app backend prima

This commit is contained in:
2025-10-20 19:10:08 +02:00
commit 438255d27b
42 changed files with 4622 additions and 0 deletions

0
app/schemas/__init__.py Normal file
View File

56
app/schemas/allarme.py Normal file
View File

@@ -0,0 +1,56 @@
from datetime import datetime
from typing import Optional, Dict, Any
from pydantic import BaseModel, Field
from app.models.allarme import SeveritaAllarme, StatoAllarme, TipoAllarme
class AllarmeBase(BaseModel):
"""Schema base per allarmi"""
tipo: TipoAllarme
severita: SeveritaAllarme
titolo: str = Field(..., max_length=255)
descrizione: Optional[str] = None
messaggio: Optional[str] = None
valore_rilevato: Optional[float] = None
valore_soglia: Optional[float] = None
unita_misura: Optional[str] = Field(None, max_length=20)
dati_sensori: Optional[Dict[str, Any]] = None
class AllarmeCreate(AllarmeBase):
"""Schema per creazione allarme"""
sito_id: int
timestamp_rilevamento: datetime
class AllarmeUpdate(BaseModel):
"""Schema per aggiornamento allarme"""
stato: Optional[StatoAllarme] = None
note: Optional[str] = None
risolto_da: Optional[str] = None
class AllarmeResponse(AllarmeBase):
"""Schema per risposta API con allarme"""
id: int
sito_id: int
stato: StatoAllarme
timestamp_rilevamento: datetime
timestamp_notifica: Optional[datetime] = None
created_at: datetime
updated_at: Optional[datetime] = None
note: Optional[str] = None
risolto_da: Optional[str] = None
timestamp_risoluzione: Optional[datetime] = None
class Config:
from_attributes = True
class AllarmeList(BaseModel):
"""Schema per lista paginata di allarmi"""
total: int
items: list[AllarmeResponse]
page: int
page_size: int

25
app/schemas/auth.py Normal file
View File

@@ -0,0 +1,25 @@
from typing import Optional
from pydantic import BaseModel, EmailStr
class Token(BaseModel):
"""Schema per token JWT"""
access_token: str
token_type: str = "bearer"
class TokenData(BaseModel):
"""Schema per dati contenuti nel token"""
email: Optional[str] = None
cliente_id: Optional[int] = None
class LoginRequest(BaseModel):
"""Schema per richiesta di login"""
email: EmailStr
password: str
class RegisterFCMToken(BaseModel):
"""Schema per registrazione FCM token"""
fcm_token: str

36
app/schemas/sito.py Normal file
View File

@@ -0,0 +1,36 @@
from datetime import datetime
from typing import Optional
from pydantic import BaseModel
from app.models.sito import TipoSito
class SitoBase(BaseModel):
"""Schema base per siti"""
nome: str
tipo: TipoSito
descrizione: Optional[str] = None
latitudine: Optional[float] = None
longitudine: Optional[float] = None
altitudine: Optional[float] = None
comune: Optional[str] = None
provincia: Optional[str] = None
regione: Optional[str] = None
codice_identificativo: Optional[str] = None
class SitoResponse(SitoBase):
"""Schema per risposta API con sito"""
id: int
cliente_id: int
created_at: datetime
updated_at: Optional[datetime] = None
class Config:
from_attributes = True
class SitoListResponse(BaseModel):
"""Schema per lista siti"""
total: int
items: list[SitoResponse]

View File

@@ -0,0 +1,39 @@
from pydantic import BaseModel
from typing import List
class StatisticheResponse(BaseModel):
"""Schema per statistiche dashboard"""
totale_allarmi: int
totale_siti: int
allarmi_aperti: int
allarmi_recenti_7gg: int
# Per severità
allarmi_critical: int
allarmi_warning: int
allarmi_info: int
# Per stato
allarmi_nuovo: int
allarmi_in_gestione: int
allarmi_risolto: int
# Siti per tipo
siti_ponte: int
siti_galleria: int
siti_diga: int
siti_frana: int
siti_versante: int
siti_edificio: int
class AllarmePerGiornoItem(BaseModel):
"""Item per grafico allarmi per giorno"""
data: str # ISO format date
count: int
class AllarmiPerGiornoResponse(BaseModel):
"""Schema per allarmi raggruppati per giorno"""
dati: List[AllarmePerGiornoItem]