refactor(movies): collapse single-field deps structs to Arc params
This commit is contained in:
@@ -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>,
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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)]
|
||||||
|
|||||||
@@ -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(),
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user