refactor(movies): collapse single-field deps structs to Arc params

This commit is contained in:
2026-06-11 22:17:09 +02:00
parent 1e62f12903
commit cdff0de53d
6 changed files with 21 additions and 42 deletions

View File

@@ -5,14 +5,6 @@ use domain::ports::{
PersonCommand, PersonQuery, PosterFetcherClient, SearchCommand, PersonCommand, PersonQuery, PosterFetcherClient, SearchCommand,
}; };
pub struct GetMoviesDeps {
pub movie: Arc<dyn MovieRepository>,
}
pub struct GetMovieProfileDeps {
pub movie_profile: Arc<dyn MovieProfileRepository>,
}
pub struct SyncPosterDeps { pub struct SyncPosterDeps {
pub movie: Arc<dyn MovieRepository>, pub movie: Arc<dyn MovieRepository>,
pub movie_profile: Arc<dyn MovieProfileRepository>, pub movie_profile: Arc<dyn MovieProfileRepository>,

View File

@@ -1,12 +1,13 @@
use std::sync::Arc;
use domain::{ use domain::{
errors::DomainError, errors::DomainError,
models::{CastMember, CrewMember, ExternalPersonId, MovieProfile, PersonId}, models::{CastMember, CrewMember, ExternalPersonId, MovieProfile, PersonId},
ports::MovieProfileRepository,
value_objects::MovieId, value_objects::MovieId,
}; };
use uuid::Uuid; use uuid::Uuid;
use crate::movies::deps::GetMovieProfileDeps;
pub struct GetMovieProfileQuery { pub struct GetMovieProfileQuery {
pub movie_id: Uuid, pub movie_id: Uuid,
} }
@@ -60,11 +61,11 @@ fn resolve_crew(member: &CrewMember) -> CrewMemberWithId {
} }
pub async fn execute( pub async fn execute(
deps: &GetMovieProfileDeps, movie_profile: Arc<dyn MovieProfileRepository>,
query: GetMovieProfileQuery, query: GetMovieProfileQuery,
) -> Result<Option<MovieProfileResult>, DomainError> { ) -> Result<Option<MovieProfileResult>, DomainError> {
let movie_id = MovieId::from_uuid(query.movie_id); let movie_id = MovieId::from_uuid(query.movie_id);
let profile = deps.movie_profile.get_by_movie_id(&movie_id).await?; let profile = movie_profile.get_by_movie_id(&movie_id).await?;
Ok(profile.map(|p| { Ok(profile.map(|p| {
let cast = p.cast.iter().map(resolve_cast).collect(); let cast = p.cast.iter().map(resolve_cast).collect();

View File

@@ -1,13 +1,16 @@
use std::sync::Arc;
use domain::{ use domain::{
errors::DomainError, errors::DomainError,
models::collections::{PageParams, Paginated}, models::collections::{PageParams, Paginated},
models::{MovieFilter, MovieSummary}, models::{MovieFilter, MovieSummary},
ports::MovieRepository,
}; };
use crate::movies::{deps::GetMoviesDeps, queries::GetMoviesQuery}; use crate::movies::queries::GetMoviesQuery;
pub async fn execute( pub async fn execute(
deps: &GetMoviesDeps, movie: Arc<dyn MovieRepository>,
query: GetMoviesQuery, query: GetMoviesQuery,
) -> Result<Paginated<MovieSummary>, DomainError> { ) -> Result<Paginated<MovieSummary>, DomainError> {
let page = PageParams::new(query.limit, query.offset)?; let page = PageParams::new(query.limit, query.offset)?;
@@ -16,7 +19,7 @@ pub async fn execute(
genre: query.genre, genre: query.genre,
language: query.language, language: query.language,
}; };
deps.movie.list_movies(&page, &filter).await movie.list_movies(&page, &filter).await
} }
#[cfg(test)] #[cfg(test)]

View File

@@ -1,5 +1,3 @@
use std::sync::Arc;
use chrono::Utc; use chrono::Utc;
use uuid::Uuid; use uuid::Uuid;
@@ -10,19 +8,14 @@ use domain::{
value_objects::MovieId, value_objects::MovieId,
}; };
use crate::movies::{ use crate::movies::get_movie_profile::{self, GetMovieProfileQuery};
deps::GetMovieProfileDeps,
get_movie_profile::{self, GetMovieProfileQuery},
};
#[tokio::test] #[tokio::test]
async fn returns_none_when_no_profile() { async fn returns_none_when_no_profile() {
let deps = GetMovieProfileDeps { let movie_profile = InMemoryMovieProfileRepository::new();
movie_profile: InMemoryMovieProfileRepository::new(),
};
let result = get_movie_profile::execute( let result = get_movie_profile::execute(
&deps, movie_profile,
GetMovieProfileQuery { GetMovieProfileQuery {
movie_id: Uuid::new_v4(), movie_id: Uuid::new_v4(),
}, },
@@ -71,12 +64,8 @@ async fn returns_profile_with_cast_and_crew() {
}; };
profile_repo.upsert(&profile).await.unwrap(); profile_repo.upsert(&profile).await.unwrap();
let deps = GetMovieProfileDeps {
movie_profile: Arc::clone(&profile_repo) as _,
};
let result = get_movie_profile::execute( let result = get_movie_profile::execute(
&deps, profile_repo.clone(),
GetMovieProfileQuery { GetMovieProfileQuery {
movie_id: movie_id.value(), movie_id: movie_id.value(),
}, },

View File

@@ -1,15 +1,13 @@
use domain::testing::InMemoryMovieRepository; use domain::testing::InMemoryMovieRepository;
use crate::movies::{deps::GetMoviesDeps, get_movies, queries::GetMoviesQuery}; use crate::movies::{get_movies, queries::GetMoviesQuery};
#[tokio::test] #[tokio::test]
async fn returns_empty_when_no_movies() { async fn returns_empty_when_no_movies() {
let deps = GetMoviesDeps { let movie = InMemoryMovieRepository::new();
movie: InMemoryMovieRepository::new(),
};
let result = get_movies::execute( let result = get_movies::execute(
&deps, movie,
GetMoviesQuery { GetMoviesQuery {
limit: None, limit: None,
offset: None, offset: None,

View File

@@ -13,7 +13,7 @@ use application::{
queries::{GetMovieSocialPageQuery, GetReviewHistoryQuery}, queries::{GetMovieSocialPageQuery, GetReviewHistoryQuery},
}, },
movies::{ movies::{
deps::{GetMovieProfileDeps, GetMoviesDeps, SyncPosterDeps}, deps::SyncPosterDeps,
get_movies, get_movies,
queries::GetMoviesQuery, queries::GetMoviesQuery,
sync_poster, sync_poster,
@@ -52,9 +52,7 @@ pub async fn list_movies(
Query(params): Query<MoviesQueryParams>, Query(params): Query<MoviesQueryParams>,
) -> Result<Json<MoviesResponse>, ApiError> { ) -> Result<Json<MoviesResponse>, ApiError> {
let page = get_movies::execute( let page = get_movies::execute(
&GetMoviesDeps { state.app_ctx.repos.movie.clone(),
movie: state.app_ctx.repos.movie.clone(),
},
GetMoviesQuery { GetMoviesQuery {
limit: params.limit, limit: params.limit,
offset: params.offset, offset: params.offset,
@@ -208,9 +206,7 @@ pub async fn get_movie_profile(
use application::movies::get_movie_profile; use application::movies::get_movie_profile;
let query = get_movie_profile::GetMovieProfileQuery { movie_id }; let query = get_movie_profile::GetMovieProfileQuery { movie_id };
match get_movie_profile::execute( match get_movie_profile::execute(
&GetMovieProfileDeps { state.app_ctx.repos.movie_profile.clone(),
movie_profile: state.app_ctx.repos.movie_profile.clone(),
},
query, query,
) )
.await .await