49 lines
1.8 KiB
Rust
49 lines
1.8 KiB
Rust
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(())
|
|
}
|
|
}
|