import uuid from datetime import datetime from decimal import Decimal from typing import Literal from pydantic import Field, HttpUrl, model_validator from app.schemas import StrictModel class TodoItem(StrictModel): number: int text: str = Field(min_length=1, max_length=1024) class CompanyDocumentInput(StrictModel): object_key: str = Field(min_length=1, max_length=1024) title: str = Field(min_length=1, max_length=255) mime_type: str = Field(min_length=1, max_length=128) size_bytes: int = Field(gt=0) checksum_sha256: str = Field(pattern=r"^[0-9a-f]{64}$") class NotificationDetailsInput(StrictModel): deadline: datetime | None = None details_header: str | None = Field(default=None, max_length=255) details_text: str | None = Field(default=None, max_length=4000) todo_header: str | None = Field(default=None, max_length=255) todo_plan: list[TodoItem] | None = Field(default=None, min_length=1) send_documents: bool = False documents: list[CompanyDocumentInput] | None = Field(default=None, min_length=1) class NotificationCreateRequest(StrictModel): user_id: uuid.UUID notification_type: str = Field(min_length=1, max_length=32) source: str = Field(min_length=1, max_length=32) external_id: str = Field(min_length=1, max_length=128) notification_datetime: datetime header: str = Field(min_length=1, max_length=255) text: str | None = Field(default=None, max_length=1024) priority_override: int | None = None date_expired: datetime | None = None price: Decimal | None = Field(default=None, ge=0, max_digits=12, decimal_places=2) old_price: Decimal | None = Field(default=None, ge=0, max_digits=12, decimal_places=2) payment_url: HttpUrl | None = None chat_message_text: str | None = Field(default=None, max_length=1024) details: NotificationDetailsInput | None = None @model_validator(mode="after") def prices(self) -> "NotificationCreateRequest": if self.old_price is not None and self.price is None: raise ValueError("old_price requires price") return self class NotificationCancelRequest(StrictModel): source: str = Field(min_length=1, max_length=32) external_id: str = Field(min_length=1, max_length=128) close_reason: Literal["cancelled", "paid"] class UploadInitRequest(StrictModel): context_type: Literal["notification"] context_id: uuid.UUID file_name: str = Field(min_length=1, max_length=255) mime_type: str = Field(min_length=1, max_length=128) size_bytes: int = Field(gt=0) class UploadCompleteRequest(StrictModel): checksum: str = Field(pattern=r"^sha256:[0-9a-f]{64}$")