Files
movies-diary/crates/application/src/diary/get_movie_social_page.rs
Gabriel Kaszewski 8526b77f18 test: move application tests to tests/
test_support/test_helpers -> tests/support; watched_at unified w/ domain test_watched_at (2024-03-15).
Kept inline: users::diary_filter tests (feed_sort_to_direction_all_variants, paged_user_filter_builds_correctly) - pub(super) helpers in private module.
Dropped stale never-compiled users/tests/get_users.rs (old execute signature).
2026-10-25 22:36:52 +01:00

45 lines
1.2 KiB
Rust

use domain::{
errors::DomainError,
models::{
FeedEntry, Movie, MovieProfile, MovieStats,
collections::{PageParams, Paginated},
},
value_objects::MovieId,
};
use crate::diary::{deps::GetMovieSocialPageDeps, queries::GetMovieSocialPageQuery};
pub struct MovieSocialPageResult {
pub movie: Movie,
pub stats: MovieStats,
pub reviews: Paginated<FeedEntry>,
pub profile: Option<MovieProfile>,
}
pub async fn execute(
deps: &GetMovieSocialPageDeps,
query: GetMovieSocialPageQuery,
) -> Result<MovieSocialPageResult, DomainError> {
let movie_id = MovieId::from_uuid(query.movie_id);
let page = PageParams::new(Some(query.limit), Some(query.offset))?;
let movie = deps
.movie_query
.get_movie_by_id(&movie_id)
.await?
.ok_or_else(|| DomainError::NotFound(format!("Movie {}", query.movie_id)))?;
let (stats, reviews, profile) = tokio::try_join!(
deps.diary.get_movie_stats(&movie_id),
deps.diary.get_movie_social_feed(&movie_id, &page),
deps.movie_profile.get_by_movie_id(&movie_id),
)?;
Ok(MovieSocialPageResult {
movie,
stats,
reviews,
profile,
})
}