c92bcb0074
Co-authored-by: Cursor <cursoragent@cursor.com>
50 lines
1.2 KiB
Python
50 lines
1.2 KiB
Python
import asyncio
|
|
from contextlib import asynccontextmanager
|
|
|
|
from fastapi import FastAPI
|
|
|
|
from app.api.admin import router as admin_router
|
|
from app.api.public import router as public_router
|
|
from app.config import settings
|
|
from app.db import Base, SessionLocal, engine
|
|
from app import models # noqa: F401 — register models with Base.metadata
|
|
from app.services import cleaner as cleaner_service
|
|
|
|
|
|
async def _cleaner_loop() -> None:
|
|
while True:
|
|
db = SessionLocal()
|
|
try:
|
|
cleaner_service.run_once(db)
|
|
except Exception:
|
|
pass
|
|
finally:
|
|
db.close()
|
|
await asyncio.sleep(60)
|
|
|
|
|
|
@asynccontextmanager
|
|
async def lifespan(_app: FastAPI):
|
|
settings.data_dir.mkdir(parents=True, exist_ok=True)
|
|
settings.uploads_dir.mkdir(parents=True, exist_ok=True)
|
|
Base.metadata.create_all(bind=engine)
|
|
task = asyncio.create_task(_cleaner_loop())
|
|
try:
|
|
yield
|
|
finally:
|
|
task.cancel()
|
|
try:
|
|
await task
|
|
except asyncio.CancelledError:
|
|
pass
|
|
|
|
|
|
app = FastAPI(title="MincedPad", lifespan=lifespan)
|
|
app.include_router(public_router)
|
|
app.include_router(admin_router)
|
|
|
|
|
|
@app.get("/api/health")
|
|
def health():
|
|
return {"ok": True, "name": "MincedPad"}
|