Skip to main content

ephemeris_forge_forgejo/api/http/
access.rs

1use 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}