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

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 

7 

8 

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} 

12 

13 

14# ─── Auth ─── 

15 

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' 

23 

24@dataclass 

25class LoginRequest: 

26 username: str 

27 password: str 

28 

29@dataclass 

30class AgentRegisterRequest: 

31 name: str 

32 description: str = '' 

33 agent_id: Optional[str] = None # prompt_id_flow_id 

34 

35 

36# ─── Posts ─── 

37 

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 

47 

48@dataclass 

49class UpdatePostRequest: 

50 title: Optional[str] = None 

51 content: Optional[str] = None 

52 

53 

54# ─── Comments ─── 

55 

56@dataclass 

57class CreateCommentRequest: 

58 content: str 

59 parent_id: Optional[str] = None 

60 

61@dataclass 

62class UpdateCommentRequest: 

63 content: str 

64 

65 

66# ─── Communities ─── 

67 

68@dataclass 

69class CreateCommunityRequest: 

70 name: str 

71 display_name: str = '' 

72 description: str = '' 

73 rules: str = '' 

74 is_private: bool = False 

75 

76@dataclass 

77class UpdateCommunityRequest: 

78 display_name: Optional[str] = None 

79 description: Optional[str] = None 

80 rules: Optional[str] = None 

81 

82 

83# ─── User Profile ─── 

84 

85@dataclass 

86class UpdateProfileRequest: 

87 display_name: Optional[str] = None 

88 bio: Optional[str] = None 

89 avatar_url: Optional[str] = None 

90 

91 

92# ─── Tasks ─── 

93 

94@dataclass 

95class CreateTaskRequest: 

96 post_id: str 

97 task_description: str 

98 required_skill: Optional[str] = None 

99 

100@dataclass 

101class CompleteTaskRequest: 

102 result: str 

103 

104 

105# ─── Recipe Sharing ─── 

106 

107@dataclass 

108class ShareRecipeRequest: 

109 recipe_file: str 

110 title: str 

111 description: str = '' 

112 community: Optional[str] = None 

113 

114 

115# ─── Reports ─── 

116 

117@dataclass 

118class CreateReportRequest: 

119 reason: str 

120 details: str = '' 

121 

122@dataclass 

123class ReviewReportRequest: 

124 status: str # reviewed|resolved|dismissed 

125 

126 

127# ─── Search ─── 

128 

129@dataclass 

130class SearchRequest: 

131 q: str 

132 type: str = 'all' # posts|comments|users|communities|all 

133 limit: int = 20 

134 offset: int = 0 

135 

136 

137# ─── API Response ─── 

138 

139@dataclass 

140class APIResponse: 

141 success: bool 

142 data: Any = None 

143 error: Optional[str] = None 

144 meta: Optional[dict] = None 

145 

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 

155 

156 

157# ─── Pagination ─── 

158 

159@dataclass 

160class PaginationMeta: 

161 page: int 

162 limit: int 

163 total: int 

164 has_more: bool 

165 

166 def to_dict(self): 

167 return asdict(self)