use crate::AdapterRecord;
use crate::{AuthResult, AuthSchema, AuthStore, CreateUser};
use async_trait::async_trait;
#[derive(Clone, Default)]
pub struct UserCreationDefaults(pub(crate) Vec<UserCreateTransform>);
impl UserCreationDefaults {
pub fn apply(self, data: CreateUser) -> AuthResult<CreateUser> {
create_data(data, &self.0)
}
}
#[async_trait]
pub trait SessionCreatedHook<S: AuthSchema>: Send + Sync {
async fn after_create(
&self,
session: &S::Session,
database: &dyn AuthStore<S>,
) -> AuthResult<()>;
}
pub enum AdapterEvent<S: AuthSchema> {
UserCreated(AdapterRecord<S::User>),
UserUpdated(AdapterRecord<S::User>),
SessionCreated(AdapterRecord<S::Session>),
SessionUpdated(AdapterRecord<S::Session>),
AccountCreated(AdapterRecord<S::Account>),
AccountUpdated(AdapterRecord<S::Account>),
}
#[async_trait]
pub trait AdapterAfterHook<S: AuthSchema>: Send + Sync {
async fn after_write(
&self,
event: &AdapterEvent<S>,
database: &dyn AuthStore<S>,
) -> AuthResult<()>;
}
use std::sync::Arc;
pub(crate) type UserCreateTransform =
Arc<dyn Fn(CreateUser) -> AuthResult<CreateUser> + Send + Sync>;
pub(in crate::store) fn create_data(
mut data: CreateUser,
transforms: &[UserCreateTransform],
) -> AuthResult<CreateUser> {
for transform in transforms {
data = transform(data)?;
}
Ok(data)
}