gitea_sdk/api/orgs/
members.rs

1use build_it::Builder;
2use reqwest::StatusCode;
3use serde::Serialize;
4
5use crate::{error::Result, model::user::User, Client};
6
7#[derive(Debug, Clone, Builder, Serialize)]
8#[build_it(into)]
9pub struct ListMembersBuilder {
10    #[serde(skip)]
11    #[build_it(skip)]
12    org: String,
13    /// Page number of results to return (1-based).
14    page: Option<i64>,
15    /// Page size of results.
16    limit: Option<i64>,
17}
18
19#[derive(Debug, Clone)]
20pub struct IsMemberBuilder {
21    org: String,
22    username: String,
23}
24
25#[derive(Debug, Clone)]
26pub struct RemoveMemberBuilder {
27    org: String,
28    username: String,
29}
30
31impl ListMembersBuilder {
32    pub fn new(org: impl ToString) -> Self {
33        Self {
34            org: org.to_string(),
35            page: None,
36            limit: None,
37        }
38    }
39    /// Sends the request to list an organization's members.
40    /// This will return a list of [User] objects.
41    pub async fn send(&self, client: &Client) -> Result<Vec<User>> {
42        let req = client
43            .get(format!("/orgs/{}/members", self.org))
44            .query(self)
45            .build()?;
46        let res = client.make_request(req).await?;
47        client.parse_response(res).await
48    }
49}
50
51impl IsMemberBuilder {
52    pub fn new(org: impl ToString, username: impl ToString) -> Self {
53        Self {
54            org: org.to_string(),
55            username: username.to_string(),
56        }
57    }
58    /// Sends the request to check if a user is a member of an organization.
59    pub async fn send(&self, client: &Client) -> Result<bool> {
60        let Self { org, username } = self;
61        let req = client
62            .get(format!("/orgs/{org}/members/{username}"))
63            .build()?;
64        match client.make_request(req).await {
65            Ok(_) => Ok(true),
66            Err(e) => {
67                if e.status_code == StatusCode::NOT_FOUND {
68                    Ok(false)
69                } else {
70                    Err(e)
71                }
72            }
73        }
74    }
75}
76
77impl RemoveMemberBuilder {
78    pub fn new(org: impl ToString, username: impl ToString) -> Self {
79        Self {
80            org: org.to_string(),
81            username: username.to_string(),
82        }
83    }
84    /// Sends the request to remove a user from an organization.
85    pub async fn send(&self, client: &Client) -> Result<()> {
86        let Self { org, username } = self;
87        let req = client
88            .delete(format!("/orgs/{org}/members/{username}"))
89            .build()?;
90        let _ = client.make_request(req).await?;
91        Ok(())
92    }
93}