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::{
7    Index, Pagination,
8    body::{
9        Body, NewBody,
10        by_id::{
11            meeting::{
12                Meeting, NewMeeting,
13                by_id::agenda_item::{AgendaItem, NewAgendaItem, UpdateAgendaItem},
14            },
15            membership::{self, Membership, NewMembership, UpdateMembership},
16            organization::{self, NewOrganization, Organization},
17            permission::{NewPermission, Permission},
18            person::{self, NewPerson, Person},
19        },
20    },
21    config::Config,
22    me::profile::{Profile, UpdateProfile},
23    user::User,
24};
25use pib_service_core_types::{
26    AgendaItemId, BodyId, BodyPermissionId, DataPage, MeetingId, MembershipId, OrganizationId,
27    PersonId, UserId,
28};
29
30mod requests {
31    pub(super) use pib_client_requests::{
32        body::{
33            self,
34            by_id::{
35                meeting::{self, by_id::agenda_item},
36                membership, organization, permission, person,
37            },
38        },
39        config, get, me, user,
40    };
41}
42
43mod types {
44    pub(super) use pib_service_api_types::{
45        body::{
46            self,
47            by_id::{
48                meeting::{self, by_id::agenda_item},
49                organization, permission, person,
50            },
51        },
52        me, user,
53    };
54}
55
56#[async_trait::async_trait(?Send)]
57pub trait PibClient: Clone {
58    type ClientError: std::error::Error;
59
60    async fn get(&self) -> Result<Index, Self::ClientError>;
61
62    async fn config_get(&self) -> Result<Config, Self::ClientError>;
63
64    async fn user_get(&self, pagination: Pagination) -> Result<DataPage<User>, Self::ClientError>;
65
66    async fn user_by_id_get(&self, user_id: UserId) -> Result<User, Self::ClientError>;
67
68    async fn body_get(&self, pagination: Pagination) -> Result<DataPage<Body>, Self::ClientError>;
69
70    async fn body_post(&self, new_body: NewBody) -> Result<Body, Self::ClientError>;
71
72    async fn body_by_id_get(&self, body_id: BodyId) -> Result<Body, Self::ClientError>;
73
74    async fn body_by_id_permission_get(
75        &self,
76        body_id: BodyId,
77        pagination: Pagination,
78    ) -> Result<DataPage<Permission>, Self::ClientError>;
79
80    async fn body_by_id_permission_post(
81        &self,
82        body_id: BodyId,
83        new_permission: NewPermission,
84    ) -> Result<Permission, Self::ClientError>;
85
86    async fn body_by_id_permission_by_id_get(
87        &self,
88        body_id: BodyId,
89        permission_id: BodyPermissionId,
90    ) -> Result<Permission, Self::ClientError>;
91
92    async fn body_by_id_meeting_get(
93        &self,
94        body_id: BodyId,
95        pagination: Pagination,
96    ) -> Result<DataPage<Meeting>, Self::ClientError>;
97
98    async fn body_by_id_meeting_post(
99        &self,
100        body_id: BodyId,
101        new_meeting: NewMeeting,
102    ) -> Result<Meeting, Self::ClientError>;
103
104    async fn body_by_id_meeting_by_id_get(
105        &self,
106        body_id: BodyId,
107        meeting_id: MeetingId,
108    ) -> Result<Meeting, Self::ClientError>;
109
110    async fn body_by_id_meeting_by_id_agenda_item_get(
111        &self,
112        body_id: BodyId,
113        meeting_id: MeetingId,
114        pagination: Pagination,
115    ) -> Result<DataPage<AgendaItem>, Self::ClientError>;
116
117    async fn body_by_id_meeting_by_id_agenda_item_post(
118        &self,
119        body_id: BodyId,
120        meeting_id: MeetingId,
121        new_agenda_item: NewAgendaItem,
122    ) -> Result<AgendaItem, Self::ClientError>;
123
124    async fn body_by_id_meeting_by_id_agenda_item_by_id_get(
125        &self,
126        body_id: BodyId,
127        meeting_id: MeetingId,
128        agenda_item_id: AgendaItemId,
129    ) -> Result<AgendaItem, Self::ClientError>;
130
131    async fn body_by_id_meeting_by_id_agenda_item_by_id_patch(
132        &self,
133        body_id: BodyId,
134        meeting_id: MeetingId,
135        agenda_item_id: AgendaItemId,
136        update_agenda_item: UpdateAgendaItem,
137    ) -> Result<types::agenda_item::AgendaItem, Self::ClientError>;
138
139    async fn body_by_id_organization_get(
140        &self,
141        body_id: BodyId,
142        pagination: Pagination,
143    ) -> Result<DataPage<Organization>, Self::ClientError>;
144
145    async fn body_by_id_organization_post(
146        &self,
147        body_id: BodyId,
148        payload: NewOrganization,
149    ) -> Result<Organization, Self::ClientError>;
150
151    async fn body_by_id_organization_by_id_get(
152        &self,
153        body_id: BodyId,
154        organization_id: OrganizationId,
155    ) -> Result<Organization, Self::ClientError>;
156
157    async fn body_by_id_organization_by_id_membership_get(
158        &self,
159        body_id: BodyId,
160        organization_id: OrganizationId,
161        pagination: Pagination,
162    ) -> Result<DataPage<Membership>, Self::ClientError>;
163
164    async fn body_by_id_organization_by_id_membership_post(
165        &self,
166        body_id: BodyId,
167        organization_id: OrganizationId,
168        new_membership: organization::by_id::membership::NewMembership,
169    ) -> Result<Membership, Self::ClientError>;
170
171    async fn body_by_id_organization_by_id_membership_by_id_get(
172        &self,
173        body_id: BodyId,
174        organization_id: OrganizationId,
175        membership_id: MembershipId,
176    ) -> Result<Membership, Self::ClientError>;
177
178    async fn body_by_id_organization_by_id_membership_by_id_patch(
179        &self,
180        body_id: BodyId,
181        organization_id: OrganizationId,
182        membership_id: MembershipId,
183        update_membership: UpdateMembership,
184    ) -> Result<Membership, Self::ClientError>;
185
186    async fn body_by_id_person_get(
187        &self,
188        body_id: BodyId,
189        pagination: Pagination,
190    ) -> Result<DataPage<Person>, Self::ClientError>;
191
192    async fn body_by_id_person_post(
193        &self,
194        body_id: BodyId,
195        new_person: NewPerson,
196    ) -> Result<Person, Self::ClientError>;
197
198    async fn body_by_id_person_by_id_get(
199        &self,
200        body_id: BodyId,
201        person_id: PersonId,
202    ) -> Result<Person, Self::ClientError>;
203
204    async fn body_by_id_person_by_id_membership_get(
205        &self,
206        body_id: BodyId,
207        person_id: PersonId,
208        pagination: Pagination,
209    ) -> Result<DataPage<Membership>, Self::ClientError>;
210
211    async fn body_by_id_person_by_id_membership_post(
212        &self,
213        body_id: BodyId,
214        person_id: PersonId,
215        new_membership: person::by_id::membership::NewMembership,
216    ) -> Result<Membership, Self::ClientError>;
217
218    async fn body_by_id_person_by_id_membership_by_id_get(
219        &self,
220        body_id: BodyId,
221        person_id: PersonId,
222        membership_id: MembershipId,
223    ) -> Result<Membership, Self::ClientError>;
224
225    async fn body_by_id_person_by_id_membership_by_id_patch(
226        &self,
227        body_id: BodyId,
228        person_id: PersonId,
229        membership_id: MembershipId,
230        update_membership: UpdateMembership,
231    ) -> Result<Membership, Self::ClientError>;
232
233    async fn body_by_id_membership_get(
234        &self,
235        body_id: BodyId,
236        pagination: Pagination,
237    ) -> Result<DataPage<Membership>, Self::ClientError>;
238
239    async fn body_by_id_membership_post(
240        &self,
241        body_id: BodyId,
242        new_membership: NewMembership,
243    ) -> Result<Membership, Self::ClientError>;
244
245    async fn body_by_id_membership_by_id_get(
246        &self,
247        body_id: BodyId,
248        membership_id: MembershipId,
249    ) -> Result<Membership, Self::ClientError>;
250
251    async fn body_by_id_membership_by_id_patch(
252        &self,
253        body_id: BodyId,
254        membership_id: MembershipId,
255        update_membership: UpdateMembership,
256    ) -> Result<Membership, Self::ClientError>;
257
258    async fn me_profile_get(&self) -> Result<Profile, Self::ClientError>;
259
260    async fn me_profile_patch(
261        &self,
262        update_profile: UpdateProfile,
263    ) -> Result<Profile, Self::ClientError>;
264}
265
266#[async_trait::async_trait(?Send)]
267impl<C: http_request_derive_client::Client + Clone> PibClient for C {
268    type ClientError = C::ClientError;
269
270    async fn get(&self) -> Result<Index, Self::ClientError> {
271        let response = self.execute(requests::get::Request).await?;
272        Ok(response.0.0)
273    }
274
275    async fn config_get(&self) -> Result<Config, Self::ClientError> {
276        let response = self.execute(requests::config::get::Request).await?;
277        Ok(response.0.0)
278    }
279
280    async fn user_get(
281        &self,
282        pagination: Pagination,
283    ) -> Result<DataPage<types::user::User>, Self::ClientError> {
284        let response = self
285            .execute(requests::user::get::Request { pagination })
286            .await?;
287        Ok(response.0.0)
288    }
289
290    async fn user_by_id_get(
291        &self,
292        user_id: UserId,
293    ) -> Result<types::user::User, Self::ClientError> {
294        let response = self
295            .execute(requests::user::by_id::get::Request { user_id })
296            .await?;
297        Ok(response.0.0)
298    }
299
300    async fn body_get(
301        &self,
302        pagination: Pagination,
303    ) -> Result<DataPage<types::body::Body>, Self::ClientError> {
304        let response = self
305            .execute(requests::body::get::Request { pagination })
306            .await?;
307        Ok(response.0.0)
308    }
309
310    async fn body_post(
311        &self,
312        new_body: types::body::NewBody,
313    ) -> Result<types::body::Body, Self::ClientError> {
314        Ok(self
315            .execute(requests::body::post::Request {
316                payload: types::body::post::RequestBody(new_body),
317            })
318            .await?
319            .0
320            .0)
321    }
322
323    async fn body_by_id_get(
324        &self,
325        body_id: BodyId,
326    ) -> Result<types::body::Body, Self::ClientError> {
327        let response = self
328            .execute(requests::body::by_id::get::Request { body_id })
329            .await?;
330        Ok(response.0.0)
331    }
332
333    async fn body_by_id_permission_get(
334        &self,
335        body_id: BodyId,
336        pagination: Pagination,
337    ) -> Result<DataPage<Permission>, Self::ClientError> {
338        Ok(self
339            .execute(requests::permission::get::Request {
340                body_id,
341                pagination,
342            })
343            .await?
344            .0
345            .0)
346    }
347
348    async fn body_by_id_permission_post(
349        &self,
350        body_id: BodyId,
351        new_permission: NewPermission,
352    ) -> Result<Permission, Self::ClientError> {
353        Ok(self
354            .execute(requests::permission::post::Request {
355                body_id,
356                payload: types::permission::post::RequestBody(new_permission),
357            })
358            .await?
359            .0
360            .0)
361    }
362
363    async fn body_by_id_permission_by_id_get(
364        &self,
365        body_id: BodyId,
366        permission_id: BodyPermissionId,
367    ) -> Result<types::permission::Permission, Self::ClientError> {
368        let response = self
369            .execute(requests::permission::by_id::get::Request {
370                body_id,
371                permission_id,
372            })
373            .await?;
374        Ok(response.0.0)
375    }
376
377    async fn body_by_id_meeting_get(
378        &self,
379        body_id: BodyId,
380        pagination: Pagination,
381    ) -> Result<DataPage<types::meeting::Meeting>, Self::ClientError> {
382        Ok(self
383            .execute(requests::meeting::get::Request {
384                body_id,
385                pagination,
386            })
387            .await?
388            .0
389            .0)
390    }
391
392    async fn body_by_id_meeting_post(
393        &self,
394        body_id: BodyId,
395        new_meeting: types::meeting::NewMeeting,
396    ) -> Result<types::meeting::Meeting, Self::ClientError> {
397        Ok(self
398            .execute(requests::meeting::post::Request {
399                body_id,
400                payload: types::meeting::post::RequestBody(new_meeting),
401            })
402            .await?
403            .0
404            .0)
405    }
406
407    async fn body_by_id_meeting_by_id_get(
408        &self,
409        body_id: BodyId,
410        meeting_id: MeetingId,
411    ) -> Result<types::meeting::Meeting, Self::ClientError> {
412        let response = self
413            .execute(requests::meeting::by_id::get::Request {
414                body_id,
415                meeting_id,
416            })
417            .await?;
418        Ok(response.0.0)
419    }
420
421    async fn body_by_id_meeting_by_id_agenda_item_get(
422        &self,
423        body_id: BodyId,
424        meeting_id: MeetingId,
425        pagination: Pagination,
426    ) -> Result<DataPage<types::agenda_item::AgendaItem>, Self::ClientError> {
427        let response = self
428            .execute(requests::agenda_item::get::Request {
429                body_id,
430                meeting_id,
431                pagination,
432            })
433            .await?;
434        Ok(response.0.0)
435    }
436
437    async fn body_by_id_meeting_by_id_agenda_item_post(
438        &self,
439        body_id: BodyId,
440        meeting_id: MeetingId,
441        new_agenda_item: types::agenda_item::NewAgendaItem,
442    ) -> Result<types::agenda_item::AgendaItem, Self::ClientError> {
443        Ok(self
444            .execute(requests::agenda_item::post::Request {
445                body_id,
446                meeting_id,
447                payload: types::agenda_item::post::RequestBody(new_agenda_item),
448            })
449            .await?
450            .0
451            .0)
452    }
453
454    async fn body_by_id_meeting_by_id_agenda_item_by_id_get(
455        &self,
456        body_id: BodyId,
457        meeting_id: MeetingId,
458        agenda_item_id: AgendaItemId,
459    ) -> Result<types::agenda_item::AgendaItem, Self::ClientError> {
460        let response = self
461            .execute(requests::agenda_item::by_id::get::Request {
462                body_id,
463                meeting_id,
464                agenda_item_id,
465            })
466            .await?;
467        Ok(response.0.0)
468    }
469
470    async fn body_by_id_meeting_by_id_agenda_item_by_id_patch(
471        &self,
472        body_id: BodyId,
473        meeting_id: MeetingId,
474        agenda_item_id: AgendaItemId,
475        update_agenda_item: UpdateAgendaItem,
476    ) -> Result<types::agenda_item::AgendaItem, Self::ClientError> {
477        let response = self
478            .execute(requests::agenda_item::by_id::patch::Request {
479                body_id,
480                meeting_id,
481                agenda_item_id,
482                payload: types::agenda_item::by_id::patch::RequestBody(update_agenda_item),
483            })
484            .await?;
485        Ok(response.0.0)
486    }
487
488    async fn body_by_id_organization_get(
489        &self,
490        body_id: BodyId,
491        pagination: Pagination,
492    ) -> Result<DataPage<types::organization::Organization>, Self::ClientError> {
493        Ok(self
494            .execute(requests::organization::get::Request {
495                body_id,
496                pagination,
497            })
498            .await?
499            .0
500            .0)
501    }
502
503    async fn body_by_id_organization_post(
504        &self,
505        body_id: BodyId,
506        new_organization: types::organization::NewOrganization,
507    ) -> Result<types::organization::Organization, Self::ClientError> {
508        Ok(self
509            .execute(requests::organization::post::Request {
510                body_id,
511                payload: types::organization::post::RequestBody(new_organization),
512            })
513            .await?
514            .0
515            .0)
516    }
517
518    async fn body_by_id_organization_by_id_get(
519        &self,
520        body_id: BodyId,
521        organization_id: OrganizationId,
522    ) -> Result<types::organization::Organization, Self::ClientError> {
523        let response = self
524            .execute(requests::organization::by_id::get::Request {
525                body_id,
526                organization_id,
527            })
528            .await?;
529        Ok(response.0.0)
530    }
531
532    async fn body_by_id_organization_by_id_membership_get(
533        &self,
534        body_id: BodyId,
535        organization_id: OrganizationId,
536        pagination: Pagination,
537    ) -> Result<DataPage<Membership>, Self::ClientError> {
538        let response = self
539            .execute(requests::organization::by_id::membership::get::Request {
540                body_id,
541                organization_id,
542                pagination,
543            })
544            .await?;
545        Ok(response.0.0)
546    }
547
548    async fn body_by_id_organization_by_id_membership_post(
549        &self,
550        body_id: BodyId,
551        organization_id: OrganizationId,
552        new_membership: organization::by_id::membership::NewMembership,
553    ) -> Result<Membership, Self::ClientError> {
554        Ok(self
555            .execute(requests::organization::by_id::membership::post::Request {
556                body_id,
557                organization_id,
558                payload: types::organization::by_id::membership::post::RequestBody(new_membership),
559            })
560            .await?
561            .0
562            .0)
563    }
564
565    async fn body_by_id_organization_by_id_membership_by_id_get(
566        &self,
567        body_id: BodyId,
568        organization_id: OrganizationId,
569        membership_id: MembershipId,
570    ) -> Result<Membership, Self::ClientError> {
571        let response = self
572            .execute(
573                requests::organization::by_id::membership::by_id::get::Request {
574                    body_id,
575                    organization_id,
576                    membership_id,
577                },
578            )
579            .await?;
580        Ok(response.0.0)
581    }
582
583    async fn body_by_id_organization_by_id_membership_by_id_patch(
584        &self,
585        body_id: BodyId,
586        organization_id: OrganizationId,
587        membership_id: MembershipId,
588        update_membership: UpdateMembership,
589    ) -> Result<Membership, Self::ClientError> {
590        let response = self
591            .execute(
592                requests::organization::by_id::membership::by_id::patch::Request {
593                    body_id,
594                    organization_id,
595                    membership_id,
596                    payload: organization::by_id::membership::by_id::patch::RequestBody(
597                        update_membership,
598                    ),
599                },
600            )
601            .await?;
602        Ok(response.0.0)
603    }
604
605    async fn body_by_id_person_get(
606        &self,
607        body_id: BodyId,
608        pagination: Pagination,
609    ) -> Result<DataPage<types::person::Person>, Self::ClientError> {
610        Ok(self
611            .execute(requests::person::get::Request {
612                body_id,
613                pagination,
614            })
615            .await?
616            .0
617            .0)
618    }
619
620    async fn body_by_id_person_post(
621        &self,
622        body_id: BodyId,
623        new_person: types::person::NewPerson,
624    ) -> Result<types::person::Person, Self::ClientError> {
625        Ok(self
626            .execute(requests::person::post::Request {
627                body_id,
628                payload: types::person::post::RequestBody(new_person),
629            })
630            .await?
631            .0
632            .0)
633    }
634
635    async fn body_by_id_person_by_id_get(
636        &self,
637        body_id: BodyId,
638        person_id: PersonId,
639    ) -> Result<types::person::Person, Self::ClientError> {
640        let response = self
641            .execute(requests::person::by_id::get::Request { body_id, person_id })
642            .await?;
643        Ok(response.0.0)
644    }
645
646    async fn body_by_id_person_by_id_membership_get(
647        &self,
648        body_id: BodyId,
649        person_id: PersonId,
650        pagination: Pagination,
651    ) -> Result<DataPage<Membership>, Self::ClientError> {
652        let response = self
653            .execute(requests::person::by_id::membership::get::Request {
654                body_id,
655                person_id,
656                pagination,
657            })
658            .await?;
659        Ok(response.0.0)
660    }
661
662    async fn body_by_id_person_by_id_membership_post(
663        &self,
664        body_id: BodyId,
665        person_id: PersonId,
666        new_membership: person::by_id::membership::NewMembership,
667    ) -> Result<Membership, Self::ClientError> {
668        Ok(self
669            .execute(requests::person::by_id::membership::post::Request {
670                body_id,
671                person_id,
672                payload: types::person::by_id::membership::post::RequestBody(new_membership),
673            })
674            .await?
675            .0
676            .0)
677    }
678
679    async fn body_by_id_person_by_id_membership_by_id_get(
680        &self,
681        body_id: BodyId,
682        person_id: PersonId,
683        membership_id: MembershipId,
684    ) -> Result<Membership, Self::ClientError> {
685        let response = self
686            .execute(requests::person::by_id::membership::by_id::get::Request {
687                body_id,
688                person_id,
689                membership_id,
690            })
691            .await?;
692        Ok(response.0.0)
693    }
694
695    async fn body_by_id_person_by_id_membership_by_id_patch(
696        &self,
697        body_id: BodyId,
698        person_id: PersonId,
699        membership_id: MembershipId,
700        update_membership: UpdateMembership,
701    ) -> Result<Membership, Self::ClientError> {
702        let response = self
703            .execute(requests::person::by_id::membership::by_id::patch::Request {
704                body_id,
705                person_id,
706                membership_id,
707                payload: person::by_id::membership::by_id::patch::RequestBody(update_membership),
708            })
709            .await?;
710        Ok(response.0.0)
711    }
712
713    async fn body_by_id_membership_get(
714        &self,
715        body_id: BodyId,
716        pagination: Pagination,
717    ) -> Result<DataPage<Membership>, Self::ClientError> {
718        let response = self
719            .execute(requests::membership::get::Request {
720                body_id,
721                pagination,
722            })
723            .await?;
724        Ok(response.0.0)
725    }
726
727    async fn body_by_id_membership_post(
728        &self,
729        body_id: BodyId,
730        new_membership: membership::NewMembership,
731    ) -> Result<Membership, Self::ClientError> {
732        Ok(self
733            .execute(requests::membership::post::Request {
734                body_id,
735                payload: membership::post::RequestBody(new_membership),
736            })
737            .await?
738            .0
739            .0)
740    }
741
742    async fn body_by_id_membership_by_id_get(
743        &self,
744        body_id: BodyId,
745        membership_id: MembershipId,
746    ) -> Result<Membership, Self::ClientError> {
747        let response = self
748            .execute(requests::membership::by_id::get::Request {
749                body_id,
750                membership_id,
751            })
752            .await?;
753        Ok(response.0.0)
754    }
755
756    async fn body_by_id_membership_by_id_patch(
757        &self,
758        body_id: BodyId,
759        membership_id: MembershipId,
760        update_membership: UpdateMembership,
761    ) -> Result<Membership, Self::ClientError> {
762        let response = self
763            .execute(requests::membership::by_id::patch::Request {
764                body_id,
765                membership_id,
766                payload: membership::by_id::patch::RequestBody(update_membership),
767            })
768            .await?;
769        Ok(response.0.0)
770    }
771
772    async fn me_profile_get(&self) -> Result<types::me::profile::Profile, Self::ClientError> {
773        Ok(self.execute(requests::me::profile::get::Request).await?.0.0)
774    }
775
776    async fn me_profile_patch(
777        &self,
778        update_profile: UpdateProfile,
779    ) -> Result<Profile, Self::ClientError> {
780        Ok(self
781            .execute(requests::me::profile::patch::Request {
782                payload: types::me::profile::patch::RequestBody(update_profile),
783            })
784            .await?
785            .0
786            .0)
787    }
788}