vbox funzionanti

This commit is contained in:
2026-03-19 11:41:10 +01:00
parent 538d6a6bec
commit b7f7c1f7c0
32 changed files with 6043 additions and 262 deletions
+128
View File
@@ -0,0 +1,128 @@
"""
Schema Pydantic per i canali di notifica multi-canale.
"""
import uuid
from datetime import datetime
from typing import Any, Literal
from pydantic import BaseModel, Field
# ─── NotificationChannel ─────────────────────────────────────────────────────
ChannelType = Literal["webhook", "email", "telegram", "whatsapp"]
class NotificationChannelCreate(BaseModel):
name: str = Field(..., min_length=1, max_length=255)
channel_type: ChannelType
config: dict[str, Any] | None = None # configurazione pubblica
config_secret: dict[str, Any] | None = None # verrà cifrato in config_enc
class NotificationChannelUpdate(BaseModel):
name: str | None = None
is_active: bool | None = None
config: dict[str, Any] | None = None
config_secret: dict[str, Any] | None = None
class NotificationChannelResponse(BaseModel):
id: uuid.UUID
tenant_id: uuid.UUID
name: str
channel_type: str
is_active: bool
config: dict[str, Any] | None
consecutive_failures: int
circuit_open_until: datetime | None
created_by: uuid.UUID | None
created_at: datetime
updated_at: datetime
model_config = {"from_attributes": True}
class NotificationChannelListResponse(BaseModel):
items: list[NotificationChannelResponse]
total: int
page: int
page_size: int
class ChannelTestResult(BaseModel):
success: bool
message: str
http_status: int | None = None
# ─── NotificationRule ─────────────────────────────────────────────────────────
EventType = Literal[
"new_message",
"state_changed",
"anomaly",
"send_failed",
"send_delivered",
"mailbox_error",
]
class NotificationRuleCreate(BaseModel):
channel_id: uuid.UUID
name: str = Field(..., min_length=1, max_length=255)
event_type: EventType
filter: dict[str, Any] | None = None
class NotificationRuleUpdate(BaseModel):
name: str | None = None
event_type: EventType | None = None
filter: dict[str, Any] | None = None
is_active: bool | None = None
class NotificationRuleResponse(BaseModel):
id: uuid.UUID
tenant_id: uuid.UUID
channel_id: uuid.UUID
name: str
event_type: str
filter: dict[str, Any] | None
is_active: bool
created_at: datetime
model_config = {"from_attributes": True}
class NotificationRuleListResponse(BaseModel):
items: list[NotificationRuleResponse]
total: int
# ─── NotificationLog ─────────────────────────────────────────────────────────
class NotificationLogResponse(BaseModel):
id: uuid.UUID
tenant_id: uuid.UUID
channel_id: uuid.UUID
rule_id: uuid.UUID | None
event_type: str
status: str
attempt_count: int
max_attempts: int
next_retry_at: datetime | None
last_error: str | None
http_status: int | None
sent_at: datetime | None
created_at: datetime
model_config = {"from_attributes": True}
class NotificationLogListResponse(BaseModel):
items: list[NotificationLogResponse]
total: int
page: int
page_size: int