You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

120 lines
3.4 KiB

from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse
import logging
from core.database import db_manager
from core.auth import initialize_auth
from core.exceptions import PietanzaNotFoundError, ValidationError, DatabaseError
from dependencies import get_config
from routes import pietanze
# Configura logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
logger = logging.getLogger(__name__)
# Crea applicazione FastAPI
app = FastAPI(
title="API Simple Mensa",
description="API per il sistema di prenotazione mensa",
version="1.0.0",
docs_url="/docs",
redoc_url="/redoc"
)
# Carica configurazione
config = get_config()
# Configura CORS
app.add_middleware(
CORSMiddleware,
allow_origins=config['cors']['allow_origins'],
allow_credentials=config['cors']['allow_credentials'],
allow_methods=config['cors']['allow_methods'],
allow_headers=config['cors']['allow_headers'],
)
# Includi router
app.include_router(pietanze.router, prefix="/api/v1")
# Gestori di eccezioni
@app.exception_handler(PietanzaNotFoundError)
async def pietanza_not_found_handler(request, exc):
return JSONResponse(
status_code=exc.status_code,
content={"errore": "Pietanza non trovata", "dettaglio": exc.detail}
)
@app.exception_handler(ValidationError)
async def validation_error_handler(request, exc):
return JSONResponse(
status_code=exc.status_code,
content={"errore": "Errore di validazione", "dettaglio": exc.detail}
)
@app.exception_handler(DatabaseError)
async def database_error_handler(request, exc):
return JSONResponse(
status_code=exc.status_code,
content={"errore": "Errore database", "dettaglio": exc.detail}
)
# Eventi di avvio e spegnimento
@app.on_event("startup")
async def startup_event():
"""Inizializza applicazione all'avvio"""
try:
# Inizializza database
await db_manager.initialize(config['database'])
logger.info("Database inizializzato")
# Inizializza autenticazione
initialize_auth(config['auth'])
logger.info("Autenticazione inizializzata")
logger.info("Avvio applicazione completato")
except Exception as e:
logger.error(f"Errore nell'inizializzazione dell'applicazione: {e}")
raise
@app.on_event("shutdown")
async def shutdown_event():
"""Pulizia alla chiusura dell'applicazione"""
try:
await db_manager.close()
logger.info("Spegnimento applicazione completato")
except Exception as e:
logger.error(f"Errore durante lo spegnimento: {e}")
# Endpoint di controllo stato
@app.get("/health")
async def health_check():
"""Endpoint di controllo stato dell'applicazione"""
return {
"stato": "funzionante",
"servizio": "simple-mensa-api",
"versione": "1.0.0"
}
# Endpoint principale
@app.get("/")
async def root():
"""Endpoint principale con informazioni API"""
return {
"messaggio": "API Simple Mensa",
"versione": "1.0.0",
"documentazione": "/docs",
"stato": "/health"
}
if __name__ == "__main__":
import uvicorn
uvicorn.run(
"main:app",
host=config['server']['host'],
port=config['server']['port'],
reload=config['server']['reload'],
)