""" Mitai Jinkendo API - Main Application FastAPI backend with modular router structure. """ import os from pathlib import Path from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from slowapi import Limiter, _rate_limit_exceeded_handler from slowapi.util import get_remote_address from slowapi.errors import RateLimitExceeded from db import init_db # Import routers from routers import auth, profiles, weight, circumference, caliper from routers import activity, nutrition, photos, insights, prompts from routers import admin, stats, exportdata, importdata # ── App Configuration ───────────────────────────────────────────────────────── DATA_DIR = Path(os.getenv("DATA_DIR", "./data")) PHOTOS_DIR = Path(os.getenv("PHOTOS_DIR", "./photos")) DATA_DIR.mkdir(parents=True, exist_ok=True) PHOTOS_DIR.mkdir(parents=True, exist_ok=True) app = FastAPI(title="Mitai Jinkendo API", version="3.0.0") # Rate limiting limiter = Limiter(key_func=get_remote_address) app.state.limiter = limiter app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler) # CORS app.add_middleware( CORSMiddleware, allow_origins=os.getenv("ALLOWED_ORIGINS", "*").split(","), allow_credentials=True, allow_methods=["GET","POST","PUT","DELETE","OPTIONS"], allow_headers=["*"], ) # ── Startup Event ───────────────────────────────────────────────────────────── @app.on_event("startup") async def startup_event(): """Run database initialization on startup.""" try: init_db() except Exception as e: print(f"⚠️ init_db() failed (non-fatal): {e}") # Don't crash on startup - can be created manually # Apply v9c migration if needed try: from apply_v9c_migration import apply_migration apply_migration() except Exception as e: print(f"⚠️ v9c migration failed (non-fatal): {e}") # ── Register Routers ────────────────────────────────────────────────────────── app.include_router(auth.router) # /api/auth/* app.include_router(profiles.router) # /api/profiles/*, /api/profile app.include_router(weight.router) # /api/weight/* app.include_router(circumference.router) # /api/circumferences/* app.include_router(caliper.router) # /api/caliper/* app.include_router(activity.router) # /api/activity/* app.include_router(nutrition.router) # /api/nutrition/* app.include_router(photos.router) # /api/photos/* app.include_router(insights.router) # /api/insights/*, /api/ai/* app.include_router(prompts.router) # /api/prompts/* app.include_router(admin.router) # /api/admin/* app.include_router(stats.router) # /api/stats app.include_router(exportdata.router) # /api/export/* app.include_router(importdata.router) # /api/import/* # ── Health Check ────────────────────────────────────────────────────────────── @app.get("/") def root(): """API health check.""" return {"status": "ok", "service": "mitai-jinkendo", "version": "v9c-dev"}