Skip to main content

shared/settings/
user.rs

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}