Skip to main content

composio_sdk/models/
project.rs

1//! Project configuration models for Composio API.
2
3use serde::{Deserialize, Serialize};
4
5/// Log visibility policy for project logs.
6#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
7#[serde(rename_all = "snake_case")]
8pub enum ProjectLogVisibilitySetting {
9    /// Store and show all logs.
10    ShowAll,
11    /// Do not store sensitive data in logs.
12    DontStoreData,
13}
14
15/// Project configuration response model.
16#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
17pub struct ProjectConfigResponse {
18    /// Whether 2FA is enabled for the project.
19    #[serde(rename = "is_2FA_enabled", alias = "is_2_fa_enabled")]
20    pub is_2_fa_enabled: bool,
21
22    /// Log visibility setting.
23    pub log_visibility_setting: ProjectLogVisibilitySetting,
24
25    /// Whether secret keys are masked in connected account outputs.
26    pub mask_secret_keys_in_connected_account: bool,
27
28    /// Optional display name for the project.
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub display_name: Option<String>,
31
32    /// Deprecated compatibility field.
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub is_composio_link_enabled_for_managed_auth: Option<bool>,
35
36    /// Optional project logo URL.
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub logo_url: Option<String>,
39
40    /// Whether MCP API key is required.
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub require_mcp_api_key: Option<bool>,
43
44    /// Signed URL file expiry in seconds.
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub signed_url_file_expiry_in_seconds: Option<f64>,
47}
48
49/// Project configuration update request model.
50#[derive(Debug, Clone, Serialize, Default, PartialEq)]
51pub struct ProjectConfigUpdateParams {
52    /// Optional display name for the project.
53    #[serde(skip_serializing_if = "Option::is_none")]
54    pub display_name: Option<String>,
55
56    /// Optional 2FA enablement value.
57    #[serde(
58        rename = "is_2FA_enabled",
59        alias = "is_2_fa_enabled",
60        skip_serializing_if = "Option::is_none"
61    )]
62    pub is_2_fa_enabled: Option<bool>,
63
64    /// Deprecated compatibility field.
65    #[serde(skip_serializing_if = "Option::is_none")]
66    pub is_composio_link_enabled_for_managed_auth: Option<bool>,
67
68    /// Optional log visibility setting.
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub log_visibility_setting: Option<ProjectLogVisibilitySetting>,
71
72    /// Optional project logo URL.
73    #[serde(skip_serializing_if = "Option::is_none")]
74    pub logo_url: Option<String>,
75
76    /// Optional secret key masking setting.
77    #[serde(skip_serializing_if = "Option::is_none")]
78    pub mask_secret_keys_in_connected_account: Option<bool>,
79
80    /// Optional MCP API key requirement.
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub require_mcp_api_key: Option<bool>,
83
84    /// Optional signed URL file expiry in seconds.
85    #[serde(skip_serializing_if = "Option::is_none")]
86    pub signed_url_file_expiry_in_seconds: Option<f64>,
87}
88
89#[cfg(test)]
90mod tests {
91    use super::*;
92
93    #[test]
94    fn test_project_config_update_serialization() {
95        let params = ProjectConfigUpdateParams {
96            display_name: Some("Engineering".to_string()),
97            is_2_fa_enabled: Some(true),
98            is_composio_link_enabled_for_managed_auth: None,
99            log_visibility_setting: Some(ProjectLogVisibilitySetting::DontStoreData),
100            logo_url: None,
101            mask_secret_keys_in_connected_account: Some(true),
102            require_mcp_api_key: Some(false),
103            signed_url_file_expiry_in_seconds: Some(900.0),
104        };
105
106        let json = serde_json::to_value(&params).unwrap();
107        assert_eq!(json["display_name"], "Engineering");
108        assert_eq!(json["is_2FA_enabled"], true);
109        assert_eq!(json["log_visibility_setting"], "dont_store_data");
110        assert!(json.get("logo_url").is_none());
111    }
112
113    #[test]
114    fn test_project_config_response_deserialization_with_2fa_alias() {
115        let payload = r#"{
116            "is_2FA_enabled": true,
117            "log_visibility_setting": "show_all",
118            "mask_secret_keys_in_connected_account": false,
119            "display_name": "Acme",
120            "require_mcp_api_key": true
121        }"#;
122
123        let response: ProjectConfigResponse = serde_json::from_str(payload).unwrap();
124        assert!(response.is_2_fa_enabled);
125        assert_eq!(
126            response.log_visibility_setting,
127            ProjectLogVisibilitySetting::ShowAll
128        );
129        assert_eq!(response.display_name.as_deref(), Some("Acme"));
130        assert_eq!(response.require_mcp_api_key, Some(true));
131    }
132
133    #[test]
134    fn test_project_config_response_deserialization_with_snake_case_alias() {
135        let payload = r#"{
136            "is_2_fa_enabled": false,
137            "log_visibility_setting": "dont_store_data",
138            "mask_secret_keys_in_connected_account": true
139        }"#;
140
141        let response: ProjectConfigResponse = serde_json::from_str(payload).unwrap();
142        assert!(!response.is_2_fa_enabled);
143        assert_eq!(
144            response.log_visibility_setting,
145            ProjectLogVisibilitySetting::DontStoreData
146        );
147        assert!(response.mask_secret_keys_in_connected_account);
148    }
149}