use actix_web::{web, HttpResponse, Responder};
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize)]
pub struct ChildApprovalDecision {
pub request_id: String,
pub approved: bool,
}
#[derive(Debug, Serialize)]
struct ChildApprovalResponse {
delivered: bool,
}
pub async fn handler(
path: web::Path<String>,
body: web::Json<ChildApprovalDecision>,
) -> impl Responder {
let child_session_id = path.into_inner();
let ChildApprovalDecision {
request_id,
approved,
} = body.into_inner();
let delivered = bamboo_engine::external_agents::live::deliver_approval(
&child_session_id,
&request_id,
approved,
);
if delivered {
tracing::info!(
"[{}] child approval delivered (request_id={}, approved={})",
child_session_id,
request_id,
approved
);
HttpResponse::Ok().json(ChildApprovalResponse { delivered: true })
} else {
tracing::warn!(
"[{}] child approval not delivered (request_id={}): child not live",
child_session_id,
request_id
);
HttpResponse::NotFound().json(ChildApprovalResponse { delivered: false })
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn decision_body_deserializes() {
let v: ChildApprovalDecision =
serde_json::from_str(r#"{"request_id":"r1","approved":true}"#).unwrap();
assert_eq!(v.request_id, "r1");
assert!(v.approved);
}
}