62 lines
2.0 KiB
Python
62 lines
2.0 KiB
Python
from datetime import datetime
|
|
from typing import Any
|
|
|
|
from pydantic import BaseModel, Field, model_validator
|
|
|
|
|
|
class MessageCreateRequest(BaseModel):
|
|
sender_user_id: int = Field(gt=0)
|
|
peer_user_id: int = Field(gt=0)
|
|
client_msg_id: str = Field(min_length=1, max_length=64)
|
|
content_type: int = Field(description="1-text 2-audio 3-image 4-json")
|
|
content_text: str | None = Field(default=None)
|
|
content_json: dict[str, Any] | None = None
|
|
media_file_key: str | None = Field(default=None, max_length=255)
|
|
media_duration_ms: int | None = Field(default=None, ge=0)
|
|
|
|
@model_validator(mode="after")
|
|
def validate_message_fields(self) -> "MessageCreateRequest":
|
|
if self.sender_user_id == self.peer_user_id:
|
|
raise ValueError("sender_user_id and peer_user_id cannot be the same")
|
|
|
|
if self.content_type not in {1, 2, 3, 4}:
|
|
raise ValueError("content_type must be one of 1, 2, 3, 4")
|
|
|
|
if self.content_type == 1 and not (self.content_text and self.content_text.strip()):
|
|
raise ValueError("content_text is required when content_type is 1")
|
|
|
|
if self.content_type in {2, 3} and not self.media_file_key:
|
|
raise ValueError("media_file_key is required when content_type is 2 or 3")
|
|
|
|
if self.content_type == 4 and self.content_json is None:
|
|
raise ValueError("content_json is required when content_type is 4")
|
|
|
|
return self
|
|
|
|
|
|
class MessageItem(BaseModel):
|
|
id: int
|
|
conversation_id: int
|
|
seq: int
|
|
sender_user_id: int | None
|
|
role: int
|
|
content_type: int
|
|
content_text: str | None
|
|
content_json: dict[str, Any] | None
|
|
media_file_key: str | None
|
|
media_duration_ms: int | None
|
|
client_msg_id: str | None
|
|
created_at: datetime
|
|
|
|
|
|
class MessageCreateResponse(BaseModel):
|
|
idempotent: bool
|
|
message: MessageItem
|
|
|
|
|
|
class MessageListResponse(BaseModel):
|
|
conversation_id: int
|
|
has_more: bool
|
|
next_cursor_seq: int | None
|
|
items: list[MessageItem]
|