use crate::models::AggregateRoot;
use std::error::Error;
use crate::event::DomainEvent;
pub trait Repository<T: AggregateRoot> {
type Error: std::error::Error + std::fmt::Display + 'static + Send;
fn insert(&mut self, entity: &T) -> Result<Option<String>, Self::Error>;
fn get(&mut self, key: &String) -> Result<Option<T>, Self::Error>;
fn get_paged(&mut self, page_num: usize, page_size: usize) -> Result<Option<Vec<T>>, Self::Error>;
fn contains_key(&mut self, key: &String) -> Result<bool, Self::Error> {
Ok(self.get(key)?.is_some())
}
fn update(&mut self, entity: &T) -> Result<Option<String>, Self::Error>;
fn remove(&mut self, key: &String) -> Result<Option<String>, Self::Error>;
}
pub trait ReadRepository<T> {
type Error: std::error::Error + std::fmt::Display + 'static + Send;
fn get(&mut self, key: &String) -> Result<Option<T>, Self::Error>;
fn get_paged(&mut self, page_num: usize, page_size: usize) -> Result<Option<Vec<T>>, Self::Error>;
fn contains_key(&mut self, key: &String) -> Result<bool, Self::Error> {
Ok(self.get(key)?.is_some())
}
}
pub trait EventRepository {
type Events: DomainEvent;
fn events_by_aggregate(&self, aggregate_id: &String) -> Option<Vec<Self::Events>>;
fn events_since_version(&self, aggregate_id: &String, version: u64) -> Option<Vec<Self::Events>>;
fn num_events_since_version(&self, aggregate_id: &String, version: u64, num_events: u64) -> Option<Vec<Self::Events>>;
fn get(&self, event_id: &String) -> Option<Self::Events>;
fn contains_event(&self, event_id: &String) -> bool {
self.get(event_id).is_some()
}
fn contains_aggregate(&self, aggregate_id: &String) -> bool;
fn insert(&mut self, event: &Self::Events) -> Option<Self::Events>;
}