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

View File

@@ -10,3 +10,9 @@ sqlx = { version = "0.8.6", features = [
"uuid",
"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 {
left + right
use domain::{
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)]
mod tests {
use super::*;
impl SqliteMovieRepository {
pub fn new(pool: SqlitePool) -> Self {
Self { pool }
}
#[test]
fn it_works() {
let result = add(2, 2);
assert_eq!(result, 4);
fn map_err(e: sqlx::Error) -> DomainError {
tracing::error!("Database error: {:?}", e);
DomainError::InfrastructureError("Database operation failed".into())
}
}
#[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) {
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 {
&self.id
}