- add admin POST /api/v1/admin/reindex-search endpoint + event-driven handler - backfill persons from movie_cast/movie_crew into persons table - paginate person list_page/backfill_from_credits_batch to cap memory - concurrent worker event dispatch with semaphore (max 8) - graceful worker shutdown (drain in-flight tasks on SIGINT) - always ack events, log handler errors as warnings (no infinite retry) - NATS ack_wait 600s, AtomicBool guard against concurrent reindex - add username/display_name to UserSummaryDto and users list - add person_id to CastMemberDto/CrewMemberDto via get_movie_profile use case - add movie_id to wrapup MovieRef, person_id to wrapup PersonStat - thread tmdb_person_id through wrapup cast pipeline - add is_federated to FeedEntryDto - cap orphaned persons query with LIMIT 500 - add SPA link to classic site footer
33 lines
1.5 KiB
Rust
33 lines
1.5 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",
|
|
DomainEvent::WatchlistEntryAdded { .. } => "watchlist.entry.added",
|
|
DomainEvent::WatchlistEntryRemoved { .. } => "watchlist.entry.removed",
|
|
DomainEvent::FollowAccepted { .. } => "follow.accepted",
|
|
DomainEvent::BackfillFollower { .. } => "backfill.follower",
|
|
DomainEvent::FederationDeliveryRequested { .. } => "federation.delivery.requested",
|
|
DomainEvent::WatchEventIngested { .. } => "watch.event.ingested",
|
|
DomainEvent::WrapUpRequested { .. } => "wrapup.requested",
|
|
DomainEvent::WrapUpCompleted { .. } => "wrapup.completed",
|
|
DomainEvent::SearchReindexRequested => "search.reindex.requested",
|
|
};
|
|
format!("{prefix}.{suffix}")
|
|
}
|
|
|
|
pub fn consumer_subject_filter(prefix: &str) -> String {
|
|
format!("{prefix}.>")
|
|
}
|
|
|
|
#[cfg(test)]
|
|
#[path = "tests/subject.rs"]
|
|
mod tests;
|