Files
movies-diary/crates/adapters/nats/src/subject.rs

82 lines
2.7 KiB
Rust

use domain::events::DomainEvent;
pub fn event_to_subject(prefix: &str, event: &DomainEvent) -> String {
let suffix = match event {
DomainEvent::ReviewLogged { .. } => "review.logged",
DomainEvent::ReviewUpdated { .. } => "review.updated",
DomainEvent::ReviewDeleted { .. } => "review.deleted",
DomainEvent::MovieDiscovered { .. } => "movie.discovered",
DomainEvent::MovieDeleted { .. } => "movie.deleted",
DomainEvent::UserUpdated { .. } => "user.updated",
DomainEvent::MovieEnrichmentRequested { .. } => "movie.enrichment.requested",
DomainEvent::ImageStored { .. } => "image.stored",
};
format!("{prefix}.{suffix}")
}
pub fn consumer_subject_filter(prefix: &str) -> String {
format!("{prefix}.>")
}
#[cfg(test)]
mod tests {
use super::*;
use chrono::NaiveDateTime;
use domain::value_objects::{ExternalMetadataId, MovieId, Rating, ReviewId, UserId};
use uuid::Uuid;
fn dt() -> NaiveDateTime {
chrono::DateTime::from_timestamp(1_700_000_000, 0).unwrap().naive_utc()
}
#[test]
fn review_logged_subject() {
let event = DomainEvent::ReviewLogged {
review_id: ReviewId::from_uuid(Uuid::new_v4()),
movie_id: MovieId::from_uuid(Uuid::new_v4()),
user_id: UserId::from_uuid(Uuid::new_v4()),
rating: Rating::new(3).unwrap(),
watched_at: dt(),
};
assert_eq!(
event_to_subject("movies-diary.events", &event),
"movies-diary.events.review.logged"
);
}
#[test]
fn review_updated_subject() {
let event = DomainEvent::ReviewUpdated {
review_id: ReviewId::from_uuid(Uuid::new_v4()),
movie_id: MovieId::from_uuid(Uuid::new_v4()),
user_id: UserId::from_uuid(Uuid::new_v4()),
rating: Rating::new(5).unwrap(),
watched_at: dt(),
};
assert_eq!(
event_to_subject("movies-diary.events", &event),
"movies-diary.events.review.updated"
);
}
#[test]
fn movie_discovered_subject() {
let event = DomainEvent::MovieDiscovered {
movie_id: MovieId::from_uuid(Uuid::new_v4()),
external_metadata_id: ExternalMetadataId::new("tt0000001".into()).unwrap(),
};
assert_eq!(
event_to_subject("movies-diary.events", &event),
"movies-diary.events.movie.discovered"
);
}
#[test]
fn consumer_subject_filter_appends_wildcard() {
assert_eq!(
consumer_subject_filter("movies-diary.events"),
"movies-diary.events.>"
);
}
}