mastodon_async/requests/
push.rs

1use crate::{
2    entities::push::{add_subscription, update_data},
3    errors::Result,
4};
5
6/// Container for the key & auth strings for an AddPushRequest
7///
8/// // Example
9///
10/// ```
11/// use mastodon_async::requests::Keys;
12///
13/// let keys = Keys::new("anetohias===", "oeatssah=");
14/// ```
15#[derive(Debug, Default, Clone, PartialEq, Eq)]
16pub struct Keys {
17    pub(crate) p256dh: String,
18    pub(crate) auth: String,
19}
20
21impl Keys {
22    /// Create the `Keys` container
23    ///
24    /// // Example
25    ///
26    /// ```
27    /// use mastodon_async::requests::Keys;
28    ///
29    /// let keys = Keys::new("anetohias===", "oeatssah=");
30    /// ```
31    pub fn new(p256dh: &str, auth: &str) -> Keys {
32        Keys {
33            p256dh: p256dh.to_string(),
34            auth: auth.to_string(),
35        }
36    }
37}
38
39/// Builder to pass to the Mastodon::add_push_subscription method
40///
41/// // Example
42///
43/// ```no_run
44/// use mastodon_async::{Mastodon, Data};
45/// use mastodon_async::requests::{AddPushRequest, Keys};
46///
47/// tokio_test::block_on(async {
48///     let data = Data::default();
49///     let client = Mastodon::from(data);
50///
51///     let keys = Keys::new("stahesuahoei293ise===", "tasecoa,nmeozka==");
52///     let mut request = AddPushRequest::new("http://example.com/push/endpoint", &keys);
53///     request.follow().reblog();
54///
55///     client.add_push_subscription(&request).await.unwrap();
56/// });
57/// ```
58#[derive(Debug, Default, Clone, PartialEq, Eq)]
59pub struct AddPushRequest {
60    endpoint: String,
61
62    p256dh: String,
63    auth: String,
64
65    follow: Option<bool>,
66    favourite: Option<bool>,
67    reblog: Option<bool>,
68    mention: Option<bool>,
69}
70
71impl AddPushRequest {
72    /// Construct a new AddPushRequest
73    ///
74    /// // Example
75    ///
76    /// ```
77    /// use mastodon_async::requests::{AddPushRequest, Keys};
78    /// let keys = Keys::new("abcdef===", "foobar==");
79    /// let push_endpoint = "https://example.com/push/endpoint";
80    /// let request = AddPushRequest::new(push_endpoint, &keys);
81    /// ```
82    pub fn new(endpoint: &str, keys: &Keys) -> AddPushRequest {
83        AddPushRequest {
84            endpoint: endpoint.to_string(),
85            p256dh: keys.p256dh.clone(),
86            auth: keys.auth.clone(),
87            ..Default::default()
88        }
89    }
90
91    /// A flag that indicates if you want follow notifications pushed
92    ///
93    /// // Example
94    /// ```
95    /// use mastodon_async::requests::{AddPushRequest, Keys};
96    /// let keys = Keys::new("abcdef===", "foobar==");
97    /// let push_endpoint = "https://example.com/push/endpoint";
98    /// let mut request = AddPushRequest::new(push_endpoint, &keys);
99    /// request.follow();
100    /// ```
101    pub fn follow(&mut self) -> &mut Self {
102        self.follow = Some(true);
103        self
104    }
105
106    /// A flag that indicates if you want favourite notifications pushed
107    ///
108    /// // Example
109    /// ```
110    /// use mastodon_async::requests::{AddPushRequest, Keys};
111    /// let keys = Keys::new("abcdef===", "foobar==");
112    /// let push_endpoint = "https://example.com/push/endpoint";
113    /// let mut request = AddPushRequest::new(push_endpoint, &keys);
114    /// request.favourite();
115    /// ```
116    pub fn favourite(&mut self) -> &mut Self {
117        self.favourite = Some(true);
118        self
119    }
120
121    /// A flag that indicates if you want reblog notifications pushed
122    ///
123    /// // Example
124    /// ```
125    /// use mastodon_async::requests::{AddPushRequest, Keys};
126    /// let keys = Keys::new("abcdef===", "foobar==");
127    /// let push_endpoint = "https://example.com/push/endpoint";
128    /// let mut request = AddPushRequest::new(push_endpoint, &keys);
129    /// request.reblog();
130    /// ```
131    pub fn reblog(&mut self) -> &mut Self {
132        self.reblog = Some(true);
133        self
134    }
135
136    /// A flag that indicates if you want mention notifications pushed
137    ///
138    /// // Example
139    /// ```
140    /// use mastodon_async::requests::{AddPushRequest, Keys};
141    /// let keys = Keys::new("abcdef===", "foobar==");
142    /// let push_endpoint = "https://example.com/push/endpoint";
143    /// let mut request = AddPushRequest::new(push_endpoint, &keys);
144    /// request.mention();
145    /// ```
146    pub fn mention(&mut self) -> &mut Self {
147        self.mention = Some(true);
148        self
149    }
150
151    fn flags_present(&self) -> bool {
152        self.follow.is_some()
153            || self.favourite.is_some()
154            || self.reblog.is_some()
155            || self.mention.is_some()
156    }
157
158    pub(crate) fn build(&self) -> Result<add_subscription::Form> {
159        use crate::entities::push::{
160            add_subscription::{Data, Form, Keys, Subscription},
161            Alerts,
162        };
163        let mut form = Form {
164            subscription: Subscription {
165                endpoint: self.endpoint.clone(),
166                keys: Keys {
167                    p256dh: self.p256dh.clone(),
168                    auth: self.auth.clone(),
169                },
170            },
171            data: None,
172        };
173        if self.flags_present() {
174            let mut alerts = Alerts::default();
175
176            if let Some(follow) = self.follow {
177                alerts.follow = Some(follow);
178            }
179
180            if let Some(favourite) = self.favourite {
181                alerts.favourite = Some(favourite);
182            }
183
184            if let Some(reblog) = self.reblog {
185                alerts.reblog = Some(reblog);
186            }
187
188            if let Some(mention) = self.mention {
189                alerts.mention = Some(mention);
190            }
191
192            form.data = Some(Data {
193                alerts: Some(alerts),
194            });
195        }
196        Ok(form)
197    }
198}
199
200/// Builder to pass to the Mastodon::update_push_data method
201///
202/// // Example
203///
204/// ```no_run
205/// use mastodon_async::{Mastodon, Data, requests::UpdatePushRequest};
206///
207/// let data = Data::default();
208/// let client = Mastodon::from(data);
209///
210/// let mut request = UpdatePushRequest::new("foobar");
211/// request.follow(true)
212///     .reblog(true);
213///
214/// tokio_test::block_on(async {
215///     client.update_push_data(&request).await.unwrap();
216/// });
217/// ```
218#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize)]
219pub struct UpdatePushRequest {
220    id: String,
221    follow: Option<bool>,
222    favourite: Option<bool>,
223    reblog: Option<bool>,
224    mention: Option<bool>,
225}
226
227impl UpdatePushRequest {
228    /// Construct a new UpdatePushRequest
229    ///
230    /// // Example
231    ///
232    /// ```
233    /// let request = mastodon_async::requests::UpdatePushRequest::new("some-id");
234    /// ```
235    pub fn new(id: &str) -> UpdatePushRequest {
236        UpdatePushRequest {
237            id: id.to_string(),
238            ..Default::default()
239        }
240    }
241
242    /// A flag that indicates if you want follow notifications pushed
243    ///
244    /// // Example
245    /// ```
246    /// let mut request = mastodon_async::requests::UpdatePushRequest::new("foobar");
247    /// request.follow(true);
248    /// ```
249    pub fn follow(&mut self, follow: bool) -> &mut Self {
250        self.follow = Some(follow);
251        self
252    }
253
254    /// A flag that indicates if you want favourite notifications pushed
255    ///
256    /// // Example
257    /// ```
258    /// let mut request = mastodon_async::requests::UpdatePushRequest::new("foobar");
259    /// request.favourite(true);
260    /// ```
261    pub fn favourite(&mut self, favourite: bool) -> &mut Self {
262        self.favourite = Some(favourite);
263        self
264    }
265
266    /// A flag that indicates if you want reblog notifications pushed
267    ///
268    /// // Example
269    /// ```
270    /// use mastodon_async::requests::UpdatePushRequest;
271    /// let mut request = UpdatePushRequest::new("foobar");
272    /// request.reblog(true);
273    /// ```
274    pub fn reblog(&mut self, reblog: bool) -> &mut Self {
275        self.reblog = Some(reblog);
276        self
277    }
278
279    /// A flag that indicates if you want mention notifications pushed
280    ///
281    /// // Example
282    /// ```
283    /// use mastodon_async::requests::UpdatePushRequest;
284    /// let mut request = UpdatePushRequest::new("foobar");
285    /// request.mention(true);
286    /// ```
287    pub fn mention(&mut self, mention: bool) -> &mut Self {
288        self.mention = Some(mention);
289        self
290    }
291
292    fn flags_present(&self) -> bool {
293        self.follow.is_some()
294            || self.favourite.is_some()
295            || self.reblog.is_some()
296            || self.mention.is_some()
297    }
298
299    pub(crate) fn build(&self) -> update_data::Form {
300        use crate::entities::push::{
301            update_data::{Data, Form},
302            Alerts,
303        };
304
305        let mut form = Form {
306            id: self.id.clone(),
307            ..Default::default()
308        };
309
310        if self.flags_present() {
311            let mut alerts = Alerts::default();
312            if let Some(follow) = self.follow {
313                alerts.follow = Some(follow);
314            }
315            if let Some(favourite) = self.favourite {
316                alerts.favourite = Some(favourite);
317            }
318            if let Some(reblog) = self.reblog {
319                alerts.reblog = Some(reblog);
320            }
321            if let Some(mention) = self.mention {
322                alerts.mention = Some(mention);
323            }
324            form.data = Data {
325                alerts: Some(alerts),
326            };
327        }
328        form
329    }
330}
331
332#[cfg(test)]
333mod tests {
334    use super::*;
335    use crate::entities::push::{add_subscription, update_data, Alerts};
336
337    #[test]
338    fn test_keys_new() {
339        let keys = Keys::new("anetohias===", "oeatssah=");
340        assert_eq!(
341            keys,
342            Keys {
343                p256dh: "anetohias===".to_string(),
344                auth: "oeatssah=".to_string()
345            }
346        );
347    }
348
349    #[test]
350    fn test_add_push_request_new() {
351        let endpoint = "https://example.com/push/endpoint";
352        let keys = Keys::new("anetohias===", "oeatssah=");
353        let req = AddPushRequest::new(endpoint, &keys);
354        assert_eq!(
355            req,
356            AddPushRequest {
357                endpoint: "https://example.com/push/endpoint".to_string(),
358                p256dh: "anetohias===".to_string(),
359                auth: "oeatssah=".to_string(),
360                follow: None,
361                favourite: None,
362                reblog: None,
363                mention: None,
364            }
365        );
366    }
367    #[test]
368    fn test_add_push_request_follow() {
369        let endpoint = "https://example.com/push/endpoint";
370        let keys = Keys::new("anetohias===", "oeatssah=");
371        let mut req = AddPushRequest::new(endpoint, &keys);
372        req.follow();
373        assert_eq!(
374            req,
375            AddPushRequest {
376                endpoint: "https://example.com/push/endpoint".to_string(),
377                p256dh: "anetohias===".to_string(),
378                auth: "oeatssah=".to_string(),
379                follow: Some(true),
380                favourite: None,
381                reblog: None,
382                mention: None,
383            }
384        );
385    }
386
387    #[test]
388    fn test_add_push_request_favourite() {
389        let endpoint = "https://example.com/push/endpoint";
390        let keys = Keys::new("anetohias===", "oeatssah=");
391        let mut req = AddPushRequest::new(endpoint, &keys);
392        req.favourite();
393        assert_eq!(
394            req,
395            AddPushRequest {
396                endpoint: "https://example.com/push/endpoint".to_string(),
397                p256dh: "anetohias===".to_string(),
398                auth: "oeatssah=".to_string(),
399                follow: None,
400                favourite: Some(true),
401                reblog: None,
402                mention: None,
403            }
404        );
405    }
406    #[test]
407    fn test_add_push_request_reblog() {
408        let endpoint = "https://example.com/push/endpoint";
409        let keys = Keys::new("anetohias===", "oeatssah=");
410        let mut req = AddPushRequest::new(endpoint, &keys);
411        req.reblog();
412        assert_eq!(
413            req,
414            AddPushRequest {
415                endpoint: "https://example.com/push/endpoint".to_string(),
416                p256dh: "anetohias===".to_string(),
417                auth: "oeatssah=".to_string(),
418                follow: None,
419                favourite: None,
420                reblog: Some(true),
421                mention: None,
422            }
423        );
424    }
425    #[test]
426    fn test_add_push_request_mention() {
427        let endpoint = "https://example.com/push/endpoint";
428        let keys = Keys::new("anetohias===", "oeatssah=");
429        let mut req = AddPushRequest::new(endpoint, &keys);
430        req.mention();
431        assert_eq!(
432            req,
433            AddPushRequest {
434                endpoint: "https://example.com/push/endpoint".to_string(),
435                p256dh: "anetohias===".to_string(),
436                auth: "oeatssah=".to_string(),
437                follow: None,
438                favourite: None,
439                reblog: None,
440                mention: Some(true),
441            }
442        );
443    }
444    #[test]
445    fn test_add_push_request_build_no_flags() {
446        let endpoint = "https://example.com/push/endpoint";
447        let keys = Keys::new("anetohias===", "oeatssah=");
448        let req = AddPushRequest::new(endpoint, &keys);
449        let form = req.build().expect("Couldn't build form");
450        assert_eq!(
451            form,
452            add_subscription::Form {
453                subscription: add_subscription::Subscription {
454                    endpoint: "https://example.com/push/endpoint".to_string(),
455                    keys: add_subscription::Keys {
456                        p256dh: "anetohias===".to_string(),
457                        auth: "oeatssah=".to_string(),
458                    },
459                },
460                data: None,
461            }
462        );
463    }
464
465    #[test]
466    fn test_add_push_request_build() {
467        let endpoint = "https://example.com/push/endpoint";
468        let keys = Keys::new("anetohias===", "oeatssah=");
469        let mut req = AddPushRequest::new(endpoint, &keys);
470        req.follow().reblog();
471        let form = req.build().expect("Couldn't build form");
472        assert_eq!(
473            form,
474            add_subscription::Form {
475                subscription: add_subscription::Subscription {
476                    endpoint: "https://example.com/push/endpoint".to_string(),
477                    keys: add_subscription::Keys {
478                        p256dh: "anetohias===".to_string(),
479                        auth: "oeatssah=".to_string(),
480                    },
481                },
482                data: Some(add_subscription::Data {
483                    alerts: Some(Alerts {
484                        follow: Some(true),
485                        favourite: None,
486                        reblog: Some(true),
487                        mention: None,
488                    }),
489                }),
490            }
491        );
492    }
493
494    #[test]
495    fn test_update_push_request_new() {
496        let req = UpdatePushRequest::new("some-id");
497        assert_eq!(
498            req,
499            UpdatePushRequest {
500                id: "some-id".to_string(),
501                follow: None,
502                favourite: None,
503                reblog: None,
504                mention: None,
505            }
506        );
507    }
508
509    #[test]
510    fn test_update_push_request_follow() {
511        let mut req = UpdatePushRequest::new("some-id");
512        req.follow(true);
513        assert_eq!(
514            req,
515            UpdatePushRequest {
516                id: "some-id".to_string(),
517                follow: Some(true),
518                favourite: None,
519                reblog: None,
520                mention: None,
521            }
522        );
523    }
524    #[test]
525    fn test_update_push_request_favourite() {
526        let mut req = UpdatePushRequest::new("some-id");
527        req.favourite(true);
528        assert_eq!(
529            req,
530            UpdatePushRequest {
531                id: "some-id".to_string(),
532                follow: None,
533                favourite: Some(true),
534                reblog: None,
535                mention: None,
536            }
537        );
538    }
539    #[test]
540    fn test_update_push_request_reblog() {
541        let mut req = UpdatePushRequest::new("some-id");
542        req.reblog(true);
543        assert_eq!(
544            req,
545            UpdatePushRequest {
546                id: "some-id".to_string(),
547                follow: None,
548                favourite: None,
549                reblog: Some(true),
550                mention: None,
551            }
552        );
553    }
554    #[test]
555    fn test_update_push_request_mention() {
556        let mut req = UpdatePushRequest::new("some-id");
557        req.mention(true);
558        assert_eq!(
559            req,
560            UpdatePushRequest {
561                id: "some-id".to_string(),
562                follow: None,
563                favourite: None,
564                reblog: None,
565                mention: Some(true),
566            }
567        );
568    }
569    #[test]
570    fn test_update_push_request_build_no_flags() {
571        let req = UpdatePushRequest::new("some-id");
572        let form = req.build();
573        assert_eq!(
574            form,
575            update_data::Form {
576                id: "some-id".to_string(),
577                data: update_data::Data { alerts: None },
578            }
579        );
580    }
581
582    #[test]
583    fn test_update_push_request_build() {
584        let mut req = UpdatePushRequest::new("some-id");
585        req.favourite(false);
586        let form = req.build();
587        assert_eq!(
588            form,
589            update_data::Form {
590                id: "some-id".to_string(),
591                data: update_data::Data {
592                    alerts: Some(Alerts {
593                        follow: None,
594                        favourite: Some(false),
595                        reblog: None,
596                        mention: None,
597                    }),
598                },
599            }
600        );
601    }
602}