2 activities::community::announce::GetCommunity,
3 objects::community::ApubCommunity,
6 block::{block_user::BlockUser, undo_block_user::UndoBlockUser},
9 announce::{AnnounceActivity, RawAnnouncableActivities},
10 remove_mod::RemoveMod,
12 update::UpdateCommunity,
15 comment::CreateOrUpdateComment,
16 post::CreateOrUpdatePost,
17 private_message::CreateOrUpdatePrivateMessage,
19 deletion::{delete::Delete, delete_user::DeleteUser, undo_delete::UndoDelete},
21 accept::AcceptFollowCommunity,
22 follow::FollowCommunity,
23 undo_follow::UndoFollowCommunity,
25 voting::{undo_vote::UndoVote, vote::Vote},
30 use activitypub_federation::{data::Data, deser::context::WithContext, traits::ActivityHandler};
31 use lemmy_utils::error::LemmyError;
32 use lemmy_websocket::LemmyContext;
33 use serde::{Deserialize, Serialize};
36 #[derive(Debug, Deserialize, Serialize)]
38 #[enum_delegate::implement(ActivityHandler)]
39 pub enum SharedInboxActivities {
40 PersonInboxActivities(Box<WithContext<PersonInboxActivities>>),
41 GroupInboxActivities(Box<WithContext<GroupInboxActivities>>),
44 #[derive(Debug, Deserialize, Serialize)]
46 #[enum_delegate::implement(ActivityHandler)]
47 pub enum GroupInboxActivities {
48 FollowCommunity(FollowCommunity),
49 UndoFollowCommunity(UndoFollowCommunity),
51 // This is a catch-all and needs to be last
52 AnnouncableActivities(RawAnnouncableActivities),
55 #[derive(Clone, Debug, Deserialize, Serialize)]
57 #[enum_delegate::implement(ActivityHandler)]
58 pub enum PersonInboxActivities {
59 AcceptFollowCommunity(AcceptFollowCommunity),
60 CreateOrUpdatePrivateMessage(CreateOrUpdatePrivateMessage),
62 UndoDelete(UndoDelete),
63 AnnounceActivity(AnnounceActivity),
66 /// This is necessary for user inbox, which can also receive some "announcable" activities,
67 /// eg a comment mention. This needs to be a separate enum so that announcables received in shared
68 /// inbox can fall through to be parsed as GroupInboxActivities::AnnouncableActivities.
69 #[derive(Clone, Debug, Deserialize, Serialize)]
71 #[enum_delegate::implement(ActivityHandler)]
72 pub enum PersonInboxActivitiesWithAnnouncable {
73 PersonInboxActivities(Box<PersonInboxActivities>),
74 AnnouncableActivities(Box<AnnouncableActivities>),
77 #[derive(Clone, Debug, Deserialize, Serialize)]
79 #[enum_delegate::implement(ActivityHandler)]
80 pub enum AnnouncableActivities {
81 CreateOrUpdateComment(CreateOrUpdateComment),
82 CreateOrUpdatePost(CreateOrUpdatePost),
86 UndoDelete(UndoDelete),
87 UpdateCommunity(UpdateCommunity),
89 UndoBlockUser(UndoBlockUser),
92 // For compatibility with Pleroma/Mastodon (send only)
96 #[derive(Clone, Debug, Deserialize, Serialize)]
98 #[enum_delegate::implement(ActivityHandler)]
99 #[allow(clippy::enum_variant_names)]
100 pub enum SiteInboxActivities {
101 BlockUser(BlockUser),
102 UndoBlockUser(UndoBlockUser),
103 DeleteUser(DeleteUser),
106 #[async_trait::async_trait(?Send)]
107 impl GetCommunity for AnnouncableActivities {
108 #[tracing::instrument(skip(self, context))]
109 async fn get_community(
111 context: &LemmyContext,
112 request_counter: &mut i32,
113 ) -> Result<ApubCommunity, LemmyError> {
114 use AnnouncableActivities::*;
115 let community = match self {
116 CreateOrUpdateComment(a) => a.get_community(context, request_counter).await?,
117 CreateOrUpdatePost(a) => a.get_community(context, request_counter).await?,
118 Vote(a) => a.get_community(context, request_counter).await?,
119 UndoVote(a) => a.get_community(context, request_counter).await?,
120 Delete(a) => a.get_community(context, request_counter).await?,
121 UndoDelete(a) => a.get_community(context, request_counter).await?,
122 UpdateCommunity(a) => a.get_community(context, request_counter).await?,
123 BlockUser(a) => a.get_community(context, request_counter).await?,
124 UndoBlockUser(a) => a.get_community(context, request_counter).await?,
125 AddMod(a) => a.get_community(context, request_counter).await?,
126 RemoveMod(a) => a.get_community(context, request_counter).await?,
127 Page(_) => unimplemented!(),
137 GroupInboxActivities,
138 PersonInboxActivities,
139 PersonInboxActivitiesWithAnnouncable,
142 protocol::tests::test_parse_lemmy_item,
146 fn test_group_inbox() {
147 test_parse_lemmy_item::<GroupInboxActivities>("assets/lemmy/activities/following/follow.json")
149 test_parse_lemmy_item::<GroupInboxActivities>(
150 "assets/lemmy/activities/create_or_update/create_note.json",
156 fn test_person_inbox() {
157 test_parse_lemmy_item::<PersonInboxActivities>("assets/lemmy/activities/following/accept.json")
159 test_parse_lemmy_item::<PersonInboxActivitiesWithAnnouncable>(
160 "assets/lemmy/activities/create_or_update/create_note.json",
163 test_parse_lemmy_item::<PersonInboxActivitiesWithAnnouncable>(
164 "assets/lemmy/activities/create_or_update/create_private_message.json",
170 fn test_site_inbox() {
171 test_parse_lemmy_item::<SiteInboxActivities>(
172 "assets/lemmy/activities/deletion/delete_user.json",