diff --git a/src/api.rs b/src/api.rs index 9e02341..4670388 100644 --- a/src/api.rs +++ b/src/api.rs @@ -1470,6 +1470,43 @@ pub fn update_process( }) } +#[wasm_bindgen] +pub fn request_data(process_id: String, state_ids: Vec, managers: Vec) -> ApiResult { + let outpoint = OutPoint::from_str(&process_id)?; + let send_to: Vec = managers.iter().flat_map(|m| { + let member: Member = serde_json::from_str(m).unwrap(); + member.get_addresses() + }) + .collect(); + let sender = lock_local_device()?.to_member(); + + let prd_request = Prd::new_request( + outpoint, + sender, + state_ids.iter().map(|s| Vec::from_hex(s).unwrap().try_into().unwrap()).collect()); + + let local_device = lock_local_device()?; + let sp_wallet = local_device.get_wallet(); + let prd_msg = prd_request.to_network_msg(sp_wallet)?; + + // For now, we just send the request to all admins, but this could be refined + let shared_secrets = lock_shared_secrets()?; + let mut ciphers = vec![]; + for address in send_to { + if let Some(secret) = shared_secrets.get_secret_for_address(address.try_into()?) { + let cipher = encrypt_with_key(secret.as_byte_array(), prd_msg.as_bytes())?; + ciphers.push(cipher.to_lower_hex_string()); + } else { + debug!("No shared secret"); + } + } + + Ok(ApiReturn { + ciphers_to_send: ciphers, + ..Default::default() + }) +} + #[wasm_bindgen] pub fn create_update_message( process_id: String,