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:
@@ -1,5 +1,5 @@
|
||||
[package]
|
||||
name = "event-payload"
|
||||
name = "adapters-event-payload"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
|
||||
@@ -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(×tamp)?,
|
||||
},
|
||||
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(×tamp)?,
|
||||
},
|
||||
EventPayload::JobEnqueued {
|
||||
job_id,
|
||||
job_type,
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user