From cedb13d7a82b7522c15b7869dac75658f5fbcbf3 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Fri, 12 Jun 2026 01:34:47 +0200 Subject: [PATCH] fix(domain): typed VOs in MovieEnrichmentRequested and PersonEnrichmentRequested --- crates/adapters/event-payload/src/lib.rs | 11 ++++++----- crates/adapters/poster-sync/src/lib.rs | 2 +- crates/adapters/tmdb-enrichment/src/movie_handler.rs | 2 +- crates/adapters/tmdb-enrichment/src/person_handler.rs | 2 +- crates/application/src/diary/review_logger.rs | 2 +- crates/application/src/jobs/enrichment_staleness.rs | 10 +++++++++- crates/application/src/person/get.rs | 2 +- crates/application/src/person/get_credits.rs | 2 +- crates/domain/src/events.rs | 6 +++--- 9 files changed, 24 insertions(+), 15 deletions(-) diff --git a/crates/adapters/event-payload/src/lib.rs b/crates/adapters/event-payload/src/lib.rs index 4d4a98f..6a7e29d 100644 --- a/crates/adapters/event-payload/src/lib.rs +++ b/crates/adapters/event-payload/src/lib.rs @@ -2,7 +2,7 @@ use chrono::NaiveDateTime; use domain::{ errors::DomainError, events::DomainEvent, - models::PersonId, + models::{ExternalPersonId, PersonId}, value_objects::{ ExternalMetadataId, GoalId, MovieId, PosterPath, Rating, ReviewId, UserId, WrapUpId, }, @@ -210,7 +210,7 @@ impl From<&DomainEvent> for EventPayload { external_metadata_id, } => EventPayload::MovieEnrichmentRequested { movie_id: movie_id.value().to_string(), - external_metadata_id: external_metadata_id.clone(), + external_metadata_id: external_metadata_id.value().to_string(), }, DomainEvent::ImageStored { key } => EventPayload::ImageStored { key: key.clone() }, DomainEvent::WatchlistEntryAdded { @@ -322,7 +322,7 @@ impl From<&DomainEvent> for EventPayload { external_person_id, } => EventPayload::PersonEnrichmentRequested { person_id: person_id.value().to_string(), - external_person_id: external_person_id.clone(), + external_person_id: external_person_id.value().to_string(), }, } } @@ -391,7 +391,8 @@ impl TryFrom for DomainEvent { external_metadata_id, } => Ok(DomainEvent::MovieEnrichmentRequested { movie_id: MovieId::from_uuid(parse_uuid(&movie_id, "movie_id")?), - external_metadata_id, + external_metadata_id: ExternalMetadataId::new(external_metadata_id) + .map_err(|e| DomainError::InfrastructureError(e.to_string()))?, }), EventPayload::ImageStored { key } => Ok(DomainEvent::ImageStored { key }), EventPayload::WatchlistEntryAdded { @@ -514,7 +515,7 @@ impl TryFrom for DomainEvent { external_person_id, } => Ok(DomainEvent::PersonEnrichmentRequested { person_id: PersonId::from_uuid(parse_uuid(&person_id, "person_id")?), - external_person_id, + external_person_id: ExternalPersonId::new(external_person_id), }), } } diff --git a/crates/adapters/poster-sync/src/lib.rs b/crates/adapters/poster-sync/src/lib.rs index 442cab3..f1fd69a 100644 --- a/crates/adapters/poster-sync/src/lib.rs +++ b/crates/adapters/poster-sync/src/lib.rs @@ -123,7 +123,7 @@ impl EventHandler for PosterSyncHandler { if already_has_poster { return Ok(()); } - (movie_id.value(), external_metadata_id.clone()) + (movie_id.value(), external_metadata_id.value().to_owned()) } _ => return Ok(()), }; diff --git a/crates/adapters/tmdb-enrichment/src/movie_handler.rs b/crates/adapters/tmdb-enrichment/src/movie_handler.rs index 9fb2247..89f5d86 100644 --- a/crates/adapters/tmdb-enrichment/src/movie_handler.rs +++ b/crates/adapters/tmdb-enrichment/src/movie_handler.rs @@ -83,7 +83,7 @@ impl EventHandler for MovieEnrichmentHandler { self.enrichment_client.as_ref(), &self.profile_repo, movie_id.clone(), - &external_metadata_id, + external_metadata_id.value(), ) .await? else { diff --git a/crates/adapters/tmdb-enrichment/src/person_handler.rs b/crates/adapters/tmdb-enrichment/src/person_handler.rs index 0c06802..4c5d9de 100644 --- a/crates/adapters/tmdb-enrichment/src/person_handler.rs +++ b/crates/adapters/tmdb-enrichment/src/person_handler.rs @@ -40,6 +40,6 @@ impl EventHandler for PersonEnrichmentHandler { _ => return Ok(()), }; - application::person::enrich::execute(&self.deps, person_id, &external_person_id).await + application::person::enrich::execute(&self.deps, person_id, external_person_id.value()).await } } diff --git a/crates/application/src/diary/review_logger.rs b/crates/application/src/diary/review_logger.rs index 749909d..ddef157 100644 --- a/crates/application/src/diary/review_logger.rs +++ b/crates/application/src/diary/review_logger.rs @@ -112,7 +112,7 @@ async fn publish_events( publisher .publish(&DomainEvent::MovieEnrichmentRequested { movie_id: movie.id().clone(), - external_metadata_id: ext_id.value().to_string(), + external_metadata_id: ext_id.clone(), }) .await?; } diff --git a/crates/application/src/jobs/enrichment_staleness.rs b/crates/application/src/jobs/enrichment_staleness.rs index 27e0029..0069832 100644 --- a/crates/application/src/jobs/enrichment_staleness.rs +++ b/crates/application/src/jobs/enrichment_staleness.rs @@ -6,6 +6,7 @@ use domain::{ errors::DomainError, events::DomainEvent, ports::{EventPublisher, MovieProfileRepository, PeriodicJob}, + value_objects::ExternalMetadataId, }; pub struct EnrichmentStalenessJob { @@ -38,9 +39,16 @@ impl PeriodicJob for EnrichmentStalenessJob { } tracing::info!("enrichment scan: {} stale movies", stale.len()); for (movie_id, external_metadata_id) in stale { + let ext_id = match ExternalMetadataId::new(external_metadata_id) { + Ok(id) => id, + Err(e) => { + tracing::warn!("skipping stale movie with malformed external_metadata_id: {e}"); + continue; + } + }; let event = DomainEvent::MovieEnrichmentRequested { movie_id, - external_metadata_id, + external_metadata_id: ext_id, }; self.event_publisher.publish(&event).await?; } diff --git a/crates/application/src/person/get.rs b/crates/application/src/person/get.rs index 2c95514..c5b9d22 100644 --- a/crates/application/src/person/get.rs +++ b/crates/application/src/person/get.rs @@ -18,7 +18,7 @@ pub async fn execute(deps: &GetPersonDeps, id: PersonId) -> Result Result