"""TapTrack Hub — FastAPI application entry point.""" from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from app.database import engine, Base # Import all models so Alembic/SQLAlchemy picks them up from app.models import user, school, license, sms, billing, ticket, audit, announcement, email_log, report # noqa from app.routers import auth, schools, licenses, sms as sms_router, billing as billing_router from app.routers import tickets, users, dashboard, school_portal, announcements, sync, email as email_router from app.routers import search, audit @asynccontextmanager async def lifespan(app: FastAPI): # Create tables if not exists (dev convenience — use Alembic in prod) async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) yield app = FastAPI( title="TapTrack Hub", description="Cloud control plane for TapTrack on-prem deployments", version="1.0.0", lifespan=lifespan, ) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Routers app.include_router(auth.router) app.include_router(schools.router) app.include_router(licenses.router) app.include_router(sms_router.router) app.include_router(billing_router.router) app.include_router(tickets.router) app.include_router(users.router) app.include_router(dashboard.router) app.include_router(school_portal.router) app.include_router(announcements.router) app.include_router(sync.router) app.include_router(email_router.router) app.include_router(search.router) app.include_router(audit.router) @app.get("/api/health") async def health(): return {"status": "ok", "service": "taptrack-hub"}