Spaces:
Sleeping
Sleeping
| # main.py | |
| import logging # Standard import | |
| # --- Setup Logging FIRST --- | |
| # Apply the configuration defined in logging_config.py | |
| from app.core.logging_config import setup_logging | |
| setup_logging() | |
| # --- Logging setup complete --- | |
| # --- Now other imports --- | |
| from fastapi import FastAPI | |
| from fastapi.middleware.cors import CORSMiddleware | |
| # Import settings and the V2 API router | |
| from app.core.config import settings | |
| from app.api import v2_endpoints # This imports the router defined in that file | |
| # --- DB imports for table creation --- | |
| # Import engine and Base from your database setup | |
| from app.db.database import engine, Base | |
| # --- Make sure models are imported so Base knows about them for create_all --- | |
| # This line ensures SQLAlchemy's Base registry is aware of your table models | |
| from app.db import models | |
| # Get logger instance *after* setup_logging() has run | |
| # This logger is specifically for messages generated directly in main.py | |
| logger = logging.getLogger(__name__) | |
| # --- Function to create database tables --- | |
| # Defines the function to be called on startup | |
| def create_db_tables(): | |
| logger.info("Attempting to create V2 database tables (if they don't exist)...") | |
| try: | |
| # Base.metadata contains registry of all tables defined using the Base declarative class | |
| Base.metadata.create_all(bind=engine) | |
| logger.info("V2 Database tables checked/created successfully.") | |
| except Exception as e: | |
| # Log the full error trace if table creation fails | |
| logger.exception(f"CRITICAL: Failed to create V2 database tables: {e}") | |
| # Depending on requirements, you might want to raise an error | |
| # to stop the application from starting if the DB is essential. | |
| # raise RuntimeError("Failed to create V2 database tables.") from e | |
| # --- Initialize FastAPI app --- | |
| # Creates the main application instance | |
| app = FastAPI( | |
| title=settings.PROJECT_NAME, | |
| description="Chatbot Backend V2 using FastAPI and GNN-based Retrieval", | |
| version="2.0.0", # Indicate V2 | |
| # Define the URL for the OpenAPI docs (Swagger UI) under the API prefix | |
| openapi_url=f"{settings.API_V2_PREFIX}/openapi.json", | |
| # Define the URL for the Swagger UI itself | |
| docs_url=f"{settings.API_V2_PREFIX}/docs", | |
| redoc_url=f"{settings.API_V2_PREFIX}/redoc" # Optional: Define ReDoc URL | |
| ) | |
| # --- Add CORS middleware --- | |
| # This must be added BEFORE including routers | |
| logger.info("Adding CORSMiddleware with HARDCODED origins for debugging...") | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=["http://localhost:5173"], # Directly specify the frontend origin | |
| # allow_origins=["*"], # Or try allowing all origins temporarily | |
| allow_credentials=True, | |
| allow_methods=["*"], # Allow all methods | |
| allow_headers=["*"], # Allow all headers | |
| ) | |
| # --- Include the V2 API router --- | |
| # Mounts all the endpoints defined in v2_endpoints.py under the specified prefix | |
| logger.info(f"Including V2 API router with prefix: {settings.API_V2_PREFIX}") | |
| app.include_router(v2_endpoints.router, prefix=settings.API_V2_PREFIX) | |
| # --- Root endpoint (optional) --- | |
| # A simple endpoint at the base URL ("/") to check if the API is running | |
| async def read_root(): | |
| """Basic health check endpoint.""" | |
| logger.info("Root endpoint '/' accessed.") | |
| return {"message": f"Welcome to {settings.PROJECT_NAME}. API V2 is available at {settings.API_V2_PREFIX}"} | |
| # --- Application Startup Event --- | |
| async def startup_event(): | |
| """ | |
| Actions to perform when the application starts up. | |
| - Creates database tables. | |
| - Note: The router's specific startup event (for loading models/data) | |
| runs automatically AFTER this app-level event. | |
| """ | |
| # Logging is configured before this runs by the setup_logging() call | |
| logger.info("Executing application startup event...") | |
| # Create database tables (idempotent - won't recreate if they exist) | |
| create_db_tables() | |
| logger.info("Application startup event completed.") | |
| # --- Application Shutdown Event (optional) --- | |
| async def shutdown_event(): | |
| """Actions to perform when the application shuts down.""" | |
| logger.info("Application shutting down...") | |
| # Add any cleanup logic here if needed (e.g., closing external connections) |