junobuild-auth 0.4.2

Authentication toolkit for Juno.
Documentation
use crate::automation::types::{
    AutomationController, PrepareAutomationError, PrepareAutomationResult, PreparedAutomation,
};
use crate::automation::utils::duration::build_expiration;
use crate::automation::utils::scope::build_scope;
use crate::openid::types::provider::OpenIdAutomationProvider;
use crate::strategies::{AuthAutomationStrategy, AuthHeapStrategy};
use junobuild_shared::ic::api::caller;
use junobuild_shared::segments::access_keys::{
    assert_controllers, assert_max_number_of_access_keys,
};
use junobuild_shared::types::state::AccessKeyId;

pub fn openid_prepare_automation(
    provider: &OpenIdAutomationProvider,
    auth_heap: &impl AuthHeapStrategy,
    auth_automation: &impl AuthAutomationStrategy,
) -> PrepareAutomationResult {
    let controller_id = caller();

    let existing_controllers = auth_automation.get_controllers();

    if existing_controllers.contains_key(&controller_id) {
        return Err(PrepareAutomationError::ControllerAlreadyExists);
    }

    let submitted_controllers: [AccessKeyId; 1] = [controller_id];

    assert_controllers(&submitted_controllers)
        .map_err(PrepareAutomationError::InvalidController)?;

    let scope = build_scope(provider, auth_heap);

    assert_max_number_of_access_keys(
        &existing_controllers,
        &submitted_controllers,
        &scope.clone().into(),
        None,
    )
    .map_err(PrepareAutomationError::TooManyControllers)?;

    let expires_at = build_expiration(provider, auth_heap);

    let controller: AutomationController = AutomationController { expires_at, scope };

    Ok(PreparedAutomation(controller_id, controller))
}