1use crate::{
4 errors::ApolloClientResult,
5 meta::{PerformRequest, DEFAULT_CLUSTER_NAME},
6 open::{
7 meta::{OpenCreatedItem, OpenRelease, OpenUpdateItem},
8 responses::{
9 OpenAppResponse, OpenClusterResponse, OpenEnvClusterResponse, OpenItemResponse,
10 OpenNamespaceResponse, OpenPublishResponse,
11 },
12 },
13};
14use http::Method;
15use reqwest::RequestBuilder;
16use std::borrow::Cow;
17
18const OPEN_API_PREFIX: &str = "openapi/v1";
19
20pub(crate) trait PerformOpenRequest: PerformRequest {}
22
23#[derive(Clone, Debug)]
25pub struct OpenEnvClusterRequest {
26 pub app_id: String,
27}
28
29impl Default for OpenEnvClusterRequest {
30 fn default() -> Self {
31 OpenEnvClusterRequest {
32 app_id: "".to_string(),
33 }
34 }
35}
36
37impl PerformRequest for OpenEnvClusterRequest {
38 type Response = Vec<OpenEnvClusterResponse>;
39
40 fn path(&self) -> String {
41 format!("{}/apps/{}/envclusters", OPEN_API_PREFIX, self.app_id)
42 }
43
44 fn app_id(&self) -> Option<&str> {
45 Some(&self.app_id)
46 }
47}
48
49impl PerformOpenRequest for OpenEnvClusterRequest {}
50
51#[derive(Clone, Debug, Default)]
53pub struct OpenAppRequest {
54 pub app_ids: Option<Vec<String>>,
55}
56
57impl PerformRequest for OpenAppRequest {
58 type Response = Vec<OpenAppResponse>;
59
60 fn path(&self) -> String {
61 format!("{}/apps", OPEN_API_PREFIX)
62 }
63
64 fn queries(&self) -> ApolloClientResult<Vec<(Cow<'_, str>, Cow<'_, str>)>> {
65 Ok(self
66 .app_ids
67 .as_ref()
68 .map(|app_ids| {
69 vec![(
70 "appIds".into(),
71 app_ids
72 .iter()
73 .map(|s| s.as_ref())
74 .collect::<Vec<&str>>()
75 .join(",")
76 .into(),
77 )]
78 })
79 .unwrap_or_default())
80 }
81}
82
83impl PerformOpenRequest for OpenAppRequest {}
84
85#[derive(Clone, Debug)]
87pub struct OpenClusterRequest {
88 pub env: String,
89 pub app_id: String,
90 pub cluster_name: String,
91}
92
93impl Default for OpenClusterRequest {
94 fn default() -> Self {
95 OpenClusterRequest {
96 env: "".to_string(),
97 app_id: "".to_string(),
98 cluster_name: DEFAULT_CLUSTER_NAME.to_string(),
99 }
100 }
101}
102
103impl PerformRequest for OpenClusterRequest {
104 type Response = OpenClusterResponse;
105
106 fn path(&self) -> String {
107 format!(
108 "{}/envs/{}/apps/{}/clusters/{}",
109 OPEN_API_PREFIX, self.env, self.app_id, self.cluster_name
110 )
111 }
112
113 fn app_id(&self) -> Option<&str> {
114 Some(&self.app_id)
115 }
116}
117
118impl PerformOpenRequest for OpenClusterRequest {}
119
120#[derive(Clone, Debug)]
122pub struct OpenNamespaceRequest {
123 pub env: String,
124 pub app_id: String,
125 pub cluster_name: String,
126}
127
128impl Default for OpenNamespaceRequest {
129 fn default() -> Self {
130 OpenNamespaceRequest {
131 env: "".to_string(),
132 app_id: "".to_string(),
133 cluster_name: DEFAULT_CLUSTER_NAME.to_string(),
134 }
135 }
136}
137
138impl PerformRequest for OpenNamespaceRequest {
139 type Response = Vec<OpenNamespaceResponse>;
140
141 fn path(&self) -> String {
142 format!(
143 "{}/envs/{}/apps/{}/clusters/{}/namespaces",
144 OPEN_API_PREFIX, self.env, self.app_id, self.cluster_name
145 )
146 }
147
148 fn app_id(&self) -> Option<&str> {
149 Some(&self.app_id)
150 }
151}
152
153impl PerformOpenRequest for OpenNamespaceRequest {}
154
155#[derive(Debug, Clone)]
157pub struct OpenCreateItemRequest {
158 pub env: String,
159 pub app_id: String,
160 pub namespace_name: String,
161 pub cluster_name: String,
162 pub item: OpenCreatedItem,
163}
164
165impl Default for OpenCreateItemRequest {
166 fn default() -> Self {
167 OpenCreateItemRequest {
168 env: "".to_string(),
169 app_id: "".to_string(),
170 namespace_name: "".to_string(),
171 cluster_name: DEFAULT_CLUSTER_NAME.to_string(),
172 item: Default::default(),
173 }
174 }
175}
176
177impl PerformRequest for OpenCreateItemRequest {
178 type Response = OpenItemResponse;
179
180 fn path(&self) -> String {
181 format!(
182 "{}/envs/{}/apps/{}/clusters/{}/namespaces/{}/items",
183 OPEN_API_PREFIX, self.env, self.app_id, self.cluster_name, self.namespace_name
184 )
185 }
186
187 fn method(&self) -> Method {
188 Method::POST
189 }
190
191 fn request_builder(&self, request_builder: RequestBuilder) -> RequestBuilder {
192 request_builder.json(&self.item)
193 }
194
195 fn app_id(&self) -> Option<&str> {
196 Some(&self.app_id)
197 }
198}
199
200impl PerformOpenRequest for OpenCreateItemRequest {}
201
202#[derive(Debug, Clone)]
204pub struct OpenUpdateItemRequest {
205 pub env: String,
206 pub app_id: String,
207 pub namespace_name: String,
208 pub cluster_name: String,
209 pub create_if_not_exists: bool,
210 pub item: OpenUpdateItem,
211}
212
213impl Default for OpenUpdateItemRequest {
214 fn default() -> Self {
215 OpenUpdateItemRequest {
216 env: "".to_string(),
217 app_id: "".to_string(),
218 namespace_name: "".to_string(),
219 cluster_name: DEFAULT_CLUSTER_NAME.to_string(),
220 create_if_not_exists: false,
221 item: Default::default(),
222 }
223 }
224}
225
226impl PerformRequest for OpenUpdateItemRequest {
227 type Response = ();
228
229 fn path(&self) -> String {
230 format!(
231 "{}/envs/{}/apps/{}/clusters/{}/namespaces/{}/items/{}",
232 OPEN_API_PREFIX,
233 self.env,
234 self.app_id,
235 self.cluster_name,
236 self.namespace_name,
237 self.item.key,
238 )
239 }
240
241 fn method(&self) -> Method {
242 Method::PUT
243 }
244
245 fn queries(&self) -> ApolloClientResult<Vec<(Cow<'_, str>, Cow<'_, str>)>> {
246 let mut queries = vec![];
247 if self.create_if_not_exists {
248 queries.push(("createIfNotExists".into(), "true".into()));
249 }
250 Ok(queries)
251 }
252
253 fn request_builder(&self, request_builder: RequestBuilder) -> RequestBuilder {
254 request_builder.json(&self.item)
255 }
256
257 fn app_id(&self) -> Option<&str> {
258 Some(&self.app_id)
259 }
260}
261
262impl PerformOpenRequest for OpenUpdateItemRequest {}
263
264#[derive(Debug, Clone)]
266pub struct OpenPublishNamespaceRequest {
267 pub env: String,
268 pub app_id: String,
269 pub namespace_name: String,
270 pub cluster_name: String,
271 pub release: OpenRelease,
272}
273
274impl Default for OpenPublishNamespaceRequest {
275 fn default() -> Self {
276 OpenPublishNamespaceRequest {
277 env: "".to_string(),
278 app_id: "".to_string(),
279 namespace_name: "".to_string(),
280 cluster_name: DEFAULT_CLUSTER_NAME.to_string(),
281 release: Default::default(),
282 }
283 }
284}
285
286impl PerformRequest for OpenPublishNamespaceRequest {
287 type Response = OpenPublishResponse;
288
289 fn path(&self) -> String {
290 format!(
291 "{}/envs/{}/apps/{}/clusters/{}/namespaces/{}/releases",
292 OPEN_API_PREFIX, self.env, self.app_id, self.cluster_name, self.namespace_name
293 )
294 }
295
296 fn method(&self) -> Method {
297 Method::POST
298 }
299
300 fn request_builder(&self, request_builder: RequestBuilder) -> RequestBuilder {
301 request_builder.json(&self.release)
302 }
303
304 fn app_id(&self) -> Option<&str> {
305 Some(&self.app_id)
306 }
307}
308
309impl PerformOpenRequest for OpenPublishNamespaceRequest {}