Skip to main content

composio_sdk/models/
link.rs

1//! Direct connected-account link endpoint models.
2
3use serde::{Deserialize, Serialize};
4
5/// Request body for creating a direct connected account link.
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct ConnectedAccountLinkCreateParams {
8    /// Auth config ID used for link generation.
9    pub auth_config_id: String,
10    /// User ID to create the link for.
11    pub user_id: String,
12    /// Optional callback URL.
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub callback_url: Option<String>,
15    /// Optional connection data to prefill auth fields.
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub connection_data: Option<serde_json::Value>,
18}
19
20/// Response for direct connected account link creation.
21#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct ConnectedAccountLinkCreateResponse {
23    /// Connected account ID that was created.
24    pub connected_account_id: String,
25    /// Link token for auth session.
26    pub link_token: String,
27    /// Redirect URL to complete authentication.
28    pub redirect_url: String,
29    /// Link expiration timestamp.
30    #[serde(alias = "expiresAt")]
31    pub expires_at: String,
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37
38    #[test]
39    fn test_connected_account_link_create_params_serialization() {
40        let params = ConnectedAccountLinkCreateParams {
41            auth_config_id: "ac_123".to_string(),
42            user_id: "user_123".to_string(),
43            callback_url: Some("https://example.com/callback".to_string()),
44            connection_data: Some(serde_json::json!({"region":"us"})),
45        };
46
47        let value = serde_json::to_value(&params).unwrap();
48        assert_eq!(value["auth_config_id"], "ac_123");
49        assert_eq!(value["user_id"], "user_123");
50        assert_eq!(value["callback_url"], "https://example.com/callback");
51        assert_eq!(value["connection_data"]["region"], "us");
52    }
53
54    #[test]
55    fn test_connected_account_link_create_response_deserialization() {
56        let payload = serde_json::json!({
57            "connected_account_id": "ca_123",
58            "link_token": "lt_123",
59            "redirect_url": "https://connect.example.com",
60            "expires_at": "2026-01-01T00:00:00Z"
61        });
62
63        let response: ConnectedAccountLinkCreateResponse = serde_json::from_value(payload).unwrap();
64        assert_eq!(response.connected_account_id, "ca_123");
65        assert_eq!(response.expires_at, "2026-01-01T00:00:00Z");
66    }
67}