2 activities::{generate_activity_id, send_lemmy_activity, verify_is_public, verify_person},
3 insert_received_activity,
4 objects::{instance::remote_instance_inboxes, person::ApubPerson},
5 protocol::activities::deletion::delete_user::DeleteUser,
7 use activitypub_federation::{
9 kinds::{activity::DeleteType, public},
10 protocol::verification::verify_urls_match,
11 traits::{ActivityHandler, Actor},
13 use lemmy_api_common::{context::LemmyContext, utils::delete_user_account};
14 use lemmy_db_schema::source::person::Person;
15 use lemmy_utils::error::LemmyError;
18 pub async fn delete_user(person: Person, context: Data<LemmyContext>) -> Result<(), LemmyError> {
19 let actor: ApubPerson = person.into();
28 let id = generate_activity_id(
30 &context.settings().get_protocol_and_hostname(),
32 let delete = DeleteUser {
33 actor: actor.id().into(),
35 object: actor.id().into(),
36 kind: DeleteType::Delete,
41 let inboxes = remote_instance_inboxes(&mut context.pool()).await?;
42 send_lemmy_activity(&context, delete, &actor, inboxes, true).await?;
46 /// This can be separate from Delete activity because it doesn't need to be handled in shared inbox
47 /// (cause instance actor doesn't have shared inbox).
48 #[async_trait::async_trait]
49 impl ActivityHandler for DeleteUser {
50 type DataType = LemmyContext;
51 type Error = LemmyError;
53 fn id(&self) -> &Url {
57 fn actor(&self) -> &Url {
61 async fn verify(&self, context: &Data<Self::DataType>) -> Result<(), LemmyError> {
62 insert_received_activity(&self.id, context).await?;
63 verify_is_public(&self.to, &[])?;
64 verify_person(&self.actor, context).await?;
65 verify_urls_match(self.actor.inner(), self.object.inner())?;
69 async fn receive(self, context: &Data<Self::DataType>) -> Result<(), LemmyError> {
70 let actor = self.actor.dereference(context).await?;