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