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
10impl Context69Client {
11 pub async fn search_user_directory(
12 &self,
13 query: &str,
14 limit: usize,
15 ) -> Result<Vec<UserDirectoryEntryResponse>, Error> {
16 let mut url = self.url("/v1/user-directory")?;
17 {
18 let mut pairs = url.query_pairs_mut();
19 pairs.append_pair("query", query);
20 pairs.append_pair("limit", &limit.to_string());
21 }
22 self.execute_json(self.client.get(url).header(
23 reqwest::header::AUTHORIZATION,
24 format!(
25 "Bearer {}",
26 self.session
27 .read()
28 .await
29 .personal_access_token
30 .clone()
31 .ok_or(Error::AuthenticationRequired)?
32 ),
33 ))
34 .await
35 }
36
37 pub async fn list_groups(&self) -> Result<Vec<GroupResponse>, Error> {
38 self.execute_json(self.authorized_request(Method::GET, "/v1/groups").await?)
39 .await
40 }
41
42 pub async fn create_group(&self, request: &CreateGroupRequest) -> Result<GroupResponse, Error> {
43 self.execute_json(
44 self.authorized_request(Method::POST, "/v1/groups")
45 .await?
46 .json(request),
47 )
48 .await
49 }
50
51 pub async fn get_group(&self, group_key: &str) -> Result<GroupResponse, Error> {
52 let path = format!("/v1/groups/{group_key}");
53 self.execute_json(self.authorized_request(Method::GET, &path).await?)
54 .await
55 }
56
57 pub async fn update_group(
58 &self,
59 group_key: &str,
60 request: &UpdateGroupRequest,
61 ) -> Result<GroupResponse, Error> {
62 let path = format!("/v1/groups/{group_key}");
63 self.execute_json(
64 self.authorized_request(Method::PATCH, &path)
65 .await?
66 .json(request),
67 )
68 .await
69 }
70
71 pub async fn delete_group(&self, group_key: &str) -> Result<(), Error> {
72 let path = format!("/v1/groups/{group_key}");
73 self.execute_empty(self.authorized_request(Method::DELETE, &path).await?)
74 .await
75 }
76
77 pub async fn list_group_members(
78 &self,
79 group_key: &str,
80 ) -> Result<Vec<GroupMemberResponse>, Error> {
81 let path = format!("/v1/groups/{group_key}/members");
82 self.execute_json(self.authorized_request(Method::GET, &path).await?)
83 .await
84 }
85
86 pub async fn upsert_group_member(
87 &self,
88 group_key: &str,
89 request: &UpsertMembershipRequest,
90 ) -> Result<(), Error> {
91 let path = format!("/v1/groups/{group_key}/members");
92 self.execute_empty(
93 self.authorized_request(Method::POST, &path)
94 .await?
95 .json(request),
96 )
97 .await
98 }
99
100 pub async fn delete_group_member(
101 &self,
102 group_key: &str,
103 login_name: &str,
104 ) -> Result<(), Error> {
105 let path = format!("/v1/groups/{group_key}/members/{login_name}");
106 self.execute_empty(self.authorized_request(Method::DELETE, &path).await?)
107 .await
108 }
109
110 pub async fn list_projects(&self, group_key: &str) -> Result<Vec<ProjectResponse>, Error> {
111 let path = format!("/v1/groups/{group_key}/projects");
112 self.execute_json(self.authorized_request(Method::GET, &path).await?)
113 .await
114 }
115
116 pub async fn create_project(
117 &self,
118 group_key: &str,
119 request: &CreateProjectRequest,
120 ) -> Result<ProjectResponse, Error> {
121 let path = format!("/v1/groups/{group_key}/projects");
122 self.execute_json(
123 self.authorized_request(Method::POST, &path)
124 .await?
125 .json(request),
126 )
127 .await
128 }
129
130 pub async fn get_project(
131 &self,
132 group_key: &str,
133 project_key: &str,
134 ) -> Result<ProjectResponse, Error> {
135 let path = format!("/v1/groups/{group_key}/projects/{project_key}");
136 self.execute_json(self.authorized_request(Method::GET, &path).await?)
137 .await
138 }
139
140 pub async fn update_project(
141 &self,
142 group_key: &str,
143 project_key: &str,
144 request: &UpdateProjectRequest,
145 ) -> Result<ProjectResponse, Error> {
146 let path = format!("/v1/groups/{group_key}/projects/{project_key}");
147 self.execute_json(
148 self.authorized_request(Method::PATCH, &path)
149 .await?
150 .json(request),
151 )
152 .await
153 }
154
155 pub async fn delete_project(&self, group_key: &str, project_key: &str) -> Result<(), Error> {
156 let path = format!("/v1/groups/{group_key}/projects/{project_key}");
157 self.execute_empty(self.authorized_request(Method::DELETE, &path).await?)
158 .await
159 }
160
161 pub async fn move_project(
162 &self,
163 group_key: &str,
164 project_key: &str,
165 request: &MoveProjectRequest,
166 ) -> Result<ProjectResponse, Error> {
167 let path = format!("/v1/groups/{group_key}/projects/{project_key}/move");
168 self.execute_json(
169 self.authorized_request(Method::POST, &path)
170 .await?
171 .json(request),
172 )
173 .await
174 }
175
176 pub async fn list_project_members(
177 &self,
178 group_key: &str,
179 project_key: &str,
180 ) -> Result<Vec<ProjectMemberResponse>, Error> {
181 let path = format!("/v1/groups/{group_key}/projects/{project_key}/members");
182 self.execute_json(self.authorized_request(Method::GET, &path).await?)
183 .await
184 }
185
186 pub async fn upsert_project_member(
187 &self,
188 group_key: &str,
189 project_key: &str,
190 request: &UpsertMembershipRequest,
191 ) -> Result<(), Error> {
192 let path = format!("/v1/groups/{group_key}/projects/{project_key}/members");
193 self.execute_empty(
194 self.authorized_request(Method::POST, &path)
195 .await?
196 .json(request),
197 )
198 .await
199 }
200
201 pub async fn delete_project_member(
202 &self,
203 group_key: &str,
204 project_key: &str,
205 login_name: &str,
206 ) -> Result<(), Error> {
207 let path = format!("/v1/groups/{group_key}/projects/{project_key}/members/{login_name}");
208 self.execute_empty(self.authorized_request(Method::DELETE, &path).await?)
209 .await
210 }
211}