1use crate::error::{ApiError, Result};
4use reqwest::Client;
5use serde_json::Value;
6use url::Url;
7
8pub struct BuildClient {
10 base_url: String,
11 client: Client,
12}
13
14impl BuildClient {
15 pub fn new(base_url: String, client: Client) -> Self {
17 Self { base_url, client }
18 }
19
20 pub fn with_auth(self, token: &str) -> Self {
22 self
24 }
25
26 pub async fn post_repo_build_stop_sn(
28 &self,
29 repo: String,
30 sn: String,
31 ) -> Result<Value> {
32 let path = format!("/{}/-/build/stop/{}", repo, sn);
33 let url = Url::parse(&format!("{}{}", self.base_url, path))?;
34
35
36 let request = self.client.request(
37 reqwest::Method::POST,
38 url
39 );
40
41
42
43
44 let response = request.send().await?;
45
46 if response.status().is_success() {
47 let json: Value = response.json().await?;
48 Ok(json)
49 } else {
50 Err(ApiError::HttpError(response.status().as_u16()))
51 }
52 }
53
54 pub async fn post_repo_build_start(
56 &self,
57 repo: String,
58 request_data: serde_json::Value,
59 ) -> Result<Value> {
60 let path = format!("/{}/-/build/start", repo);
61 let url = Url::parse(&format!("{}{}", self.base_url, path))?;
62
63
64
65 let mut request = self.client.request(
66 reqwest::Method::POST,
67 url
68 );
69
70
71
72 request = request.json(&request_data);
73
74 let response = request.send().await?;
75
76 if response.status().is_success() {
77 let json: Value = response.json().await?;
78 Ok(json)
79 } else {
80 Err(ApiError::HttpError(response.status().as_u16()))
81 }
82 }
83
84 pub async fn get_repo_build_logs_stage_sn_pipeline_id_stage_id(
86 &self,
87 repo: String,
88 sn: String,
89 pipeline_id: String,
90 stage_id: String,
91 ) -> Result<Value> {
92 let path = format!("/{}/-/build/logs/stage/{}/{}/{}", repo, sn, pipeline_id, stage_id);
93 let url = Url::parse(&format!("{}{}", self.base_url, path))?;
94
95
96 let request = self.client.request(
97 reqwest::Method::GET,
98 url
99 );
100
101
102
103
104 let response = request.send().await?;
105
106 if response.status().is_success() {
107 let json: Value = response.json().await?;
108 Ok(json)
109 } else {
110 Err(ApiError::HttpError(response.status().as_u16()))
111 }
112 }
113
114 pub async fn get_repo_build_logs(
116 &self,
117 repo: String,
118 create_time: Option<String>,
119 end_time: Option<String>,
120 event: Option<String>,
121 page: Option<i64>,
122 pagesize: Option<i64>,
123 sha: Option<String>,
124 sn: Option<String>,
125 source_ref: Option<String>,
126 status: Option<String>,
127 target_ref: Option<String>,
128 user_id: Option<String>,
129 user_name: Option<String>,
130 ) -> Result<Value> {
131 let path = format!("/{}/-/build/logs", repo);
132 let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
133
134 if let Some(value) = create_time {
135 url.query_pairs_mut().append_pair("createTime", &value.to_string());
136 }
137 if let Some(value) = end_time {
138 url.query_pairs_mut().append_pair("endTime", &value.to_string());
139 }
140 if let Some(value) = event {
141 url.query_pairs_mut().append_pair("event", &value.to_string());
142 }
143 if let Some(value) = page {
144 url.query_pairs_mut().append_pair("page", &value.to_string());
145 }
146 if let Some(value) = pagesize {
147 url.query_pairs_mut().append_pair("pagesize", &value.to_string());
148 }
149 if let Some(value) = sha {
150 url.query_pairs_mut().append_pair("sha", &value.to_string());
151 }
152 if let Some(value) = sn {
153 url.query_pairs_mut().append_pair("sn", &value.to_string());
154 }
155 if let Some(value) = source_ref {
156 url.query_pairs_mut().append_pair("sourceRef", &value.to_string());
157 }
158 if let Some(value) = status {
159 url.query_pairs_mut().append_pair("status", &value.to_string());
160 }
161 if let Some(value) = target_ref {
162 url.query_pairs_mut().append_pair("targetRef", &value.to_string());
163 }
164 if let Some(value) = user_id {
165 url.query_pairs_mut().append_pair("userId", &value.to_string());
166 }
167 if let Some(value) = user_name {
168 url.query_pairs_mut().append_pair("userName", &value.to_string());
169 }
170
171 let request = self.client.request(
172 reqwest::Method::GET,
173 url
174 );
175
176
177
178
179 let response = request.send().await?;
180
181 if response.status().is_success() {
182 let json: Value = response.json().await?;
183 Ok(json)
184 } else {
185 Err(ApiError::HttpError(response.status().as_u16()))
186 }
187 }
188
189 pub async fn get_repo_build_status_sn(
191 &self,
192 repo: String,
193 sn: String,
194 ) -> Result<Value> {
195 let path = format!("/{}/-/build/status/{}", repo, sn);
196 let url = Url::parse(&format!("{}{}", self.base_url, path))?;
197
198
199 let request = self.client.request(
200 reqwest::Method::GET,
201 url
202 );
203
204
205
206
207 let response = request.send().await?;
208
209 if response.status().is_success() {
210 let json: Value = response.json().await?;
211 Ok(json)
212 } else {
213 Err(ApiError::HttpError(response.status().as_u16()))
214 }
215 }
216
217}