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))
}