feat: event ids, outbox identity migration
This commit is contained in:
@@ -5,7 +5,7 @@ use async_nats::{
|
||||
use async_trait::async_trait;
|
||||
use domain::{
|
||||
errors::DomainError,
|
||||
events::{AckHandle, DomainEvent, EventEnvelope},
|
||||
events::{AckHandle, DomainEvent, EventEnvelope, EventId},
|
||||
ports::EventConsumer,
|
||||
};
|
||||
use futures::{
|
||||
@@ -15,7 +15,7 @@ use futures::{
|
||||
use std::sync::Arc;
|
||||
use tokio::sync::{Mutex, mpsc};
|
||||
|
||||
use crate::{config::NatsConfig, payload::NatsEventPayload, subject::consumer_subject_filter};
|
||||
use crate::{config::NatsConfig, payload::NatsEventMessage, subject::consumer_subject_filter};
|
||||
|
||||
// ── JetStream ack handle ─────────────────────────────────────────────────────
|
||||
|
||||
@@ -66,21 +66,33 @@ impl AckHandle for NoopAck {
|
||||
|
||||
// ── Envelope construction helpers ────────────────────────────────────────────
|
||||
|
||||
fn decode_js(msg: async_nats::jetstream::Message) -> Result<EventEnvelope, DomainError> {
|
||||
let payload: NatsEventPayload = serde_json::from_slice(&msg.payload)
|
||||
fn decode_message(bytes: &[u8]) -> Result<(Option<EventId>, DomainEvent), DomainError> {
|
||||
let message: NatsEventMessage = serde_json::from_slice(bytes)
|
||||
.map_err(|e| DomainError::InfrastructureError(format!("deserialize: {e}")))?;
|
||||
let event = DomainEvent::try_from(payload)?;
|
||||
let id = message
|
||||
.event_id
|
||||
.as_deref()
|
||||
.map(|s| {
|
||||
uuid::Uuid::parse_str(s)
|
||||
.map(EventId::from_uuid)
|
||||
.map_err(|e| DomainError::InfrastructureError(format!("event_id: {e}")))
|
||||
})
|
||||
.transpose()?;
|
||||
Ok((id, DomainEvent::try_from(message.payload)?))
|
||||
}
|
||||
|
||||
fn decode_js(msg: async_nats::jetstream::Message) -> Result<EventEnvelope, DomainError> {
|
||||
let (id, event) = decode_message(&msg.payload)?;
|
||||
Ok(EventEnvelope::new(
|
||||
id,
|
||||
event,
|
||||
Box::new(NatsJetStreamAckHandle { message: msg }),
|
||||
))
|
||||
}
|
||||
|
||||
fn decode_core(msg: async_nats::Message) -> Result<EventEnvelope, DomainError> {
|
||||
let payload: NatsEventPayload = serde_json::from_slice(&msg.payload)
|
||||
.map_err(|e| DomainError::InfrastructureError(format!("deserialize: {e}")))?;
|
||||
let event = DomainEvent::try_from(payload)?;
|
||||
Ok(EventEnvelope::new(event, Box::new(NoopAck)))
|
||||
let (id, event) = decode_message(&msg.payload)?;
|
||||
Ok(EventEnvelope::new(id, event, Box::new(NoopAck)))
|
||||
}
|
||||
|
||||
// ── Channel-bridge shared by both consumers ──────────────────────────────────
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
pub use event_payload::EventMessage as NatsEventMessage;
|
||||
pub use event_payload::EventPayload as NatsEventPayload;
|
||||
|
||||
Reference in New Issue
Block a user