main.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from __future__ import annotations
  2. from contextlib import asynccontextmanager
  3. from typing import AsyncGenerator
  4. from fastapi import FastAPI
  5. from fastapi.middleware.cors import CORSMiddleware
  6. from app.config import settings
  7. from app.db import close_pool, init_pool
  8. from app.middleware.logging import LoggingMiddleware
  9. from app.services.ws_hub import hub as ws_hub # noqa: F401
  10. from app.services.scheduler import start_scheduler, stop_scheduler
  11. @asynccontextmanager
  12. async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]:
  13. await init_pool()
  14. await start_scheduler()
  15. yield
  16. await stop_scheduler()
  17. await close_pool()
  18. app = FastAPI(title="Sentinel Lens", lifespan=lifespan)
  19. app.add_middleware(
  20. CORSMiddleware,
  21. allow_origins=settings.allowed_origins,
  22. allow_credentials=True,
  23. allow_methods=["*"],
  24. allow_headers=["*"],
  25. )
  26. app.add_middleware(LoggingMiddleware)
  27. # Router registration
  28. from app.routers import stats # noqa: E402
  29. from app.routers import logs # noqa: E402
  30. from app.routers import scrape # noqa: E402
  31. from app.routers import public # noqa: E402
  32. from app.routers import ws # noqa: E402
  33. from app.routers import models # noqa: E402
  34. from app.routers import schedule # noqa: E402
  35. from app.routers import discounts # noqa: E402
  36. app.include_router(stats.router, prefix="/api")
  37. app.include_router(logs.router, prefix="/api")
  38. app.include_router(scrape.router, prefix="/api")
  39. app.include_router(public.router, prefix="/api/public")
  40. app.include_router(models.router, prefix="/api")
  41. app.include_router(schedule.router, prefix="/api")
  42. app.include_router(discounts.router, prefix="/api")
  43. app.include_router(ws.router)
  44. @app.get("/")
  45. async def health_check() -> dict:
  46. return {"status": "ok", "service": "sentinel-lens"}