rustauth-plugins 0.3.0

Official RustAuth plugin modules.
Documentation
use rustauth_core::api::ApiRequest;
use rustauth_core::context::request_state::current_new_session;
use rustauth_core::context::AuthContext;
use rustauth_core::db::DbValue;
use rustauth_core::error::RustAuthError;
use rustauth_core::user::UpdateUserInput;

use super::config::{LastLoginMethodOptions, DEFAULT_DATABASE_FIELD_NAME};
use super::resolve::LoginMethodContext;

pub async fn persist_last_login_method(
    context: &AuthContext,
    request: &ApiRequest,
    options: &LastLoginMethodOptions,
) -> Result<(), RustAuthError> {
    if !options.store_in_database {
        return Ok(());
    }
    if context.adapter().is_none() {
        return Ok(());
    }
    let Some(new_session) = current_new_session().ok().flatten() else {
        return Ok(());
    };
    let login_context = LoginMethodContext::from_request(context, request);
    let Some(method) = options.resolve_login_method(&login_context) else {
        return Ok(());
    };

    let mut additional_fields = rustauth_core::db::DbRecord::new();
    additional_fields.insert(
        DEFAULT_DATABASE_FIELD_NAME.to_owned(),
        DbValue::String(method),
    );
    context
        .users()?
        .update_user(
            &new_session.user.id,
            UpdateUserInput::new().additional_fields(additional_fields),
        )
        .await?;
    Ok(())
}