siera_cloudagent_python/cloudagent/
connection.rs

1use crate::agent::CloudAgentPython;
2use crate::fill_query;
3use async_trait::async_trait;
4use serde::{Deserialize, Serialize};
5use serde_json::json;
6use siera_agent::error::Result;
7use siera_agent::modules::connection::{
8    Connection, ConnectionCreateInvitationOptions, ConnectionGetAllOptions, ConnectionModule,
9    ConnectionReceiveInvitationOptions, Invitation,
10};
11
12/// Response from the server when all connections are requested
13#[derive(Debug, Serialize, Deserialize)]
14pub struct ConnectionGetAllResponse {
15    /// List of all the connections returned by the cloudagent
16    /// these connections are already filtered on
17    pub results: Vec<Connection>,
18}
19
20#[async_trait]
21impl ConnectionModule for CloudAgentPython {
22    async fn get_all(&self, options: ConnectionGetAllOptions) -> Result<Vec<Connection>> {
23        let url = self.create_url(&["connections"])?;
24
25        let query = fill_query!(
26            options,
27            alias,
28            connection_protocol,
29            invitation_key,
30            my_did,
31            state,
32            their_did,
33            their_role
34        );
35
36        let connections: ConnectionGetAllResponse = self.get(url, Some(query)).await?;
37
38        Ok(connections.results)
39    }
40
41    async fn get_by_id(&self, id: String) -> Result<Connection> {
42        let url = self.create_url(&["connections", &id])?;
43        self.get::<Connection>(url, None).await
44    }
45
46    async fn create_invitation(
47        &self,
48        options: ConnectionCreateInvitationOptions,
49    ) -> Result<Invitation> {
50        let url = self.create_url(&["connections", "create-invitation"])?;
51        let mut query: Vec<(&str, String)> = vec![];
52
53        let body = if options.toolbox {
54            query.push(("multi_use", false.to_string()));
55            query.push(("auto_accept", true.to_string()));
56            query.push(("alias", String::from("toolbox")));
57
58            Some(json!({
59                "metadata": {
60                    "group": "admin"
61                }
62            }))
63        } else {
64            if options.multi_use {
65                query.push(("multi_use", true.to_string()));
66            }
67            if options.auto_accept {
68                query.push(("auto_accept", true.to_string()));
69            }
70            if let Some(alias) = &options.alias {
71                query.push(("alias", alias.clone()));
72            }
73            None
74        };
75        self.post::<Invitation>(url, Some(query), body).await
76    }
77    async fn receive_invitation(
78        &self,
79        invitation: ConnectionReceiveInvitationOptions,
80    ) -> Result<Connection> {
81        let url = self.create_url(&["connections", "receive-invitation"])?;
82
83        self.post(url, None, Some(serde_json::to_value(invitation)?))
84            .await
85    }
86}