golem_gateway_client/api/
api_definition.rs

1use async_trait::async_trait;
2use crate::Context;
3use crate::Error;
4use crate::model::ApiDefinition;
5use crate::model::ErrorBody;
6use crate::model::ErrorsBody;
7use crate::model::MessageBody;
8use uuid::Uuid;
9
10pub enum ApiDefinitionError {
11    Error400(ErrorsBody),
12    Error401(ErrorBody),
13    Error403(ErrorBody),
14    Error404(MessageBody),
15    Error409(String),
16    Error500(ErrorBody),
17}
18
19#[async_trait]
20pub trait ApiDefinitionClient {
21    async fn get(&self, project_id: &Uuid, api_definition_id: Option<&str>) -> Result<Vec<ApiDefinition>, Error<ApiDefinitionError>>;
22    async fn put(&self, value: &ApiDefinition) -> Result<ApiDefinition, Error<ApiDefinitionError>>;
23    async fn delete(&self, project_id: &Uuid, api_definition_id: &str) -> Result<String, Error<ApiDefinitionError>>;
24}
25
26pub struct ApiDefinitionClientLive {
27    pub context: Context,
28}
29
30#[async_trait]
31impl ApiDefinitionClient for ApiDefinitionClientLive {
32    async fn get(&self, project_id: &Uuid, api_definition_id: Option<&str>) -> Result<Vec<ApiDefinition>, Error<ApiDefinitionError>> {
33        let mut url = self.context.base_url.clone();
34        url.path_segments_mut().unwrap()
35            .push("v1")
36            .push("api")
37            .push("definitions");
38
39        url.query_pairs_mut().append_pair("project-id", &project_id.to_string());
40
41        if let Some(api_definition_id) = api_definition_id {
42            url.query_pairs_mut().append_pair("api-definition-id", &api_definition_id);
43        }
44
45        let mut request = self
46            .context
47            .client
48            .get(url.clone());
49
50        {
51            tracing::info!(method="get", endpoint="/v1/api/definitions", url=url.to_string(), "get");
52        }
53
54        if let Some(token) = self.context.bearer_token() {
55            request = request.bearer_auth(token);
56        }
57
58        let response = request.send().await?;
59
60        let status = response.status().as_u16();
61        match status {
62            200 => {
63                Ok(response.json::<Vec<ApiDefinition>>().await?)
64            }
65            400 => {
66                let body = response.json::<ErrorsBody>().await?;
67                Err(Error::Item(ApiDefinitionError::Error400(body)))
68            }
69            401 => {
70                let body = response.json::<ErrorBody>().await?;
71                Err(Error::Item(ApiDefinitionError::Error401(body)))
72            }
73            403 => {
74                let body = response.json::<ErrorBody>().await?;
75                Err(Error::Item(ApiDefinitionError::Error403(body)))
76            }
77            404 => {
78                let body = response.json::<MessageBody>().await?;
79                Err(Error::Item(ApiDefinitionError::Error404(body)))
80            }
81            409 => {
82                let body = response.json::<String>().await?;
83                Err(Error::Item(ApiDefinitionError::Error409(body)))
84            }
85            500 => {
86                let body = response.json::<ErrorBody>().await?;
87                Err(Error::Item(ApiDefinitionError::Error500(body)))
88            }
89            _ => Err(Error::unexpected(status, response.bytes().await?)),
90        }
91    }
92
93    async fn put(&self, value: &ApiDefinition) -> Result<ApiDefinition, Error<ApiDefinitionError>> {
94        let mut url = self.context.base_url.clone();
95        url.path_segments_mut().unwrap()
96            .push("v1")
97            .push("api")
98            .push("definitions");
99
100        let mut request = self
101            .context
102            .client
103            .put(url.clone());
104
105        {
106            tracing::info!(method="put", endpoint="/v1/api/definitions", url=url.to_string(), body=serde_json::to_string(value)?, "put");
107        }
108
109        if let Some(token) = self.context.bearer_token() {
110            request = request.bearer_auth(token);
111        }
112
113        request = request.json(value);
114
115        let response = request.send().await?;
116
117        let status = response.status().as_u16();
118        match status {
119            200 => {
120                Ok(response.json::<ApiDefinition>().await?)
121            }
122            400 => {
123                let body = response.json::<ErrorsBody>().await?;
124                Err(Error::Item(ApiDefinitionError::Error400(body)))
125            }
126            401 => {
127                let body = response.json::<ErrorBody>().await?;
128                Err(Error::Item(ApiDefinitionError::Error401(body)))
129            }
130            403 => {
131                let body = response.json::<ErrorBody>().await?;
132                Err(Error::Item(ApiDefinitionError::Error403(body)))
133            }
134            404 => {
135                let body = response.json::<MessageBody>().await?;
136                Err(Error::Item(ApiDefinitionError::Error404(body)))
137            }
138            409 => {
139                let body = response.json::<String>().await?;
140                Err(Error::Item(ApiDefinitionError::Error409(body)))
141            }
142            500 => {
143                let body = response.json::<ErrorBody>().await?;
144                Err(Error::Item(ApiDefinitionError::Error500(body)))
145            }
146            _ => Err(Error::unexpected(status, response.bytes().await?)),
147        }
148    }
149
150    async fn delete(&self, project_id: &Uuid, api_definition_id: &str) -> Result<String, Error<ApiDefinitionError>> {
151        let mut url = self.context.base_url.clone();
152        url.path_segments_mut().unwrap()
153            .push("v1")
154            .push("api")
155            .push("definitions");
156
157        url.query_pairs_mut().append_pair("project-id", &project_id.to_string());
158
159        url.query_pairs_mut().append_pair("api-definition-id", &api_definition_id);
160
161        let mut request = self
162            .context
163            .client
164            .delete(url.clone());
165
166        {
167            tracing::info!(method="delete", endpoint="/v1/api/definitions", url=url.to_string(), "delete");
168        }
169
170        if let Some(token) = self.context.bearer_token() {
171            request = request.bearer_auth(token);
172        }
173
174        let response = request.send().await?;
175
176        let status = response.status().as_u16();
177        match status {
178            200 => {
179                Ok(response.json::<String>().await?)
180            }
181            400 => {
182                let body = response.json::<ErrorsBody>().await?;
183                Err(Error::Item(ApiDefinitionError::Error400(body)))
184            }
185            401 => {
186                let body = response.json::<ErrorBody>().await?;
187                Err(Error::Item(ApiDefinitionError::Error401(body)))
188            }
189            403 => {
190                let body = response.json::<ErrorBody>().await?;
191                Err(Error::Item(ApiDefinitionError::Error403(body)))
192            }
193            404 => {
194                let body = response.json::<MessageBody>().await?;
195                Err(Error::Item(ApiDefinitionError::Error404(body)))
196            }
197            409 => {
198                let body = response.json::<String>().await?;
199                Err(Error::Item(ApiDefinitionError::Error409(body)))
200            }
201            500 => {
202                let body = response.json::<ErrorBody>().await?;
203                Err(Error::Item(ApiDefinitionError::Error500(body)))
204            }
205            _ => Err(Error::unexpected(status, response.bytes().await?)),
206        }
207    }
208}