import logging import traceback from fastapi import FastAPI, Request from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import JSONResponse from app.core.config import settings from app.api.endpoints import admin, auth, bandcamp, billing, compatibility, concerts, lastfm, manual_import, playlist_fix, playlists, profile, recommendations, timeline, youtube_music app = FastAPI(title="Vynl API", version="1.0.0", redirect_slashes=False) app.add_middleware( CORSMiddleware, allow_origins=[settings.FRONTEND_URL], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) app.include_router(admin.router, prefix="/api") app.include_router(auth.router, prefix="/api") app.include_router(billing.router, prefix="/api") app.include_router(playlists.router, prefix="/api") app.include_router(playlist_fix.router, prefix="/api") app.include_router(recommendations.router, prefix="/api") app.include_router(youtube_music.router, prefix="/api") app.include_router(manual_import.router, prefix="/api") app.include_router(lastfm.router, prefix="/api") app.include_router(bandcamp.router, prefix="/api") app.include_router(profile.router, prefix="/api") app.include_router(compatibility.router, prefix="/api") app.include_router(concerts.router, prefix="/api") app.include_router(timeline.router, prefix="/api") logger = logging.getLogger("app") @app.middleware("http") async def log_errors(request: Request, call_next): try: response = await call_next(request) if response.status_code >= 400: logger.warning(f"{request.method} {request.url.path} -> {response.status_code}") return response except Exception as e: logger.error(f"{request.method} {request.url.path} -> 500: {e}\n{traceback.format_exc()}") return JSONResponse(status_code=500, content={"detail": "Internal server error"}) @app.get("/api/health") async def health(): return {"status": "ok", "app": "vynl"}