mirror of
https://github.com/idrainformatica/PecFlow.git
synced 2026-06-16 12:45:42 +02:00
fase 4
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
"""
|
||||
Schemi Pydantic per l'invio PEC (Fase 4).
|
||||
"""
|
||||
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
|
||||
from pydantic import BaseModel, EmailStr, field_validator
|
||||
|
||||
|
||||
class SendPecRequest(BaseModel):
|
||||
"""
|
||||
Richiesta di invio PEC.
|
||||
|
||||
Accettato come JSON body; gli allegati vengono gestiti
|
||||
in una fase successiva tramite endpoint multipart dedicato.
|
||||
"""
|
||||
|
||||
mailbox_id: uuid.UUID
|
||||
"""Casella PEC mittente."""
|
||||
|
||||
to_addresses: list[EmailStr]
|
||||
"""Destinatari principali (almeno uno)."""
|
||||
|
||||
cc_addresses: list[EmailStr] = []
|
||||
"""Destinatari in copia (opzionale)."""
|
||||
|
||||
subject: str
|
||||
"""Oggetto del messaggio."""
|
||||
|
||||
body_text: str = ""
|
||||
"""Corpo in testo semplice."""
|
||||
|
||||
body_html: str | None = None
|
||||
"""Corpo HTML (opzionale)."""
|
||||
|
||||
reply_to_message_id: uuid.UUID | None = None
|
||||
"""UUID del messaggio a cui si risponde (per threading, opzionale)."""
|
||||
|
||||
@field_validator("to_addresses")
|
||||
@classmethod
|
||||
def at_least_one_recipient(cls, v: list[EmailStr]) -> list[EmailStr]:
|
||||
if not v:
|
||||
raise ValueError("Almeno un destinatario è obbligatorio")
|
||||
return v
|
||||
|
||||
@field_validator("subject")
|
||||
@classmethod
|
||||
def subject_not_empty(cls, v: str) -> str:
|
||||
if not v.strip():
|
||||
raise ValueError("Il campo Oggetto non può essere vuoto")
|
||||
return v.strip()
|
||||
|
||||
|
||||
class SendJobResponse(BaseModel):
|
||||
"""Stato di un job di invio PEC."""
|
||||
|
||||
model_config = {"from_attributes": True}
|
||||
|
||||
id: uuid.UUID
|
||||
tenant_id: uuid.UUID
|
||||
mailbox_id: uuid.UUID
|
||||
message_id: uuid.UUID | None = None
|
||||
status: str
|
||||
"""Stato: pending | sending | sent | failed | retrying"""
|
||||
attempt_count: int
|
||||
max_attempts: int
|
||||
next_retry_at: datetime | None = None
|
||||
last_error: str | None = None
|
||||
queued_at: datetime
|
||||
sent_at: datetime | None = None
|
||||
created_by: uuid.UUID | None = None
|
||||
|
||||
|
||||
class SendJobListResponse(BaseModel):
|
||||
"""Lista paginata di job di invio."""
|
||||
|
||||
items: list[SendJobResponse]
|
||||
total: int
|
||||
page: int
|
||||
page_size: int
|
||||
Reference in New Issue
Block a user