[experimental] Add members_from_same_role and sync_process_from_relay
This commit is contained in:
parent
8759efb582
commit
908155c939
93
src/api.rs
93
src/api.rs
@ -1896,3 +1896,96 @@ pub fn roles_contains_member(roles: String, member_str: Vec<String>) -> ApiResul
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
pub fn members_in_same_roles_me(roles: String) -> ApiResult<Vec<String>> {
|
||||
let roles: Value = serde_json::from_str(&roles)?;
|
||||
|
||||
let json = json!({
|
||||
"roles": roles
|
||||
});
|
||||
|
||||
let roles = json.extract_roles()?;
|
||||
|
||||
let device = lock_local_device()?;
|
||||
|
||||
let us = device.to_member();
|
||||
|
||||
let mut res: Vec<String> = vec![];
|
||||
|
||||
for (_, role) in roles {
|
||||
if role.members.contains(&us) {
|
||||
let to_add: Vec<String> = role.members
|
||||
.iter()
|
||||
.filter_map(|m| {
|
||||
if *m != us {
|
||||
Some(serde_json::to_string(m).unwrap())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}).collect();
|
||||
res.extend(to_add);
|
||||
}
|
||||
}
|
||||
|
||||
Ok(res)
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
pub fn sync_process_from_relay(process_id: String, process_str: String) -> ApiResult<ApiReturn> {
|
||||
let outpoint = OutPoint::from_str(&process_id)?;
|
||||
|
||||
let process: Process = serde_json::from_str(&process_str)?;
|
||||
|
||||
// Are we part of this process?
|
||||
let last_state = process.get_latest_commited_state().ok_or(ApiError::new("Process doesn't have a commited state".to_owned()))?;
|
||||
|
||||
let roles = last_state.encrypted_pcd.extract_roles()?;
|
||||
|
||||
let us = lock_local_device()?.to_member();
|
||||
|
||||
let mut contains_us = false;
|
||||
for (_, role) in &roles {
|
||||
if role.members.contains(&us) {
|
||||
contains_us = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
let mut processes = lock_processes()?;
|
||||
if !contains_us {
|
||||
// If we're not part of this process, we just keep the minimum of public informations
|
||||
processes.insert(outpoint, process.clone());
|
||||
|
||||
let updated_process = Some(UpdatedProcess {
|
||||
process_id: outpoint,
|
||||
current_process: process,
|
||||
up_to_date_roles: roles,
|
||||
..Default::default()
|
||||
});
|
||||
|
||||
let api_return = ApiReturn {
|
||||
updated_process,
|
||||
..Default::default()
|
||||
};
|
||||
Ok(api_return)
|
||||
} else {
|
||||
// If we're part of this process, we want to complete what we are missing
|
||||
let api_return: ApiReturn = if let Some(in_memory_process) = processes.get(&outpoint) {
|
||||
debug!("We already know about this process");
|
||||
// We already know about this process
|
||||
// For each state, do we have the keys? the encrypted values?
|
||||
for state in in_memory_process.get_all_states_iter() {
|
||||
debug!("parsing state {:?}", state);
|
||||
}
|
||||
ApiReturn::default()
|
||||
} else {
|
||||
debug!("We don't know about this process");
|
||||
// We didn't know about this process
|
||||
// We simply request all the attributes from each state
|
||||
ApiReturn::default()
|
||||
};
|
||||
|
||||
Ok(api_return)
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user