Skip to main content

relay_actions/actions/invitations/
list.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{
4    actions::Action, cache::CacheManager, request::get_signed, sinks::progress::ProgressSink,
5    storage::Storage,
6};
7use relay_lib::{
8    core::{Uuid, chrono::NaiveDateTime},
9    prelude::Address,
10};
11
12#[derive(Serialize)]
13struct ListReq {
14    pub page: Option<u32>,
15}
16
17#[derive(Deserialize)]
18pub struct InvitationView {
19    pub gid: Uuid,
20    pub code: String,
21    pub created_by: String,
22    pub max_uses: i32,
23    pub enabled: bool,
24    pub created_at: NaiveDateTime,
25    pub expires_at: Option<NaiveDateTime>,
26    pub last_used_at: Option<NaiveDateTime>,
27}
28
29#[derive(Deserialize)]
30pub struct ListResp {
31    pub page: u32,
32    pub has_more: bool,
33    pub invitations: Vec<InvitationView>,
34}
35
36pub struct List {
37    pub address: Address,
38    pub page: Option<u32>,
39}
40
41impl Action for List {
42    type Output = ListResp;
43
44    fn execute(
45        &self,
46        storage: &mut Storage,
47        cache: &mut CacheManager,
48        progress: &mut dyn ProgressSink,
49    ) -> Self::Output {
50        let req = ListReq { page: self.page };
51
52        progress.step("Fetching invitations", "Fetched invitations");
53        let resp = get_signed(
54            progress,
55            storage,
56            cache,
57            &self.address,
58            "/invitations/list",
59            req,
60        )
61        .unwrap_or_else(|e| {
62            progress.error(&format!("{:#?}", e));
63            progress.abort("Failed to send list request");
64        });
65
66        if !resp.status().is_success() {
67            progress.abort(&format!(
68                "Failed to list invitations. HTTP {}",
69                resp.status().as_u16()
70            ));
71        }
72
73        let parsed = resp.json::<ListResp>().unwrap_or_else(|e| {
74            progress.error(&format!("{:#?}", e));
75            progress.abort("Failed to parse list invitations response");
76        });
77
78        progress.done();
79        parsed
80    }
81}