From 53def4994fb3475d40d092347fd1c9cc9d01d610 Mon Sep 17 00:00:00 2001 From: Bjarn Bronsveld Date: Sat, 5 Sep 2026 13:03:14 +0200 Subject: [PATCH] feat(api): support quarantined inbound message processing --- src/endpoints.rs | 7 +++++++ src/types.rs | 10 ++++++++++ tests/sdk_surface.rs | 19 ++++++++++++++++++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/endpoints.rs b/src/endpoints.rs index 5ee12e4..77a6fb8 100644 --- a/src/endpoints.rs +++ b/src/endpoints.rs @@ -18,6 +18,7 @@ pub const OPERATION_IDS: &[&str] = &[ "message.index", "message.show", "message.events", + "processInboundMessage", "message.source", "message.html", "message.text", @@ -154,6 +155,12 @@ impl<'a> Messages<'a> { .await } + pub async fn process(&self, message_id: &str) -> Result { + self.client + .post(&format!("/messages/{}/process", segment(message_id)), &()) + .await + } + pub async fn events( &self, message_id: &str, diff --git a/src/types.rs b/src/types.rs index bd7dc5b..7968a2d 100644 --- a/src/types.rs +++ b/src/types.rs @@ -19,6 +19,8 @@ pub enum MessageStatus { Pending, #[serde(rename = "queued")] Queued, + #[serde(rename = "quarantined")] + Quarantined, #[serde(rename = "suppressed")] Suppressed, #[serde(rename = "processed")] @@ -253,6 +255,8 @@ pub enum MessageEventType { InboundQueued, #[serde(rename = "inbound_spam_blocked")] InboundSpamBlocked, + #[serde(rename = "inbound_released")] + InboundReleased, #[serde(rename = "inbound_processed")] InboundProcessed, #[serde(rename = "inbound_retry")] @@ -1001,6 +1005,12 @@ pub struct MessageEventsResponse { pub prev_page_url: Option, } +#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)] +#[serde(default)] +pub struct ProcessInboundMessageResponse { + pub data: serde_json::Value, +} + #[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)] #[serde(default)] pub struct ProjectIndexResponse { diff --git a/tests/sdk_surface.rs b/tests/sdk_surface.rs index 59fe2d2..3b8cdea 100644 --- a/tests/sdk_surface.rs +++ b/tests/sdk_surface.rs @@ -207,9 +207,26 @@ async fn message_raw_body_endpoints_return_plain_text() { ); } +#[tokio::test] +async fn process_quarantined_message_uses_typed_api_endpoint() { + let transport = MockTransport::new(vec![json_response( + serde_json::json!({"data": {"message_id": "message id", "status": "queued", "webhook_target_count": 1}}), + )]); + let api = Lettermint::api_with_transport("api-token", transport.clone()).unwrap(); + assert_eq!( + api.messages().process("message id").await.unwrap().data["status"], + "queued" + ); + assert_eq!( + transport.requests()[0].url, + "https://api.lettermint.co/v1/messages/message%20id/process" + ); +} + #[test] fn documented_operations_are_exposed() { - assert_eq!(lettermint::endpoints::OPERATION_IDS.len(), 49); + assert_eq!(lettermint::endpoints::OPERATION_IDS.len(), 50); + assert!(lettermint::endpoints::OPERATION_IDS.contains(&"processInboundMessage")); assert!(lettermint::endpoints::OPERATION_IDS.contains(&"v1.sendMail")); assert!(lettermint::endpoints::OPERATION_IDS.contains(&"webhook.showDelivery")); }