from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from sqlalchemy import select from app.config import settings from app.database import init_db, AsyncSessionLocal from app.routers import auth, users, entries, public, admin async def _seed_admin() -> None: from app.models.user import User from app.utils.security import hash_password async with AsyncSessionLocal() as db: result = await db.execute(select(User).where(User.email == settings.admin_username)) user = result.scalar_one_or_none() if user is None: db.add(User( email=settings.admin_username, password_hash=hash_password(settings.admin_password), display_name="Admin", is_admin=True, )) else: user.password_hash = hash_password(settings.admin_password) user.is_admin = True await db.commit() @asynccontextmanager async def lifespan(app: FastAPI): await init_db() await _seed_admin() yield app = FastAPI(title="Bourbonacci", lifespan=lifespan) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"], ) app.include_router(auth.router) app.include_router(users.router) app.include_router(entries.router) app.include_router(public.router) app.include_router(admin.router)