Coverage for integrations / social / schemas.py: 90.5%
105 statements
« prev ^ index » next coverage.py v7.14.0, created at 2026-05-12 04:49 +0000
« prev ^ index » next coverage.py v7.14.0, created at 2026-05-12 04:49 +0000
1"""
2HevolveSocial - Request/Response Schemas
3Dataclass-based schemas following the admin/schemas.py pattern.
4"""
5from dataclasses import dataclass, field, asdict
6from typing import Optional, List, Any
9def _clean(d):
10 """Remove None values from dict for JSON responses."""
11 return {k: v for k, v in d.items() if v is not None}
14# ─── Auth ───
16@dataclass
17class RegisterRequest:
18 username: str
19 password: str
20 email: Optional[str] = None
21 display_name: Optional[str] = None
22 user_type: str = 'human'
24@dataclass
25class LoginRequest:
26 username: str
27 password: str
29@dataclass
30class AgentRegisterRequest:
31 name: str
32 description: str = ''
33 agent_id: Optional[str] = None # prompt_id_flow_id
36# ─── Posts ───
38@dataclass
39class CreatePostRequest:
40 title: str
41 content: str = ''
42 content_type: str = 'text'
43 community: Optional[str] = None
44 code_language: Optional[str] = None
45 media_urls: List[str] = field(default_factory=list)
46 link_url: Optional[str] = None
48@dataclass
49class UpdatePostRequest:
50 title: Optional[str] = None
51 content: Optional[str] = None
54# ─── Comments ───
56@dataclass
57class CreateCommentRequest:
58 content: str
59 parent_id: Optional[str] = None
61@dataclass
62class UpdateCommentRequest:
63 content: str
66# ─── Communities ───
68@dataclass
69class CreateCommunityRequest:
70 name: str
71 display_name: str = ''
72 description: str = ''
73 rules: str = ''
74 is_private: bool = False
76@dataclass
77class UpdateCommunityRequest:
78 display_name: Optional[str] = None
79 description: Optional[str] = None
80 rules: Optional[str] = None
83# ─── User Profile ───
85@dataclass
86class UpdateProfileRequest:
87 display_name: Optional[str] = None
88 bio: Optional[str] = None
89 avatar_url: Optional[str] = None
92# ─── Tasks ───
94@dataclass
95class CreateTaskRequest:
96 post_id: str
97 task_description: str
98 required_skill: Optional[str] = None
100@dataclass
101class CompleteTaskRequest:
102 result: str
105# ─── Recipe Sharing ───
107@dataclass
108class ShareRecipeRequest:
109 recipe_file: str
110 title: str
111 description: str = ''
112 community: Optional[str] = None
115# ─── Reports ───
117@dataclass
118class CreateReportRequest:
119 reason: str
120 details: str = ''
122@dataclass
123class ReviewReportRequest:
124 status: str # reviewed|resolved|dismissed
127# ─── Search ───
129@dataclass
130class SearchRequest:
131 q: str
132 type: str = 'all' # posts|comments|users|communities|all
133 limit: int = 20
134 offset: int = 0
137# ─── API Response ───
139@dataclass
140class APIResponse:
141 success: bool
142 data: Any = None
143 error: Optional[str] = None
144 meta: Optional[dict] = None
146 def to_dict(self):
147 d = {'success': self.success}
148 if self.data is not None:
149 d['data'] = self.data
150 if self.error is not None:
151 d['error'] = self.error
152 if self.meta is not None:
153 d['meta'] = self.meta
154 return d
157# ─── Pagination ───
159@dataclass
160class PaginationMeta:
161 page: int
162 limit: int
163 total: int
164 has_more: bool
166 def to_dict(self):
167 return asdict(self)