73 lines
2.6 KiB
Python
73 lines
2.6 KiB
Python
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}$")
|