use crate::error::{ApiError, Result};
use reqwest::Client;
use serde_json::Value;
use url::Url;
pub struct BuildClient {
base_url: String,
client: Client,
}
impl BuildClient {
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_build_logs_stage_sn_pipeline_id_stage_id(
&self,
repo: String,
sn: String,
pipeline_id: String,
stage_id: String,
) -> Result<Value> {
let path = format!("/{}/-/build/logs/stage/{}/{}/{}", repo, sn, pipeline_id, stage_id);
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 get_repo_build_status_sn(
&self,
repo: String,
sn: String,
) -> Result<Value> {
let path = format!("/{}/-/build/status/{}", repo, sn);
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_repo_build_start(
&self,
repo: String,
request_data: serde_json::Value,
) -> Result<Value> {
let path = format!("/{}/-/build/start", repo);
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 delete_repo_build_logs_sn(
&self,
repo: String,
sn: String,
) -> Result<Value> {
let path = format!("/{}/-/build/logs/{}", repo, sn);
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_build_runner_download_log_pipeline_id(
&self,
repo: String,
pipeline_id: String,
) -> Result<Value> {
let path = format!("/{}/-/build/runner/download/log/{}", repo, pipeline_id);
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 get_repo_build_logs(
&self,
repo: String,
create_time: Option<String>,
end_time: Option<String>,
event: Option<String>,
page: Option<i64>,
pagesize: Option<i64>,
sha: Option<String>,
sn: Option<String>,
source_ref: Option<String>,
status: Option<String>,
target_ref: Option<String>,
user_id: Option<String>,
user_name: Option<String>,
) -> Result<Value> {
let path = format!("/{}/-/build/logs", repo);
let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
if let Some(value) = create_time {
url.query_pairs_mut().append_pair("createTime", &value.to_string());
}
if let Some(value) = end_time {
url.query_pairs_mut().append_pair("endTime", &value.to_string());
}
if let Some(value) = event {
url.query_pairs_mut().append_pair("event", &value.to_string());
}
if let Some(value) = page {
url.query_pairs_mut().append_pair("page", &value.to_string());
}
if let Some(value) = pagesize {
url.query_pairs_mut().append_pair("pagesize", &value.to_string());
}
if let Some(value) = sha {
url.query_pairs_mut().append_pair("sha", &value.to_string());
}
if let Some(value) = sn {
url.query_pairs_mut().append_pair("sn", &value.to_string());
}
if let Some(value) = source_ref {
url.query_pairs_mut().append_pair("sourceRef", &value.to_string());
}
if let Some(value) = status {
url.query_pairs_mut().append_pair("status", &value.to_string());
}
if let Some(value) = target_ref {
url.query_pairs_mut().append_pair("targetRef", &value.to_string());
}
if let Some(value) = user_id {
url.query_pairs_mut().append_pair("userId", &value.to_string());
}
if let Some(value) = user_name {
url.query_pairs_mut().append_pair("userName", &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_repo_build_stop_sn(
&self,
repo: String,
sn: String,
) -> Result<Value> {
let path = format!("/{}/-/build/stop/{}", repo, sn);
let url = Url::parse(&format!("{}{}", self.base_url, path))?;
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()))
}
}
}