| import asyncio |
|
|
| from fastapi import FastAPI, Request |
| from starlette.middleware.cors import CORSMiddleware |
| from starlette.middleware.trustedhost import TrustedHostMiddleware |
| from fastapi.responses import JSONResponse |
| from core.config import get_settings |
| from core.logger import setup_logger |
| from core.refresh_token import TokenManager |
| from core.router import router |
| from core.scheduler import SchedulerManager |
|
|
| settings = get_settings() |
| logger = setup_logger(__name__) |
| scheduler_manager = SchedulerManager() |
|
|
| |
| def create_app() -> FastAPI: |
| app = FastAPI( |
| title=settings.PROJECT_NAME, |
| version="0.0.1", |
| description=settings.DESCRIPTION, |
| ) |
| |
| app.add_middleware( |
| CORSMiddleware, |
| allow_origins=["*"], |
| allow_credentials=True, |
| allow_methods=["*"], |
| allow_headers=["*"], |
| ) |
|
|
| |
| app.add_middleware( |
| TrustedHostMiddleware, |
| allowed_hosts=["*"] |
| ) |
| |
| @app.get("/scheduler/jobs") |
| async def list_jobs(): |
| jobs = scheduler_manager.get_jobs() |
| return [{"id": job.id, "next_run_time": job.next_run_time} for job in jobs] |
|
|
| @app.post("/scheduler/jobs/{job_id}/trigger") |
| async def trigger_job(job_id: str): |
| job = scheduler_manager.scheduler.get_job(job_id) |
| if not job: |
| return {"error": "Job not found"} |
| await job.func() |
| return {"message": f"Job {job_id} triggered"} |
|
|
| @app.delete("/scheduler/jobs/{job_id}") |
| async def delete_job(job_id: str): |
| try: |
| scheduler_manager.remove_job(job_id) |
| return {"message": f"Job {job_id} removed"} |
| except Exception as e: |
| return {"error": str(e)} |
| |
| app.include_router(router, prefix="/api/v1") |
| app.include_router(router, prefix="/v1") |
|
|
| @app.exception_handler(Exception) |
| async def global_exception_handler(request: Request, exc: Exception): |
| logger.error(f"An error occurred: {str(exc)}", exc_info=True) |
| return JSONResponse( |
| status_code=500, |
| content={ |
| "message": "An internal server error occurred.", |
| "detail": str(exc) |
| }, |
| ) |
|
|
| |
| token_manager = TokenManager() |
|
|
| @app.on_event("startup") |
| async def startup_event(): |
| |
| app.state.refresh_task = asyncio.create_task(token_manager.start_auto_refresh()) |
| await scheduler_manager.start() |
|
|
| @app.on_event("shutdown") |
| async def shutdown_event(): |
| |
| if hasattr(app.state, 'refresh_task'): |
| app.state.refresh_task.cancel() |
| try: |
| await app.state.refresh_task |
| except asyncio.CancelledError: |
| pass |
|
|
| await scheduler_manager.shutdown() |
| return app |
|
|
| app = create_app() |