relay_actions/actions/invitations/
list.rs1use 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}