Files
movies-diary/crates/domain/src/testing/fakes/store_review.rs

69 lines
1.7 KiB
Rust

use async_trait::async_trait;
use crate::{
errors::DomainError,
events::DomainEvent,
models::Review,
ports::ReviewRepository,
value_objects::{ReviewId, UserId},
};
use super::InMemoryStore;
#[async_trait]
impl ReviewRepository for InMemoryStore {
async fn save_review(
&self,
review: &Review,
events: &[DomainEvent],
) -> Result<(), DomainError> {
self.reviews
.write()
.unwrap()
.insert(review.id().value(), review.clone());
self.record_events(events);
Ok(())
}
async fn get_review_by_id(&self, review_id: &ReviewId) -> Result<Option<Review>, DomainError> {
Ok(self
.reviews
.read()
.unwrap()
.get(&review_id.value())
.cloned())
}
async fn update_review(
&self,
review: &Review,
events: &[DomainEvent],
) -> Result<(), DomainError> {
self.reviews
.write()
.unwrap()
.insert(review.id().value(), review.clone());
self.record_events(events);
Ok(())
}
async fn delete_review(
&self,
review_id: &ReviewId,
events: &[DomainEvent],
) -> Result<(), DomainError> {
self.reviews.write().unwrap().remove(&review_id.value());
self.record_events(events);
Ok(())
}
async fn get_all_reviews_for_user(&self, user_id: &UserId) -> Result<Vec<Review>, DomainError> {
let store = self.reviews.read().unwrap();
Ok(store
.values()
.filter(|r| r.user_id() == user_id)
.cloned()
.collect())
}
}