use crate::entities::{CouncilJournalEvent, CouncilJournalRecord};
use crate::error::DomainError;
use crate::value_objects::{
AuthorizationEvidence, CouncilJournalConsumer, CouncilJournalLease, CouncilJournalPageLimit,
CouncilJournalPosition, DurationMs,
};
use async_trait::async_trait;
use time::OffsetDateTime;
#[async_trait]
pub trait CouncilJournalPort: Send + Sync {
async fn publish(
&self,
event: CouncilJournalEvent,
) -> Result<CouncilJournalRecord, DomainError>;
async fn publish_authorized(
&self,
event: CouncilJournalEvent,
authorization: Option<AuthorizationEvidence>,
) -> Result<CouncilJournalRecord, DomainError> {
if authorization.is_some() {
return Err(DomainError::InvariantViolated {
reason: "council journal adapter cannot persist authorization evidence",
});
}
self.publish(event).await
}
async fn read(
&self,
after: Option<CouncilJournalPosition>,
limit: CouncilJournalPageLimit,
) -> Result<Vec<CouncilJournalRecord>, DomainError>;
async fn position(
&self,
consumer: &CouncilJournalConsumer,
) -> Result<Option<CouncilJournalPosition>, DomainError>;
async fn lease(
&self,
consumer: &CouncilJournalConsumer,
now: OffsetDateTime,
duration: DurationMs,
) -> Result<Option<CouncilJournalLease>, DomainError>;
async fn acknowledge(
&self,
lease: &CouncilJournalLease,
through: CouncilJournalPosition,
now: OffsetDateTime,
) -> Result<(), DomainError>;
async fn release(
&self,
lease: &CouncilJournalLease,
now: OffsetDateTime,
) -> Result<(), DomainError>;
}