69 lines
1.7 KiB
Rust
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())
|
|
}
|
|
}
|