from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from pathlib import Path from app.config import settings from app.database import engine, Base from app.api.routers import auth, uploads, orders, templates, admin, order_items, cad, materials, worker, analytics, pricing, products, output_types, render_templates, notifications @asynccontextmanager async def lifespan(app: FastAPI): # Create upload directories for subdir in ("step_files", "excel_files", "thumbnails", "renders", "blend-templates"): Path(settings.upload_dir, subdir).mkdir(parents=True, exist_ok=True) yield app = FastAPI( title="Schaeffler Automat API", version="0.1.0", description="Media-creation pipeline for Schaeffler CAD/bearing product orders", lifespan=lifespan, ) app.add_middleware( CORSMiddleware, allow_origins=["http://localhost:5173", "http://localhost:3000", "http://frontend:5173", "http://localhost:8888"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Mount static files for thumbnails (dir created in lifespan; skip if not writable) thumbnails_dir = Path(settings.upload_dir) / "thumbnails" try: thumbnails_dir.mkdir(parents=True, exist_ok=True) app.mount("/thumbnails", StaticFiles(directory=str(thumbnails_dir)), name="thumbnails") except (PermissionError, OSError): pass # Running outside Docker without upload dir — thumbnails won't be served statically # Mount static files for renders renders_dir = Path(settings.upload_dir) / "renders" try: renders_dir.mkdir(parents=True, exist_ok=True) app.mount("/renders", StaticFiles(directory=str(renders_dir)), name="renders") except (PermissionError, OSError): pass # Include routers app.include_router(auth.router, prefix="/api") app.include_router(uploads.router, prefix="/api") app.include_router(orders.router, prefix="/api") app.include_router(templates.router, prefix="/api") app.include_router(admin.router, prefix="/api") app.include_router(order_items.router, prefix="/api") app.include_router(cad.router, prefix="/api") app.include_router(materials.router, prefix="/api") app.include_router(worker.router, prefix="/api") app.include_router(analytics.router, prefix="/api") app.include_router(pricing.router, prefix="/api") app.include_router(products.router, prefix="/api") app.include_router(output_types.router, prefix="/api") app.include_router(render_templates.router, prefix="/api") app.include_router(notifications.router, prefix="/api") @app.get("/health") async def health(): return {"status": "ok", "service": "schaefflerautomat-backend"}