Add SQLite repository implementation and update domain models for persistence

This commit is contained in:
2026-05-04 01:34:52 +02:00
parent 65bab7fd44
commit f60cc368b6
4 changed files with 108 additions and 9 deletions

5
Cargo.lock generated
View File

@@ -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]]

View File

@@ -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 }

View File

@@ -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!()
} }
} }

View File

@@ -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
} }