From f2e61dd9a387e90568073bf1be94e04d0556f4e0 Mon Sep 17 00:00:00 2001 From: silverpill Date: Sun, 22 May 2022 00:07:01 +0000 Subject: [PATCH] Add CLI command for re-fetching actors --- src/activitypub/fetcher/fetchers.rs | 2 +- src/activitypub/inbox/update_person.rs | 8 ++++++++ src/activitypub/mod.rs | 2 +- src/bin/mitractl.rs | 16 ++++++++++++++++ 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/activitypub/fetcher/fetchers.rs b/src/activitypub/fetcher/fetchers.rs index 209b22f..33dc045 100644 --- a/src/activitypub/fetcher/fetchers.rs +++ b/src/activitypub/fetcher/fetchers.rs @@ -142,7 +142,7 @@ pub async fn fetch_profile( fetch_profile_by_actor_id(instance, actor_url, media_dir).await } -async fn fetch_actor( +pub async fn fetch_actor( instance: &Instance, actor_url: &str, ) -> Result { diff --git a/src/activitypub/inbox/update_person.rs b/src/activitypub/inbox/update_person.rs index a21a86c..dbb7291 100644 --- a/src/activitypub/inbox/update_person.rs +++ b/src/activitypub/inbox/update_person.rs @@ -25,6 +25,14 @@ pub async fn handle_update_person( if actor.id != activity.actor { return Err(ValidationError("actor ID mismatch").into()); }; + update_actor(db_client, media_dir, actor).await +} + +pub async fn update_actor( + db_client: &impl GenericClient, + media_dir: &Path, + actor: Actor, +) -> Result<(), ImportError> { let profile = get_profile_by_actor_id(db_client, &actor.id).await?; let (avatar, banner) = fetch_avatar_and_banner(&actor, media_dir).await .map_err(|_| ValidationError("failed to fetch image"))?; diff --git a/src/activitypub/mod.rs b/src/activitypub/mod.rs index 07dc895..a79e345 100644 --- a/src/activitypub/mod.rs +++ b/src/activitypub/mod.rs @@ -4,7 +4,7 @@ mod collections; pub mod constants; pub mod deliverer; pub mod fetcher; -mod inbox; +pub mod inbox; mod receiver; pub mod views; mod vocabulary; diff --git a/src/bin/mitractl.rs b/src/bin/mitractl.rs index ccac3c8..ee00a94 100644 --- a/src/bin/mitractl.rs +++ b/src/bin/mitractl.rs @@ -2,6 +2,8 @@ use chrono::{Duration, Utc}; use clap::Parser; use uuid::Uuid; +use mitra::activitypub::fetcher::fetchers::fetch_actor; +use mitra::activitypub::inbox::update_person::update_actor; use mitra::config; use mitra::database::create_database_client; use mitra::database::migrate::apply_migrations; @@ -31,6 +33,7 @@ enum SubCommand { GenerateInviteCode(GenerateInviteCode), ListInviteCodes(ListInviteCodes), + RefetchActor(RefetchActor), DeleteProfile(DeleteProfile), DeletePost(DeletePost), DeleteExtraneousPosts(DeleteExtraneousPosts), @@ -61,6 +64,13 @@ struct GenerateInviteCode; #[derive(Parser)] struct ListInviteCodes; +/// Re-fetch actor profile by actor ID +#[derive(Parser)] +struct RefetchActor { + #[clap(short)] + id: String, +} + /// Delete profile #[derive(Parser)] struct DeleteProfile { @@ -130,6 +140,12 @@ async fn main() { println!("{}", code); }; }, + SubCommand::RefetchActor(subopts) => { + let actor_id = subopts.id; + let actor = fetch_actor(&config.instance(), &actor_id).await.unwrap(); + update_actor(db_client, &config.media_dir(), actor).await.unwrap(); + println!("profile updated"); + }, SubCommand::DeleteProfile(subopts) => { let deletion_queue = delete_profile(db_client, &subopts.id).await.unwrap(); deletion_queue.process(&config).await;