Coverage for modules\chat\schemas.py: 100%
69 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-05 09:25 +0800
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-05 09:25 +0800
1from typing import Optional, List
2from pydantic import BaseModel, ConfigDict
3from uuid import UUID
4from datetime import datetime
6class ChannelMemberOut(BaseModel):
7 user_id: UUID
8 full_name: str
9 avatar_url: Optional[str] = None
10 role: str
11 joined_at: datetime
13 model_config = ConfigDict(from_attributes=True)
15class LastMessagePreview(BaseModel):
16 id: UUID
17 sender_name: str
18 content: str
19 created_at: datetime
21 model_config = ConfigDict(from_attributes=True)
23class ChannelOut(BaseModel):
24 id: UUID
25 name: str
26 topic: Optional[str] = None
27 type: str
28 created_by_id: Optional[UUID] = None
29 unread_count: int = 0
30 members_count: int = 0
31 last_message: Optional[LastMessagePreview] = None
32 created_at: datetime
34 model_config = ConfigDict(from_attributes=True)
36class ChannelCreateIn(BaseModel):
37 name: str
38 topic: Optional[str] = None
39 type: Optional[str] = 'PUBLIC'
40 member_ids: Optional[List[UUID]] = []
42class MessageAttachmentIn(BaseModel):
43 file_name: str
44 file_size: int
45 file_type: str
46 file_url: str
48class MessageAttachmentOut(BaseModel):
49 id: UUID
50 file_name: str
51 file_size: int
52 file_type: str
53 file_url: str
55 model_config = ConfigDict(from_attributes=True)
57class MessageReactionOut(BaseModel):
58 emoji: str
59 count: int
60 users: List[dict]
62 model_config = ConfigDict(from_attributes=True)
64class MessageOut(BaseModel):
65 id: UUID
66 channel_id: UUID
67 sender_id: UUID
68 sender_name: str
69 sender_avatar: Optional[str] = None
70 content: str
71 parent_id: Optional[UUID] = None
72 attachments: List[MessageAttachmentOut] = []
73 reactions: List[MessageReactionOut] = []
74 is_pinned: bool = False
75 is_edited: bool = False
76 created_at: datetime
77 updated_at: datetime
79 model_config = ConfigDict(from_attributes=True)
81class MessageSendIn(BaseModel):
82 content: str
83 parent_id: Optional[UUID] = None
84 attachments: Optional[List[MessageAttachmentIn]] = []