Skip to content

Commit bf672d5

Browse files
authored
server: Support sending raw (pre-formatted) payloads (#1930)
Based on #1929. Closes #1927.
2 parents 886d788 + cb9397f commit bf672d5

File tree

4 files changed

+57
-1
lines changed

4 files changed

+57
-1
lines changed

server/svix-server/src/v1/endpoints/endpoint/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,7 @@ async fn send_example(
799799
payload: RawPayload::from_string(example).unwrap(),
800800
uid: None,
801801
payload_retention_period: 90,
802+
extra_params: None,
802803
};
803804

804805
let create_message =

server/svix-server/src/v1/endpoints/message.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,27 @@ pub struct MessageIn {
124124
#[serde(default = "default_90")]
125125
#[schemars(example = "default_90")]
126126
pub payload_retention_period: i64,
127+
#[serde(rename = "transformationsParams")]
128+
#[schemars(skip)]
129+
pub extra_params: Option<MessageInExtraParams>,
130+
}
131+
132+
impl MessageIn {
133+
fn payload(&self) -> Vec<u8> {
134+
if let Some(params) = &self.extra_params {
135+
if let Some(raw_payload) = &params.raw_payload {
136+
return raw_payload.as_bytes().to_owned();
137+
}
138+
}
139+
140+
self.payload.0.get().as_bytes().to_owned()
141+
}
142+
}
143+
144+
#[derive(Clone, Debug, Default, PartialEq, Eq, Deserialize, Serialize)]
145+
#[serde(rename_all = "camelCase")]
146+
pub struct MessageInExtraParams {
147+
raw_payload: Option<String>,
127148
}
128149

129150
fn example_channel_set() -> Vec<&'static str> {
@@ -350,7 +371,7 @@ pub(crate) async fn create_message_inner(
350371
// Should never happen since you're giving it an existing Application, but just in case
351372
.ok_or_else(|| Error::generic(format!("Application doesn't exist: {}", app.id)))?;
352373

353-
let payload = data.payload.to_string().into_bytes();
374+
let payload = data.payload();
354375
let msg = message::ActiveModel {
355376
app_id: Set(app.id.clone()),
356377
org_id: Set(app.org_id),

server/svix-server/tests/it/e2e_message.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,3 +531,36 @@ async fn test_message_validation() {
531531
.await
532532
.unwrap();
533533
}
534+
535+
#[tokio::test]
536+
async fn test_raw_payload() {
537+
let (client, _jh) = start_svix_server().await;
538+
539+
let app_id = create_test_app(&client, "testRawPayload").await.unwrap().id;
540+
541+
let mut receiver = TestReceiver::start(axum::http::StatusCode::OK);
542+
543+
create_test_endpoint(&client, &app_id, &receiver.endpoint)
544+
.await
545+
.unwrap();
546+
547+
let msg_payload = json!({ "test": "value1" });
548+
549+
let _: IgnoredAny = client
550+
.post(
551+
&format!("api/v1/app/{app_id}/msg/"),
552+
json!({
553+
"eventType": "payload.raw",
554+
"payload": {},
555+
"transformationsParams": {
556+
"rawPayload": msg_payload.to_string(),
557+
},
558+
}),
559+
StatusCode::ACCEPTED,
560+
)
561+
.await
562+
.unwrap();
563+
564+
let rec_body = receiver.data_recv.recv().await;
565+
assert_eq!(msg_payload.to_string(), rec_body.unwrap().to_string());
566+
}

server/svix-server/tests/it/utils/common_calls.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ pub fn message_in<T: Serialize>(event_type: &str, payload: T) -> Result<MessageI
123123
payload_retention_period: 5,
124124
channels: None,
125125
uid: None,
126+
extra_params: None,
126127
})
127128
}
128129

0 commit comments

Comments
 (0)