apollo_client/open/
requests.rs

1//! open api requests.
2
3use 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
20/// Request executed by [crate::open::OpenApiClient::execute];
21pub(crate) trait PerformOpenRequest: PerformRequest {}
22
23/// Fetch cluster and environment infos.
24#[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/// Fetch app infos.
52#[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/// Fetch cluster infos.
86#[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/// Fetch namespace info.
121#[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/// Create configuration item.
156#[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/// Update configuration item.
203#[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/// Publish a namespace.
265#[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 {}