1use super::{
2 ExtensionSettings, SettingsDeserializeExt, SettingsDeserializer, SettingsSerializeExt,
3 SettingsSerializer,
4};
5use compact_str::ToCompactString;
6use serde::{Deserialize, Serialize};
7use utoipa::ToSchema;
8
9#[derive(Clone, ToSchema, Serialize, Deserialize)]
10pub struct AppSettingsUser {
11 pub max_server_group_count: u64,
12 pub max_api_key_count: u64,
13 pub max_command_snippet_count: u64,
14 pub max_security_key_count: u64,
15 pub max_ssh_key_count: u64,
16 pub max_settings_count: u64,
17 pub max_settings_value_bytes: u64,
18
19 pub allow_changing_language: bool,
20 pub allow_changing_avatar: bool,
21
22 pub route_order: Option<Vec<super::RouteOrderItem>>,
23}
24
25#[async_trait::async_trait]
26impl SettingsSerializeExt for AppSettingsUser {
27 async fn serialize(
28 &self,
29 serializer: SettingsSerializer,
30 ) -> Result<SettingsSerializer, anyhow::Error> {
31 Ok(serializer
32 .write_raw_setting(
33 "max_server_group_count",
34 self.max_server_group_count.to_compact_string(),
35 )
36 .write_raw_setting(
37 "max_api_key_count",
38 self.max_api_key_count.to_compact_string(),
39 )
40 .write_raw_setting(
41 "max_command_snippet_count",
42 self.max_command_snippet_count.to_compact_string(),
43 )
44 .write_raw_setting(
45 "max_security_key_count",
46 self.max_security_key_count.to_compact_string(),
47 )
48 .write_raw_setting(
49 "max_ssh_key_count",
50 self.max_ssh_key_count.to_compact_string(),
51 )
52 .write_raw_setting(
53 "max_settings_count",
54 self.max_settings_count.to_compact_string(),
55 )
56 .write_raw_setting(
57 "max_settings_value_bytes",
58 self.max_settings_value_bytes.to_compact_string(),
59 )
60 .write_raw_setting(
61 "allow_changing_language",
62 self.allow_changing_language.to_compact_string(),
63 )
64 .write_raw_setting(
65 "allow_changing_avatar",
66 self.allow_changing_avatar.to_compact_string(),
67 )
68 .write_serde_setting("route_order", &self.route_order)?)
69 }
70}
71
72pub struct AppSettingsUserDeserializer;
73
74#[async_trait::async_trait]
75impl SettingsDeserializeExt for AppSettingsUserDeserializer {
76 async fn deserialize_boxed(
77 &self,
78 mut deserializer: SettingsDeserializer<'_>,
79 ) -> Result<ExtensionSettings, anyhow::Error> {
80 Ok(Box::new(AppSettingsUser {
81 max_server_group_count: deserializer
82 .take_raw_setting("max_server_group_count")
83 .and_then(|s| s.parse().ok())
84 .unwrap_or(25),
85 max_api_key_count: deserializer
86 .take_raw_setting("max_api_key_count")
87 .and_then(|s| s.parse().ok())
88 .unwrap_or(50),
89 max_command_snippet_count: deserializer
90 .take_raw_setting("max_command_snippet_count")
91 .and_then(|s| s.parse().ok())
92 .unwrap_or(100),
93 max_security_key_count: deserializer
94 .take_raw_setting("max_security_key_count")
95 .and_then(|s| s.parse().ok())
96 .unwrap_or(50),
97 max_ssh_key_count: deserializer
98 .take_raw_setting("max_ssh_key_count")
99 .and_then(|s| s.parse().ok())
100 .unwrap_or(50),
101 max_settings_count: deserializer
102 .take_raw_setting("max_settings_count")
103 .and_then(|s| s.parse().ok())
104 .unwrap_or(512),
105 max_settings_value_bytes: deserializer
106 .take_raw_setting("max_settings_value_bytes")
107 .and_then(|s| s.parse().ok())
108 .unwrap_or(16384),
109 allow_changing_language: deserializer
110 .take_raw_setting("allow_changing_language")
111 .map(|s| s == "true")
112 .unwrap_or(true),
113 allow_changing_avatar: deserializer
114 .take_raw_setting("allow_changing_avatar")
115 .map(|s| s == "true")
116 .unwrap_or(true),
117 route_order: deserializer
118 .read_serde_setting("route_order")
119 .unwrap_or_default(),
120 }))
121 }
122}