1use super::{Channel, File, RE_COLOUR};
2
3use revolt_permissions::{Override, OverrideField};
4use std::collections::HashMap;
5
6#[cfg(feature = "validator")]
7use validator::Validate;
8
9#[cfg(feature = "rocket")]
10use rocket::FromForm;
11
12auto_derived_partial!(
13 pub struct Server {
15 #[cfg_attr(feature = "serde", serde(rename = "_id"))]
17 pub id: String,
18 pub owner: String,
20
21 pub name: String,
23 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
25 pub description: Option<String>,
26
27 pub channels: Vec<String>,
30 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
32 pub categories: Option<Vec<Category>>,
33 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
35 pub system_messages: Option<SystemMessageChannels>,
36
37 #[cfg_attr(
39 feature = "serde",
40 serde(
41 default = "HashMap::<String, Role>::new",
42 skip_serializing_if = "HashMap::<String, Role>::is_empty"
43 )
44 )]
45 pub roles: HashMap<String, Role>,
46 pub default_permissions: i64,
48
49 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
51 pub icon: Option<File>,
52 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
54 pub banner: Option<File>,
55
56 #[cfg_attr(
58 feature = "serde",
59 serde(skip_serializing_if = "crate::if_zero_u32", default)
60 )]
61 pub flags: u32,
62
63 #[cfg_attr(
65 feature = "serde",
66 serde(skip_serializing_if = "crate::if_false", default)
67 )]
68 pub nsfw: bool,
69 #[cfg_attr(
71 feature = "serde",
72 serde(skip_serializing_if = "crate::if_false", default)
73 )]
74 pub analytics: bool,
75 #[cfg_attr(
77 feature = "serde",
78 serde(skip_serializing_if = "crate::if_false", default)
79 )]
80 pub discoverable: bool,
81 },
82 "PartialServer"
83);
84
85auto_derived_partial!(
86 pub struct Role {
88 pub name: String,
90 pub permissions: OverrideField,
92 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
96 pub colour: Option<String>,
97 #[cfg_attr(
99 feature = "serde",
100 serde(skip_serializing_if = "crate::if_false", default)
101 )]
102 pub hoist: bool,
103 #[cfg_attr(feature = "serde", serde(default))]
105 pub rank: i64,
106 },
107 "PartialRole"
108);
109
110auto_derived!(
111 pub enum FieldsServer {
113 Description,
114 Categories,
115 SystemMessages,
116 Icon,
117 Banner,
118 }
119
120 pub enum FieldsRole {
122 Colour,
123 }
124
125 #[cfg_attr(feature = "validator", derive(Validate))]
127 pub struct Category {
128 #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
130 pub id: String,
131 #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
133 pub title: String,
134 pub channels: Vec<String>,
136 }
137
138 pub struct SystemMessageChannels {
140 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
142 pub user_joined: Option<String>,
143 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
145 pub user_left: Option<String>,
146 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
148 pub user_kicked: Option<String>,
149 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
151 pub user_banned: Option<String>,
152 }
153
154 #[derive(Default)]
156 #[cfg_attr(feature = "validator", derive(Validate))]
157 pub struct DataCreateServer {
158 #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
160 pub name: String,
161 #[cfg_attr(feature = "validator", validate(length(min = 0, max = 1024)))]
163 pub description: Option<String>,
164 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
166 pub nsfw: Option<bool>,
167 }
168
169 #[cfg_attr(feature = "validator", derive(Validate))]
171 pub struct DataCreateRole {
172 #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
174 pub name: String,
175 pub rank: Option<i64>,
179 }
180
181 pub struct NewRoleResponse {
183 pub id: String,
185 pub role: Role,
187 }
188
189 pub struct CreateServerLegacyResponse {
191 pub server: Server,
193 pub channels: Vec<Channel>,
195 }
196
197 #[cfg_attr(feature = "rocket", derive(FromForm))]
199 pub struct OptionsFetchServer {
200 pub include_channels: Option<bool>,
202 }
203
204 #[serde(untagged)]
206 pub enum FetchServerResponse {
207 JustServer(Server),
208 ServerWithChannels {
209 #[serde(flatten)]
210 server: Server,
211 channels: Vec<Channel>,
212 },
213 }
214
215 #[cfg_attr(feature = "validator", derive(Validate))]
217 pub struct DataEditServer {
218 #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
220 pub name: Option<String>,
221 #[cfg_attr(feature = "validator", validate(length(min = 0, max = 1024)))]
223 pub description: Option<String>,
224
225 pub icon: Option<String>,
227 pub banner: Option<String>,
229
230 #[cfg_attr(feature = "validator", validate)]
232 pub categories: Option<Vec<Category>>,
233 pub system_messages: Option<SystemMessageChannels>,
235
236 #[cfg_attr(feature = "validator", serde(skip_serializing_if = "Option::is_none"))]
238 pub flags: Option<i32>,
239
240 pub discoverable: Option<bool>,
244 pub analytics: Option<bool>,
248
249 #[cfg_attr(feature = "validator", validate(length(min = 1)))]
251 pub remove: Option<Vec<FieldsServer>>,
252 }
253
254 #[cfg_attr(feature = "validator", derive(Validate))]
256 pub struct DataEditRole {
257 #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))]
259 pub name: Option<String>,
260 #[cfg_attr(
262 feature = "validator",
263 validate(length(min = 1, max = 128), regex = "RE_COLOUR")
264 )]
265 pub colour: Option<String>,
266 pub hoist: Option<bool>,
268 pub rank: Option<i64>,
272 #[cfg_attr(feature = "validator", validate(length(min = 1)))]
274 pub remove: Option<Vec<FieldsRole>>,
275 }
276
277 pub struct DataSetServerRolePermission {
279 pub permissions: Override,
281 }
282
283 #[cfg_attr(feature = "rocket", derive(FromForm))]
285 pub struct OptionsServerDelete {
286 pub leave_silently: Option<bool>,
288 }
289
290 pub struct DataEditRoleRanks {
292 pub ranks: Vec<String>,
293 }
294);