pub struct PostgresStore { /* private fields */ }Expand description
Postgres-backed AuditStore.
Implementations§
Source§impl PostgresStore
impl PostgresStore
Sourcepub async fn connect(
config: &PostgresConfig,
audit_key: Arc<AuditKey>,
) -> Result<Self, TransactionStoreError>
pub async fn connect( config: &PostgresConfig, audit_key: Arc<AuditKey>, ) -> Result<Self, TransactionStoreError>
Connect to the configured Postgres database, run the migration, and bind an audit key for chain computation.
Sourcepub async fn verify_all_with_pubkey(
config: &PostgresConfig,
verifying_key_hex: &str,
) -> Result<AuditVerification, TransactionStoreError>
pub async fn verify_all_with_pubkey( config: &PostgresConfig, verifying_key_hex: &str, ) -> Result<AuditVerification, TransactionStoreError>
Verify an existing Postgres chain — transaction chain, approval-event chain, and the binding between them — with only the exported public key. This path performs no migrations and never loads the signing key.
Sourcepub async fn read_chain_rows(
config: &PostgresConfig,
) -> Result<Vec<ChainRow>, TransactionStoreError>
pub async fn read_chain_rows( config: &PostgresConfig, ) -> Result<Vec<ChainRow>, TransactionStoreError>
Read the transaction chain without a signing key or schema mutation.
Used by sysknife audit export, which must never acquire signing
capability merely to serialize rows that already exist.
Sourcepub async fn verify_all(
&self,
key: &AuditKey,
) -> Result<AuditVerification, TransactionStoreError>
pub async fn verify_all( &self, key: &AuditKey, ) -> Result<AuditVerification, TransactionStoreError>
All three checks with the daemon’s key.
Trait Implementations§
Source§impl AuditStore for PostgresStore
impl AuditStore for PostgresStore
fn record<'life0, 'async_trait>(
&'life0 self,
transaction: NewTransaction,
) -> Pin<Box<dyn Future<Output = Result<TransactionRecord, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn record_previewed<'life0, 'async_trait>(
&'life0 self,
transaction: NewTransaction,
preview: PreviewEnvelope,
) -> Pin<Box<dyn Future<Output = Result<RecordedPreviewedTransaction, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn get<'life0, 'life1, 'async_trait>(
&'life0 self,
transaction_id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<TransactionRecord>, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get_preview<'life0, 'life1, 'async_trait>(
&'life0 self,
transaction_id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<PreviewEnvelope>, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn update_status<'life0, 'life1, 'async_trait>(
&'life0 self,
transaction_id: &'life1 str,
new_status: JobState,
) -> Pin<Box<dyn Future<Output = Result<(), TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn approve_transaction<'life0, 'life1, 'async_trait>(
&'life0 self,
transaction_id: &'life1 str,
approver: CallerPrincipal,
) -> Pin<Box<dyn Future<Output = Result<Option<String>, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn revoke_unconsumed_approval<'life0, 'life1, 'async_trait>(
&'life0 self,
transaction_id: &'life1 str,
revoker: CallerPrincipal,
) -> Pin<Box<dyn Future<Output = Result<bool, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn claim_approved_for_execution<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
transaction_id: &'life1 str,
receipt_digest: &'life2 str,
executor: CallerPrincipal,
) -> Pin<Box<dyn Future<Output = Result<bool, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn cleanup_stale_queued<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<u64, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn cancel_queued<'life0, 'life1, 'async_trait>(
&'life0 self,
transaction_id: &'life1 str,
canceller: CallerPrincipal,
) -> Pin<Box<dyn Future<Output = Result<bool, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn cancel_queued<'life0, 'life1, 'async_trait>(
&'life0 self,
transaction_id: &'life1 str,
canceller: CallerPrincipal,
) -> Pin<Box<dyn Future<Output = Result<bool, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Cancel one still-
Queued transaction (Queued → Canceled). Returns
true iff a queued row was transitioned; a Running (in-flight) or
terminal transaction is never cancelled. See
crate::transactions::TransactionStore::cancel_queued.fn list_transactions<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
limit: u32,
status_filter: Option<&'life1 str>,
action_filter: Option<&'life2 str>,
since_hours: Option<u32>,
) -> Pin<Box<dyn Future<Output = Result<Vec<TransactionRecord>, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Source§fn list_history<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
limit: u32,
status_filter: Option<&'life1 str>,
action_filter: Option<&'life2 str>,
since_hours: Option<u32>,
) -> Pin<Box<dyn Future<Output = Result<Vec<JobHistoryEntry>, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn list_history<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
limit: u32,
status_filter: Option<&'life1 str>,
action_filter: Option<&'life2 str>,
since_hours: Option<u32>,
) -> Pin<Box<dyn Future<Output = Result<Vec<JobHistoryEntry>, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Structured history rows (with
created_at and typed risk_level) for
programmatic clients. See crate::transactions::JobHistoryEntry.fn fetch_chain_row<'life0, 'life1, 'async_trait>(
&'life0 self,
transaction_id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<ChainRow>, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn fetch_event_rows<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Vec<EventRow>, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn fetch_event_rows<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Vec<EventRow>, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Every approval event, in seq order. Backs the second chain that records
grant/consume/revoke — see
audit_chain::AuditEventKind.fn fetch_chain_rows<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Vec<ChainRow>, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn verify_audit_chain<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 AuditKey,
) -> Pin<Box<dyn Future<Output = Result<VerifyOutcome, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn reconcile_interrupted_running<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<u64, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn reconcile_interrupted_running<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<u64, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Reconcile transactions orphaned by a daemon crash or restart. Read more
Source§fn verify_event_chain<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 AuditKey,
) -> Pin<Box<dyn Future<Output = Result<VerifyOutcome, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn verify_event_chain<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 AuditKey,
) -> Pin<Box<dyn Future<Output = Result<VerifyOutcome, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Walk the approval-event chain. Read more
Source§fn verify_event_binding<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<BindingOutcome, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn verify_event_binding<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<BindingOutcome, TransactionStoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Check that every event tip committed by a transaction row still exists
in the event chain. See
audit_chain::verify_event_binding.Source§impl Clone for PostgresStore
impl Clone for PostgresStore
Auto Trait Implementations§
impl !RefUnwindSafe for PostgresStore
impl !UnwindSafe for PostgresStore
impl Freeze for PostgresStore
impl Send for PostgresStore
impl Sync for PostgresStore
impl Unpin for PostgresStore
impl UnsafeUnpin for PostgresStore
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more