Skip to main content

pib_client/
pib_client.rs

1// SPDX-FileCopyrightText: Politik im Blick developers
2// SPDX-FileCopyrightText: Wolfgang Silbermayr <wolfgang@silbermayr.at>
3//
4// SPDX-License-Identifier: AGPL-3.0-or-later OR EUPL-1.2
5
6use pib_service_api_types::Pagination;
7use pib_service_core_types::{AgendaItemId, BodyId, MeetingId, OrganizationId, PersonId};
8
9mod requests {
10    pub(super) use pib_client_requests::{
11        body::{
12            self,
13            by_id::{
14                meeting::{self, by_id::agenda_item},
15                organization, person,
16            },
17        },
18        config, get, me,
19    };
20}
21mod types {
22    pub(super) use pib_service_api_types::{
23        body::{
24            self,
25            by_id::{
26                meeting::{self, by_id::agenda_item},
27                organization, person,
28            },
29        },
30        config, get, me,
31    };
32}
33
34#[async_trait::async_trait(?Send)]
35pub trait PibClient: Clone {
36    type ClientError: std::error::Error;
37
38    async fn get(&self) -> Result<types::get::ResponseBody, Self::ClientError>;
39
40    async fn config_get(&self) -> Result<types::config::get::ResponseBody, Self::ClientError>;
41
42    async fn body_get(
43        &self,
44        pagination: Pagination,
45    ) -> Result<types::body::get::ResponseBody, Self::ClientError>;
46
47    async fn body_post(
48        &self,
49        payload: types::body::post::RequestBody,
50    ) -> Result<types::body::by_id::get::ResponseBody, Self::ClientError>;
51
52    async fn body_by_id_get(
53        &self,
54        body_id: BodyId,
55    ) -> Result<types::body::by_id::get::ResponseBody, Self::ClientError>;
56
57    async fn body_by_id_meeting_get(
58        &self,
59        body_id: BodyId,
60        pagination: Pagination,
61    ) -> Result<types::meeting::get::ResponseBody, Self::ClientError>;
62
63    async fn body_by_id_meeting_post(
64        &self,
65        body_id: BodyId,
66        payload: types::meeting::post::RequestBody,
67    ) -> Result<types::meeting::by_id::get::ResponseBody, Self::ClientError>;
68
69    async fn body_by_id_meeting_by_id_get(
70        &self,
71        body_id: BodyId,
72        meeting_id: MeetingId,
73    ) -> Result<types::meeting::by_id::get::ResponseBody, Self::ClientError>;
74
75    async fn body_by_id_meeting_by_id_agenda_item_get(
76        &self,
77        body_id: BodyId,
78        meeting_id: MeetingId,
79        pagination: Pagination,
80    ) -> Result<types::agenda_item::get::ResponseBody, Self::ClientError>;
81
82    async fn body_by_id_meeting_by_id_agenda_item_post(
83        &self,
84        body_id: BodyId,
85        meeting_id: MeetingId,
86        payload: types::meeting::by_id::agenda_item::post::RequestBody,
87    ) -> Result<types::agenda_item::by_id::get::ResponseBody, Self::ClientError>;
88
89    async fn body_by_id_meeting_by_id_agenda_item_by_id_get(
90        &self,
91        body_id: BodyId,
92        meeting_id: MeetingId,
93        agenda_item_id: AgendaItemId,
94    ) -> Result<types::agenda_item::by_id::get::ResponseBody, Self::ClientError>;
95
96    async fn body_by_id_organization_get(
97        &self,
98        body_id: BodyId,
99        pagination: Pagination,
100    ) -> Result<types::organization::get::ResponseBody, Self::ClientError>;
101
102    async fn body_by_id_organization_post(
103        &self,
104        body_id: BodyId,
105        payload: types::organization::post::RequestBody,
106    ) -> Result<types::organization::by_id::get::ResponseBody, Self::ClientError>;
107
108    async fn body_by_id_organization_by_id_get(
109        &self,
110        body_id: BodyId,
111        organization_id: OrganizationId,
112    ) -> Result<types::organization::by_id::get::ResponseBody, Self::ClientError>;
113
114    async fn body_by_id_person_get(
115        &self,
116        body_id: BodyId,
117        pagination: Pagination,
118    ) -> Result<types::person::get::ResponseBody, Self::ClientError>;
119
120    async fn body_by_id_person_post(
121        &self,
122        body_id: BodyId,
123        payload: types::person::post::RequestBody,
124    ) -> Result<types::person::by_id::get::ResponseBody, Self::ClientError>;
125
126    async fn body_by_id_person_by_id_get(
127        &self,
128        body_id: BodyId,
129        person_id: PersonId,
130    ) -> Result<types::person::by_id::get::ResponseBody, Self::ClientError>;
131
132    async fn me_profile_get(
133        &self,
134    ) -> Result<types::me::profile::get::ResponseBody, Self::ClientError>;
135
136    async fn me_profile_patch(
137        &self,
138        payload: types::me::profile::patch::RequestBody,
139    ) -> Result<types::me::profile::get::ResponseBody, Self::ClientError>;
140}
141
142#[async_trait::async_trait(?Send)]
143impl<C: http_request_derive_client::Client + Clone> PibClient for C {
144    type ClientError = C::ClientError;
145
146    async fn get(&self) -> Result<types::get::ResponseBody, Self::ClientError> {
147        let response = self.execute(requests::get::Request).await?;
148        Ok(response.0)
149    }
150
151    async fn config_get(&self) -> Result<types::config::get::ResponseBody, Self::ClientError> {
152        let response = self.execute(requests::config::get::Request).await?;
153        Ok(response.0)
154    }
155
156    async fn body_get(
157        &self,
158        pagination: Pagination,
159    ) -> Result<types::body::get::ResponseBody, Self::ClientError> {
160        let response = self
161            .execute(requests::body::get::Request { pagination })
162            .await?;
163        Ok(response.0)
164    }
165
166    async fn body_post(
167        &self,
168        payload: types::body::post::RequestBody,
169    ) -> Result<types::body::by_id::get::ResponseBody, Self::ClientError> {
170        Ok(self
171            .execute(requests::body::post::Request { payload })
172            .await?
173            .0)
174    }
175
176    async fn body_by_id_get(
177        &self,
178        body_id: BodyId,
179    ) -> Result<types::body::by_id::get::ResponseBody, Self::ClientError> {
180        let response = self
181            .execute(requests::body::by_id::get::Request { body_id })
182            .await?;
183        Ok(response.0)
184    }
185
186    async fn body_by_id_meeting_get(
187        &self,
188        body_id: BodyId,
189        pagination: Pagination,
190    ) -> Result<types::meeting::get::ResponseBody, Self::ClientError> {
191        Ok(self
192            .execute(requests::meeting::get::Request {
193                body_id,
194                pagination,
195            })
196            .await?
197            .0)
198    }
199
200    async fn body_by_id_meeting_post(
201        &self,
202        body_id: BodyId,
203        payload: types::meeting::post::RequestBody,
204    ) -> Result<types::meeting::by_id::get::ResponseBody, Self::ClientError> {
205        Ok(self
206            .execute(requests::meeting::post::Request { body_id, payload })
207            .await?
208            .0)
209    }
210
211    async fn body_by_id_meeting_by_id_get(
212        &self,
213        body_id: BodyId,
214        meeting_id: MeetingId,
215    ) -> Result<types::meeting::by_id::get::ResponseBody, Self::ClientError> {
216        let response = self
217            .execute(requests::meeting::by_id::get::Request {
218                body_id,
219                meeting_id,
220            })
221            .await?;
222        Ok(response.0)
223    }
224
225    async fn body_by_id_meeting_by_id_agenda_item_get(
226        &self,
227        body_id: BodyId,
228        meeting_id: MeetingId,
229        pagination: Pagination,
230    ) -> Result<types::agenda_item::get::ResponseBody, Self::ClientError> {
231        let response = self
232            .execute(requests::agenda_item::get::Request {
233                body_id,
234                meeting_id,
235                pagination,
236            })
237            .await?;
238        Ok(response.0)
239    }
240
241    async fn body_by_id_meeting_by_id_agenda_item_post(
242        &self,
243        body_id: BodyId,
244        meeting_id: MeetingId,
245        payload: types::agenda_item::post::RequestBody,
246    ) -> Result<types::agenda_item::by_id::get::ResponseBody, Self::ClientError> {
247        Ok(self
248            .execute(requests::agenda_item::post::Request {
249                body_id,
250                meeting_id,
251                payload,
252            })
253            .await?
254            .0)
255    }
256
257    async fn body_by_id_meeting_by_id_agenda_item_by_id_get(
258        &self,
259        body_id: BodyId,
260        meeting_id: MeetingId,
261        agenda_item_id: AgendaItemId,
262    ) -> Result<types::agenda_item::by_id::get::ResponseBody, Self::ClientError> {
263        let response = self
264            .execute(requests::agenda_item::by_id::get::Request {
265                body_id,
266                meeting_id,
267                agenda_item_id,
268            })
269            .await?;
270        Ok(response.0)
271    }
272
273    async fn body_by_id_organization_get(
274        &self,
275        body_id: BodyId,
276        pagination: Pagination,
277    ) -> Result<types::organization::get::ResponseBody, Self::ClientError> {
278        Ok(self
279            .execute(requests::organization::get::Request {
280                body_id,
281                pagination,
282            })
283            .await?
284            .0)
285    }
286
287    async fn body_by_id_organization_post(
288        &self,
289        body_id: BodyId,
290        payload: types::organization::post::RequestBody,
291    ) -> Result<types::organization::by_id::get::ResponseBody, Self::ClientError> {
292        Ok(self
293            .execute(requests::organization::post::Request { body_id, payload })
294            .await?
295            .0)
296    }
297
298    async fn body_by_id_organization_by_id_get(
299        &self,
300        body_id: BodyId,
301        organization_id: OrganizationId,
302    ) -> Result<types::organization::by_id::get::ResponseBody, Self::ClientError> {
303        let response = self
304            .execute(requests::organization::by_id::get::Request {
305                body_id,
306                organization_id,
307            })
308            .await?;
309        Ok(response.0)
310    }
311
312    async fn body_by_id_person_get(
313        &self,
314        body_id: BodyId,
315        pagination: Pagination,
316    ) -> Result<types::person::get::ResponseBody, Self::ClientError> {
317        Ok(self
318            .execute(requests::person::get::Request {
319                body_id,
320                pagination,
321            })
322            .await?
323            .0)
324    }
325
326    async fn body_by_id_person_post(
327        &self,
328        body_id: BodyId,
329        payload: types::person::post::RequestBody,
330    ) -> Result<types::person::by_id::get::ResponseBody, Self::ClientError> {
331        Ok(self
332            .execute(requests::person::post::Request { body_id, payload })
333            .await?
334            .0)
335    }
336
337    async fn body_by_id_person_by_id_get(
338        &self,
339        body_id: BodyId,
340        person_id: PersonId,
341    ) -> Result<types::person::by_id::get::ResponseBody, Self::ClientError> {
342        let response = self
343            .execute(requests::person::by_id::get::Request { body_id, person_id })
344            .await?;
345        Ok(response.0)
346    }
347
348    async fn me_profile_get(
349        &self,
350    ) -> Result<types::me::profile::get::ResponseBody, Self::ClientError> {
351        Ok(self.execute(requests::me::profile::get::Request).await?.0)
352    }
353
354    async fn me_profile_patch(
355        &self,
356        payload: types::me::profile::patch::RequestBody,
357    ) -> Result<types::me::profile::get::ResponseBody, Self::ClientError> {
358        Ok(self
359            .execute(requests::me::profile::patch::Request { payload })
360            .await?
361            .0)
362    }
363}