postmark/api/message_streams/
get_suppressions.rs1use 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}