From 5712c9099c800a0f0ea0cd3367a4efd78c6fc3e1 Mon Sep 17 00:00:00 2001 From: silverpill Date: Mon, 21 Nov 2022 19:57:26 +0000 Subject: [PATCH] Allow to search for profile by actor ID --- src/mastodon_api/search/helpers.rs | 56 ++++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/src/mastodon_api/search/helpers.rs b/src/mastodon_api/search/helpers.rs index 3fa74d3..9044e24 100644 --- a/src/mastodon_api/search/helpers.rs +++ b/src/mastodon_api/search/helpers.rs @@ -7,10 +7,11 @@ use url::Url; use crate::activitypub::{ actors::types::ActorAddress, fetcher::helpers::{ + get_or_import_profile_by_actor_id, import_post, import_profile_by_actor_address, }, - identifiers::parse_local_object_id, + identifiers::{parse_local_actor_id, parse_local_object_id}, }; use crate::config::Config; use crate::errors::{DatabaseError, HttpError, ValidationError}; @@ -29,7 +30,10 @@ use crate::models::profiles::queries::{ }; use crate::models::profiles::types::DbActorProfile; use crate::models::tags::queries::search_tags; -use crate::models::users::types::User; +use crate::models::users::{ + queries::get_user_by_name, + types::User, +}; use crate::utils::currencies::{validate_wallet_address, Currency}; use super::types::SearchResults; @@ -138,11 +142,11 @@ async fn search_profiles_or_import( async fn find_post_by_url( config: &Config, db_client: &mut impl GenericClient, - url: String, + url: &str, ) -> Result, DatabaseError> { let maybe_post = match parse_local_object_id( &config.instance_url(), - &url, + url, ) { Ok(post_id) => { // Local URL @@ -156,7 +160,7 @@ async fn find_post_by_url( match import_post( config, db_client, - url, + url.to_string(), None, ).await { Ok(post) => Some(post), @@ -170,6 +174,37 @@ async fn find_post_by_url( Ok(maybe_post) } +async fn find_profile_by_url( + config: &Config, + db_client: &impl GenericClient, + url: &str, +) -> Result, DatabaseError> { + let profile = match parse_local_actor_id( + &config.instance_url(), + url, + ) { + Ok(username) => { + // Local URL + match get_user_by_name(db_client, &username).await { + Ok(user) => Some(user.profile), + Err(DatabaseError::NotFound(_)) => None, + Err(other_error) => return Err(other_error), + } + }, + Err(_) => { + get_or_import_profile_by_actor_id( + db_client, + &config.instance(), + &config.media_dir(), + url, + ).await + .map_err(|err| log::warn!("{}", err)) + .ok() + }, + }; + Ok(profile) +} + pub async fn search( config: &Config, current_user: &User, @@ -198,11 +233,20 @@ pub async fn search( ).await?; }, SearchQuery::Url(url) => { - let maybe_post = find_post_by_url(config, db_client, url).await?; + let maybe_post = find_post_by_url(config, db_client, &url).await?; if let Some(post) = maybe_post { if can_view_post(db_client, Some(current_user), &post).await? { posts = vec![post]; }; + } else { + let maybe_profile = find_profile_by_url( + config, + db_client, + &url, + ).await?; + if let Some(profile) = maybe_profile { + profiles = vec![profile]; + }; }; }, SearchQuery::WalletAddress(address) => {