use crate::{ actions::get_action, error::AppError, handlers::actions::{ConfirmActionRequest, ConfirmActionResponse}, }; #[derive(Clone, Default)] pub struct ActionConfirmationService; impl ActionConfirmationService { pub fn new() -> Self { Self } pub async fn confirm_action( &self, request: ConfirmActionRequest, confirmed_by_user_id: &str, ) -> Result { if !request.confirmed { tracing::info!( user_id = %confirmed_by_user_id, action = %request.action, conversation_id = %request.conversation_id, "action confirmation cancelled by user" ); return Ok(ConfirmActionResponse { success: false, delegated: false, message: "Action cancelled by user.".to_string(), action: request.action.clone(), backend_handler: None, record_id: None, fields: None, ui_events: None, }); } let action = get_action(&request.action); let backend_handler = action .as_ref() .map(|item| item.backend_handler.clone()) .unwrap_or_else(|| request.action.clone()); tracing::info!( user_id = %confirmed_by_user_id, action = %request.action, backend_handler = %backend_handler, conversation_id = %request.conversation_id, "action confirmed by user" ); Ok(ConfirmActionResponse { success: true, delegated: true, message: format!( "Action approved. Execute '{}' in the product backend.", backend_handler ), action: request.action.clone(), backend_handler: Some(backend_handler), record_id: None, fields: Some(request.fields), ui_events: None, }) } }