import os from fastapi import FastAPI, Depends, APIRouter from fastapi.middleware.cors import CORSMiddleware from sqlalchemy.orm import Session from backend.app.core.config import settings from backend.app.core.database import SessionLocal, engine, get_db from backend.app.core.seeding import seed_db from backend.app.models.base import Base # Import Routers from backend.app.routers import ( auth_router, workers_router, jobs_router, bookings_router, wallet_router, roster_router, admin_router ) # Initialize database tables # This is a safe fallback; in production migrations are preferred, # but for the BCA viva, ensuring tables exist automatically is a lifesaver. Base.metadata.create_all(bind=engine) # Trigger Database Seeding on startup db = SessionLocal() try: seed_db(db) finally: db.close() app = FastAPI( title=settings.PROJECT_NAME, description="ConstructHire location-aware labor marketplace backend", version="1.0.0", docs_url="/docs", redoc_url="/redoc" ) # CORS configuration # Allow local Vite dev server and production netlify deployments app.add_middleware( CORSMiddleware, allow_origins=["*"], # For BCA viva simplicity; in strict prod specify origins allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Register API Routers api_router = APIRouter(prefix="/api") api_router.include_router(auth_router) api_router.include_router(workers_router) api_router.include_router(jobs_router) api_router.include_router(bookings_router) api_router.include_router(wallet_router) api_router.include_router(roster_router) api_router.include_router(admin_router) app.include_router(api_router) @app.get("/") def read_root(): """Root endpoint to check backend status.""" return { "status": "online", "service": settings.PROJECT_NAME, "docs": "/docs", "api_prefix": settings.API_V1_STR } @app.post("/api/admin/reset-db") def reset_database(db: Session = Depends(get_db)): """Convenience endpoint to clear and re-seed the database with demo values.""" # Drop all tables and recreate them Base.metadata.drop_all(bind=engine) Base.metadata.create_all(bind=engine) seed_db(db) return {"message": "Database successfully reset and re-seeded."}