use crate::error::{ApiError, Result};
use reqwest::Client;
use serde_json::Value;
use url::Url;
pub struct CollaboratorsClient {
base_url: String,
client: Client,
}
impl CollaboratorsClient {
pub fn new(base_url: String, client: Client) -> Self {
Self { base_url, client }
}
pub fn with_auth(self, token: &str) -> Self {
self
}
pub async fn get_repo_inherit_members(
&self,
repo: String,
search: Option<String>,
role: Option<String>,
page: Option<i64>,
page_size: Option<i64>,
) -> Result<Value> {
let path = format!("/{}/-/inherit-members", repo);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
if let Some(value) = search {
url.query_pairs_mut().append_pair("search", &value.to_string());
}
if let Some(value) = role {
url.query_pairs_mut().append_pair("role", &value.to_string());
}
if let Some(value) = page {
url.query_pairs_mut().append_pair("page", &value.to_string());
}
if let Some(value) = page_size {
url.query_pairs_mut().append_pair("page_size", &value.to_string());
}
let request = self.client.request(
reqwest::Method::GET,
url
);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn get_group_inherit_members(
&self,
group: String,
search: Option<String>,
role: Option<String>,
page: Option<i64>,
page_size: Option<i64>,
) -> Result<Value> {
let path = format!("/{}/-/inherit-members", group);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
if let Some(value) = search {
url.query_pairs_mut().append_pair("search", &value.to_string());
}
if let Some(value) = role {
url.query_pairs_mut().append_pair("role", &value.to_string());
}
if let Some(value) = page {
url.query_pairs_mut().append_pair("page", &value.to_string());
}
if let Some(value) = page_size {
url.query_pairs_mut().append_pair("page_size", &value.to_string());
}
let request = self.client.request(
reqwest::Method::GET,
url
);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn post_group_members_username(
&self,
group: String,
username: String,
request_data: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/members/{}", group, username);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::POST,
url
);
request = request.json(&request_data);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn put_group_members_username(
&self,
group: String,
username: String,
request_data: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/members/{}", group, username);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::PUT,
url
);
request = request.json(&request_data);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn delete_group_members_username(
&self,
group: String,
username: String,
) -> Result<Value> {
let path = format!("/{}/-/members/{}", group, username);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let request = self.client.request(
reqwest::Method::DELETE,
url
);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn get_repo_outside_collaborators(
&self,
repo: String,
page: Option<i64>,
page_size: Option<i64>,
role: Option<String>,
search: Option<String>,
) -> Result<Value> {
let path = format!("/{}/-/outside-collaborators", repo);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
if let Some(value) = page {
url.query_pairs_mut().append_pair("page", &value.to_string());
}
if let Some(value) = page_size {
url.query_pairs_mut().append_pair("page_size", &value.to_string());
}
if let Some(value) = role {
url.query_pairs_mut().append_pair("role", &value.to_string());
}
if let Some(value) = search {
url.query_pairs_mut().append_pair("search", &value.to_string());
}
let request = self.client.request(
reqwest::Method::GET,
url
);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn post_mission_members_username(
&self,
mission: String,
username: String,
request_data: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/members/{}", mission, username);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::POST,
url
);
request = request.json(&request_data);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn put_repo_outside_collaborators_username(
&self,
repo: String,
username: String,
role: String,
) -> Result<Value> {
let path = format!("/{}/-/outside-collaborators/{}", repo, username);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
url.query_pairs_mut().append_pair("role", &role.to_string());
let request = self.client.request(
reqwest::Method::PUT,
url
);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn delete_repo_outside_collaborators_username(
&self,
repo: String,
username: String,
) -> Result<Value> {
let path = format!("/{}/-/outside-collaborators/{}", repo, username);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let request = self.client.request(
reqwest::Method::DELETE,
url
);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn post_repo_members_username(
&self,
repo: String,
username: String,
request_data: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/members/{}", repo, username);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::POST,
url
);
request = request.json(&request_data);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn put_repo_members_username(
&self,
repo: String,
username: String,
request_data: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/members/{}", repo, username);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::PUT,
url
);
request = request.json(&request_data);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn delete_repo_members_username(
&self,
repo: String,
username: String,
) -> Result<Value> {
let path = format!("/{}/-/members/{}", repo, username);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let request = self.client.request(
reqwest::Method::DELETE,
url
);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn get_repo_members(
&self,
repo: String,
page: Option<i64>,
page_size: Option<i64>,
role: Option<String>,
search: Option<String>,
) -> Result<Value> {
let path = format!("/{}/-/members", repo);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
if let Some(value) = page {
url.query_pairs_mut().append_pair("page", &value.to_string());
}
if let Some(value) = page_size {
url.query_pairs_mut().append_pair("page_size", &value.to_string());
}
if let Some(value) = role {
url.query_pairs_mut().append_pair("role", &value.to_string());
}
if let Some(value) = search {
url.query_pairs_mut().append_pair("search", &value.to_string());
}
let request = self.client.request(
reqwest::Method::GET,
url
);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn get_repo_list_members(
&self,
repo: String,
page: Option<i64>,
page_size: Option<i64>,
role: Option<String>,
search: Option<String>,
names: Option<String>,
order_by: Option<String>,
desc: Option<bool>,
) -> Result<Value> {
let path = format!("/{}/-/list-members", repo);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
if let Some(value) = page {
url.query_pairs_mut().append_pair("page", &value.to_string());
}
if let Some(value) = page_size {
url.query_pairs_mut().append_pair("page_size", &value.to_string());
}
if let Some(value) = role {
url.query_pairs_mut().append_pair("role", &value.to_string());
}
if let Some(value) = search {
url.query_pairs_mut().append_pair("search", &value.to_string());
}
if let Some(value) = names {
url.query_pairs_mut().append_pair("names", &value.to_string());
}
if let Some(value) = order_by {
url.query_pairs_mut().append_pair("order_by", &value.to_string());
}
if let Some(value) = desc {
url.query_pairs_mut().append_pair("desc", &value.to_string());
}
let request = self.client.request(
reqwest::Method::GET,
url
);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn get_group_members(
&self,
group: String,
page: Option<i64>,
page_size: Option<i64>,
role: Option<String>,
search: Option<String>,
) -> Result<Value> {
let path = format!("/{}/-/members", group);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
if let Some(value) = page {
url.query_pairs_mut().append_pair("page", &value.to_string());
}
if let Some(value) = page_size {
url.query_pairs_mut().append_pair("page_size", &value.to_string());
}
if let Some(value) = role {
url.query_pairs_mut().append_pair("role", &value.to_string());
}
if let Some(value) = search {
url.query_pairs_mut().append_pair("search", &value.to_string());
}
let request = self.client.request(
reqwest::Method::GET,
url
);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn post_registry_members_username(
&self,
registry: String,
username: String,
request_data: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/members/{}", registry, username);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::POST,
url
);
request = request.json(&request_data);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
pub async fn get_repo_top_activity_users(
&self,
repo: String,
top: Option<i64>,
) -> Result<Value> {
let path = format!("/{}/-/top-activity-users", repo);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
if let Some(value) = top {
url.query_pairs_mut().append_pair("top", &value.to_string());
}
let request = self.client.request(
reqwest::Method::GET,
url
);
let response = request.send().await?;
if response.status().is_success() {
let json: Value = response.json().await?;
Ok(json)
} else {
Err(ApiError::HttpError(response.status().as_u16()))
}
}
}