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}