Files
web-app-python/app/main.py
2025-10-20 19:10:08 +02:00

108 lines
2.6 KiB
Python

import logging
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from app.core.config import settings
from app.core.database import Base, engine
from app.api import auth, allarmi, siti, statistiche
from app.mqtt.client import MQTTClient
from app.mqtt.handler import alarm_handler
# Configurazione logging
logging.basicConfig(
level=logging.INFO if not settings.DEBUG else logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
)
logger = logging.getLogger(__name__)
# Client MQTT globale
mqtt_client = None
@asynccontextmanager
async def lifespan(app: FastAPI):
"""Gestione lifecycle dell'applicazione"""
global mqtt_client
# Startup
logger.info("Avvio applicazione...")
# Crea tabelle database
logger.info("Creazione tabelle database...")
Base.metadata.create_all(bind=engine)
# Avvia client MQTT
logger.info("Avvio client MQTT...")
mqtt_client = MQTTClient(message_handler=alarm_handler.handle_alarm)
try:
mqtt_client.start()
logger.info("Client MQTT avviato con successo")
except Exception as e:
logger.error(f"Errore nell'avvio del client MQTT: {e}")
logger.warning("L'applicazione continuerà senza il client MQTT")
yield
# Shutdown
logger.info("Arresto applicazione...")
if mqtt_client:
mqtt_client.stop()
logger.info("Client MQTT fermato")
# Crea applicazione FastAPI
app = FastAPI(
title=settings.APP_NAME,
description="API per il sistema di monitoraggio terreni con notifiche push",
version="1.0.0",
lifespan=lifespan,
)
# Configurazione CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # In produzione, specificare i domini permessi
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Registrazione router
app.include_router(auth.router)
app.include_router(allarmi.router)
app.include_router(siti.router)
app.include_router(statistiche.router)
@app.get("/")
async def root():
"""Endpoint root per verificare che l'API sia attiva"""
return {
"message": "Terrain Monitor API",
"version": "1.0.0",
"status": "active",
}
@app.get("/health")
async def health_check():
"""Health check endpoint"""
return {
"status": "healthy",
"mqtt_connected": mqtt_client.client.is_connected() if mqtt_client else False,
}
if __name__ == "__main__":
import uvicorn
uvicorn.run(
"app.main:app",
host="0.0.0.0",
port=8000,
reload=settings.DEBUG,
)