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 get_repo_build_logs_stage_sn_pipeline_id_stage_id(
28 &self,
29 repo: String,
30 sn: String,
31 pipeline_id: String,
32 stage_id: String,
33 ) -> Result<Value> {
34 let path = format!("/{}/-/build/logs/stage/{}/{}/{}", repo, sn, pipeline_id, stage_id);
35 let url = Url::parse(&format!("{}{}", self.base_url, path))?;
36
37
38 let request = self.client.request(
39 reqwest::Method::GET,
40 url
41 );
42
43
44
45
46 let response = request.send().await?;
47
48 if response.status().is_success() {
49 let json: Value = response.json().await?;
50 Ok(json)
51 } else {
52 Err(ApiError::HttpError(response.status().as_u16()))
53 }
54 }
55
56 pub async fn get_repo_build_status_sn(
58 &self,
59 repo: String,
60 sn: String,
61 ) -> Result<Value> {
62 let path = format!("/{}/-/build/status/{}", repo, sn);
63 let url = Url::parse(&format!("{}{}", self.base_url, path))?;
64
65
66 let request = self.client.request(
67 reqwest::Method::GET,
68 url
69 );
70
71
72
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 post_repo_build_start(
86 &self,
87 repo: String,
88 request_data: serde_json::Value,
89 ) -> Result<Value> {
90 let path = format!("/{}/-/build/start", repo);
91 let url = Url::parse(&format!("{}{}", self.base_url, path))?;
92
93
94
95 let mut request = self.client.request(
96 reqwest::Method::POST,
97 url
98 );
99
100
101
102 request = request.json(&request_data);
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 delete_repo_build_logs_sn(
116 &self,
117 repo: String,
118 sn: String,
119 ) -> Result<Value> {
120 let path = format!("/{}/-/build/logs/{}", repo, sn);
121 let url = Url::parse(&format!("{}{}", self.base_url, path))?;
122
123
124 let request = self.client.request(
125 reqwest::Method::DELETE,
126 url
127 );
128
129
130
131
132 let response = request.send().await?;
133
134 if response.status().is_success() {
135 let json: Value = response.json().await?;
136 Ok(json)
137 } else {
138 Err(ApiError::HttpError(response.status().as_u16()))
139 }
140 }
141
142 pub async fn get_repo_build_runner_download_log_pipeline_id(
144 &self,
145 repo: String,
146 pipeline_id: String,
147 ) -> Result<Value> {
148 let path = format!("/{}/-/build/runner/download/log/{}", repo, pipeline_id);
149 let url = Url::parse(&format!("{}{}", self.base_url, path))?;
150
151
152 let request = self.client.request(
153 reqwest::Method::GET,
154 url
155 );
156
157
158
159
160 let response = request.send().await?;
161
162 if response.status().is_success() {
163 let json: Value = response.json().await?;
164 Ok(json)
165 } else {
166 Err(ApiError::HttpError(response.status().as_u16()))
167 }
168 }
169
170 pub async fn get_repo_build_logs(
172 &self,
173 repo: String,
174 create_time: Option<String>,
175 end_time: Option<String>,
176 event: Option<String>,
177 page: Option<i64>,
178 pagesize: Option<i64>,
179 sha: Option<String>,
180 sn: Option<String>,
181 source_ref: Option<String>,
182 status: Option<String>,
183 target_ref: Option<String>,
184 user_id: Option<String>,
185 user_name: Option<String>,
186 ) -> Result<Value> {
187 let path = format!("/{}/-/build/logs", repo);
188 let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
189
190 if let Some(value) = create_time {
191 url.query_pairs_mut().append_pair("createTime", &value.to_string());
192 }
193 if let Some(value) = end_time {
194 url.query_pairs_mut().append_pair("endTime", &value.to_string());
195 }
196 if let Some(value) = event {
197 url.query_pairs_mut().append_pair("event", &value.to_string());
198 }
199 if let Some(value) = page {
200 url.query_pairs_mut().append_pair("page", &value.to_string());
201 }
202 if let Some(value) = pagesize {
203 url.query_pairs_mut().append_pair("pagesize", &value.to_string());
204 }
205 if let Some(value) = sha {
206 url.query_pairs_mut().append_pair("sha", &value.to_string());
207 }
208 if let Some(value) = sn {
209 url.query_pairs_mut().append_pair("sn", &value.to_string());
210 }
211 if let Some(value) = source_ref {
212 url.query_pairs_mut().append_pair("sourceRef", &value.to_string());
213 }
214 if let Some(value) = status {
215 url.query_pairs_mut().append_pair("status", &value.to_string());
216 }
217 if let Some(value) = target_ref {
218 url.query_pairs_mut().append_pair("targetRef", &value.to_string());
219 }
220 if let Some(value) = user_id {
221 url.query_pairs_mut().append_pair("userId", &value.to_string());
222 }
223 if let Some(value) = user_name {
224 url.query_pairs_mut().append_pair("userName", &value.to_string());
225 }
226
227 let request = self.client.request(
228 reqwest::Method::GET,
229 url
230 );
231
232
233
234
235 let response = request.send().await?;
236
237 if response.status().is_success() {
238 let json: Value = response.json().await?;
239 Ok(json)
240 } else {
241 Err(ApiError::HttpError(response.status().as_u16()))
242 }
243 }
244
245 pub async fn post_repo_build_stop_sn(
247 &self,
248 repo: String,
249 sn: String,
250 ) -> Result<Value> {
251 let path = format!("/{}/-/build/stop/{}", repo, sn);
252 let url = Url::parse(&format!("{}{}", self.base_url, path))?;
253
254
255 let request = self.client.request(
256 reqwest::Method::POST,
257 url
258 );
259
260
261
262
263 let response = request.send().await?;
264
265 if response.status().is_success() {
266 let json: Value = response.json().await?;
267 Ok(json)
268 } else {
269 Err(ApiError::HttpError(response.status().as_u16()))
270 }
271 }
272
273}