use crate::{PersistenceError, QueryContext, SnapshotStoreAggregateContext};
use async_trait::async_trait;
use cqrs_es::{Aggregate, EventEnvelope, View};
#[async_trait]
pub trait PersistedEventRepository<A>: Send + Sync
where
A: Aggregate,
{
async fn get_events(
&self,
aggregate_id: &str,
) -> Result<Vec<EventEnvelope<A>>, PersistenceError>;
async fn get_last_events(
&self,
aggregate_id: &str,
number_events: usize,
) -> Result<Vec<EventEnvelope<A>>, PersistenceError>;
async fn get_snapshot(
&self,
aggregate_id: &str,
) -> Result<Option<SnapshotStoreAggregateContext<A>>, PersistenceError>;
async fn persist(
&self,
events: &[EventEnvelope<A>],
snapshot_update: Option<(String, A, usize)>,
) -> Result<(), PersistenceError>;
}
#[async_trait]
pub trait ViewRepository<V, A>: Send + Sync
where
V: View<A>,
A: Aggregate,
{
async fn load(
&self,
query_instance_id: &str,
) -> Result<Option<(V, QueryContext)>, PersistenceError>;
async fn update_view(&self, view: V, context: QueryContext) -> Result<(), PersistenceError>;
}