use serde_json::Value;
use trust_tasks_rs::specs::auth::passkey::{
enroll::finish::v0_2 as enroll_finish, enroll::start::v0_2 as enroll_start, list::v0_1 as list,
revoke::finish::v0_1 as revoke_finish, revoke::start::v0_1 as revoke_start,
};
use trust_tasks_rs::{Payload, TrustTask};
use super::helpers::{TrustTaskOutcome, success_response, task_error_to_reject};
use super::{JoinAuthCtx, admin_signer, parse_spec_payload};
use crate::routes::admin::passkeys;
use crate::server::AppState;
pub(crate) const LIST_TYPE: &str = <list::Payload as Payload>::TYPE_URI;
pub(crate) const ENROLL_START_TYPE: &str = <enroll_start::Payload as Payload>::TYPE_URI;
pub(crate) const ENROLL_FINISH_TYPE: &str = <enroll_finish::Payload as Payload>::TYPE_URI;
pub(crate) const REVOKE_START_TYPE: &str = <revoke_start::Payload as Payload>::TYPE_URI;
pub(crate) const REVOKE_FINISH_TYPE: &str = <revoke_finish::Payload as Payload>::TYPE_URI;
pub(crate) const URIS: &[&str] = &[
LIST_TYPE,
ENROLL_START_TYPE,
ENROLL_FINISH_TYPE,
REVOKE_START_TYPE,
REVOKE_FINISH_TYPE,
];
pub(super) async fn dispatch(
state: &AppState,
ctx: &JoinAuthCtx,
doc: TrustTask<Value>,
type_uri: &str,
) -> Option<TrustTaskOutcome> {
let actor = match admin_signer(state, ctx, &doc).await {
Ok(a) => a,
Err(reject) => return Some(reject),
};
let did = actor.did.as_str();
Some(match type_uri {
LIST_TYPE => match parse_spec_payload::<list::Payload>(&doc) {
Err(reject) => reject,
Ok(_) => answer(&doc, passkeys::list(state, did).await),
},
ENROLL_START_TYPE => match parse_spec_payload::<enroll_start::Payload>(&doc) {
Err(reject) => reject,
Ok(p) => answer(&doc, passkeys::register_start(state, did, &p).await),
},
ENROLL_FINISH_TYPE => match parse_spec_payload::<enroll_finish::Payload>(&doc) {
Err(reject) => reject,
Ok(p) => answer(&doc, passkeys::register_finish(state, did, &p).await),
},
REVOKE_START_TYPE => match parse_spec_payload::<revoke_start::Payload>(&doc) {
Err(reject) => reject,
Ok(p) => answer(&doc, passkeys::revoke_start(state, did, &p).await),
},
REVOKE_FINISH_TYPE => match parse_spec_payload::<revoke_finish::Payload>(&doc) {
Err(reject) => reject,
Ok(p) => answer(&doc, passkeys::revoke_finish(state, did, &p).await),
},
_ => return None,
})
}
fn answer<R: serde::Serialize>(
doc: &TrustTask<Value>,
result: Result<R, crate::error::TaskError>,
) -> TrustTaskOutcome {
match result {
Ok(response) => success_response(doc, response),
Err(e) => task_error_to_reject(doc, &e),
}
}