use async_trait::async_trait; use domain::{errors::DomainError, models::Movie, ports::MovieCommand, value_objects::MovieId}; use super::SqliteMovieRepository; #[async_trait] impl MovieCommand for SqliteMovieRepository { async fn upsert_movie(&self, movie: &Movie) -> Result<(), DomainError> { let id = movie.id().value().to_string(); let external_metadata_id = movie.external_metadata_id().map(|e| e.value().to_string()); let title = movie.title().value(); let release_year = movie.release_year().value() as i64; let director = movie.director(); let poster_path = movie.poster_path().map(|p| p.value().to_string()); sqlx::query( "INSERT INTO movies (id, external_metadata_id, title, release_year, director, poster_path) VALUES (?, ?, ?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET external_metadata_id = excluded.external_metadata_id, title = excluded.title, release_year = excluded.release_year, director = excluded.director, poster_path = excluded.poster_path", ) .bind(&id) .bind(&external_metadata_id) .bind(title) .bind(release_year) .bind(director) .bind(&poster_path) .execute(&self.pool) .await .map_err(crate::shared::map_sqlx_error)?; Ok(()) } async fn delete_movie(&self, movie_id: &MovieId) -> Result<(), DomainError> { let id = movie_id.value().to_string(); sqlx::query("DELETE FROM movies WHERE id = ?") .bind(&id) .execute(&self.pool) .await .map_err(crate::shared::map_sqlx_error)?; Ok(()) } }