feat: async image conversion service (avif/webp) with backfill

This commit is contained in:
2026-05-12 15:05:28 +02:00
parent 4269eca582
commit 696e3e170c
22 changed files with 1286 additions and 16 deletions

View File

@@ -43,6 +43,9 @@ pub enum EventPayload {
movie_id: String,
external_metadata_id: String,
},
ImageStored {
key: String,
},
}
impl EventPayload {
@@ -55,6 +58,7 @@ impl EventPayload {
EventPayload::UserUpdated { .. } => "UserUpdated",
EventPayload::ReviewDeleted { .. } => "ReviewDeleted",
EventPayload::MovieEnrichmentRequested { .. } => "MovieEnrichmentRequested",
EventPayload::ImageStored { .. } => "ImageStored",
}
}
}
@@ -114,6 +118,7 @@ impl From<&DomainEvent> for EventPayload {
external_metadata_id: external_metadata_id.clone(),
}
}
DomainEvent::ImageStored { key } => EventPayload::ImageStored { key: key.clone() },
}
}
}
@@ -171,6 +176,9 @@ impl TryFrom<EventPayload> for DomainEvent {
external_metadata_id,
})
}
EventPayload::ImageStored { key } => {
Ok(DomainEvent::ImageStored { key })
}
}
}
}
@@ -247,4 +255,20 @@ mod tests {
assert_eq!(EventPayload::from(&review_updated()).event_type(), "ReviewUpdated");
assert_eq!(EventPayload::from(&movie_discovered()).event_type(), "MovieDiscovered");
}
#[test]
fn round_trip_image_stored() {
let event = DomainEvent::ImageStored { key: "avatars/abc123".into() };
let payload = EventPayload::from(&event);
let json = serde_json::to_string(&payload).unwrap();
let back: EventPayload = serde_json::from_str(&json).unwrap();
let recovered = DomainEvent::try_from(back).unwrap();
assert_eq!(EventPayload::from(&event), EventPayload::from(&recovered));
}
#[test]
fn image_stored_event_type() {
let payload = EventPayload::from(&DomainEvent::ImageStored { key: "posters/x".into() });
assert_eq!(payload.event_type(), "ImageStored");
}
}