from datetime import datetime from pydantic import BaseModel, ConfigDict, Field from app.chats.models import ChatMemberRole, ChatType from app.messages.models import MessageType class ChatRead(BaseModel): model_config = ConfigDict(from_attributes=True) id: int public_id: str type: ChatType title: str | None = None display_title: str | None = None handle: str | None = None description: str | None = None is_public: bool = False is_saved: bool = False archived: bool = False pinned: bool = False unread_count: int = 0 unread_mentions_count: int = 0 pinned_message_id: int | None = None members_count: int | None = None online_count: int | None = None subscribers_count: int | None = None counterpart_user_id: int | None = None counterpart_name: str | None = None counterpart_username: str | None = None counterpart_is_online: bool | None = None counterpart_last_seen_at: datetime | None = None last_message_text: str | None = None last_message_type: MessageType | None = None last_message_created_at: datetime | None = None my_role: ChatMemberRole | None = None created_at: datetime class ChatMemberRead(BaseModel): model_config = ConfigDict(from_attributes=True) id: int user_id: int role: ChatMemberRole joined_at: datetime class ChatDetailRead(ChatRead): members: list[ChatMemberRead] class ChatCreateRequest(BaseModel): type: ChatType title: str | None = Field(default=None, max_length=255) handle: str | None = Field(default=None, max_length=64) description: str | None = Field(default=None, max_length=512) is_public: bool = False member_ids: list[int] = Field(default_factory=list) class ChatMemberAddRequest(BaseModel): user_id: int class ChatMemberRoleUpdateRequest(BaseModel): role: ChatMemberRole class ChatTitleUpdateRequest(BaseModel): title: str = Field(min_length=1, max_length=255) class ChatPinMessageRequest(BaseModel): message_id: int | None = None class ChatDeleteRequest(BaseModel): for_all: bool = False class ChatDiscoverRead(ChatRead): is_member: bool class ChatNotificationSettingsRead(BaseModel): chat_id: int user_id: int muted: bool class ChatNotificationSettingsUpdate(BaseModel): muted: bool class ChatInviteLinkRead(BaseModel): chat_id: int token: str invite_url: str class ChatJoinByInviteRequest(BaseModel): token: str = Field(min_length=8, max_length=64)