87 lines
2.1 KiB
Python
87 lines
2.1 KiB
Python
"""Pydantic schemas for notification system."""
|
|
from datetime import datetime
|
|
from uuid import UUID
|
|
|
|
from pydantic import BaseModel, Field, field_validator
|
|
|
|
|
|
VALID_EVENTS = {
|
|
"session.escalated",
|
|
"session.high_priority",
|
|
"proposal.pending",
|
|
"proposal.approved",
|
|
"knowledge_gap.detected",
|
|
"l1.session.escalated",
|
|
}
|
|
|
|
|
|
class NotificationConfigCreate(BaseModel):
|
|
channel: str = Field(..., pattern="^(email|slack_webhook|teams_webhook)$")
|
|
webhook_url: str | None = None
|
|
email_addresses: list[str] | None = None
|
|
events_enabled: dict[str, bool] = Field(
|
|
default_factory=lambda: {e: True for e in VALID_EVENTS}
|
|
)
|
|
|
|
@field_validator("events_enabled")
|
|
@classmethod
|
|
def validate_event_keys(cls, v: dict[str, bool]) -> dict[str, bool]:
|
|
invalid = set(v) - VALID_EVENTS
|
|
if invalid:
|
|
raise ValueError(f"Unknown event keys: {invalid}")
|
|
return v
|
|
|
|
|
|
class NotificationConfigUpdate(BaseModel):
|
|
webhook_url: str | None = None
|
|
email_addresses: list[str] | None = None
|
|
is_active: bool | None = None
|
|
events_enabled: dict[str, bool] | None = None
|
|
|
|
@field_validator("events_enabled")
|
|
@classmethod
|
|
def validate_event_keys(cls, v: dict[str, bool] | None) -> dict[str, bool] | None:
|
|
if v is not None:
|
|
invalid = set(v) - VALID_EVENTS
|
|
if invalid:
|
|
raise ValueError(f"Unknown event keys: {invalid}")
|
|
return v
|
|
|
|
|
|
class NotificationConfigResponse(BaseModel):
|
|
id: UUID
|
|
channel: str
|
|
webhook_url: str | None
|
|
email_addresses: list[str] | None
|
|
is_active: bool
|
|
events_enabled: dict[str, bool]
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
class NotificationResponse(BaseModel):
|
|
id: UUID
|
|
event: str
|
|
title: str
|
|
body: str | None
|
|
link: str | None
|
|
is_read: bool
|
|
created_at: datetime
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
class UnreadCountResponse(BaseModel):
|
|
count: int
|
|
|
|
|
|
class NotificationTestRequest(BaseModel):
|
|
config_id: UUID
|
|
|
|
|
|
class NotificationTestResponse(BaseModel):
|
|
success: bool
|
|
message: str
|