1use serde::{Deserialize, Serialize};
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
13#[serde(rename_all = "UPPERCASE")]
14pub enum AuthConfigStatus {
15 Enabled,
17 Disabled,
19}
20
21impl AuthConfigStatus {
22 pub fn as_str(self) -> &'static str {
24 match self {
25 Self::Enabled => "ENABLED",
26 Self::Disabled => "DISABLED",
27 }
28 }
29}
30
31#[derive(Debug, Clone, Default, Serialize, Deserialize)]
33pub struct AuthConfigListParams {
34 #[serde(skip_serializing_if = "Option::is_none")]
36 pub is_composio_managed: Option<bool>,
37
38 #[serde(skip_serializing_if = "Option::is_none")]
40 pub toolkit_slug: Option<String>,
41
42 #[serde(skip_serializing_if = "Option::is_none")]
44 pub show_disabled: Option<bool>,
45
46 #[serde(skip_serializing_if = "Option::is_none")]
48 pub search: Option<String>,
49
50 #[serde(skip_serializing_if = "Option::is_none")]
52 pub limit: Option<u32>,
53
54 #[serde(skip_serializing_if = "Option::is_none")]
56 pub cursor: Option<String>,
57}
58
59#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct AuthConfigListResponse {
62 pub items: Vec<AuthConfigInfo>,
64
65 #[serde(skip_serializing_if = "Option::is_none")]
67 pub next_cursor: Option<String>,
68
69 #[serde(skip_serializing_if = "Option::is_none")]
71 pub total_pages: Option<u32>,
72
73 #[serde(skip_serializing_if = "Option::is_none")]
75 pub current_page: Option<u32>,
76
77 #[serde(skip_serializing_if = "Option::is_none")]
79 pub total_items: Option<u32>,
80}
81
82#[derive(Debug, Clone, Serialize, Deserialize)]
84pub struct AuthConfigInfo {
85 pub id: String,
87
88 #[serde(skip_serializing_if = "Option::is_none")]
90 pub uuid: Option<String>,
91
92 #[serde(rename = "type")]
94 pub config_type: String,
95
96 pub toolkit: ToolkitInfo,
98
99 #[serde(skip_serializing_if = "Option::is_none")]
101 pub name: Option<String>,
102
103 pub auth_scheme: String,
105
106 #[serde(skip_serializing_if = "Option::is_none")]
108 pub credentials: Option<serde_json::Value>,
109
110 pub status: String,
112
113 pub created_at: String,
115
116 #[serde(skip_serializing_if = "Option::is_none")]
118 pub no_of_connections: Option<u32>,
119
120 #[serde(skip_serializing_if = "Option::is_none")]
122 pub tool_access_config: Option<serde_json::Value>,
123}
124
125#[derive(Debug, Clone, Serialize, Deserialize)]
127pub struct ToolkitInfo {
128 pub slug: String,
130
131 #[serde(skip_serializing_if = "Option::is_none")]
133 pub name: Option<String>,
134}
135
136#[derive(Debug, Clone, Serialize, Deserialize)]
138pub struct AuthConfigCreateParams {
139 pub toolkit: String,
141
142 pub options: AuthConfigOptions,
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize)]
148#[serde(tag = "type")]
149pub enum AuthConfigOptions {
150 #[serde(rename = "custom")]
152 Custom {
153 auth_scheme: String,
155
156 credentials: serde_json::Value,
158
159 #[serde(skip_serializing_if = "Option::is_none")]
161 restrict_to_following_tools: Option<Vec<String>>,
162 },
163
164 #[serde(rename = "default")]
166 Default {
167 #[serde(skip_serializing_if = "Option::is_none")]
169 scopes: Option<Vec<String>>,
170
171 #[serde(skip_serializing_if = "Option::is_none")]
173 user_scopes: Option<Vec<String>>,
174
175 #[serde(skip_serializing_if = "Option::is_none")]
177 restrict_to_following_tools: Option<Vec<String>>,
178 },
179}
180
181#[derive(Debug, Clone, Serialize, Deserialize)]
183pub struct AuthConfigCreateResponse {
184 pub auth_config: AuthConfig,
186}
187
188#[derive(Debug, Clone, Serialize, Deserialize)]
190pub struct AuthConfig {
191 pub id: String,
193
194 pub toolkit: ToolkitInfo,
196
197 pub auth_scheme: String,
199
200 pub is_composio_managed: bool,
202
203 #[serde(skip_serializing_if = "Option::is_none")]
205 pub restrict_to_following_tools: Option<Vec<String>>,
206}
207
208#[derive(Debug, Clone, Serialize, Deserialize)]
210pub struct AuthConfigRetrieveResponse {
211 pub id: String,
213
214 #[serde(skip_serializing_if = "Option::is_none")]
216 pub uuid: Option<String>,
217
218 #[serde(rename = "type")]
220 pub config_type: String,
221
222 pub toolkit: ToolkitInfo,
224
225 #[serde(skip_serializing_if = "Option::is_none")]
227 pub name: Option<String>,
228
229 pub auth_scheme: String,
231
232 #[serde(skip_serializing_if = "Option::is_none")]
234 pub credentials: Option<serde_json::Value>,
235
236 #[serde(skip_serializing_if = "Option::is_none")]
238 pub proxy_config: Option<serde_json::Value>,
239
240 #[serde(skip_serializing_if = "Option::is_none")]
242 pub expected_input_fields: Option<Vec<String>>,
243
244 #[serde(skip_serializing_if = "Option::is_none")]
246 pub shared_credentials: Option<serde_json::Value>,
247}
248
249#[derive(Debug, Clone, Serialize, Deserialize)]
251#[serde(tag = "type")]
252pub enum AuthConfigUpdateParams {
253 #[serde(rename = "custom")]
255 Custom {
256 #[serde(skip_serializing_if = "Option::is_none")]
258 credentials: Option<serde_json::Value>,
259
260 #[serde(skip_serializing_if = "Option::is_none")]
262 proxy_config: Option<serde_json::Value>,
263
264 #[serde(skip_serializing_if = "Option::is_none")]
266 tool_access_config: Option<serde_json::Value>,
267
268 #[serde(skip_serializing_if = "Option::is_none")]
270 shared_credentials: Option<serde_json::Value>,
271
272 #[serde(skip_serializing_if = "Option::is_none")]
274 is_enabled_for_tool_router: Option<bool>,
275 },
276
277 #[serde(rename = "default")]
279 Default {
280 #[serde(skip_serializing_if = "Option::is_none")]
282 credentials: Option<DefaultCredentials>,
283
284 #[serde(skip_serializing_if = "Option::is_none")]
286 is_enabled_for_tool_router: Option<bool>,
287 },
288}
289
290#[derive(Debug, Clone, Serialize, Deserialize)]
292pub struct DefaultCredentials {
293 #[serde(skip_serializing_if = "Option::is_none")]
295 pub scopes: Option<Vec<String>>,
296
297 #[serde(skip_serializing_if = "Option::is_none")]
299 pub user_scopes: Option<Vec<String>>,
300}
301
302#[derive(Debug, Clone, Serialize, Deserialize)]
304pub struct AuthConfigUpdateResponse {
305 pub success: bool,
307
308 #[serde(skip_serializing_if = "Option::is_none")]
310 pub auth_config: Option<AuthConfigInfo>,
311}
312
313#[derive(Debug, Clone, Serialize, Deserialize)]
315pub struct AuthConfigDeleteResponse {
316 pub success: bool,
318
319 #[serde(skip_serializing_if = "Option::is_none")]
321 pub message: Option<String>,
322}
323
324#[derive(Debug, Clone, Serialize, Deserialize)]
326pub struct AuthConfigStatusUpdateResponse {
327 pub success: bool,
329
330 pub status: String,
332}
333
334#[cfg(test)]
338mod tests {
339 use super::*;
340
341 #[test]
342 fn test_auth_config_list_params_default() {
343 let params = AuthConfigListParams::default();
344 assert!(params.is_composio_managed.is_none());
345 assert!(params.toolkit_slug.is_none());
346 }
347
348 #[test]
349 fn test_auth_config_options_custom_serialization() {
350 let options = AuthConfigOptions::Custom {
351 auth_scheme: "OAUTH2".to_string(),
352 credentials: serde_json::json!({"client_id": "test"}),
353 restrict_to_following_tools: None,
354 };
355
356 let json = serde_json::to_string(&options).unwrap();
357 assert!(json.contains("custom"));
358 assert!(json.contains("OAUTH2"));
359 }
360
361 #[test]
362 fn test_auth_config_status_serialization() {
363 let enabled = AuthConfigStatus::Enabled;
364 let json = serde_json::to_string(&enabled).unwrap();
365 assert_eq!(json, "\"ENABLED\"");
366 assert_eq!(enabled.as_str(), "ENABLED");
367 }
368
369 #[test]
370 fn test_auth_config_update_response_deserialization() {
371 let payload = r#"{"success":true}"#;
372 let response: AuthConfigUpdateResponse = serde_json::from_str(payload).unwrap();
373 assert!(response.success);
374 }
375
376 #[test]
377 fn test_auth_config_delete_response_deserialization() {
378 let payload = r#"{"success":true,"message":"deleted"}"#;
379 let response: AuthConfigDeleteResponse = serde_json::from_str(payload).unwrap();
380 assert!(response.success);
381 assert_eq!(response.message.as_deref(), Some("deleted"));
382 }
383
384 #[test]
385 fn test_auth_config_status_update_response_deserialization() {
386 let payload = r#"{"success":true,"status":"DISABLED"}"#;
387 let response: AuthConfigStatusUpdateResponse = serde_json::from_str(payload).unwrap();
388 assert!(response.success);
389 assert_eq!(response.status, "DISABLED");
390 }
391
392 #[test]
393 fn test_auth_config_options_default_serialization() {
394 let options = AuthConfigOptions::Default {
395 scopes: Some(vec!["repo".to_string()]),
396 user_scopes: None,
397 restrict_to_following_tools: None,
398 };
399
400 let json = serde_json::to_string(&options).unwrap();
401 assert!(json.contains("default"));
402 assert!(json.contains("repo"));
403 }
404}