#![deny(missing_docs)]
#[cfg(feature = "keycloak")]
mod keycloak;
mod store;
mod worker;
use std::{future::Future, pin::Pin};
#[cfg(feature = "keycloak")]
pub use keycloak::{KeycloakAccountDeleter, KeycloakDeletionConfig};
pub use store::{
ErasureError, ErasureOutcome, ErasureService, ErasureState, PostgresErasureStore,
ProductErasure, reject_fenced_subject,
};
pub use worker::IdentityDeletionHandler;
pub const POSTGRES_MIGRATION_SQL: &str = include_str!("../migrations/0001_erasure.sql");
pub const IDENTITY_DELETE_JOB_TYPE: &str = "identity.account.delete";
pub type ErasureFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;
#[derive(Clone, Copy, Debug, PartialEq, Eq, thiserror::Error)]
pub enum IdentityDeletionError {
#[error("identity deletion temporarily unavailable")]
Retryable,
#[error("identity deletion rejected permanently")]
Permanent,
}
pub trait IdentityAccountDeleter: Send + Sync + 'static {
fn delete_account<'a>(
&'a self,
subject: &'a str,
) -> ErasureFuture<'a, Result<(), IdentityDeletionError>>;
}