Conservazione in Sidebar
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user