1use crate::{
2 entities::push::{add_subscription, update_data},
3 errors::Result,
4};
5
6#[derive(Debug, Default, Clone, PartialEq, Eq)]
16pub struct Keys {
17 pub(crate) p256dh: String,
18 pub(crate) auth: String,
19}
20
21impl Keys {
22 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#[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 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 pub fn follow(&mut self) -> &mut Self {
102 self.follow = Some(true);
103 self
104 }
105
106 pub fn favourite(&mut self) -> &mut Self {
117 self.favourite = Some(true);
118 self
119 }
120
121 pub fn reblog(&mut self) -> &mut Self {
132 self.reblog = Some(true);
133 self
134 }
135
136 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#[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 pub fn new(id: &str) -> UpdatePushRequest {
236 UpdatePushRequest {
237 id: id.to_string(),
238 ..Default::default()
239 }
240 }
241
242 pub fn follow(&mut self, follow: bool) -> &mut Self {
250 self.follow = Some(follow);
251 self
252 }
253
254 pub fn favourite(&mut self, favourite: bool) -> &mut Self {
262 self.favourite = Some(favourite);
263 self
264 }
265
266 pub fn reblog(&mut self, reblog: bool) -> &mut Self {
275 self.reblog = Some(reblog);
276 self
277 }
278
279 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}