use super::helpers::TrustTaskOutcome;
use serde_json::Value;
use trust_tasks_rs::TrustTask;
use vta_sdk::protocols::context_management::create::CreateContextBody;
use vta_sdk::protocols::context_management::delete::{DeleteContextBody, DeleteContextPreviewBody};
use vta_sdk::protocols::context_management::get::GetContextBody;
use vta_sdk::protocols::context_management::list::ListContextsBody;
use vta_sdk::protocols::context_management::update::UpdateContextBody;
use vta_sdk::protocols::context_management::update_did::UpdateContextDidBody;
use crate::auth::AuthClaims;
use crate::operations;
use crate::server::AppState;
use super::helpers::{TRANSPORT_TRUST_TASK, app_error_to_reject, parse_payload, success_response};
pub(super) async fn handle_list(
state: &AppState,
auth: &AuthClaims,
doc: TrustTask<Value>,
) -> TrustTaskOutcome {
let _req: ListContextsBody = match parse_payload(&doc) {
Ok(r) => r,
Err(resp) => return resp,
};
match operations::contexts::list_contexts(&state.contexts_ks, auth, TRANSPORT_TRUST_TASK).await
{
Ok(body) => success_response(&doc, body),
Err(e) => app_error_to_reject(&doc, e),
}
}
pub(super) async fn handle_create(
state: &AppState,
auth: &AuthClaims,
doc: TrustTask<Value>,
) -> TrustTaskOutcome {
if let Err(e) = auth.require_admin() {
return app_error_to_reject(&doc, e);
}
let req: CreateContextBody = match parse_payload(&doc) {
Ok(r) => r,
Err(resp) => return resp,
};
let audit_id = req.id.clone();
match operations::contexts::create_context(
&state.contexts_ks,
auth,
&req.id,
req.name,
req.description,
req.parent,
TRANSPORT_TRUST_TASK,
)
.await
{
Ok(body) => {
if let Err(e) = crate::audit::record_with_detail(
&state.audit_sink,
"contexts.create",
&auth.did,
Some(&audit_id),
"success",
Some(TRANSPORT_TRUST_TASK),
Some(&audit_id),
None,
)
.await
{
tracing::warn!(error = %e, "audit record failed for contexts.create");
}
success_response(&doc, body)
}
Err(e) => app_error_to_reject(&doc, e),
}
}
pub(super) async fn handle_get(
state: &AppState,
auth: &AuthClaims,
doc: TrustTask<Value>,
) -> TrustTaskOutcome {
let req: GetContextBody = match parse_payload(&doc) {
Ok(r) => r,
Err(resp) => return resp,
};
match operations::contexts::get_context_op(
&state.contexts_ks,
auth,
&req.id,
TRANSPORT_TRUST_TASK,
)
.await
{
Ok(body) => success_response(&doc, body),
Err(e) => app_error_to_reject(&doc, e),
}
}
pub(super) async fn handle_secrets(
state: &AppState,
auth: &AuthClaims,
doc: TrustTask<Value>,
) -> TrustTaskOutcome {
let req: vta_sdk::protocols::context_management::secrets::GetContextSecretsBody =
match parse_payload(&doc) {
Ok(r) => r,
Err(resp) => return resp,
};
let deps = operations::export::ExportDeps {
keys_ks: &state.keys_ks,
contexts_ks: &state.contexts_ks,
imported_ks: &state.imported_ks,
audit: &state.audit_sink,
acl_ks: &state.acl_ks,
#[cfg(feature = "webvh")]
webvh_ks: &state.webvh_ks,
seed_store: &state.seed_store,
};
match operations::export::get_context_secrets(&deps, auth, &req.id, TRANSPORT_TRUST_TASK).await
{
Ok(bundle) => success_response(
&doc,
vta_sdk::protocols::context_management::secrets::ContextSecretsResultBody::from(bundle),
),
Err(e) => app_error_to_reject(&doc, e),
}
}
pub(super) async fn handle_update(
state: &AppState,
auth: &AuthClaims,
doc: TrustTask<Value>,
) -> TrustTaskOutcome {
if let Err(e) = auth.require_super_admin() {
return app_error_to_reject(&doc, e);
}
let req: UpdateContextBody = match parse_payload(&doc) {
Ok(r) => r,
Err(resp) => return resp,
};
match operations::contexts::update_context(
&state.contexts_ks,
auth,
&req.id,
operations::contexts::UpdateContextParams {
name: req.name,
did: req.did,
description: req.description,
context_policy: req.context_policy,
},
TRANSPORT_TRUST_TASK,
)
.await
{
Ok(body) => success_response(&doc, body),
Err(e) => app_error_to_reject(&doc, e),
}
}
pub(super) async fn handle_update_did(
state: &AppState,
auth: &AuthClaims,
doc: TrustTask<Value>,
) -> TrustTaskOutcome {
if let Err(e) = auth.require_admin() {
return app_error_to_reject(&doc, e);
}
let req: UpdateContextDidBody = match parse_payload(&doc) {
Ok(r) => r,
Err(resp) => return resp,
};
match operations::contexts::update_context_did(
&state.contexts_ks,
auth,
&req.id,
req.did,
TRANSPORT_TRUST_TASK,
)
.await
{
Ok(body) => success_response(&doc, body),
Err(e) => app_error_to_reject(&doc, e),
}
}
pub(super) async fn handle_preview_delete(
state: &AppState,
auth: &AuthClaims,
doc: TrustTask<Value>,
) -> TrustTaskOutcome {
if let Err(e) = auth.require_admin() {
return app_error_to_reject(&doc, e);
}
let req: DeleteContextPreviewBody = match parse_payload(&doc) {
Ok(r) => r,
Err(resp) => return resp,
};
match operations::contexts::preview_delete_context(
&state.contexts_ks,
&state.keys_ks,
&state.acl_ks,
&state.did_templates_ks,
#[cfg(feature = "webvh")]
&state.webvh_ks,
auth,
&req.id,
TRANSPORT_TRUST_TASK,
)
.await
{
Ok(body) => success_response(&doc, body),
Err(e) => app_error_to_reject(&doc, e),
}
}
pub(super) async fn handle_delete(
state: &AppState,
auth: &AuthClaims,
doc: TrustTask<Value>,
) -> TrustTaskOutcome {
if let Err(e) = auth.require_admin() {
return app_error_to_reject(&doc, e);
}
let req: DeleteContextBody = match parse_payload(&doc) {
Ok(r) => r,
Err(resp) => return resp,
};
let ks = operations::keyspaces_from_app_state(state);
match operations::contexts::delete_context(&ks, auth, &req.id, req.force, TRANSPORT_TRUST_TASK)
.await
{
Ok(body) => success_response(&doc, body),
Err(e) => app_error_to_reject(&doc, e),
}
}