refactor: code smell fixes — tests, events, naming

- Tests for ExecutePipelineHandler (happy path, fallback, disabled skip, failure retry, not found)
- Tests for ProcessNextJobHandler (empty queue, process, drain multiple)
- DerivativeGenerated domain event + event-payload mapping + event_store aggregate
- Renamed event-payload → adapters-event-payload, event-transport → adapters-event-transport
This commit is contained in:
2026-05-31 21:00:50 +02:00
parent e11a1a828b
commit d379f3d3c8
19 changed files with 481 additions and 49 deletions

View File

@@ -1,5 +1,5 @@
[package]
name = "event-payload"
name = "adapters-event-payload"
version = "0.1.0"
edition = "2024"

View File

@@ -34,6 +34,12 @@ pub enum EventPayload {
asset_id: String,
timestamp: String,
},
DerivativeGenerated {
asset_id: String,
derivative_id: String,
profile: String,
timestamp: String,
},
JobEnqueued {
job_id: String,
job_type: String,
@@ -59,6 +65,7 @@ impl EventPayload {
Self::ShareCreated { .. } => "shares.created",
Self::ShareRevoked { .. } => "shares.revoked",
Self::SidecarSyncRequested { .. } => "sidecars.sync_requested",
Self::DerivativeGenerated { .. } => "derivatives.generated",
Self::JobEnqueued { .. } => "jobs.enqueued",
Self::JobCompleted { .. } => "jobs.completed",
Self::JobFailed { .. } => "jobs.failed",
@@ -123,6 +130,17 @@ impl From<&DomainEvent> for EventPayload {
asset_id: asset_id.to_string(),
timestamp: timestamp.to_string(),
},
DomainEvent::DerivativeGenerated {
asset_id,
derivative_id,
profile,
timestamp,
} => Self::DerivativeGenerated {
asset_id: asset_id.to_string(),
derivative_id: derivative_id.to_string(),
profile: profile.clone(),
timestamp: timestamp.to_string(),
},
DomainEvent::JobEnqueued {
job_id,
job_type,
@@ -222,6 +240,17 @@ impl TryFrom<EventPayload> for DomainEvent {
asset_id: SystemId::from_uuid(parse_uuid(&asset_id, "asset_id")?),
timestamp: parse_timestamp(&timestamp)?,
},
EventPayload::DerivativeGenerated {
asset_id,
derivative_id,
profile,
timestamp,
} => DomainEvent::DerivativeGenerated {
asset_id: SystemId::from_uuid(parse_uuid(&asset_id, "asset_id")?),
derivative_id: SystemId::from_uuid(parse_uuid(&derivative_id, "derivative_id")?),
profile,
timestamp: parse_timestamp(&timestamp)?,
},
EventPayload::JobEnqueued {
job_id,
job_type,

View File

@@ -1,11 +1,11 @@
[package]
name = "event-transport"
name = "adapters-event-transport"
version = "0.1.0"
edition = "2024"
[dependencies]
domain = { workspace = true }
event-payload = { workspace = true }
adapters-event-payload = { workspace = true }
serde_json = { workspace = true }
async-trait = { workspace = true }
tracing = { workspace = true }

View File

@@ -1,13 +1,13 @@
pub mod composite;
pub use composite::CompositeEventPublisher;
use adapters_event_payload::EventPayload;
use async_trait::async_trait;
use domain::{
errors::DomainError,
events::{DomainEvent, EventEnvelope},
ports::{EventConsumer, EventPublisher},
};
use event_payload::EventPayload;
use futures::stream::BoxStream;
#[async_trait]

View File

@@ -55,7 +55,7 @@ async fn published_bytes_are_valid_json() {
adapter.publish(&event).await.unwrap();
let recorded = messages.lock().unwrap();
let payload: event_payload::EventPayload =
let payload: adapters_event_payload::EventPayload =
serde_json::from_slice(&recorded[0].1).expect("should be valid JSON");
assert_eq!(payload.subject(), "assets.ingested");
}

View File

@@ -5,7 +5,7 @@ edition = "2024"
[dependencies]
domain = { workspace = true }
event-transport = { workspace = true }
adapters-event-transport = { workspace = true }
async-nats = { workspace = true }
async-trait = { workspace = true }
futures = { workspace = true }

View File

@@ -1,7 +1,7 @@
use adapters_event_transport::{MessageSource, RawMessage, Transport};
use async_nats::jetstream::{self, AckKind, stream::Config as StreamConfig};
use async_trait::async_trait;
use domain::errors::DomainError;
use event_transport::{MessageSource, RawMessage, Transport};
use futures::stream::BoxStream;
use std::sync::Arc;

View File

@@ -5,7 +5,7 @@ edition = "2024"
[dependencies]
domain = { workspace = true }
event-payload = { workspace = true }
adapters-event-payload = { workspace = true }
sqlx = { workspace = true, features = ["postgres", "runtime-tokio", "migrate", "uuid", "chrono", "json"] }
uuid = { workspace = true }
chrono = { workspace = true }

View File

@@ -1,9 +1,9 @@
use crate::helpers::{MapDomainError, pg_repo};
use adapters_event_payload::EventPayload;
use async_trait::async_trait;
use domain::{
errors::DomainError, events::DomainEvent, ports::EventStore, value_objects::SystemId,
};
use event_payload::EventPayload;
use uuid::Uuid;
pg_repo!(PostgresEventStore);
@@ -14,7 +14,8 @@ fn aggregate_id(event: &DomainEvent) -> Uuid {
DomainEvent::AssetIngested { asset_id, .. }
| DomainEvent::MetadataUpdated { asset_id, .. }
| DomainEvent::AssetDeleted { asset_id, .. }
| DomainEvent::SidecarSyncRequested { asset_id, .. } => *asset_id.as_uuid(),
| DomainEvent::SidecarSyncRequested { asset_id, .. }
| DomainEvent::DerivativeGenerated { asset_id, .. } => *asset_id.as_uuid(),
DomainEvent::ShareCreated { scope_id, .. } | DomainEvent::ShareRevoked { scope_id, .. } => {
*scope_id.as_uuid()