1#[cfg(feature = "12-62-0")]
2use crate::model::clip::Clip;
3use crate::model::{id::Id, user::User};
4
5use serde::Serialize;
6use typed_builder::TypedBuilder;
7use url::Url;
8
9#[derive(Serialize, Default, Debug, Clone, TypedBuilder)]
10#[serde(rename_all = "camelCase")]
11#[builder(doc)]
12pub struct Request {
13 #[builder(default, setter(strip_option))]
14 pub disable_registration: Option<bool>,
15 #[builder(default, setter(strip_option))]
16 pub disable_local_timeline: Option<bool>,
17 #[builder(default, setter(strip_option))]
18 pub disable_global_timeline: Option<bool>,
19 #[builder(default, setter(strip_option))]
20 pub use_star_for_reaction_fallback: Option<bool>,
21 #[builder(default, setter(strip_option))]
22 pub pinned_users: Option<Vec<String>>,
23 #[cfg(feature = "12-58-0")]
24 #[cfg_attr(docsrs, doc(cfg(feature = "12-58-0")))]
25 #[serde(skip_serializing_if = "Option::is_none")]
26 #[builder(default, setter(strip_option))]
27 pub pinned_pages: Option<Vec<String>>,
28 #[cfg(feature = "12-62-0")]
29 #[cfg_attr(docsrs, doc(cfg(feature = "12-62-0")))]
30 #[serde(skip_serializing_if = "Option::is_none")]
31 #[builder(default, setter(strip_option))]
32 pub pinned_clip_id: Option<Option<Id<Clip>>>,
33 #[builder(default, setter(strip_option))]
34 pub hidden_tags: Option<Vec<String>>,
35 #[builder(default, setter(strip_option))]
36 pub blocked_hosts: Option<Vec<String>>,
37 #[serde(skip_serializing_if = "Option::is_none")]
38 #[builder(default, setter(strip_option))]
39 pub mascot_image_url: Option<Option<String>>,
40 #[serde(skip_serializing_if = "Option::is_none")]
41 #[builder(default, setter(strip_option))]
42 pub bannar_url: Option<Option<String>>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 #[builder(default, setter(strip_option))]
45 pub icon_url: Option<Option<String>>,
46 #[cfg(feature = "12-60-0")]
47 #[cfg_attr(docsrs, doc(cfg(feature = "12-60-0")))]
48 #[serde(skip_serializing_if = "Option::is_none")]
49 #[builder(default, setter(strip_option))]
50 pub background_image_url: Option<Option<String>>,
51 #[cfg(feature = "12-60-0")]
52 #[cfg_attr(docsrs, doc(cfg(feature = "12-60-0")))]
53 #[serde(skip_serializing_if = "Option::is_none")]
54 #[builder(default, setter(strip_option))]
55 pub logo_image_url: Option<Option<String>>,
56 #[serde(skip_serializing_if = "Option::is_none")]
57 #[builder(default, setter(strip_option))]
58 pub name: Option<Option<String>>,
59 #[serde(skip_serializing_if = "Option::is_none")]
60 #[builder(default, setter(strip_option))]
61 pub description: Option<Option<String>>,
62 #[serde(skip_serializing_if = "Option::is_none")]
63 #[builder(default, setter(strip_option))]
64 pub max_note_text_length: Option<u64>,
65 #[serde(skip_serializing_if = "Option::is_none")]
66 #[builder(default, setter(strip_option))]
67 pub local_drive_capacity_mb: Option<u64>,
68 #[serde(skip_serializing_if = "Option::is_none")]
69 #[builder(default, setter(strip_option))]
70 pub remote_drive_capacity_mb: Option<u64>,
71 #[serde(skip_serializing_if = "Option::is_none")]
72 #[builder(default, setter(strip_option))]
73 pub cache_remote_files: Option<bool>,
74 #[serde(skip_serializing_if = "Option::is_none")]
75 #[builder(default, setter(strip_option))]
76 pub proxy_remote_files: Option<bool>,
77 #[cfg(feature = "12-37-0")]
78 #[cfg_attr(docsrs, doc(cfg(feature = "12-37-0")))]
79 #[serde(skip_serializing_if = "Option::is_none")]
80 #[builder(default, setter(strip_option))]
81 pub enable_hcaptcha: Option<bool>,
82 #[cfg(feature = "12-37-0")]
83 #[cfg_attr(docsrs, doc(cfg(feature = "12-37-0")))]
84 #[serde(skip_serializing_if = "Option::is_none")]
85 #[builder(default, setter(strip_option))]
86 pub hcaptcha_site_key: Option<Option<String>>,
87 #[cfg(feature = "12-37-0")]
88 #[cfg_attr(docsrs, doc(cfg(feature = "12-37-0")))]
89 #[serde(skip_serializing_if = "Option::is_none")]
90 #[builder(default, setter(strip_option))]
91 pub hcaptcha_secret_key: Option<Option<String>>,
92 #[serde(skip_serializing_if = "Option::is_none")]
93 #[builder(default, setter(strip_option))]
94 pub enable_recaptcha: Option<bool>,
95 #[serde(skip_serializing_if = "Option::is_none")]
96 #[builder(default, setter(strip_option))]
97 pub recaptcha_site_key: Option<Option<String>>,
98 #[serde(skip_serializing_if = "Option::is_none")]
99 #[builder(default, setter(strip_option))]
100 pub recaptcha_secret_key: Option<Option<String>>,
101 #[serde(skip_serializing_if = "Option::is_none")]
102 #[builder(default, setter(strip_option))]
103 pub proxy_account_id: Option<Option<Id<User>>>,
104 #[serde(skip_serializing_if = "Option::is_none")]
105 #[builder(default, setter(strip_option))]
106 pub maintainer_name: Option<Option<String>>,
107 #[serde(skip_serializing_if = "Option::is_none")]
108 #[builder(default, setter(strip_option))]
109 pub maintainer_email: Option<Option<String>>,
110 #[serde(skip_serializing_if = "Option::is_none")]
111 #[builder(default, setter(strip_option))]
112 pub langs: Option<Vec<String>>,
113 #[serde(skip_serializing_if = "Option::is_none")]
114 #[builder(default, setter(strip_option))]
115 pub summaly_proxy: Option<Option<Url>>,
116 #[serde(skip_serializing_if = "Option::is_none")]
117 #[builder(default, setter(strip_option))]
118 pub enable_twitter_integration: Option<bool>,
119 #[serde(skip_serializing_if = "Option::is_none")]
120 #[builder(default, setter(strip_option))]
121 pub twitter_consumer_key: Option<Option<String>>,
122 #[serde(skip_serializing_if = "Option::is_none")]
123 #[builder(default, setter(strip_option))]
124 pub twitter_consumer_secret: Option<Option<String>>,
125 #[serde(skip_serializing_if = "Option::is_none")]
126 #[builder(default, setter(strip_option))]
127 pub enable_github_integration: Option<bool>,
128 #[serde(skip_serializing_if = "Option::is_none")]
129 #[builder(default, setter(strip_option))]
130 pub github_client_id: Option<Option<String>>,
131 #[serde(skip_serializing_if = "Option::is_none")]
132 #[builder(default, setter(strip_option))]
133 pub github_client_secret: Option<Option<String>>,
134 #[serde(skip_serializing_if = "Option::is_none")]
135 #[builder(default, setter(strip_option))]
136 pub enable_discord_integration: Option<bool>,
137 #[serde(skip_serializing_if = "Option::is_none")]
138 #[builder(default, setter(strip_option))]
139 pub discord_client_id: Option<Option<String>>,
140 #[serde(skip_serializing_if = "Option::is_none")]
141 #[builder(default, setter(strip_option))]
142 pub discord_client_secret: Option<Option<String>>,
143 #[serde(skip_serializing_if = "Option::is_none")]
144 #[builder(default, setter(strip_option))]
145 pub enable_email: Option<bool>,
146 #[serde(skip_serializing_if = "Option::is_none")]
147 #[builder(default, setter(strip_option))]
148 pub email: Option<Option<String>>,
149 #[serde(skip_serializing_if = "Option::is_none")]
150 #[builder(default, setter(strip_option))]
151 pub smtp_secure: Option<bool>,
152 #[serde(skip_serializing_if = "Option::is_none")]
153 #[builder(default, setter(strip_option))]
154 pub smtp_host: Option<Option<String>>,
155 #[serde(skip_serializing_if = "Option::is_none")]
156 #[builder(default, setter(strip_option))]
157 pub smtp_port: Option<Option<u16>>,
158 #[serde(skip_serializing_if = "Option::is_none")]
159 #[builder(default, setter(strip_option))]
160 pub smtp_user: Option<Option<String>>,
161 #[serde(skip_serializing_if = "Option::is_none")]
162 #[builder(default, setter(strip_option))]
163 pub smtp_pass: Option<Option<String>>,
164 #[serde(skip_serializing_if = "Option::is_none")]
165 #[builder(default, setter(strip_option))]
166 pub error_image_url: Option<Option<String>>,
167 #[serde(skip_serializing_if = "Option::is_none")]
168 #[builder(default, setter(strip_option))]
169 pub enable_service_worker: Option<bool>,
170 #[serde(skip_serializing_if = "Option::is_none")]
171 #[builder(default, setter(strip_option))]
172 pub sw_public_key: Option<Option<String>>,
173 #[serde(skip_serializing_if = "Option::is_none")]
174 #[builder(default, setter(strip_option))]
175 pub sw_private_key: Option<Option<String>>,
176 #[serde(skip_serializing_if = "Option::is_none")]
177 #[builder(default, setter(strip_option))]
178 pub tos_url: Option<Option<String>>,
179 #[serde(skip_serializing_if = "Option::is_none")]
180 #[builder(default, setter(strip_option))]
181 pub repository_url: Option<Url>,
182 #[serde(skip_serializing_if = "Option::is_none")]
183 #[builder(default, setter(strip_option))]
184 pub feedback_url: Option<Option<String>>,
185 #[serde(skip_serializing_if = "Option::is_none")]
186 #[builder(default, setter(strip_option))]
187 pub use_object_storage: Option<bool>,
188 #[serde(skip_serializing_if = "Option::is_none")]
189 #[builder(default, setter(strip_option))]
190 pub object_storage_base_url: Option<Option<Url>>,
191 #[serde(skip_serializing_if = "Option::is_none")]
192 #[builder(default, setter(strip_option))]
193 pub object_storage_bucket: Option<Option<String>>,
194 #[serde(skip_serializing_if = "Option::is_none")]
195 #[builder(default, setter(strip_option))]
196 pub object_storage_prefix: Option<Option<String>>,
197 #[serde(skip_serializing_if = "Option::is_none")]
198 #[builder(default, setter(strip_option))]
199 pub object_storage_endpoint: Option<Option<String>>,
200 #[serde(skip_serializing_if = "Option::is_none")]
201 #[builder(default, setter(strip_option))]
202 pub object_storage_region: Option<Option<String>>,
203 #[serde(skip_serializing_if = "Option::is_none")]
204 #[builder(default, setter(strip_option))]
205 pub object_storage_port: Option<Option<u16>>,
206 #[serde(skip_serializing_if = "Option::is_none")]
207 #[builder(default, setter(strip_option))]
208 pub object_storage_access_key: Option<Option<String>>,
209 #[serde(skip_serializing_if = "Option::is_none")]
210 #[builder(default, setter(strip_option))]
211 pub object_storage_secret_key: Option<Option<String>>,
212 #[serde(
213 rename = "objectStorageUseSSL",
214 skip_serializing_if = "Option::is_none"
215 )]
216 #[builder(default, setter(strip_option))]
217 pub object_storage_use_ssl: Option<bool>,
218 #[cfg(feature = "12-31-0")]
219 #[cfg_attr(docsrs, doc(cfg(feature = "12-31-0")))]
220 #[serde(skip_serializing_if = "Option::is_none")]
221 #[builder(default, setter(strip_option))]
222 pub object_storage_use_proxy: Option<bool>,
223 #[cfg(feature = "12-47-0")]
224 #[cfg_attr(docsrs, doc(cfg(feature = "12-47-0")))]
225 #[serde(skip_serializing_if = "Option::is_none")]
226 #[builder(default, setter(strip_option))]
227 pub object_storage_set_public_read: Option<bool>,
228}
229
230impl misskey_core::Request for Request {
231 type Response = ();
232 const ENDPOINT: &'static str = "admin/update-meta";
233}
234
235#[cfg(test)]
236mod tests {
237 use super::Request;
238 use crate::test::{ClientExt, TestClient};
239
240 #[tokio::test]
242 async fn request_with_name() {
243 let client = TestClient::new();
244 client
245 .admin
246 .test(
247 Request::builder()
248 .name(Some("instance name".to_string()))
249 .build(),
250 )
251 .await;
252 }
253
254 #[tokio::test]
255 async fn request_with_options() {
256 let client = TestClient::new();
257 let image_url = client.avatar_url().await;
258
259 client
260 .admin
261 .test(Request {
262 disable_registration: Some(false),
263 disable_local_timeline: Some(false),
264 disable_global_timeline: Some(false),
265 use_star_for_reaction_fallback: Some(false),
266 #[cfg(feature = "12-58-0")]
267 pinned_pages: Some(vec!["/announcements".to_string()]),
268 #[cfg(feature = "12-62-0")]
269 pinned_clip_id: Some(None),
270 pinned_users: Some(vec!["@admin".to_string(), "@testuser".to_string()]),
271 hidden_tags: Some(vec!["not_good".to_string()]),
272 blocked_hosts: Some(vec!["not.good.host".to_string()]),
273 mascot_image_url: Some(Some(image_url.to_string())),
274 bannar_url: Some(Some(image_url.to_string())),
275 icon_url: Some(Some(image_url.to_string())),
276 #[cfg(feature = "12-60-0")]
277 background_image_url: Some(Some(image_url.to_string())),
278 #[cfg(feature = "12-60-0")]
279 logo_image_url: Some(Some(image_url.to_string())),
280 name: None,
281 description: Some(Some("description!".to_string())),
282 max_note_text_length: Some(1000),
283 local_drive_capacity_mb: Some(1000),
284 remote_drive_capacity_mb: Some(1000),
285 cache_remote_files: Some(true),
286 proxy_remote_files: Some(true),
287 #[cfg(feature = "12-37-0")]
288 enable_hcaptcha: Some(false),
289 #[cfg(feature = "12-37-0")]
290 hcaptcha_site_key: Some(None),
291 #[cfg(feature = "12-37-0")]
292 hcaptcha_secret_key: Some(None),
293 enable_recaptcha: Some(false),
294 recaptcha_site_key: Some(None),
295 recaptcha_secret_key: Some(None),
296 proxy_account_id: Some(None),
297 maintainer_name: Some(Some("coord_e".to_string())),
298 maintainer_email: Some(Some("me@coord-e.com".to_string())),
299 langs: Some(vec!["ja_JP".to_string()]),
300 summaly_proxy: Some(None),
301 enable_twitter_integration: Some(false),
302 twitter_consumer_key: Some(None),
303 twitter_consumer_secret: Some(None),
304 enable_github_integration: Some(false),
305 github_client_id: Some(None),
306 github_client_secret: Some(None),
307 enable_discord_integration: Some(false),
308 discord_client_id: Some(None),
309 discord_client_secret: Some(None),
310 enable_email: Some(false),
311 email: Some(None),
312 smtp_secure: Some(true),
313 smtp_host: Some(None),
314 smtp_port: Some(None),
315 smtp_user: Some(None),
316 smtp_pass: Some(None),
317 error_image_url: Some(Some(image_url.to_string())),
318 enable_service_worker: Some(false),
319 sw_public_key: Some(None),
320 sw_private_key: Some(None),
321 tos_url: Some(None),
322 repository_url: Some(image_url.clone()),
323 feedback_url: Some(Some(image_url.to_string())),
324 use_object_storage: Some(false),
325 object_storage_base_url: Some(None),
326 object_storage_bucket: Some(None),
327 object_storage_prefix: Some(None),
328 object_storage_endpoint: Some(None),
329 object_storage_region: Some(None),
330 object_storage_port: Some(None),
331 object_storage_access_key: Some(None),
332 object_storage_secret_key: Some(None),
333 object_storage_use_ssl: Some(false),
334 #[cfg(feature = "12-31-0")]
335 object_storage_use_proxy: Some(false),
336 #[cfg(feature = "12-47-0")]
337 object_storage_set_public_read: Some(false),
338 })
339 .await;
340 }
341}