ephemeris_forge_forgejo/api/http/
access.rs1use ephemeris_forge::{RepoRef, TeamName, UserName, encode, path_segment};
2use reqwest::Method;
3
4use crate::Permission;
5use crate::api::HttpApi;
6use crate::api::error::ForgeError;
7use crate::api::model::{
8 Collaborator, CollaboratorPermission, CollaboratorUser, CurrentUser, Team,
9};
10use crate::api::operations::AccessApi;
11use crate::api::request::AddCollaboratorOption;
12
13impl AccessApi for HttpApi {
14 async fn teams(&self, repo: &RepoRef) -> Result<Vec<Team>, ForgeError> {
15 let path = repo.path("teams");
16 Ok(self.http.json(Method::GET, &path, None).await?)
17 }
18
19 async fn current_user(&self) -> Result<String, ForgeError> {
20 let user: CurrentUser = self.http.json(Method::GET, "user", None).await?;
21 Ok(user.login)
22 }
23
24 async fn user_teams(&self) -> Result<Vec<Team>, ForgeError> {
25 self.paged("user/teams").await
26 }
27
28 async fn organization_teams(&self, organization: &str) -> Result<Vec<Team>, ForgeError> {
29 self.paged(&format!("orgs/{organization}/teams")).await
30 }
31
32 async fn add_team(
33 &self,
34 repo: &RepoRef,
35 team: &TeamName,
36 _: Permission,
37 ) -> Result<(), ForgeError> {
38 let team = path_segment(team.as_str());
39 let path = repo.path(&format!("teams/{team}"));
40 self.send_write(Method::PUT, &path, None).await
41 }
42
43 async fn remove_team(&self, repo: &RepoRef, team: &str) -> Result<(), ForgeError> {
44 let team = path_segment(team);
45 let path = repo.path(&format!("teams/{team}"));
46 self.send_write(Method::DELETE, &path, None).await
47 }
48
49 async fn collaborators(&self, repo: &RepoRef) -> Result<Vec<Collaborator>, ForgeError> {
50 let users: Vec<CollaboratorUser> = self.paged(&repo.path("collaborators")).await?;
51 let mut collaborators = Vec::with_capacity(users.len());
52 for user in users {
53 let segment = path_segment(&user.login);
54 let path = repo.path(&format!("collaborators/{segment}/permission"));
55 let permission: CollaboratorPermission =
56 self.http.json(Method::GET, &path, None).await?;
57 collaborators.push(Collaborator {
58 login: user.login,
59 permission: permission.permission,
60 });
61 }
62 Ok(collaborators)
63 }
64
65 async fn add_collaborator(
66 &self,
67 repo: &RepoRef,
68 user: &UserName,
69 permission: Permission,
70 ) -> Result<(), ForgeError> {
71 let user = path_segment(user.as_str());
72 let path = repo.path(&format!("collaborators/{user}"));
73 let body = encode(&AddCollaboratorOption { permission });
74 self.send_write(Method::PUT, &path, Some(&body)).await
75 }
76
77 async fn remove_collaborator(&self, repo: &RepoRef, user: &str) -> Result<(), ForgeError> {
78 let user = path_segment(user);
79 let path = repo.path(&format!("collaborators/{user}"));
80 self.send_write(Method::DELETE, &path, None).await
81 }
82}