diff options
author | Paul Woolcock <paul@woolcock.us> | 2018-09-08 06:46:48 -0400 |
---|---|---|
committer | Paul Woolcock <paul@woolcock.us> | 2018-09-10 08:08:46 -0400 |
commit | 690b029d9956cfcfe86692450d7b5ce9f0f15c19 (patch) | |
tree | d88d7e030bd2ccb0685768114ef404411a4fcfd5 /src/requests | |
parent | 28192e1188edd50e7de8d211c257bece87981789 (diff) |
Add methods & data structures for all the "push" endpoints
Closes #53
Diffstat (limited to 'src/requests')
-rw-r--r-- | src/requests/mod.rs | 3 | ||||
-rw-r--r-- | src/requests/push.rs | 633 |
2 files changed, 636 insertions, 0 deletions
diff --git a/src/requests/mod.rs b/src/requests/mod.rs index bb3f1ae..31785aa 100644 --- a/src/requests/mod.rs +++ b/src/requests/mod.rs @@ -1,7 +1,10 @@ +/// Data structure for the MastodonClient::add_push_subscription method +pub use self::push::{AddPushRequest, Keys, UpdatePushRequest}; /// Data structure for the MastodonClient::statuses method pub use self::statuses::StatusesRequest; /// Data structure for the MastodonClient::update_credentials method pub use self::update_credentials::UpdateCredsRequest; +mod push; mod statuses; mod update_credentials; diff --git a/src/requests/push.rs b/src/requests/push.rs new file mode 100644 index 0000000..c609b07 --- /dev/null +++ b/src/requests/push.rs @@ -0,0 +1,633 @@ +use entities::push::{add_subscription, update_data}; +use errors::Result; + +/// Container for the key & auth strings for an AddPushRequest +/// +/// # Example +/// +/// ``` +/// # extern crate elefren; +/// use elefren::requests::Keys; +/// +/// let keys = Keys::new("anetohias===", "oeatssah="); +/// ``` +#[derive(Debug, Default, Clone, PartialEq)] +pub struct Keys { + pub(crate) p256dh: String, + pub(crate) auth: String, +} + +impl Keys { + /// Create the `Keys` container + /// + /// # Example + /// + /// ``` + /// # extern crate elefren; + /// use elefren::requests::Keys; + /// + /// let keys = Keys::new("anetohias===", "oeatssah="); + /// ``` + pub fn new(p256dh: &str, auth: &str) -> Keys { + Keys { + p256dh: p256dh.to_string(), + auth: auth.to_string(), + } + } +} + +/// Builder to pass to the Mastodon::add_push_subscription method +/// +/// # Example +/// +/// ```no_run +/// # extern crate elefren; +/// # use elefren::{MastodonClient, Mastodon, Data}; +/// # fn main() -> Result<(), elefren::Error> { +/// # let data = Data { +/// # base: "".into(), +/// # client_id: "".into(), +/// # client_secret: "".into(), +/// # redirect: "".into(), +/// # token: "".into(), +/// # }; +/// use elefren::requests::{AddPushRequest, Keys}; +/// +/// let client = Mastodon::from(data); +/// +/// let keys = Keys::new("stahesuahoei293ise===", "tasecoa,nmeozka=="); +/// let mut request = AddPushRequest::new("http://example.com/push/endpoint", &keys); +/// request.follow().reblog(); +/// +/// client.add_push_subscription(&request)?; +/// # Ok(()) +/// # } +/// ``` +#[derive(Debug, Default, Clone, PartialEq)] +pub struct AddPushRequest { + endpoint: String, + + p256dh: String, + auth: String, + + follow: Option<bool>, + favourite: Option<bool>, + reblog: Option<bool>, + mention: Option<bool>, +} + +impl AddPushRequest { + /// Construct a new AddPushRequest + /// + /// # Example + /// + /// ``` + /// # extern crate elefren; + /// use elefren::requests::{AddPushRequest, Keys}; + /// let keys = Keys::new("abcdef===", "foobar=="); + /// let push_endpoint = "https://example.com/push/endpoint"; + /// let request = AddPushRequest::new(push_endpoint, &keys); + /// ``` + pub fn new(endpoint: &str, keys: &Keys) -> AddPushRequest { + AddPushRequest { + endpoint: endpoint.to_string(), + p256dh: keys.p256dh.clone(), + auth: keys.auth.clone(), + ..Default::default() + } + } + + /// A flag that indicates if you want follow notifications pushed + /// + /// # Example + /// ``` + /// # extern crate elefren; + /// use elefren::requests::{AddPushRequest, Keys}; + /// let keys = Keys::new("abcdef===", "foobar=="); + /// let push_endpoint = "https://example.com/push/endpoint"; + /// let mut request = AddPushRequest::new(push_endpoint, &keys); + /// request.follow(); + /// ``` + pub fn follow(&mut self) -> &mut Self { + self.follow = Some(true); + self + } + + /// A flag that indicates if you want favourite notifications pushed + /// + /// # Example + /// ``` + /// # extern crate elefren; + /// use elefren::requests::{AddPushRequest, Keys}; + /// let keys = Keys::new("abcdef===", "foobar=="); + /// let push_endpoint = "https://example.com/push/endpoint"; + /// let mut request = AddPushRequest::new(push_endpoint, &keys); + /// request.favourite(); + /// ``` + pub fn favourite(&mut self) -> &mut Self { + self.favourite = Some(true); + self + } + + /// A flag that indicates if you want reblog notifications pushed + /// + /// # Example + /// ``` + /// # extern crate elefren; + /// use elefren::requests::{AddPushRequest, Keys}; + /// let keys = Keys::new("abcdef===", "foobar=="); + /// let push_endpoint = "https://example.com/push/endpoint"; + /// let mut request = AddPushRequest::new(push_endpoint, &keys); + /// request.reblog(); + /// ``` + pub fn reblog(&mut self) -> &mut Self { + self.reblog = Some(true); + self + } + + /// A flag that indicates if you want mention notifications pushed + /// + /// # Example + /// ``` + /// # extern crate elefren; + /// use elefren::requests::{AddPushRequest, Keys}; + /// let keys = Keys::new("abcdef===", "foobar=="); + /// let push_endpoint = "https://example.com/push/endpoint"; + /// let mut request = AddPushRequest::new(push_endpoint, &keys); + /// request.mention(); + /// ``` + pub fn mention(&mut self) -> &mut Self { + self.mention = Some(true); + self + } + + fn flags_present(&self) -> bool { + self.follow.is_some() + || self.favourite.is_some() + || self.reblog.is_some() + || self.mention.is_some() + } + + pub(crate) fn build(&self) -> Result<add_subscription::Form> { + use entities::push::{ + add_subscription::{Data, Form, Keys, Subscription}, + Alerts, + }; + let mut form = Form { + subscription: Subscription { + endpoint: self.endpoint.clone(), + keys: Keys { + p256dh: self.p256dh.clone(), + auth: self.auth.clone(), + }, + }, + data: None, + }; + if self.flags_present() { + let mut alerts = Alerts::default(); + + if let Some(follow) = self.follow { + alerts.follow = Some(follow); + } + + if let Some(favourite) = self.favourite { + alerts.favourite = Some(favourite); + } + + if let Some(reblog) = self.reblog { + alerts.reblog = Some(reblog); + } + + if let Some(mention) = self.mention { + alerts.mention = Some(mention); + } + + form.data = Some(Data { + alerts: Some(alerts), + }); + } + Ok(form) + } +} + +/// Builder to pass to the Mastodon::update_push_data method +/// +/// # Example +/// +/// ```no_run +/// # extern crate elefren; +/// # use elefren::{MastodonClient, Mastodon, Data}; +/// # fn main() -> Result<(), elefren::Error> { +/// # let data = Data { +/// # base: "".into(), +/// # client_id: "".into(), +/// # client_secret: "".into(), +/// # redirect: "".into(), +/// # token: "".into(), +/// # }; +/// use elefren::requests::UpdatePushRequest; +/// +/// let client = Mastodon::from(data); +/// +/// let mut request = UpdatePushRequest::new("foobar"); +/// request.follow(true).reblog(true); +/// +/// client.update_push_data(&request)?; +/// # Ok(()) +/// # } +/// ``` +#[derive(Debug, Default, Clone, PartialEq, Serialize)] +pub struct UpdatePushRequest { + id: String, + follow: Option<bool>, + favourite: Option<bool>, + reblog: Option<bool>, + mention: Option<bool>, +} + +impl UpdatePushRequest { + /// Construct a new UpdatePushRequest + /// + /// # Example + /// + /// ``` + /// # extern crate elefren; + /// use elefren::requests::UpdatePushRequest; + /// let request = UpdatePushRequest::new("some-id"); + /// ``` + pub fn new(id: &str) -> UpdatePushRequest { + UpdatePushRequest { + id: id.to_string(), + ..Default::default() + } + } + + /// A flag that indicates if you want follow notifications pushed + /// + /// # Example + /// ``` + /// # extern crate elefren; + /// use elefren::requests::UpdatePushRequest; + /// let mut request = UpdatePushRequest::new("foobar"); + /// request.follow(true); + /// ``` + pub fn follow(&mut self, follow: bool) -> &mut Self { + self.follow = Some(follow); + self + } + + /// A flag that indicates if you want favourite notifications pushed + /// + /// # Example + /// ``` + /// # extern crate elefren; + /// use elefren::requests::UpdatePushRequest; + /// let mut request = UpdatePushRequest::new("foobar"); + /// request.favourite(true); + /// ``` + pub fn favourite(&mut self, favourite: bool) -> &mut Self { + self.favourite = Some(favourite); + self + } + + /// A flag that indicates if you want reblog notifications pushed + /// + /// # Example + /// ``` + /// # extern crate elefren; + /// use elefren::requests::UpdatePushRequest; + /// let mut request = UpdatePushRequest::new("foobar"); + /// request.reblog(true); + /// ``` + pub fn reblog(&mut self, reblog: bool) -> &mut Self { + self.reblog = Some(reblog); + self + } + + /// A flag that indicates if you want mention notifications pushed + /// + /// # Example + /// ``` + /// # extern crate elefren; + /// use elefren::requests::UpdatePushRequest; + /// let mut request = UpdatePushRequest::new("foobar"); + /// request.mention(true); + /// ``` + pub fn mention(&mut self, mention: bool) -> &mut Self { + self.mention = Some(mention); + self + } + + fn flags_present(&self) -> bool { + self.follow.is_some() + || self.favourite.is_some() + || self.reblog.is_some() + || self.mention.is_some() + } + + pub(crate) fn build(&self) -> update_data::Form { + use entities::push::{ + update_data::{Data, Form}, + Alerts, + }; + + let mut form = Form { + id: self.id.clone(), + ..Default::default() + }; + + if self.flags_present() { + let mut alerts = Alerts::default(); + if let Some(follow) = self.follow { + alerts.follow = Some(follow); + } + if let Some(favourite) = self.favourite { + alerts.favourite = Some(favourite); + } + if let Some(reblog) = self.reblog { + alerts.reblog = Some(reblog); + } + if let Some(mention) = self.mention { + alerts.mention = Some(mention); + } + form.data = Data { + alerts: Some(alerts), + }; + } + form + } +} + +#[cfg(test)] +mod tests { + use super::*; + use entities::push::{add_subscription, update_data, Alerts}; + + #[test] + fn test_keys_new() { + let keys = Keys::new("anetohias===", "oeatssah="); + assert_eq!( + keys, + Keys { + p256dh: "anetohias===".to_string(), + auth: "oeatssah=".to_string() + } + ); + } + + #[test] + fn test_add_push_request_new() { + let endpoint = "https://example.com/push/endpoint"; + let keys = Keys::new("anetohias===", "oeatssah="); + let req = AddPushRequest::new(endpoint, &keys); + assert_eq!( + req, + AddPushRequest { + endpoint: "https://example.com/push/endpoint".to_string(), + p256dh: "anetohias===".to_string(), + auth: "oeatssah=".to_string(), + follow: None, + favourite: None, + reblog: None, + mention: None, + } + ); + } + #[test] + fn test_add_push_request_follow() { + let endpoint = "https://example.com/push/endpoint"; + let keys = Keys::new("anetohias===", "oeatssah="); + let mut req = AddPushRequest::new(endpoint, &keys); + req.follow(); + assert_eq!( + req, + AddPushRequest { + endpoint: "https://example.com/push/endpoint".to_string(), + p256dh: "anetohias===".to_string(), + auth: "oeatssah=".to_string(), + follow: Some(true), + favourite: None, + reblog: None, + mention: None, + } + ); + } + + #[test] + fn test_add_push_request_favourite() { + let endpoint = "https://example.com/push/endpoint"; + let keys = Keys::new("anetohias===", "oeatssah="); + let mut req = AddPushRequest::new(endpoint, &keys); + req.favourite(); + assert_eq!( + req, + AddPushRequest { + endpoint: "https://example.com/push/endpoint".to_string(), + p256dh: "anetohias===".to_string(), + auth: "oeatssah=".to_string(), + follow: None, + favourite: Some(true), + reblog: None, + mention: None, + } + ); + } + #[test] + fn test_add_push_request_reblog() { + let endpoint = "https://example.com/push/endpoint"; + let keys = Keys::new("anetohias===", "oeatssah="); + let mut req = AddPushRequest::new(endpoint, &keys); + req.reblog(); + assert_eq!( + req, + AddPushRequest { + endpoint: "https://example.com/push/endpoint".to_string(), + p256dh: "anetohias===".to_string(), + auth: "oeatssah=".to_string(), + follow: None, + favourite: None, + reblog: Some(true), + mention: None, + } + ); + } + #[test] + fn test_add_push_request_mention() { + let endpoint = "https://example.com/push/endpoint"; + let keys = Keys::new("anetohias===", "oeatssah="); + let mut req = AddPushRequest::new(endpoint, &keys); + req.mention(); + assert_eq!( + req, + AddPushRequest { + endpoint: "https://example.com/push/endpoint".to_string(), + p256dh: "anetohias===".to_string(), + auth: "oeatssah=".to_string(), + follow: None, + favourite: None, + reblog: None, + mention: Some(true), + } + ); + } + #[test] + fn test_add_push_request_build_no_flags() { + let endpoint = "https://example.com/push/endpoint"; + let keys = Keys::new("anetohias===", "oeatssah="); + let req = AddPushRequest::new(endpoint, &keys); + let form = req.build().expect("Couldn't build form"); + assert_eq!( + form, + add_subscription::Form { + subscription: add_subscription::Subscription { + endpoint: "https://example.com/push/endpoint".to_string(), + keys: add_subscription::Keys { + p256dh: "anetohias===".to_string(), + auth: "oeatssah=".to_string(), + }, + }, + data: None, + } + ); + } + + #[test] + fn test_add_push_request_build() { + let endpoint = "https://example.com/push/endpoint"; + let keys = Keys::new("anetohias===", "oeatssah="); + let mut req = AddPushRequest::new(endpoint, &keys); + req.follow().reblog(); + let form = req.build().expect("Couldn't build form"); + assert_eq!( + form, + add_subscription::Form { + subscription: add_subscription::Subscription { + endpoint: "https://example.com/push/endpoint".to_string(), + keys: add_subscription::Keys { + p256dh: "anetohias===".to_string(), + auth: "oeatssah=".to_string(), + }, + }, + data: Some(add_subscription::Data { + alerts: Some(Alerts { + follow: Some(true), + favourite: None, + reblog: Some(true), + mention: None, + }), + }), + } + ); + } + + #[test] + fn test_update_push_request_new() { + let req = UpdatePushRequest::new("some-id"); + assert_eq!( + req, + UpdatePushRequest { + id: "some-id".to_string(), + follow: None, + favourite: None, + reblog: None, + mention: None, + } + ); + } + + #[test] + fn test_update_push_request_follow() { + let mut req = UpdatePushRequest::new("some-id"); + req.follow(true); + assert_eq!( + req, + UpdatePushRequest { + id: "some-id".to_string(), + follow: Some(true), + favourite: None, + reblog: None, + mention: None, + } + ); + } + #[test] + fn test_update_push_request_favourite() { + let mut req = UpdatePushRequest::new("some-id"); + req.favourite(true); + assert_eq!( + req, + UpdatePushRequest { + id: "some-id".to_string(), + follow: None, + favourite: Some(true), + reblog: None, + mention: None, + } + ); + } + #[test] + fn test_update_push_request_reblog() { + let mut req = UpdatePushRequest::new("some-id"); + req.reblog(true); + assert_eq!( + req, + UpdatePushRequest { + id: "some-id".to_string(), + follow: None, + favourite: None, + reblog: Some(true), + mention: None, + } + ); + } + #[test] + fn test_update_push_request_mention() { + let mut req = UpdatePushRequest::new("some-id"); + req.mention(true); + assert_eq!( + req, + UpdatePushRequest { + id: "some-id".to_string(), + follow: None, + favourite: None, + reblog: None, + mention: Some(true), + } + ); + } + #[test] + fn test_update_push_request_build_no_flags() { + let req = UpdatePushRequest::new("some-id"); + let form = req.build(); + assert_eq!( + form, + update_data::Form { + id: "some-id".to_string(), + data: update_data::Data { + alerts: None, + }, + } + ); + } + + #[test] + fn test_update_push_request_build() { + let mut req = UpdatePushRequest::new("some-id"); + req.favourite(false); + let form = req.build(); + assert_eq!( + form, + update_data::Form { + id: "some-id".to_string(), + data: update_data::Data { + alerts: Some(Alerts { + follow: None, + favourite: Some(false), + reblog: None, + mention: None, + }), + }, + } + ); + } +} |