siera_cloudagent_python/cloudagent/
connection.rs1use 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#[derive(Debug, Serialize, Deserialize)]
14pub struct ConnectionGetAllResponse {
15 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}