golem_gateway_client/api/
api_domain.rs

1use 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}