2 objects::community::ApubCommunity,
5 block::{block_user::BlockUser, undo_block_user::UndoBlockUser},
7 announce::{AnnounceActivity, RawAnnouncableActivities},
8 collection_add::CollectionAdd,
9 collection_remove::CollectionRemove,
10 lock_page::{LockPage, UndoLockPage},
12 update::UpdateCommunity,
15 chat_message::CreateOrUpdateChatMessage,
16 note::CreateOrUpdateNote,
17 page::CreateOrUpdatePage,
19 deletion::{delete::Delete, delete_user::DeleteUser, undo_delete::UndoDelete},
20 following::{accept::AcceptFollow, follow::Follow, undo_follow::UndoFollow},
21 voting::{undo_vote::UndoVote, vote::Vote},
27 use activitypub_federation::{data::Data, deser::context::WithContext, traits::ActivityHandler};
28 use lemmy_api_common::context::LemmyContext;
29 use lemmy_utils::error::LemmyError;
30 use serde::{Deserialize, Serialize};
33 #[derive(Debug, Deserialize, Serialize)]
35 #[enum_delegate::implement(ActivityHandler)]
36 pub enum SharedInboxActivities {
37 PersonInboxActivities(Box<WithContext<PersonInboxActivities>>),
38 GroupInboxActivities(Box<WithContext<GroupInboxActivities>>),
41 #[derive(Debug, Deserialize, Serialize)]
43 #[enum_delegate::implement(ActivityHandler)]
44 pub enum GroupInboxActivities {
46 UndoFollow(UndoFollow),
48 // This is a catch-all and needs to be last
49 AnnouncableActivities(RawAnnouncableActivities),
52 #[derive(Clone, Debug, Deserialize, Serialize)]
54 #[enum_delegate::implement(ActivityHandler)]
55 pub enum PersonInboxActivities {
57 AcceptFollow(AcceptFollow),
58 UndoFollow(UndoFollow),
59 CreateOrUpdatePrivateMessage(CreateOrUpdateChatMessage),
61 UndoDelete(UndoDelete),
62 AnnounceActivity(AnnounceActivity),
65 /// This is necessary for user inbox, which can also receive some "announcable" activities,
66 /// eg a comment mention. This needs to be a separate enum so that announcables received in shared
67 /// inbox can fall through to be parsed as GroupInboxActivities::AnnouncableActivities.
68 #[derive(Clone, Debug, Deserialize, Serialize)]
70 #[enum_delegate::implement(ActivityHandler)]
71 pub enum PersonInboxActivitiesWithAnnouncable {
72 PersonInboxActivities(Box<PersonInboxActivities>),
73 AnnouncableActivities(Box<AnnouncableActivities>),
76 #[derive(Clone, Debug, Deserialize, Serialize)]
78 #[enum_delegate::implement(ActivityHandler)]
79 pub enum AnnouncableActivities {
80 CreateOrUpdateComment(CreateOrUpdateNote),
81 CreateOrUpdatePost(CreateOrUpdatePage),
85 UndoDelete(UndoDelete),
86 UpdateCommunity(UpdateCommunity),
88 UndoBlockUser(UndoBlockUser),
89 CollectionAdd(CollectionAdd),
90 CollectionRemove(CollectionRemove),
92 UndoLockPost(UndoLockPage),
93 // For compatibility with Pleroma/Mastodon (send only)
97 #[derive(Clone, Debug, Deserialize, Serialize)]
99 #[enum_delegate::implement(ActivityHandler)]
100 #[allow(clippy::enum_variant_names)]
101 pub enum SiteInboxActivities {
102 BlockUser(BlockUser),
103 UndoBlockUser(UndoBlockUser),
104 DeleteUser(DeleteUser),
107 #[async_trait::async_trait(?Send)]
108 impl InCommunity for AnnouncableActivities {
109 #[tracing::instrument(skip(self, context))]
112 context: &LemmyContext,
113 request_counter: &mut i32,
114 ) -> Result<ApubCommunity, LemmyError> {
115 use AnnouncableActivities::*;
117 CreateOrUpdateComment(a) => a.community(context, request_counter).await,
118 CreateOrUpdatePost(a) => a.community(context, request_counter).await,
119 Vote(a) => a.community(context, request_counter).await,
120 UndoVote(a) => a.community(context, request_counter).await,
121 Delete(a) => a.community(context, request_counter).await,
122 UndoDelete(a) => a.community(context, request_counter).await,
123 UpdateCommunity(a) => a.community(context, request_counter).await,
124 BlockUser(a) => a.community(context, request_counter).await,
125 UndoBlockUser(a) => a.community(context, request_counter).await,
126 CollectionAdd(a) => a.community(context, request_counter).await,
127 CollectionRemove(a) => a.community(context, request_counter).await,
128 LockPost(a) => a.community(context, request_counter).await,
129 UndoLockPost(a) => a.community(context, request_counter).await,
130 Page(_) => unimplemented!(),
139 GroupInboxActivities,
140 PersonInboxActivities,
141 PersonInboxActivitiesWithAnnouncable,
144 protocol::tests::{test_json, test_parse_lemmy_item},
148 fn test_group_inbox() {
149 test_parse_lemmy_item::<GroupInboxActivities>("assets/lemmy/activities/following/follow.json")
151 test_parse_lemmy_item::<GroupInboxActivities>(
152 "assets/lemmy/activities/create_or_update/create_note.json",
158 fn test_person_inbox() {
159 test_parse_lemmy_item::<PersonInboxActivities>("assets/lemmy/activities/following/accept.json")
161 test_parse_lemmy_item::<PersonInboxActivitiesWithAnnouncable>(
162 "assets/lemmy/activities/create_or_update/create_note.json",
165 test_parse_lemmy_item::<PersonInboxActivitiesWithAnnouncable>(
166 "assets/lemmy/activities/create_or_update/create_private_message.json",
169 test_json::<PersonInboxActivitiesWithAnnouncable>("assets/mastodon/activities/follow.json")
174 fn test_site_inbox() {
175 test_parse_lemmy_item::<SiteInboxActivities>(
176 "assets/lemmy/activities/deletion/delete_user.json",