use crate::{ config::{Config, UrlKind}, data::State, db::Actor, error::{Error, ErrorKind}, }; use activitystreams::{ activity::{Follow as AsFollow, Undo as AsUndo}, context, iri_string::types::IriString, prelude::*, security, }; use std::convert::TryInto; mod announce; mod follow; mod forward; mod reject; mod undo; pub(crate) use self::{ announce::Announce, follow::Follow, forward::Forward, reject::Reject, undo::Undo, }; async fn get_inboxes( state: &State, actor: &Actor, object_id: &IriString, ) -> Result, Error> { let authority = object_id .authority_str() .ok_or(ErrorKind::Domain)? .to_string(); state.inboxes_without(&actor.inbox, &authority).await } fn prepare_activity( mut t: T, id: impl TryInto, to: impl TryInto, ) -> Result where T: ObjectExt + BaseExt, Error: From + From, { t.set_id(id.try_into()?) .set_many_tos(vec![to.try_into()?]) .set_many_contexts(vec![context(), security()]); Ok(t) } // Generate a type that says "I want to stop following you" fn generate_undo_follow( config: &Config, actor_id: &IriString, my_id: &IriString, ) -> Result { let mut follow = AsFollow::new(my_id.clone(), actor_id.clone()); follow.set_id(config.generate_url(UrlKind::Activity)); let undo = AsUndo::new(my_id.clone(), follow.into_any_base()?); prepare_activity(undo, config.generate_url(UrlKind::Actor), actor_id.clone()) }