use serde_json::Value;
use trust_tasks_rs::TrustTask;
use vti_common::acl::Capability;
use crate::audit;
use crate::auth::AuthClaims;
use crate::operations::room_oracle;
use crate::server::AppState;
use super::helpers::{
TRANSPORT_TRUST_TASK, TrustTaskOutcome, app_error_to_reject, parse_payload, success_response,
};
async fn require_cap(
state: &AppState,
auth: &AuthClaims,
doc: &TrustTask<Value>,
cap: Capability,
) -> Result<(), TrustTaskOutcome> {
super::helpers::require_capability(state, auth, doc, cap, "minting a room presentation").await
}
pub(super) async fn handle_present(
state: &AppState,
auth: &AuthClaims,
doc: TrustTask<Value>,
) -> TrustTaskOutcome {
if let Err(r) = require_cap(state, auth, &doc, Capability::RoomPresent).await {
return r;
}
let req: trust_tasks_rs::specs::rooms::keys::present::v0_2::Payload = match parse_payload(&doc)
{
Ok(r) => r,
Err(resp) => return resp,
};
let action = serde_json::to_value(req.action)
.ok()
.and_then(|v| v.as_str().map(str::to_string))
.unwrap_or_default();
let minted = match room_oracle::present(state, auth, &auth.did, &req.room_id, &action).await {
Ok(m) => m,
Err(e) => return app_error_to_reject(&doc, e),
};
if let Err(e) = audit::record(
&state.audit_sink,
"rooms.keys.present",
&auth.did,
Some(&req.room_id),
"success",
Some(TRANSPORT_TRUST_TASK),
None,
)
.await
{
tracing::error!(error = %e, "failed to record a room-oracle audit entry");
}
success_response(&doc, minted)
}