Skip to main content

context69_sdk/client/
workspace.rs

1use context69_contracts::{
2    CreateGroupRequest, CreateProjectRequest, GroupMemberResponse, GroupResponse,
3    MoveProjectRequest, ProjectMemberResponse, ProjectResponse, UpdateGroupRequest,
4    UpdateProjectRequest, UpsertMembershipRequest, UserDirectoryEntryResponse,
5};
6use reqwest::Method;
7
8use crate::{Context69Client, Error};
9
10pub struct WorkspaceApi<'a> {
11    client: &'a Context69Client,
12}
13
14impl<'a> WorkspaceApi<'a> {
15    pub(crate) fn new(client: &'a Context69Client) -> Self {
16        Self { client }
17    }
18
19    pub async fn search_user_directory(
20        &self,
21        query: &str,
22        limit: usize,
23    ) -> Result<Vec<UserDirectoryEntryResponse>, Error> {
24        let mut url = self.client.url("/v1/user-directory")?;
25        {
26            let mut pairs = url.query_pairs_mut();
27            pairs.append_pair("query", query);
28            pairs.append_pair("limit", &limit.to_string());
29        }
30        self.client
31            .execute_json(self.client.authorized_url_request(Method::GET, url).await?)
32            .await
33    }
34
35    pub async fn list_groups(&self) -> Result<Vec<GroupResponse>, Error> {
36        self.client
37            .execute_json(
38                self.client
39                    .authorized_request(Method::GET, "/v1/groups")
40                    .await?,
41            )
42            .await
43    }
44
45    pub async fn create_group(&self, request: &CreateGroupRequest) -> Result<GroupResponse, Error> {
46        self.client
47            .execute_json(
48                self.client
49                    .authorized_request(Method::POST, "/v1/groups")
50                    .await?
51                    .json(request),
52            )
53            .await
54    }
55
56    pub async fn get_group(&self, group_key: &str) -> Result<GroupResponse, Error> {
57        let path = format!("/v1/groups/{group_key}");
58        self.client
59            .execute_json(self.client.authorized_request(Method::GET, &path).await?)
60            .await
61    }
62
63    pub async fn update_group(
64        &self,
65        group_key: &str,
66        request: &UpdateGroupRequest,
67    ) -> Result<GroupResponse, Error> {
68        let path = format!("/v1/groups/{group_key}");
69        self.client
70            .execute_json(
71                self.client
72                    .authorized_request(Method::PATCH, &path)
73                    .await?
74                    .json(request),
75            )
76            .await
77    }
78
79    pub async fn delete_group(&self, group_key: &str) -> Result<(), Error> {
80        let path = format!("/v1/groups/{group_key}");
81        self.client
82            .execute_empty(
83                self.client
84                    .authorized_request(Method::DELETE, &path)
85                    .await?,
86            )
87            .await
88    }
89
90    pub async fn list_group_members(
91        &self,
92        group_key: &str,
93    ) -> Result<Vec<GroupMemberResponse>, Error> {
94        let path = format!("/v1/groups/{group_key}/members");
95        self.client
96            .execute_json(self.client.authorized_request(Method::GET, &path).await?)
97            .await
98    }
99
100    pub async fn upsert_group_member(
101        &self,
102        group_key: &str,
103        request: &UpsertMembershipRequest,
104    ) -> Result<(), Error> {
105        let path = format!("/v1/groups/{group_key}/members");
106        self.client
107            .execute_empty(
108                self.client
109                    .authorized_request(Method::POST, &path)
110                    .await?
111                    .json(request),
112            )
113            .await
114    }
115
116    pub async fn delete_group_member(
117        &self,
118        group_key: &str,
119        login_name: &str,
120    ) -> Result<(), Error> {
121        let path = format!("/v1/groups/{group_key}/members/{login_name}");
122        self.client
123            .execute_empty(
124                self.client
125                    .authorized_request(Method::DELETE, &path)
126                    .await?,
127            )
128            .await
129    }
130
131    pub async fn list_projects(&self, group_key: &str) -> Result<Vec<ProjectResponse>, Error> {
132        let path = format!("/v1/groups/{group_key}/projects");
133        self.client
134            .execute_json(self.client.authorized_request(Method::GET, &path).await?)
135            .await
136    }
137
138    pub async fn create_project(
139        &self,
140        group_key: &str,
141        request: &CreateProjectRequest,
142    ) -> Result<ProjectResponse, Error> {
143        let path = format!("/v1/groups/{group_key}/projects");
144        self.client
145            .execute_json(
146                self.client
147                    .authorized_request(Method::POST, &path)
148                    .await?
149                    .json(request),
150            )
151            .await
152    }
153
154    pub async fn get_project(
155        &self,
156        group_key: &str,
157        project_key: &str,
158    ) -> Result<ProjectResponse, Error> {
159        let path = format!("/v1/groups/{group_key}/projects/{project_key}");
160        self.client
161            .execute_json(self.client.authorized_request(Method::GET, &path).await?)
162            .await
163    }
164
165    pub async fn update_project(
166        &self,
167        group_key: &str,
168        project_key: &str,
169        request: &UpdateProjectRequest,
170    ) -> Result<ProjectResponse, Error> {
171        let path = format!("/v1/groups/{group_key}/projects/{project_key}");
172        self.client
173            .execute_json(
174                self.client
175                    .authorized_request(Method::PATCH, &path)
176                    .await?
177                    .json(request),
178            )
179            .await
180    }
181
182    pub async fn delete_project(&self, group_key: &str, project_key: &str) -> Result<(), Error> {
183        let path = format!("/v1/groups/{group_key}/projects/{project_key}");
184        self.client
185            .execute_empty(
186                self.client
187                    .authorized_request(Method::DELETE, &path)
188                    .await?,
189            )
190            .await
191    }
192
193    pub async fn move_project(
194        &self,
195        group_key: &str,
196        project_key: &str,
197        request: &MoveProjectRequest,
198    ) -> Result<ProjectResponse, Error> {
199        let path = format!("/v1/groups/{group_key}/projects/{project_key}/move");
200        self.client
201            .execute_json(
202                self.client
203                    .authorized_request(Method::POST, &path)
204                    .await?
205                    .json(request),
206            )
207            .await
208    }
209
210    pub async fn list_project_members(
211        &self,
212        group_key: &str,
213        project_key: &str,
214    ) -> Result<Vec<ProjectMemberResponse>, Error> {
215        let path = format!("/v1/groups/{group_key}/projects/{project_key}/members");
216        self.client
217            .execute_json(self.client.authorized_request(Method::GET, &path).await?)
218            .await
219    }
220
221    pub async fn upsert_project_member(
222        &self,
223        group_key: &str,
224        project_key: &str,
225        request: &UpsertMembershipRequest,
226    ) -> Result<(), Error> {
227        let path = format!("/v1/groups/{group_key}/projects/{project_key}/members");
228        self.client
229            .execute_empty(
230                self.client
231                    .authorized_request(Method::POST, &path)
232                    .await?
233                    .json(request),
234            )
235            .await
236    }
237
238    pub async fn delete_project_member(
239        &self,
240        group_key: &str,
241        project_key: &str,
242        login_name: &str,
243    ) -> Result<(), Error> {
244        let path = format!("/v1/groups/{group_key}/projects/{project_key}/members/{login_name}");
245        self.client
246            .execute_empty(
247                self.client
248                    .authorized_request(Method::DELETE, &path)
249                    .await?,
250            )
251            .await
252    }
253}