use crate::error::{ApiError, Result};
use reqwest::Client;
use serde_json::Value;
use url::Url;
pub struct ArtifactoryClient {
base_url: String,
client: Client,
}
impl ArtifactoryClient {
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_slug_registry_quotas_download(
&self,
slug: String,
r#type: String,
page: Option<i64>,
page_size: Option<i64>,
ordering: Option<String>,
) -> Result<Value> {
let path = format!("/{}/-/registry/-/quotas/download", slug);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
url.query_pairs_mut().append_pair("type", &r#type.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());
}
if let Some(value) = ordering {
url.query_pairs_mut().append_pair("ordering", &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_slug_packages_type_name_tag_tag(
&self,
slug: String,
r#type: String,
name: String,
tag: String,
sha_256: Option<String>,
arch: Option<String>,
) -> Result<Value> {
let path = format!("/{}/-/packages/{}/{}/-/tag/{}", slug, r#type, name, tag);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
if let Some(value) = sha_256 {
url.query_pairs_mut().append_pair("sha256", &value.to_string());
}
if let Some(value) = arch {
url.query_pairs_mut().append_pair("arch", &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 delete_slug_packages_type_name_tag_tag(
&self,
slug: String,
r#type: String,
name: String,
tag: String,
) -> Result<Value> {
let path = format!("/{}/-/packages/{}/{}/-/tag/{}", slug, r#type, name, tag);
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_slug_packages_type_name(
&self,
slug: String,
r#type: String,
name: String,
) -> Result<Value> {
let path = format!("/{}/-/packages/{}/{}", slug, r#type, name);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
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_settings_set_visibility(
&self,
registry: String,
visibility: String,
) -> Result<Value> {
let path = format!("/{}/-/settings/set_visibility", registry);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
url.query_pairs_mut().append_pair("visibility", &visibility.to_string());
let request = self.client.request(
reqwest::Method::POST,
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_slug_packages_type_pkgname_tags(
&self,
slug: String,
r#type: String,
pkgname: String,
page: Option<i64>,
page_size: Option<i64>,
ordering: Option<String>,
name: Option<String>,
) -> Result<Value> {
let path = format!("/{}/-/packages/{}/{}/-/tags", slug, r#type, pkgname);
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) = ordering {
url.query_pairs_mut().append_pair("ordering", &value.to_string());
}
if let Some(value) = name {
url.query_pairs_mut().append_pair("name", &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_slug_registry_quota(
&self,
slug: String,
r#type: String,
) -> Result<Value> {
let path = format!("/{}/-/registry/-/quota", slug);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
url.query_pairs_mut().append_pair("type", &r#type.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_slug_registry_quotas(
&self,
slug: String,
r#type: String,
page: Option<i64>,
page_size: Option<i64>,
ordering: Option<String>,
) -> Result<Value> {
let path = format!("/{}/-/registry/-/quotas", slug);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
url.query_pairs_mut().append_pair("type", &r#type.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());
}
if let Some(value) = ordering {
url.query_pairs_mut().append_pair("ordering", &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 delete_registry(
&self,
registry: String,
x_cnb_identity_ticket: Option<String>,
) -> Result<Value> {
let path = format!("/{}", registry);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
let mut request = self.client.request(
reqwest::Method::DELETE,
url
);
if let Some(value) = x_cnb_identity_ticket {
request = request.header("x-cnb-identity-ticket", value);
}
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_slug_packages(
&self,
slug: String,
r#type: String,
page: Option<i64>,
page_size: Option<i64>,
ordering: Option<String>,
name: Option<String>,
) -> Result<Value> {
let path = format!("/{}/-/packages", slug);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
url.query_pairs_mut().append_pair("type", &r#type.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());
}
if let Some(value) = ordering {
url.query_pairs_mut().append_pair("ordering", &value.to_string());
}
if let Some(value) = name {
url.query_pairs_mut().append_pair("name", &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 head_slug_packages(
&self,
slug: String,
r#type: String,
page: Option<i64>,
page_size: Option<i64>,
ordering: Option<String>,
name: Option<String>,
) -> Result<Value> {
let path = format!("/{}/-/packages", slug);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
url.query_pairs_mut().append_pair("type", &r#type.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());
}
if let Some(value) = ordering {
url.query_pairs_mut().append_pair("ordering", &value.to_string());
}
if let Some(value) = name {
url.query_pairs_mut().append_pair("name", &value.to_string());
}
let request = self.client.request(
reqwest::Method::HEAD,
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()))
}
}
}