From 30da77dcf52140c4d9fe382b82bf08e9257dd75a Mon Sep 17 00:00:00 2001 From: silverpill Date: Mon, 30 May 2022 22:50:57 +0000 Subject: [PATCH] Move Follow() activity handler to inbox::follow module --- src/activitypub/handlers/follow.rs | 49 ++++++++++++++++++++++++++++++ src/activitypub/handlers/mod.rs | 1 + src/activitypub/receiver.rs | 44 +++------------------------ 3 files changed, 54 insertions(+), 40 deletions(-) create mode 100644 src/activitypub/handlers/follow.rs diff --git a/src/activitypub/handlers/follow.rs b/src/activitypub/handlers/follow.rs new file mode 100644 index 0000000..20f0dc3 --- /dev/null +++ b/src/activitypub/handlers/follow.rs @@ -0,0 +1,49 @@ +use tokio_postgres::GenericClient; + +use crate::activitypub::{ + activity::{create_activity_accept_follow, Activity}, + deliverer::deliver_activity, + fetcher::helpers::{get_or_import_profile_by_actor_id, ImportError}, + receiver::{get_object_id, parse_actor_id}, + vocabulary::PERSON, +}; +use crate::config::Config; +use crate::errors::DatabaseError; +use crate::models::relationships::queries::follow; +use crate::models::users::queries::get_user_by_name; +use super::HandlerResult; + +pub async fn handle_follow( + config: &Config, + db_client: &mut impl GenericClient, + activity: Activity, +) -> HandlerResult { + let source_profile = get_or_import_profile_by_actor_id( + db_client, + &config.instance(), + &config.media_dir(), + &activity.actor, + ).await?; + let source_actor = source_profile.actor_json + .ok_or(ImportError::LocalObject)?; + let target_actor_id = get_object_id(&activity.object)?; + let target_username = parse_actor_id(&config.instance_url(), &target_actor_id)?; + let target_user = get_user_by_name(db_client, &target_username).await?; + match follow(db_client, &source_profile.id, &target_user.profile.id).await { + Ok(_) => (), + // Proceed even if relationship already exists + Err(DatabaseError::AlreadyExists(_)) => (), + Err(other_error) => return Err(other_error.into()), + }; + + // Send activity + let new_activity = create_activity_accept_follow( + &config.instance_url(), + &target_user.profile, + &activity.id, + &source_actor.id, + ); + let recipients = vec![source_actor]; + deliver_activity(config, &target_user, new_activity, recipients); + Ok(Some(PERSON)) +} diff --git a/src/activitypub/handlers/mod.rs b/src/activitypub/handlers/mod.rs index 9082a41..ce51a18 100644 --- a/src/activitypub/handlers/mod.rs +++ b/src/activitypub/handlers/mod.rs @@ -6,6 +6,7 @@ pub type HandlerResult = Result, ImportError>; pub mod announce; pub mod create_note; pub mod delete; +pub mod follow; pub mod like; pub mod update_note; pub mod update_person; diff --git a/src/activitypub/receiver.rs b/src/activitypub/receiver.rs index 9a0f51b..370a828 100644 --- a/src/activitypub/receiver.rs +++ b/src/activitypub/receiver.rs @@ -23,24 +23,15 @@ use crate::models::reactions::queries::{ use crate::models::relationships::queries::{ follow_request_accepted, follow_request_rejected, - follow, get_follow_request_by_id, unfollow, }; -use crate::models::users::queries::get_user_by_name; -use super::activity::{ - Activity, - Object, - create_activity_accept_follow, -}; -use super::deliverer::deliver_activity; -use super::fetcher::helpers::{ - get_or_import_profile_by_actor_id, - import_post, -}; +use super::activity::{Activity, Object}; +use super::fetcher::helpers::import_post; use super::handlers::{ announce::handle_announce, delete::handle_delete, + follow::handle_follow, like::handle_like, update_note::handle_update_note, update_person::handle_update_person, @@ -251,34 +242,7 @@ pub async fn receive_activity( }, (FOLLOW, _) => { require_actor_signature(&activity.actor, &signer_id)?; - let source_profile = get_or_import_profile_by_actor_id( - db_client, - &config.instance(), - &config.media_dir(), - &activity.actor, - ).await?; - let source_actor = source_profile.actor_json - .ok_or(HttpError::InternalError)?; - let target_actor_id = get_object_id(&activity.object)?; - let target_username = parse_actor_id(&config.instance_url(), &target_actor_id)?; - let target_user = get_user_by_name(db_client, &target_username).await?; - match follow(db_client, &source_profile.id, &target_user.profile.id).await { - Ok(_) => (), - // Proceed even if relationship already exists - Err(DatabaseError::AlreadyExists(_)) => (), - Err(other_error) => return Err(other_error.into()), - }; - - // Send activity - let new_activity = create_activity_accept_follow( - &config.instance_url(), - &target_user.profile, - &activity.id, - &source_actor.id, - ); - let recipients = vec![source_actor]; - deliver_activity(config, &target_user, new_activity, recipients); - Some(PERSON) + handle_follow(config, db_client, activity).await? }, (UNDO, FOLLOW) => { require_actor_signature(&activity.actor, &signer_id)?;