use chrono::{DateTime, Utc};
#[cfg(any(feature = "postgres", feature = "sqlite", feature = "mysql"))]
use keepsake::{RelationDefinition, RelationId, RelationSpec};
#[cfg(all(
any(feature = "postgres", feature = "sqlite", feature = "mysql"),
feature = "fulfillment-counters"
))]
use uuid::Uuid;
#[cfg(all(
any(feature = "postgres", feature = "sqlite", feature = "mysql"),
feature = "fulfillment-counters"
))]
use super::FulfilledExpiryCandidate;
#[cfg(feature = "mysql")]
use super::MySqlBackend;
#[cfg(feature = "postgres")]
use super::PostgresBackend;
#[cfg(feature = "sqlite")]
use super::SqliteBackend;
use super::{KeepsakeSqlxBackend, NoopRelationCache, SqlxKeepsakeRepository};
#[derive(Debug, Clone, Copy)]
pub struct TimedSqlxKeepsakeRepository<'repo, B, C = NoopRelationCache>
where
B: KeepsakeSqlxBackend,
{
pub(super) repository: &'repo SqlxKeepsakeRepository<B, C>,
pub(super) at: DateTime<Utc>,
}
#[cfg(feature = "postgres")]
pub type TimedKeepsakeRepository<'repo, C = NoopRelationCache> =
TimedSqlxKeepsakeRepository<'repo, PostgresBackend, C>;
#[cfg(feature = "sqlite")]
pub type TimedSqliteKeepsakeRepository<'repo, C = NoopRelationCache> =
TimedSqlxKeepsakeRepository<'repo, SqliteBackend, C>;
#[cfg(feature = "mysql")]
pub type TimedMySqlKeepsakeRepository<'repo, C = NoopRelationCache> =
TimedSqlxKeepsakeRepository<'repo, MySqlBackend, C>;
impl<'repo, B, C> TimedSqlxKeepsakeRepository<'repo, B, C>
where
B: KeepsakeSqlxBackend,
{
#[must_use]
pub const fn repository(&self) -> &'repo SqlxKeepsakeRepository<B, C> {
self.repository
}
#[must_use]
pub const fn timestamp(&self) -> DateTime<Utc> {
self.at
}
}
#[cfg(feature = "postgres")]
impl<C> TimedKeepsakeRepository<'_, C>
where
C: super::RelationCache,
{
pub async fn upsert_relation(
&self,
relation: &RelationDefinition,
) -> super::RepositoryResult<RelationDefinition> {
self.repository.upsert_relation(relation, self.at).await
}
pub async fn upsert_relation_spec<Spec>(&self) -> super::RepositoryResult<RelationDefinition>
where
Spec: RelationSpec,
{
self.repository.upsert_relation_spec::<Spec>(self.at).await
}
pub async fn set_relation_enabled(
&self,
relation_id: RelationId,
enabled: bool,
) -> super::RepositoryResult<bool> {
self.repository
.set_relation_enabled(relation_id, enabled, self.at)
.await
}
pub async fn due_timed_expiry(
&self,
limit: i64,
) -> super::RepositoryResult<Vec<super::TimedExpiryCandidate>> {
self.repository.due_timed_expiry(self.at, limit).await
}
pub async fn expire_due_timed(&self, limit: i64) -> super::RepositoryResult<u64> {
self.repository.expire_due_timed(self.at, limit).await
}
#[cfg(feature = "fulfillment-counters")]
pub async fn fulfillment_snapshot(
&self,
keepsake_id: Uuid,
) -> super::RepositoryResult<keepsake::FulfillmentSnapshot> {
self.repository.fulfillment_snapshot(keepsake_id).await
}
#[cfg(feature = "fulfillment-counters")]
pub async fn due_fulfilled_expiry(
&self,
limit: i64,
) -> super::RepositoryResult<Vec<FulfilledExpiryCandidate>> {
self.repository.due_fulfilled_expiry(limit).await
}
#[cfg(feature = "fulfillment-counters")]
pub async fn expire_due_fulfilled(&self, limit: i64) -> super::RepositoryResult<u64> {
self.repository.expire_due_fulfilled(self.at, limit).await
}
#[cfg(feature = "fulfillment-counters")]
pub async fn upsert_counter_projection(
&self,
keepsake_id: Uuid,
key: &str,
value: i64,
) -> super::RepositoryResult<()> {
self.repository
.upsert_counter_projection(keepsake_id, key, value, self.at)
.await
}
#[cfg(feature = "fulfillment-counters")]
pub async fn increment_counter_projection(
&self,
keepsake_id: Uuid,
key: &str,
delta: i64,
) -> super::RepositoryResult<i64> {
self.repository
.increment_counter_projection(keepsake_id, key, delta, self.at)
.await
}
#[cfg(feature = "fulfillment-counters")]
pub async fn upsert_checklist_projection(
&self,
keepsake_id: Uuid,
item: &str,
complete: bool,
) -> super::RepositoryResult<()> {
self.repository
.upsert_checklist_projection(keepsake_id, item, complete, self.at)
.await
}
}
#[cfg(feature = "sqlite")]
impl<C> TimedSqliteKeepsakeRepository<'_, C>
where
C: super::RelationCache,
{
pub async fn upsert_relation(
&self,
relation: &RelationDefinition,
) -> super::RepositoryResult<RelationDefinition> {
self.repository.upsert_relation(relation, self.at).await
}
pub async fn upsert_relation_spec<Spec>(&self) -> super::RepositoryResult<RelationDefinition>
where
Spec: RelationSpec,
{
self.repository.upsert_relation_spec::<Spec>(self.at).await
}
pub async fn set_relation_enabled(
&self,
relation_id: RelationId,
enabled: bool,
) -> super::RepositoryResult<bool> {
self.repository
.set_relation_enabled(relation_id, enabled, self.at)
.await
}
pub async fn due_timed_expiry(
&self,
limit: i64,
) -> super::RepositoryResult<Vec<super::TimedExpiryCandidate>> {
self.repository.due_timed_expiry(self.at, limit).await
}
pub async fn expire_due_timed(&self, limit: i64) -> super::RepositoryResult<u64> {
self.repository.expire_due_timed(self.at, limit).await
}
#[cfg(feature = "fulfillment-counters")]
pub async fn fulfillment_snapshot(
&self,
keepsake_id: Uuid,
) -> super::RepositoryResult<keepsake::FulfillmentSnapshot> {
self.repository.fulfillment_snapshot(keepsake_id).await
}
#[cfg(feature = "fulfillment-counters")]
pub async fn due_fulfilled_expiry(
&self,
limit: i64,
) -> super::RepositoryResult<Vec<FulfilledExpiryCandidate>> {
self.repository.due_fulfilled_expiry(limit).await
}
#[cfg(feature = "fulfillment-counters")]
pub async fn expire_due_fulfilled(&self, limit: i64) -> super::RepositoryResult<u64> {
self.repository.expire_due_fulfilled(self.at, limit).await
}
#[cfg(feature = "fulfillment-counters")]
pub async fn upsert_counter_projection(
&self,
keepsake_id: Uuid,
key: &str,
value: i64,
) -> super::RepositoryResult<()> {
self.repository
.upsert_counter_projection(keepsake_id, key, value, self.at)
.await
}
#[cfg(feature = "fulfillment-counters")]
pub async fn increment_counter_projection(
&self,
keepsake_id: Uuid,
key: &str,
delta: i64,
) -> super::RepositoryResult<i64> {
self.repository
.increment_counter_projection(keepsake_id, key, delta, self.at)
.await
}
#[cfg(feature = "fulfillment-counters")]
pub async fn upsert_checklist_projection(
&self,
keepsake_id: Uuid,
item: &str,
complete: bool,
) -> super::RepositoryResult<()> {
self.repository
.upsert_checklist_projection(keepsake_id, item, complete, self.at)
.await
}
}
#[cfg(feature = "mysql")]
impl<C> TimedMySqlKeepsakeRepository<'_, C>
where
C: super::RelationCache,
{
pub async fn upsert_relation(
&self,
relation: &RelationDefinition,
) -> super::RepositoryResult<RelationDefinition> {
self.repository.upsert_relation(relation, self.at).await
}
pub async fn upsert_relation_spec<Spec>(&self) -> super::RepositoryResult<RelationDefinition>
where
Spec: RelationSpec,
{
self.repository.upsert_relation_spec::<Spec>(self.at).await
}
pub async fn set_relation_enabled(
&self,
relation_id: RelationId,
enabled: bool,
) -> super::RepositoryResult<bool> {
self.repository
.set_relation_enabled(relation_id, enabled, self.at)
.await
}
pub async fn due_timed_expiry(
&self,
limit: i64,
) -> super::RepositoryResult<Vec<super::TimedExpiryCandidate>> {
self.repository.due_timed_expiry(self.at, limit).await
}
pub async fn expire_due_timed(&self, limit: i64) -> super::RepositoryResult<u64> {
self.repository.expire_due_timed(self.at, limit).await
}
#[cfg(feature = "fulfillment-counters")]
pub async fn fulfillment_snapshot(
&self,
keepsake_id: Uuid,
) -> super::RepositoryResult<keepsake::FulfillmentSnapshot> {
self.repository.fulfillment_snapshot(keepsake_id).await
}
#[cfg(feature = "fulfillment-counters")]
pub async fn due_fulfilled_expiry(
&self,
limit: i64,
) -> super::RepositoryResult<Vec<FulfilledExpiryCandidate>> {
self.repository.due_fulfilled_expiry(limit).await
}
#[cfg(feature = "fulfillment-counters")]
pub async fn expire_due_fulfilled(&self, limit: i64) -> super::RepositoryResult<u64> {
self.repository.expire_due_fulfilled(self.at, limit).await
}
#[cfg(feature = "fulfillment-counters")]
pub async fn upsert_counter_projection(
&self,
keepsake_id: Uuid,
key: &str,
value: i64,
) -> super::RepositoryResult<()> {
self.repository
.upsert_counter_projection(keepsake_id, key, value, self.at)
.await
}
#[cfg(feature = "fulfillment-counters")]
pub async fn increment_counter_projection(
&self,
keepsake_id: Uuid,
key: &str,
delta: i64,
) -> super::RepositoryResult<i64> {
self.repository
.increment_counter_projection(keepsake_id, key, delta, self.at)
.await
}
#[cfg(feature = "fulfillment-counters")]
pub async fn upsert_checklist_projection(
&self,
keepsake_id: Uuid,
item: &str,
complete: bool,
) -> super::RepositoryResult<()> {
self.repository
.upsert_checklist_projection(keepsake_id, item, complete, self.at)
.await
}
}