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, 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, DomainError> { let store = self.reviews.read().unwrap(); Ok(store .values() .filter(|r| r.user_id() == user_id) .cloned() .collect()) } }