Skip to main content

dsc/api/
models.rs

1use serde::{Deserialize, Serialize};
2
3/// Response payload for site.json.
4#[derive(Debug, Deserialize)]
5pub struct SiteResponse {
6    pub site: SiteInfo,
7}
8
9/// Site metadata.
10#[derive(Debug, Deserialize)]
11pub struct SiteInfo {
12    pub title: String,
13}
14
15/// Response payload for about.json.
16#[derive(Debug, Deserialize)]
17pub struct AboutResponse {
18    pub about: AboutInfo,
19}
20
21/// About metadata.
22#[derive(Debug, Deserialize)]
23pub struct AboutInfo {
24    pub version: Option<String>,
25    pub installed_version: Option<String>,
26}
27
28/// Response payload for topic JSON.
29#[derive(Debug, Deserialize)]
30pub struct TopicResponse {
31    #[serde(default)]
32    pub title: Option<String>,
33    #[serde(default)]
34    pub slug: Option<String>,
35    pub post_stream: PostStream,
36}
37
38/// Topic post stream.
39#[derive(Debug, Deserialize)]
40pub struct PostStream {
41    pub posts: Vec<Post>,
42}
43
44/// Topic post.
45#[derive(Debug, Deserialize)]
46pub struct Post {
47    pub id: u64,
48    #[serde(default)]
49    pub raw: Option<String>,
50    #[serde(default)]
51    pub updated_at: Option<String>,
52    #[serde(default)]
53    pub created_at: Option<String>,
54}
55
56#[derive(Debug, Deserialize, Serialize)]
57pub struct CustomEmoji {
58    pub name: String,
59    pub url: String,
60}
61
62/// Response payload for category JSON.
63#[derive(Debug, Deserialize)]
64pub struct CategoryResponse {
65    #[serde(default)]
66    pub category: Option<CategoryInfo>,
67    pub topic_list: TopicList,
68}
69
70/// Category metadata.
71#[derive(Debug, Deserialize, Serialize, Clone)]
72pub struct CategoryInfo {
73    pub name: String,
74    pub slug: String,
75    #[serde(default)]
76    pub color: Option<String>,
77    #[serde(default)]
78    pub text_color: Option<String>,
79    pub id: Option<u64>,
80    #[serde(default)]
81    pub subcategory_list: Vec<CategoryInfo>,
82    #[serde(default)]
83    pub parent_category_id: Option<u64>,
84}
85
86/// Response payload for categories.json.
87#[derive(Debug, Deserialize)]
88pub struct CategoriesResponse {
89    pub category_list: CategoryList,
90}
91
92/// Category listing.
93#[derive(Debug, Deserialize)]
94pub struct CategoryList {
95    pub categories: Vec<CategoryInfo>,
96}
97
98/// Topic list for a category.
99#[derive(Debug, Deserialize)]
100pub struct TopicList {
101    pub topics: Vec<TopicSummary>,
102}
103
104/// Topic summary.
105#[derive(Debug, Deserialize, Serialize)]
106pub struct TopicSummary {
107    pub id: u64,
108    pub title: String,
109    pub slug: String,
110}
111
112/// Group summary.
113#[derive(Debug, Deserialize, Serialize, Clone)]
114pub struct GroupSummary {
115    pub id: u64,
116    pub name: String,
117    #[serde(default)]
118    pub full_name: Option<String>,
119}
120
121/// Response payload for groups.json.
122#[derive(Debug, Deserialize)]
123pub struct GroupsResponse {
124    pub groups: Vec<GroupSummary>,
125}
126
127#[derive(Debug, Deserialize, Serialize, Clone)]
128pub struct GroupMember {
129    pub id: u64,
130    pub username: String,
131    #[serde(default)]
132    pub name: Option<String>,
133}
134
135#[derive(Debug, Deserialize)]
136pub struct GroupMembersResponse {
137    pub members: Vec<GroupMember>,
138}
139
140/// Response payload for group detail.
141#[derive(Debug, Deserialize)]
142pub struct GroupDetailResponse {
143    pub group: GroupDetail,
144}
145
146/// Group details with settings used for deep-copy.
147#[derive(Debug, Deserialize, Serialize, Clone)]
148pub struct GroupDetail {
149    pub id: u64,
150    pub name: String,
151    #[serde(default)]
152    pub full_name: Option<String>,
153    #[serde(default)]
154    pub title: Option<String>,
155    #[serde(default)]
156    pub grant_trust_level: Option<u64>,
157    #[serde(default)]
158    pub visibility_level: Option<u64>,
159    #[serde(default)]
160    pub mentionable_level: Option<u64>,
161    #[serde(default)]
162    pub messageable_level: Option<u64>,
163    #[serde(default)]
164    pub default_notification_level: Option<u64>,
165    #[serde(default)]
166    pub members_visibility_level: Option<u64>,
167    #[serde(default)]
168    pub primary_group: Option<bool>,
169    #[serde(default)]
170    pub public_admission: Option<bool>,
171    #[serde(default)]
172    pub public_exit: Option<bool>,
173    #[serde(default)]
174    pub allow_membership_requests: Option<bool>,
175    #[serde(default)]
176    pub automatic_membership_email_domains: Option<String>,
177    #[serde(default)]
178    pub automatic_membership_retroactive: Option<bool>,
179    #[serde(default)]
180    pub membership_request_template: Option<String>,
181    #[serde(default)]
182    pub flair_icon: Option<String>,
183    #[serde(default)]
184    pub flair_upload_id: Option<u64>,
185    #[serde(default)]
186    pub flair_color: Option<String>,
187    #[serde(default)]
188    pub flair_background_color: Option<String>,
189    #[serde(default)]
190    pub bio_raw: Option<String>,
191}
192
193/// Response payload for creating a post/topic.
194#[derive(Debug, Deserialize)]
195pub struct CreatePostResponse {
196    pub id: u64,
197    pub topic_id: u64,
198}
199
200/// Response payload for creating a category.
201#[derive(Debug, Deserialize)]
202pub struct CreateCategoryResponse {
203    pub category: CreatedCategory,
204}
205
206/// Created category payload.
207#[derive(Debug, Deserialize)]
208pub struct CreatedCategory {
209    pub id: u64,
210}
211
212/// Response payload for creating a group.
213#[derive(Debug, Deserialize)]
214pub struct CreateGroupResponse {
215    pub group: CreatedGroup,
216}
217
218/// Created group payload.
219#[derive(Debug, Deserialize)]
220pub struct CreatedGroup {
221    pub id: u64,
222}