Add SQLite repository implementation and update domain models for persistence
This commit is contained in:
5
Cargo.lock
generated
5
Cargo.lock
generated
@@ -1260,7 +1260,12 @@ dependencies = [
|
|||||||
name = "sqlite"
|
name = "sqlite"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"async-trait",
|
||||||
|
"chrono",
|
||||||
|
"domain",
|
||||||
"sqlx",
|
"sqlx",
|
||||||
|
"tracing",
|
||||||
|
"uuid",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|||||||
@@ -10,3 +10,9 @@ sqlx = { version = "0.8.6", features = [
|
|||||||
"uuid",
|
"uuid",
|
||||||
"macros",
|
"macros",
|
||||||
] }
|
] }
|
||||||
|
|
||||||
|
domain = { workspace = true }
|
||||||
|
uuid = { workspace = true }
|
||||||
|
chrono = { workspace = true }
|
||||||
|
tracing = { workspace = true }
|
||||||
|
async-trait = { workspace = true }
|
||||||
|
|||||||
@@ -1,14 +1,64 @@
|
|||||||
pub fn add(left: u64, right: u64) -> u64 {
|
use domain::{
|
||||||
left + right
|
errors::DomainError,
|
||||||
|
events::DomainEvent,
|
||||||
|
models::{DiaryEntry, DiaryFilter, Movie, Review, ReviewHistory, collections::Paginated},
|
||||||
|
ports::MovieRepository,
|
||||||
|
value_objects::{ExternalMetadataId, MovieId, MovieTitle, ReleaseYear},
|
||||||
|
};
|
||||||
|
use sqlx::SqlitePool;
|
||||||
|
|
||||||
|
pub struct SqliteMovieRepository {
|
||||||
|
pool: SqlitePool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
impl SqliteMovieRepository {
|
||||||
mod tests {
|
pub fn new(pool: SqlitePool) -> Self {
|
||||||
use super::*;
|
Self { pool }
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
fn map_err(e: sqlx::Error) -> DomainError {
|
||||||
fn it_works() {
|
tracing::error!("Database error: {:?}", e);
|
||||||
let result = add(2, 2);
|
DomainError::InfrastructureError("Database operation failed".into())
|
||||||
assert_eq!(result, 4);
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait::async_trait]
|
||||||
|
impl MovieRepository for SqliteMovieRepository {
|
||||||
|
async fn get_movie_by_external_id(
|
||||||
|
&self,
|
||||||
|
external_metadata_id: &ExternalMetadataId,
|
||||||
|
) -> Result<Option<Movie>, DomainError> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn get_movie_by_id(&self, movie_id: &MovieId) -> Result<Option<Movie>, DomainError> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn get_movies_by_title_and_year(
|
||||||
|
&self,
|
||||||
|
title: &MovieTitle,
|
||||||
|
year: &ReleaseYear,
|
||||||
|
) -> Result<Vec<Movie>, DomainError> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn upsert_movie(&self, movie: &Movie) -> Result<(), DomainError> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn save_review(&self, review: &Review) -> Result<DomainEvent, DomainError> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn query_diary(
|
||||||
|
&self,
|
||||||
|
filter: &DiaryFilter,
|
||||||
|
) -> Result<Paginated<DiaryEntry>, DomainError> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn get_review_history(&self, movie_id: &MovieId) -> Result<ReviewHistory, DomainError> {
|
||||||
|
todo!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,6 +52,24 @@ impl Movie {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn from_persistence(
|
||||||
|
id: MovieId,
|
||||||
|
external_metadata_id: Option<ExternalMetadataId>,
|
||||||
|
title: MovieTitle,
|
||||||
|
release_year: ReleaseYear,
|
||||||
|
director: Option<String>,
|
||||||
|
poster_path: Option<PosterPath>,
|
||||||
|
) -> Self {
|
||||||
|
Self {
|
||||||
|
id,
|
||||||
|
external_metadata_id,
|
||||||
|
title,
|
||||||
|
release_year,
|
||||||
|
director,
|
||||||
|
poster_path,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn update_poster(&mut self, poster_path: PosterPath) {
|
pub fn update_poster(&mut self, poster_path: PosterPath) {
|
||||||
self.poster_path = Some(poster_path);
|
self.poster_path = Some(poster_path);
|
||||||
}
|
}
|
||||||
@@ -132,6 +150,26 @@ impl Review {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn from_persistence(
|
||||||
|
id: ReviewId,
|
||||||
|
movie_id: MovieId,
|
||||||
|
user_id: UserId,
|
||||||
|
rating: Rating,
|
||||||
|
comment: Option<Comment>,
|
||||||
|
watched_at: NaiveDateTime,
|
||||||
|
created_at: NaiveDateTime,
|
||||||
|
) -> Self {
|
||||||
|
Self {
|
||||||
|
id,
|
||||||
|
movie_id,
|
||||||
|
user_id,
|
||||||
|
rating,
|
||||||
|
comment,
|
||||||
|
watched_at,
|
||||||
|
created_at,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn id(&self) -> &ReviewId {
|
pub fn id(&self) -> &ReviewId {
|
||||||
&self.id
|
&self.id
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user