diff --git a/src/db/kv/index/json.rs b/src/db/kv/index/json.rs index cff370cb..597d1e99 100644 --- a/src/db/kv/index/json.rs +++ b/src/db/kv/index/json.rs @@ -358,22 +358,24 @@ pub async fn get_multiple( let results: Vec> = if indexed_values.is_empty() { (0..keys.len()).map(|_| None).collect() } else { - deserialize_values(indexed_values) + deserialize_values(indexed_values)? }; Ok(results) } // Helper function to deserialize JSON strings to Vec> -fn deserialize_values(values: Vec>) -> Vec> { +fn deserialize_values( + values: Vec>, +) -> Result>, DynError> { values .into_iter() - .map(|opt| { - opt.and_then(|value_str| { - serde_json::from_str::>(&value_str) - .ok() - .and_then(|vec| vec.into_iter().next()) - }) + .map(|value_str| match value_str { + Some(value) => { + let value: Vec = serde_json::from_str(&value)?; + Ok(value.into_iter().next()) + } + None => Ok(None), }) .collect() } diff --git a/src/models/user/details.rs b/src/models/user/details.rs index 2d806ac3..540afff1 100644 --- a/src/models/user/details.rs +++ b/src/models/user/details.rs @@ -71,7 +71,10 @@ where .map_err(serde::de::Error::custom)?; Ok(Some(urls)) } - _ => Err(serde::de::Error::custom("Expected a string or an array")), + serde_json::Value::Null => Ok(None), + _ => Err(serde::de::Error::custom( + "Expected either a string, an array or null", + )), } } diff --git a/src/models/user/search.rs b/src/models/user/search.rs index b1bba7e3..5030da23 100644 --- a/src/models/user/search.rs +++ b/src/models/user/search.rs @@ -103,7 +103,11 @@ impl UserSearch { return Ok(()); } let mut records_to_delete: Vec = Vec::with_capacity(user_ids.len()); - let users = UserDetails::get_by_ids(user_ids) + let keys = user_ids + .iter() + .map(|&id| vec![id]) + .collect::>>(); + let users = UserDetails::get_from_index(keys.iter().map(|item| item.as_slice()).collect()) .await? .into_iter() .flatten() @@ -171,7 +175,7 @@ mod tests { .put_index_json(vec![user_id].as_slice(), None) .await?; - // Call `put_to_index` with the same `UserDetails` object multiple times + // Call `put_to_index` with the same `UserDetails` object UserSearch::put_to_index(&[&user_details]).await?; // Check that the index contains only one record for the user