Conservazione in Sidebar

This commit is contained in:
2026-06-18 11:53:18 +02:00
parent c68daf4313
commit 042a522854
6 changed files with 753 additions and 6 deletions
+43
View File
@@ -131,3 +131,46 @@ class StartRescanRequest(BaseModel):
"True: ri-estrae tutti gli allegati, sovrascrivendo i testi gia' presenti."
),
)
# ─── Schemi conservazione sostitutiva ────────────────────────────────────────
class ConservationStats(BaseModel):
"""Statistiche di conservazione sostitutiva per un tenant."""
total_messages: int
conserved: int # is_conserved=True
pending: int # is_pending_conservation=True AND is_conserved=False
not_queued: int # non ancora marcati per conservazione
coverage_pct: float # conserved / total * 100
last_conserved_at: Optional[str] = None # ISO datetime del piu' recente messaggio conservato
class ConservationTenantBreakdown(BaseModel):
"""Statistiche di un singolo tenant (usato da super_admin)."""
tenant_id: str
tenant_name: str
tenant_slug: str
stats: ConservationStats
class ConservationStatsResponse(BaseModel):
"""
Risposta GET /settings/conservation/stats.
- admin: stats.stats contiene le stat del suo tenant; per_tenant e' None
- super_admin con tenant_id: stats del tenant specificato; per_tenant e' None
- super_admin senza tenant_id: stats aggregate su tutti i tenant; per_tenant e' la lista per-tenant
"""
stats: ConservationStats
per_tenant: Optional[list[ConservationTenantBreakdown]] = None
class ConservationTriggerResult(BaseModel):
"""Risposta POST /settings/conservation/trigger."""
queued: bool
message: str
job_id: Optional[str] = None