fix: NewRemoteReview param struct, atomic review+orphan movie delete

This commit is contained in:
2026-10-26 01:19:09 +01:00
parent 9a4d0c1714
commit 7f9c252d35
18 changed files with 261 additions and 116 deletions

View File

@@ -4,7 +4,7 @@ use domain::{
events::DomainEvent,
models::{Review, ReviewSource},
ports::ReviewRepository,
value_objects::{ReviewId, UserId},
value_objects::{MovieId, ReviewId, UserId},
};
use sqlx::SqlitePool;
@@ -114,12 +114,15 @@ impl ReviewRepository for SqliteReviewRepository {
tx.commit().await.map_err(crate::shared::map_sqlx_error)
}
async fn delete_review(
async fn delete_review_and_orphaned_movie(
&self,
review_id: &ReviewId,
events: &[DomainEvent],
movie_id: &MovieId,
review_events: &[DomainEvent],
orphan_events: &[DomainEvent],
) -> Result<(), DomainError> {
let id = review_id.value().to_string();
let movie = movie_id.value().to_string();
let mut tx = self
.pool
.begin()
@@ -130,7 +133,19 @@ impl ReviewRepository for SqliteReviewRepository {
.execute(&mut *tx)
.await
.map_err(crate::shared::map_sqlx_error)?;
enqueue_events(&mut tx, events).await?;
enqueue_events(&mut tx, review_events).await?;
let orphaned = sqlx::query(
"DELETE FROM movies WHERE id = ? \
AND NOT EXISTS (SELECT 1 FROM reviews WHERE movie_id = ?)",
)
.bind(&movie)
.bind(&movie)
.execute(&mut *tx)
.await
.map_err(crate::shared::map_sqlx_error)?;
if orphaned.rows_affected() > 0 {
enqueue_events(&mut tx, orphan_events).await?;
}
tx.commit().await.map_err(crate::shared::map_sqlx_error)
}