Skip to main content

uptrakit_openapi_client/
settings.rs

1use crate::Result;
2use crate::UptrakitClient;
3use crate::types_impl::server_cert::RenewServerCertResponse;
4use crate::types_impl::settings_access::{AccessSettingsResponse, UpdateAccessSettingsRequest};
5use crate::types_impl::settings_agent_certs::{
6    AgentCertificateSettingsResponse, UpdateAgentCertificateSettingsRequest,
7};
8use crate::types_impl::settings_ca::RotateCaResponse;
9use crate::types_impl::settings_combined::{
10    CombinedSettingsResponse, GlobalSettingsCombinedResponse,
11};
12use crate::types_impl::settings_network::{NetworkSettingsResponse, UpdateNetworkSettingsRequest};
13use crate::types_impl::settings_reset::{ResetDataRequest, ResetDataResponse};
14
15impl UptrakitClient {
16    /// Get combined global settings (network, system services, MQTT limit, optional NATS).
17    pub async fn get_global_combined_settings(&self) -> Result<GlobalSettingsCombinedResponse> {
18        self.get(crate::paths::global_settings::COMBINED).await
19    }
20
21    /// Get combined settings (access, certificates, enrollment tokens).
22    pub async fn get_combined_settings(&self) -> Result<CombinedSettingsResponse> {
23        self.get(crate::paths::settings::COMBINED).await
24    }
25
26    /// Get access settings (registration + authentication combined).
27    /// Returns the response body and the raw `ETag` header value.
28    pub async fn get_access_settings(&self) -> Result<(AccessSettingsResponse, String)> {
29        self.get_with_etag(crate::paths::settings::ACCESS).await
30    }
31
32    /// Update access settings.  `etag` must be the value returned by a prior
33    /// `get_access_settings` call — the server requires `If-Match` for optimistic locking.
34    pub async fn update_access_settings(
35        &self,
36        req: &UpdateAccessSettingsRequest,
37        etag: &str,
38    ) -> Result<(AccessSettingsResponse, String)> {
39        self.put_json_with_etag(crate::paths::settings::ACCESS, req, etag)
40            .await
41    }
42
43    /// Get agent certificate settings.
44    pub async fn get_agent_certificate_settings(&self) -> Result<AgentCertificateSettingsResponse> {
45        self.get(crate::paths::settings::AGENT_CERTIFICATES).await
46    }
47
48    /// Update agent certificate settings.
49    pub async fn update_agent_certificate_settings(
50        &self,
51        req: &UpdateAgentCertificateSettingsRequest,
52    ) -> Result<AgentCertificateSettingsResponse> {
53        self.put_json(crate::paths::settings::AGENT_CERTIFICATES, req)
54            .await
55    }
56
57    /// Get network settings.
58    pub async fn get_network_settings(&self) -> Result<NetworkSettingsResponse> {
59        self.get(crate::paths::settings::NETWORK).await
60    }
61
62    /// Update network settings.
63    pub async fn update_network_settings(
64        &self,
65        req: &UpdateNetworkSettingsRequest,
66    ) -> Result<NetworkSettingsResponse> {
67        self.put_json(crate::paths::settings::NETWORK, req).await
68    }
69
70    /// Rotate the CA certificate.
71    pub async fn rotate_ca(&self) -> Result<RotateCaResponse> {
72        self.post_empty(crate::paths::settings::ROTATE_CA).await
73    }
74
75    /// Renew the server TLS certificate.
76    pub async fn renew_server_certificate(&self) -> Result<RenewServerCertResponse> {
77        self.post_empty(crate::paths::settings::RENEW_SERVER_CERT)
78            .await
79    }
80
81    /// Reset all tenant-scoped data.
82    pub async fn reset_data(&self, req: &ResetDataRequest) -> Result<ResetDataResponse> {
83        self.post_json(crate::paths::settings::RESET_DATA, req)
84            .await
85    }
86}
87
88#[cfg(test)]
89mod tests {
90    use crate::types_impl::SecretString;
91    use crate::types_impl::registration::RegistrationMode;
92    use crate::types_impl::settings_access::UpdateAccessSettingsRequest;
93    use crate::types_impl::settings_agent_certs::UpdateAgentCertificateSettingsRequest;
94    use crate::types_impl::settings_network::UpdateNetworkSettingsRequest;
95
96    #[test]
97    fn update_access_settings_serialization() {
98        let req = UpdateAccessSettingsRequest {
99            mode: RegistrationMode::Invite,
100            token: Some(SecretString::new("my-invite-token")),
101            require_token_for_oidc: Some(true),
102            password_auth_enabled: Some(false),
103            two_factor_required: None,
104        };
105        let json = serde_json::to_value(&req).expect("serialize");
106        assert_eq!(json["mode"], "invite");
107        assert_eq!(json["token"], "my-invite-token");
108        assert_eq!(json["require_token_for_oidc"], true);
109        assert_eq!(json["password_auth_enabled"], false);
110    }
111
112    #[test]
113    fn update_agent_certificate_settings_serialization() {
114        let req = UpdateAgentCertificateSettingsRequest {
115            lifetime_hours: Some(8_760),
116            renewal_window_hours: Some(72),
117        };
118        let json = serde_json::to_value(&req).expect("serialize");
119        assert_eq!(json["lifetime_hours"], 8_760);
120        assert_eq!(json["renewal_window_hours"], 72);
121    }
122
123    #[test]
124    fn update_network_settings_serialization() {
125        let req = UpdateNetworkSettingsRequest {
126            trusted_proxies: Some(vec!["10.0.0.0/8".to_string()]),
127            real_ip_header: Some("X-Real-IP".to_string()),
128            sans: None,
129            https_addr: None,
130            forwarded_client_cert_info_header: None,
131            forwarded_client_cert_pem_header: None,
132            pki_addr: None,
133            regenerate_cert: None,
134        };
135        let json = serde_json::to_value(&req).expect("serialize");
136        assert_eq!(json["trusted_proxies"][0], "10.0.0.0/8");
137        assert_eq!(json["real_ip_header"], "X-Real-IP");
138    }
139}