|
|
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() |