postmark/api/message_streams/
get_suppressions.rs

1use std::borrow::Cow;
2
3use crate::api::message_streams::StreamIdOrName;
4use crate::Endpoint;
5use serde::{Deserialize, Serialize};
6use typed_builder::TypedBuilder;
7
8use time::OffsetDateTime;
9
10#[derive(Debug, Clone, PartialEq, Serialize)]
11#[serde(rename_all = "PascalCase")]
12#[derive(TypedBuilder)]
13pub struct GetSuppressionRequest {
14    #[serde(skip)]
15    pub stream_id: StreamIdOrName,
16}
17
18#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
19#[serde(rename_all = "PascalCase")]
20pub struct GetSuppressionResponse {
21    pub suppressions: Vec<GetSuppression>,
22}
23
24#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
25#[serde(rename_all = "PascalCase")]
26pub struct GetSuppression {
27    pub email_address: String,
28    pub suppression_reason: String,
29    pub origin: String,
30    #[serde(with = "time::serde::rfc3339")]
31    pub created_at: OffsetDateTime,
32}
33
34impl Endpoint for GetSuppressionRequest {
35    type Request = GetSuppressionRequest;
36    type Response = GetSuppressionResponse;
37
38    fn endpoint(&self) -> Cow<'static, str> {
39        format!("/message-streams/{}/suppressions/dump", self.stream_id).into()
40    }
41
42    fn body(&self) -> &Self::Request {
43        self
44    }
45
46    fn method(&self) -> http::Method {
47        http::Method::GET
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use httptest::matchers::request;
54    use httptest::{responders::*, Expectation, Server};
55    use serde_json::json;
56
57    use crate::reqwest::PostmarkClient;
58    use crate::Query;
59
60    use super::*;
61    const STREAM_ID: &str = "my-stream-id";
62    #[tokio::test]
63    pub async fn create_new_server() {
64        let server = Server::run();
65
66        server.expect(
67            Expectation::matching(request::method_path(
68                "GET",
69                format!("/message-streams/{STREAM_ID}/suppressions/dump"),
70            ))
71            .respond_with(json_encoded(json!({
72              "Suppressions":[
73                {
74                  "EmailAddress":"address@wildbit.com",
75                  "SuppressionReason":"ManualSuppression",
76                  "Origin": "Recipient",
77                  "CreatedAt":"2019-12-17T08:58:33-05:00"
78                },
79                {
80                  "EmailAddress":"bounce.address@wildbit.com",
81                  "SuppressionReason":"HardBounce",
82                  "Origin": "Recipient",
83                  "CreatedAt":"2019-12-17T08:58:33-05:00"
84                },
85                {
86                  "EmailAddress":"spam.complaint.address@wildbit.com",
87                  "SuppressionReason":"SpamComplaint",
88                  "Origin": "Recipient",
89                  "CreatedAt":"2019-12-17T08:58:33-05:00"
90                }
91              ]
92            }))),
93        );
94
95        let client = PostmarkClient::builder()
96            .base_url(server.url("/").to_string())
97            .build();
98
99        let req = GetSuppressionRequest::builder()
100            .stream_id(StreamIdOrName::StreamId(String::from(STREAM_ID)))
101            .build();
102
103        print!("{}\n", req.endpoint());
104
105        req.execute(&client)
106            .await
107            .expect("Should get a response and be able to json decode it");
108    }
109}