facebook_signed_request/
data_deletion_callback.rs

1//! [Official doc](https://developers.facebook.com/docs/development/create-an-app/app-dashboard/data-deletion-callback)
2
3use chrono::{serde::ts_seconds, DateTime, Utc};
4use serde::Deserialize;
5use serde_aux::field_attributes::deserialize_number_from_string;
6
7use crate::ParseError;
8
9#[derive(Deserialize, Debug, Clone)]
10pub struct Payload {
11    #[serde(deserialize_with = "deserialize_number_from_string")]
12    pub user_id: u64,
13    pub algorithm: String,
14    #[serde(with = "ts_seconds")]
15    pub issued_at: DateTime<Utc>,
16    #[serde(with = "ts_seconds")]
17    pub expires: DateTime<Utc>,
18}
19impl crate::Payload for Payload {
20    fn algorithm(&self) -> Option<&str> {
21        Some(&self.algorithm)
22    }
23}
24
25pub fn parse(signed_request: &str, app_secret: &str) -> Result<Payload, ParseError> {
26    crate::parse(signed_request, app_secret)
27}
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32
33    #[test]
34    fn test_de() {
35        let json = r#"{"user_id":"218471","algorithm":"HMAC-SHA256","issued_at":1291836800,"expires":1291840400}"#;
36
37        match serde_json::from_str::<Payload>(json) {
38            Ok(payload) => {
39                assert_eq!(payload.user_id, 218471);
40                assert_eq!(payload.algorithm, "HMAC-SHA256");
41                assert_eq!(payload.issued_at.timestamp(), 1291836800);
42                assert_eq!(payload.expires.timestamp(), 1291840400);
43            }
44            Err(err) => panic!("{}", err),
45        }
46    }
47}