From b700a8ac6de0d3cab57f432d92f537b994da024a Mon Sep 17 00:00:00 2001 From: silverpill Date: Wed, 2 Nov 2022 13:07:18 +0000 Subject: [PATCH] Return verified results when searching for DID --- src/ethereum/subscriptions.rs | 4 +- src/mastodon_api/search/helpers.rs | 5 +-- src/models/profiles/queries.rs | 66 ++++++++++++++++-------------- src/models/users/queries.rs | 2 +- 4 files changed, 41 insertions(+), 36 deletions(-) diff --git a/src/ethereum/subscriptions.rs b/src/ethereum/subscriptions.rs index 048a0c1..af7ac5c 100644 --- a/src/ethereum/subscriptions.rs +++ b/src/ethereum/subscriptions.rs @@ -37,7 +37,7 @@ use crate::models::subscriptions::queries::{ }; use crate::models::users::queries::{ get_user_by_id, - get_user_by_wallet_address, + get_user_by_public_wallet_address, }; use crate::models::users::types::User; use crate::utils::caip2::ChainId; @@ -158,7 +158,7 @@ pub async fn check_ethereum_subscriptions( continue; }, }; - let recipient = get_user_by_wallet_address( + let recipient = get_user_by_public_wallet_address( db_client, ÐEREUM, &recipient_address, diff --git a/src/mastodon_api/search/helpers.rs b/src/mastodon_api/search/helpers.rs index dbb613f..0b289d7 100644 --- a/src/mastodon_api/search/helpers.rs +++ b/src/mastodon_api/search/helpers.rs @@ -19,7 +19,7 @@ use crate::models::posts::helpers::can_view_post; use crate::models::posts::types::Post; use crate::models::profiles::queries::{ search_profiles, - search_profiles_by_did, + search_profiles_by_did_only, search_profiles_by_wallet_address, }; use crate::models::profiles::types::DbActorProfile; @@ -195,10 +195,9 @@ pub async fn search( ).await?; }, SearchQuery::Did(did) => { - profiles = search_profiles_by_did( + profiles = search_profiles_by_did_only( db_client, &did, - false, ).await?; }, SearchQuery::Unknown => (), // ignore diff --git a/src/models/profiles/queries.rs b/src/models/profiles/queries.rs index e63b7b2..766d7eb 100644 --- a/src/models/profiles/queries.rs +++ b/src/models/profiles/queries.rs @@ -400,24 +400,37 @@ pub async fn search_profiles( Ok(profiles) } +pub async fn search_profiles_by_did_only( + db_client: &impl GenericClient, + did: &DidPkh, +) -> Result, DatabaseError> { + let rows = db_client.query( + " + SELECT actor_profile + FROM actor_profile + WHERE + EXISTS ( + SELECT 1 + FROM jsonb_array_elements(actor_profile.identity_proofs) AS proof + WHERE proof ->> 'issuer' = $1 + ) + ", + &[&did.to_string()], + ).await?; + let profiles: Vec = rows.iter() + .map(|row| row.try_get("actor_profile")) + .collect::>()?; + Ok(profiles) +} + pub async fn search_profiles_by_did( db_client: &impl GenericClient, did: &DidPkh, prefer_verified: bool, ) -> Result, DatabaseError> { let did_str = did.to_string(); - let identity_proof_query = - " - SELECT actor_profile, TRUE AS is_verified - FROM actor_profile - WHERE - EXISTS ( - SELECT 1 - FROM jsonb_array_elements(actor_profile.identity_proofs) AS proof - WHERE proof ->> 'issuer' = $did - ) - "; - let rows = if let Some(currency) = did.currency() { + let verified = search_profiles_by_did_only(db_client, did).await?; + let unverified = if let Some(currency) = did.currency() { // If currency is Ethereum, // search over extra fields must be case insensitive. let value_op = match currency { @@ -428,9 +441,7 @@ pub async fn search_profiles_by_did( // login addresses are private. let statement = format!( " - {identity_proof_query} - UNION ALL - SELECT actor_profile, FALSE + SELECT actor_profile FROM actor_profile WHERE EXISTS ( @@ -441,7 +452,6 @@ pub async fn search_profiles_by_did( AND field ->> 'value' {value_op} $field_value ) ", - identity_proof_query=identity_proof_query, value_op=value_op, ); let field_name = currency.field_name(); @@ -451,21 +461,17 @@ pub async fn search_profiles_by_did( field_name=field_name, field_value=did.address, )?; - db_client.query(query.sql(), query.parameters()).await? + let rows = db_client.query(query.sql(), query.parameters()).await?; + let unverified = rows.iter() + .map(|row| row.try_get("actor_profile")) + .collect::, _>>()? + .into_iter() + // Exclude verified + .filter(|profile| !verified.iter().any(|item| item.id == profile.id)) + .collect(); + unverified } else { - let query = query!(identity_proof_query, did=did_str)?; - db_client.query(query.sql(), query.parameters()).await? - }; - let mut verified = vec![]; - let mut unverified = vec![]; - for row in rows { - let profile: DbActorProfile = row.try_get("actor_profile")?; - let is_verified: bool = row.try_get("is_verified")?; - if is_verified { - verified.push(profile); - } else if !verified.iter().any(|item| item.id == profile.id) { - unverified.push(profile); - }; + vec![] }; let results = if prefer_verified && verified.len() > 0 { verified diff --git a/src/models/users/queries.rs b/src/models/users/queries.rs index 033e7df..b3b06a7 100644 --- a/src/models/users/queries.rs +++ b/src/models/users/queries.rs @@ -207,7 +207,7 @@ pub async fn get_user_by_did( Ok(user) } -pub async fn get_user_by_wallet_address( +pub async fn get_user_by_public_wallet_address( db_client: &impl GenericClient, currency: &Currency, wallet_address: &str,