opentalk_mail_worker_protocol/
lib.rs

1// SPDX-FileCopyrightText: OpenTalk GmbH <mail@opentalk.eu>
2//
3// SPDX-License-Identifier: EUPL-1.2
4
5pub mod v1;
6
7/// Versioned Mail Task Protocol
8#[derive(PartialEq, Eq, Debug)]
9#[cfg_attr(
10    feature = "serde",
11    derive(serde::Serialize, serde::Deserialize),
12    serde(tag = "version")
13)]
14#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
15pub enum MailTask {
16    #[cfg_attr(feature = "serde", serde(rename = "1"))]
17    V1(v1::Message),
18}
19
20#[cfg(feature = "client")]
21impl MailTask {
22    /// Creates an invite MailTask for a registered invitee
23    pub fn registered_event_invite<E, I, U>(inviter: I, event: E, invitee: U) -> MailTask
24    where
25        I: Into<v1::RegisteredUser>,
26        E: Into<v1::Event>,
27        U: Into<v1::RegisteredUser>,
28    {
29        Self::V1(v1::Message::RegisteredEventInvite(
30            v1::RegisteredEventInvite {
31                invitee: invitee.into(),
32                event: event.into(),
33                inviter: inviter.into(),
34            },
35        ))
36    }
37
38    /// Creates an invite MailTask for an unregistered invitee
39    pub fn unregistered_event_invite<E, I, U>(inviter: I, event: E, invitee: U) -> MailTask
40    where
41        I: Into<v1::RegisteredUser>,
42        E: Into<v1::Event>,
43        U: Into<v1::UnregisteredUser>,
44    {
45        Self::V1(v1::Message::UnregisteredEventInvite(
46            v1::UnregisteredEventInvite {
47                invitee: invitee.into(),
48                event: event.into(),
49                inviter: inviter.into(),
50            },
51        ))
52    }
53
54    /// Creates an invite MailTask for an external invitee
55    pub fn external_event_invite<E, I, U>(
56        inviter: I,
57        event: E,
58        invitee: U,
59        invite_code: String,
60    ) -> MailTask
61    where
62        I: Into<v1::RegisteredUser>,
63        E: Into<v1::Event>,
64        U: Into<v1::ExternalUser>,
65    {
66        Self::V1(v1::Message::ExternalEventInvite(v1::ExternalEventInvite {
67            invitee: invitee.into(),
68            event: event.into(),
69            inviter: inviter.into(),
70            invite_code,
71        }))
72    }
73
74    /// Creates an event update MailTask for a registered invitee
75    pub fn registered_event_update<E, EE, I, U>(
76        inviter: I,
77        event: E,
78        event_exception: Option<EE>,
79        invitee: U,
80    ) -> MailTask
81    where
82        I: Into<v1::RegisteredUser>,
83        E: Into<v1::Event>,
84        EE: Into<v1::EventException>,
85        U: Into<v1::RegisteredUser>,
86    {
87        Self::V1(v1::Message::RegisteredEventUpdate(
88            v1::RegisteredEventUpdate {
89                invitee: invitee.into(),
90                event: event.into(),
91                event_exception: event_exception.map(Into::into),
92                inviter: inviter.into(),
93            },
94        ))
95    }
96
97    /// Creates an event update MailTask for an unregistered invitee
98    pub fn unregistered_event_update<E, EE, I, U>(
99        inviter: I,
100        event: E,
101        event_exception: Option<EE>,
102        invitee: U,
103    ) -> MailTask
104    where
105        I: Into<v1::RegisteredUser>,
106        E: Into<v1::Event>,
107        EE: Into<v1::EventException>,
108        U: Into<v1::UnregisteredUser>,
109    {
110        Self::V1(v1::Message::UnregisteredEventUpdate(
111            v1::UnregisteredEventUpdate {
112                invitee: invitee.into(),
113                event: event.into(),
114                event_exception: event_exception.map(Into::into),
115                inviter: inviter.into(),
116            },
117        ))
118    }
119
120    /// Creates an event update MailTask for an external invitee
121    pub fn external_event_update<E, EE, I, U>(
122        inviter: I,
123        event: E,
124        event_exception: Option<EE>,
125        invitee: U,
126        invite_code: String,
127    ) -> MailTask
128    where
129        I: Into<v1::RegisteredUser>,
130        E: Into<v1::Event>,
131        EE: Into<v1::EventException>,
132        U: Into<v1::ExternalUser>,
133    {
134        Self::V1(v1::Message::ExternalEventUpdate(v1::ExternalEventUpdate {
135            invitee: invitee.into(),
136            event: event.into(),
137            event_exception: event_exception.map(Into::into),
138            inviter: inviter.into(),
139            invite_code,
140        }))
141    }
142
143    /// Creates an event cancellation MailTask for a registered invitee
144    pub fn registered_event_cancellation<E, I, U>(inviter: I, event: E, invitee: U) -> MailTask
145    where
146        I: Into<v1::RegisteredUser>,
147        E: Into<v1::Event>,
148        U: Into<v1::RegisteredUser>,
149    {
150        Self::V1(v1::Message::RegisteredEventCancellation(
151            v1::RegisteredEventCancellation {
152                invitee: invitee.into(),
153                event: event.into(),
154                inviter: inviter.into(),
155            },
156        ))
157    }
158
159    /// Creates an event cancellation MailTask for an unregistered invitee
160    pub fn unregistered_event_cancellation<E, I, U>(inviter: I, event: E, invitee: U) -> MailTask
161    where
162        I: Into<v1::RegisteredUser>,
163        E: Into<v1::Event>,
164        U: Into<v1::UnregisteredUser>,
165    {
166        Self::V1(v1::Message::UnregisteredEventCancellation(
167            v1::UnregisteredEventCancellation {
168                invitee: invitee.into(),
169                event: event.into(),
170                inviter: inviter.into(),
171            },
172        ))
173    }
174
175    /// Creates an event cancellation MailTask for an external invitee
176    pub fn external_event_cancellation<E, I, U>(inviter: I, event: E, invitee: U) -> MailTask
177    where
178        I: Into<v1::RegisteredUser>,
179        E: Into<v1::Event>,
180        U: Into<v1::ExternalUser>,
181    {
182        Self::V1(v1::Message::ExternalEventCancellation(
183            v1::ExternalEventCancellation {
184                invitee: invitee.into(),
185                event: event.into(),
186                inviter: inviter.into(),
187            },
188        ))
189    }
190
191    /// Creates an event uninvite MailTask for a registered invitee
192    pub fn registered_event_uninvite<E, I, U>(inviter: I, event: E, invitee: U) -> MailTask
193    where
194        I: Into<v1::RegisteredUser>,
195        E: Into<v1::Event>,
196        U: Into<v1::RegisteredUser>,
197    {
198        Self::V1(v1::Message::RegisteredEventUninvite(
199            v1::RegisteredEventUninvite {
200                invitee: invitee.into(),
201                event: event.into(),
202                inviter: inviter.into(),
203            },
204        ))
205    }
206
207    /// Creates an event uninvite MailTask for an unregistered invitee
208    pub fn unregistered_event_uninvite<E, I, U>(inviter: I, event: E, invitee: U) -> MailTask
209    where
210        I: Into<v1::RegisteredUser>,
211        E: Into<v1::Event>,
212        U: Into<v1::UnregisteredUser>,
213    {
214        Self::V1(v1::Message::UnregisteredEventUninvite(
215            v1::UnregisteredEventUninvite {
216                invitee: invitee.into(),
217                event: event.into(),
218                inviter: inviter.into(),
219            },
220        ))
221    }
222
223    /// Creates an event uninvite MailTask for an external invitee
224    pub fn external_event_uninvite<E, I, U>(inviter: I, event: E, invitee: U) -> MailTask
225    where
226        I: Into<v1::RegisteredUser>,
227        E: Into<v1::Event>,
228        U: Into<v1::ExternalUser>,
229    {
230        Self::V1(v1::Message::ExternalEventUninvite(
231            v1::ExternalEventUninvite {
232                invitee: invitee.into(),
233                event: event.into(),
234                inviter: inviter.into(),
235            },
236        ))
237    }
238
239    pub fn as_kind_str(&self) -> &'static str {
240        match self {
241            MailTask::V1(message) => match message {
242                // Invites
243                v1::Message::RegisteredEventInvite(_) => "registered_invite",
244                v1::Message::UnregisteredEventInvite(_) => "unregistered_invite",
245                v1::Message::ExternalEventInvite(_) => "external_invite",
246                // Updates
247                v1::Message::RegisteredEventUpdate(_) => "registered_update",
248                v1::Message::UnregisteredEventUpdate(_) => "unregistered_update",
249                v1::Message::ExternalEventUpdate(_) => "external_update",
250                // Cancellations
251                v1::Message::RegisteredEventCancellation(_) => "registered_cancellation",
252                v1::Message::UnregisteredEventCancellation(_) => "unregistered_cancellation",
253                v1::Message::ExternalEventCancellation(_) => "external_cancellation",
254                // Uninvites
255                v1::Message::RegisteredEventUninvite(_) => "registered_uninvite",
256                v1::Message::UnregisteredEventUninvite(_) => "unregistered_uninvite",
257                v1::Message::ExternalEventUninvite(_) => "external_uninvite",
258            },
259        }
260    }
261}
262
263#[cfg(feature = "client")]
264impl From<String> for v1::ExternalUser {
265    fn from(email: String) -> Self {
266        Self {
267            email: email.into(),
268        }
269    }
270}
271
272#[cfg(feature = "client")]
273impl
274    From<(
275        chrono::DateTime<chrono::Utc>,
276        opentalk_types_common::time::TimeZone,
277    )> for v1::Time
278{
279    fn from(
280        (time, timezone): (
281            chrono::DateTime<chrono::Utc>,
282            opentalk_types_common::time::TimeZone,
283        ),
284    ) -> Self {
285        v1::Time {
286            time,
287            timezone: timezone.to_string(),
288        }
289    }
290}