1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
//! The Organization API.
mod list_repos;
use crate::Octocrab;
pub use self::list_repos::ListReposBuilder;
/// A client to GitHub's organization API.
///
/// Created with [`Octocrab::orgs`].
pub struct OrgHandler<'octo> {
crab: &'octo Octocrab,
owner: String,
}
impl<'octo> OrgHandler<'octo> {
pub(crate) fn new(crab: &'octo Octocrab, owner: String) -> Self {
Self { crab, owner }
}
/// Add or update organization membership
///
/// **Note**
/// - Only authenticated organization owners can add a member to the
/// organization or update the member's role.
/// - If the authenticated user is adding a member to the organization, the
/// invited user will receive an email inviting them to the organization.
/// The user's membership status will be pending until they accept
/// the invitation.
/// - Authenticated users can update a user's membership by passing the role
/// parameter. If the authenticated user changes a member's role to admin,
/// the affected user will receive an email notifying them that they've
/// been made an organization owner. If the authenticated user changes an
/// owner's role to member, no email will be sent.
/// ```no_run
/// # async fn run() -> octocrab::Result<()> {
/// # let octocrab = octocrab::Octocrab::default();
/// let invitation = octocrab.orgs("owner").add_or_update_membership("ferris", None).await?;
/// # Ok(())
/// # }
/// ```
pub async fn add_or_update_membership(
&self,
username: impl AsRef<str>,
role: Option<crate::params::orgs::Role>,
) -> crate::Result<crate::models::orgs::MembershipInvitation> {
let url = format!(
"orgs/{org}/memberships/{username}",
org = self.owner,
username = username.as_ref(),
);
let body = role.map(|role| serde_json::json!({ "role": role }));
self.crab.post(url, body.as_ref()).await
}
/// Check if a user is, publicly or privately, a member of the organization.
///
/// ```no_run
/// # async fn run() -> octocrab::Result<()> {
/// # let octocrab = octocrab::Octocrab::default();
/// assert!(octocrab.orgs("owner").check_membership("ferris").await?);
/// # Ok(())
/// # }
/// ```
pub async fn check_membership(&self, username: impl AsRef<str>) -> crate::Result<bool> {
let url = format!(
"orgs/{org}/members/{username}",
org = self.owner,
username = username.as_ref(),
);
let response = self
.crab
._get(self.crab.absolute_url(url)?, None::<&()>)
.await?;
let status = response.status();
Ok(status == 204 || status == 301)
}
/// Get an organization
///
/// To see many of the organization response values, you need to be an
/// authenticated organization owner with the `admin:org` scope. When the
/// value of `two_factor_requirement_enabled` is true, the organization
/// requires all members, billing managers, and outside collaborators to
/// enable two-factor authentication.
/// ```no_run
/// # async fn run() -> octocrab::Result<()> {
/// # let octocrab = octocrab::Octocrab::default();
/// let org = octocrab.orgs("owner").get().await?;
/// # Ok(())
/// # }
/// ```
pub async fn get(&self) -> crate::Result<crate::models::orgs::Organization> {
let route = format!("orgs/{org}", org = self.owner);
self.crab.get(route, None::<&()>).await
}
/// List repos for the specified organization.
///
/// ```no_run
/// # async fn run() -> octocrab::Result<()> {
/// use octocrab::params;
///
/// // Get the least active repos belonging to `owner`.
/// let page = octocrab::instance()
/// .orgs("owner")
/// .list_repos()
/// // Optional Parameters
/// .repo_type(params::repos::Type::Sources)
/// .sort(params::repos::Sort::Pushed)
/// .direction(params::Direction::Descending)
/// .per_page(25)
/// .page(5u32)
/// // Send the request.
/// .send()
/// .await?;
/// # Ok(())
/// # }
/// ```
pub fn list_repos(&self) -> list_repos::ListReposBuilder {
list_repos::ListReposBuilder::new(self)
}
}