mas_handlers/graphql/model/
site_config.rs1#![allow(clippy::str_to_string)] use async_graphql::{ComplexObject, Enum, ID, SimpleObject};
10use url::Url;
11
12pub const SITE_CONFIG_ID: &str = "site_config";
13pub const CAPTCHA_CONFIG_ID: &str = "captcha_config";
14
15#[derive(SimpleObject)]
16#[graphql(complex)]
17#[allow(clippy::struct_excessive_bools)]
18pub struct SiteConfig {
19 captcha_config: Option<CaptchaConfig>,
21
22 server_name: String,
24
25 policy_uri: Option<Url>,
27
28 tos_uri: Option<Url>,
30
31 imprint: Option<String>,
33
34 email_change_allowed: bool,
36
37 display_name_change_allowed: bool,
39
40 password_login_enabled: bool,
42
43 password_change_allowed: bool,
45
46 password_registration_enabled: bool,
48
49 account_deactivation_allowed: bool,
51
52 minimum_password_complexity: u8,
56
57 login_with_email_allowed: bool,
59
60 plan_management_iframe_uri: Option<String>,
62}
63
64#[derive(SimpleObject)]
65#[graphql(complex)]
66pub struct CaptchaConfig {
67 pub service: CaptchaService,
69
70 pub site_key: String,
72}
73
74#[derive(Enum, Debug, Clone, Copy, PartialEq, Eq)]
76pub enum CaptchaService {
77 RecaptchaV2,
78 CloudflareTurnstile,
79 HCaptcha,
80}
81
82#[ComplexObject]
83impl SiteConfig {
84 pub async fn id(&self) -> ID {
86 SITE_CONFIG_ID.into()
87 }
88}
89
90impl SiteConfig {
91 pub fn new(data_model: &mas_data_model::SiteConfig) -> Self {
94 Self {
95 captcha_config: data_model.captcha.as_ref().map(CaptchaConfig::new),
96 server_name: data_model.server_name.clone(),
97 policy_uri: data_model.policy_uri.clone(),
98 tos_uri: data_model.tos_uri.clone(),
99 imprint: data_model.imprint.clone(),
100 email_change_allowed: data_model.email_change_allowed,
101 display_name_change_allowed: data_model.displayname_change_allowed,
102 password_login_enabled: data_model.password_login_enabled,
103 password_change_allowed: data_model.password_change_allowed,
104 password_registration_enabled: data_model.password_registration_enabled,
105 account_deactivation_allowed: data_model.account_deactivation_allowed,
106 minimum_password_complexity: data_model.minimum_password_complexity,
107 login_with_email_allowed: data_model.login_with_email_allowed,
108 plan_management_iframe_uri: data_model.plan_management_iframe_uri.clone(),
109 }
110 }
111}
112
113#[ComplexObject]
114impl CaptchaConfig {
115 pub async fn id(&self) -> ID {
116 CAPTCHA_CONFIG_ID.into()
117 }
118}
119
120impl CaptchaConfig {
121 pub fn new(data_model: &mas_data_model::CaptchaConfig) -> Self {
124 Self {
125 service: match data_model.service {
126 mas_data_model::CaptchaService::RecaptchaV2 => CaptchaService::RecaptchaV2,
127 mas_data_model::CaptchaService::CloudflareTurnstile => {
128 CaptchaService::CloudflareTurnstile
129 }
130 mas_data_model::CaptchaService::HCaptcha => CaptchaService::HCaptcha,
131 },
132 site_key: data_model.site_key.clone(),
133 }
134 }
135}