ockam_api 0.93.0

Ockam's request-response API
use miette::IntoDiagnostic;
use std::collections::BTreeMap;

use ockam_core::api::Request;
use ockam_core::async_trait;
use ockam_core::compat::time::Duration;
use ockam_node::Context;

use crate::authenticator::direct::types::CreateToken;
use crate::authenticator::one_time_code::OneTimeCode;
use crate::nodes::service::default_address::DefaultAddress;
use crate::orchestrator::{AuthorityNodeClient, HasSecureClient};

#[async_trait]
pub trait TokenIssuer {
    async fn create_token(
        &self,
        ctx: &Context,
        attributes: BTreeMap<String, String>,
        duration: Option<Duration>,
        ttl_count: Option<u64>,
    ) -> miette::Result<OneTimeCode>;
}

#[async_trait]
impl TokenIssuer for AuthorityNodeClient {
    async fn create_token(
        &self,
        ctx: &Context,
        attributes: BTreeMap<String, String>,
        duration: Option<Duration>,
        ttl_count: Option<u64>,
    ) -> miette::Result<OneTimeCode> {
        let body = CreateToken::new()
            .with_attributes(attributes)
            .with_ttl(duration)
            .with_ttl_count(ttl_count);

        let req = Request::post("/").body(body);
        self.get_secure_client()
            .ask(ctx, DefaultAddress::ENROLLMENT_TOKEN_ISSUER, req)
            .await
            .into_diagnostic()?
            .success()
            .into_diagnostic()
    }
}