Skip to main content

relay_actions/actions/invitations/
create.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{
4    actions::Action, cache::CacheManager, request::post_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 CreateReq {
14    pub max_uses: i32,
15    pub expires_at: Option<NaiveDateTime>,
16}
17
18#[derive(Deserialize)]
19struct CreateResp {
20    pub gid: Uuid,
21}
22
23pub struct Create {
24    pub address: Address,
25    pub max_uses: i32,
26    pub expires_at: Option<NaiveDateTime>,
27}
28
29impl Action for Create {
30    type Output = Uuid;
31
32    fn execute(
33        &self,
34        storage: &mut Storage,
35        cache: &mut CacheManager,
36        progress: &mut dyn ProgressSink,
37    ) -> Self::Output {
38        let req = CreateReq {
39            max_uses: self.max_uses,
40            expires_at: self.expires_at,
41        };
42
43        progress.step("Creating invitation", "Created invitation");
44        let resp = post_signed(
45            progress,
46            storage,
47            cache,
48            &self.address,
49            "/invitations/create",
50            req,
51        )
52        .unwrap_or_else(|e| {
53            progress.error(&format!("{:#?}", e));
54            progress.abort("Failed to send create request");
55        });
56
57        if !resp.status().is_success() {
58            progress.abort(&format!(
59                "Failed to list invitations. HTTP {}",
60                resp.status().as_u16()
61            ));
62        }
63
64        let parsed = resp.json::<CreateResp>().unwrap_or_else(|e| {
65            progress.error(&format!("{:#?}", e));
66            progress.abort("Failed to parse create invitation response");
67        });
68
69        progress.done();
70        parsed.gid
71    }
72}