golem_gateway_client/api/
api_definition.rs1use 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}