3 community::{announce::AnnouncableActivities, send_to_community},
6 verify_person_in_community,
10 vote::{Vote, VoteType},
13 context::lemmy_context,
14 fetcher::object_id::ObjectId,
17 use activitystreams::{
18 activity::kind::UndoType,
20 primitives::OneOrMany,
23 use lemmy_api_common::blocking;
26 traits::{ActivityFields, ActivityHandler, ActorType},
28 verify::verify_urls_match,
30 use lemmy_db_queries::Crud;
31 use lemmy_db_schema::{
32 source::{community::Community, person::Person},
35 use lemmy_utils::LemmyError;
36 use lemmy_websocket::LemmyContext;
37 use serde::{Deserialize, Serialize};
41 #[derive(Clone, Debug, Deserialize, Serialize, ActivityFields)]
42 #[serde(rename_all = "camelCase")]
44 actor: ObjectId<Person>,
47 cc: [ObjectId<Community>; 1],
48 #[serde(rename = "type")]
51 #[serde(rename = "@context")]
52 context: OneOrMany<AnyBase>,
59 object: &PostOrComment,
61 community_id: CommunityId,
63 context: &LemmyContext,
64 ) -> Result<(), LemmyError> {
65 let community = blocking(context.pool(), move |conn| {
66 Community::read(conn, community_id)
70 let object = Vote::new(object, actor, &community, kind.clone(), context)?;
71 let id = generate_activity_id(
73 &context.settings().get_protocol_and_hostname(),
75 let undo_vote = UndoVote {
76 actor: ObjectId::new(actor.actor_id()),
77 to: [PublicUrl::Public],
79 cc: [ObjectId::new(community.actor_id())],
82 context: lemmy_context(),
83 unparsed: Default::default(),
85 let activity = AnnouncableActivities::UndoVote(undo_vote);
86 send_to_community(activity, &id, actor, &community, vec![], context).await
90 #[async_trait::async_trait(?Send)]
91 impl ActivityHandler for UndoVote {
92 type DataType = LemmyContext;
95 context: &Data<LemmyContext>,
96 request_counter: &mut i32,
97 ) -> Result<(), LemmyError> {
98 verify_activity(self, &context.settings())?;
99 verify_person_in_community(&self.actor, &self.cc[0], context, request_counter).await?;
100 verify_urls_match(self.actor(), self.object.actor())?;
101 self.object.verify(context, request_counter).await?;
107 context: &Data<LemmyContext>,
108 request_counter: &mut i32,
109 ) -> Result<(), LemmyError> {
110 let actor = self.actor.dereference(context, request_counter).await?;
114 .dereference(context, request_counter)
117 PostOrComment::Post(p) => undo_vote_post(actor, p.deref(), context).await,
118 PostOrComment::Comment(c) => undo_vote_comment(actor, &c, context).await,