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