Skip to main content

shared/settings/
activity.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(ToSchema, Serialize, Deserialize, Clone, Copy)]
10#[serde(rename_all = "snake_case")]
11pub enum ActivityIpHiding {
12    Admins,
13    AllUsers,
14    None,
15}
16
17#[derive(Clone, ToSchema, Serialize, Deserialize)]
18pub struct AppSettingsActivity {
19    pub admin_log_retention_days: u16,
20    pub admin_log_retention_count: Option<u64>,
21    pub user_log_retention_days: u16,
22    pub user_log_retention_count: Option<u64>,
23    pub server_log_retention_days: u16,
24    pub server_log_retention_count: Option<u64>,
25
26    pub server_log_admin_activity: bool,
27    pub server_log_schedule_activity: bool,
28    pub server_hide_activity_ips: ActivityIpHiding,
29}
30
31#[async_trait::async_trait]
32impl SettingsSerializeExt for AppSettingsActivity {
33    async fn serialize(
34        &self,
35        serializer: SettingsSerializer,
36    ) -> Result<SettingsSerializer, anyhow::Error> {
37        Ok(serializer
38            .write_raw_setting(
39                "admin_log_retention_days",
40                self.admin_log_retention_days.to_compact_string(),
41            )
42            .write_raw_setting(
43                "admin_log_retention_count",
44                self.admin_log_retention_count
45                    .map_or("".into(), |c| c.to_compact_string()),
46            )
47            .write_raw_setting(
48                "user_log_retention_days",
49                self.user_log_retention_days.to_compact_string(),
50            )
51            .write_raw_setting(
52                "user_log_retention_count",
53                self.user_log_retention_count
54                    .map_or("".into(), |c| c.to_compact_string()),
55            )
56            .write_raw_setting(
57                "server_log_retention_days",
58                self.server_log_retention_days.to_compact_string(),
59            )
60            .write_raw_setting(
61                "server_log_retention_count",
62                self.server_log_retention_count
63                    .map_or("".into(), |c| c.to_compact_string()),
64            )
65            .write_raw_setting(
66                "server_log_admin_activity",
67                self.server_log_admin_activity.to_compact_string(),
68            )
69            .write_raw_setting(
70                "server_log_schedule_activity",
71                self.server_log_schedule_activity.to_compact_string(),
72            )
73            .write_raw_setting(
74                "server_hide_activity_ips",
75                match self.server_hide_activity_ips {
76                    ActivityIpHiding::Admins => "admins",
77                    ActivityIpHiding::AllUsers => "all_users",
78                    ActivityIpHiding::None => "none",
79                },
80            ))
81    }
82}
83
84pub struct AppSettingsActivityDeserializer;
85
86#[async_trait::async_trait]
87impl SettingsDeserializeExt for AppSettingsActivityDeserializer {
88    async fn deserialize_boxed(
89        &self,
90        mut deserializer: SettingsDeserializer<'_>,
91    ) -> Result<ExtensionSettings, anyhow::Error> {
92        Ok(Box::new(AppSettingsActivity {
93            admin_log_retention_days: deserializer
94                .take_raw_setting("admin_log_retention_days")
95                .and_then(|s| s.parse().ok())
96                .unwrap_or(180),
97            admin_log_retention_count: deserializer
98                .take_raw_setting("admin_log_retention_count")
99                .and_then(|s| s.parse().ok()),
100            user_log_retention_days: deserializer
101                .take_raw_setting("user_log_retention_days")
102                .and_then(|s| s.parse().ok())
103                .unwrap_or(180),
104            user_log_retention_count: deserializer
105                .take_raw_setting("user_log_retention_count")
106                .and_then(|s| s.parse().ok()),
107            server_log_retention_days: deserializer
108                .take_raw_setting("server_log_retention_days")
109                .and_then(|s| s.parse().ok())
110                .unwrap_or(90),
111            server_log_retention_count: deserializer
112                .take_raw_setting("server_log_retention_count")
113                .and_then(|s| s.parse().ok()),
114            server_log_admin_activity: deserializer
115                .take_raw_setting("server_log_admin_activity")
116                .map(|s| s == "true")
117                .unwrap_or(true),
118            server_log_schedule_activity: deserializer
119                .take_raw_setting("server_log_schedule_activity")
120                .map(|s| s == "true")
121                .unwrap_or(true),
122            server_hide_activity_ips: match deserializer
123                .take_raw_setting("server_hide_activity_ips")
124                .as_deref()
125            {
126                Some("admins") => ActivityIpHiding::Admins,
127                Some("all_users") => ActivityIpHiding::AllUsers,
128                _ => ActivityIpHiding::None,
129            },
130        }))
131    }
132}