3 following::follow::FollowCommunity,
8 context::lemmy_context,
9 fetcher::object_id::ObjectId,
12 use activitystreams::{
13 activity::kind::AcceptType,
15 primitives::OneOrMany,
18 use lemmy_api_common::blocking;
21 traits::{ActivityFields, ActivityHandler, ActorType},
22 verify::verify_urls_match,
24 use lemmy_db_schema::{
26 community::{Community, CommunityFollower},
31 use lemmy_utils::LemmyError;
32 use lemmy_websocket::LemmyContext;
33 use serde::{Deserialize, Serialize};
36 #[derive(Clone, Debug, Deserialize, Serialize, ActivityFields)]
37 #[serde(rename_all = "camelCase")]
38 pub struct AcceptFollowCommunity {
39 actor: ObjectId<Community>,
41 object: FollowCommunity,
42 #[serde(rename = "type")]
45 #[serde(rename = "@context")]
46 context: OneOrMany<AnyBase>,
51 impl AcceptFollowCommunity {
53 follow: FollowCommunity,
54 context: &LemmyContext,
55 request_counter: &mut i32,
56 ) -> Result<(), LemmyError> {
57 let community = follow.object.dereference_local(context).await?;
61 .dereference(context, request_counter)
63 let accept = AcceptFollowCommunity {
64 actor: ObjectId::new(community.actor_id()),
65 to: ObjectId::new(person.actor_id()),
67 kind: AcceptType::Accept,
68 id: generate_activity_id(
70 &context.settings().get_protocol_and_hostname(),
72 context: lemmy_context(),
73 unparsed: Default::default(),
75 let inbox = vec![person.inbox_url.into()];
76 send_lemmy_activity(context, &accept, &accept.id, &community, inbox, true).await
80 /// Handle accepted follows
81 #[async_trait::async_trait(?Send)]
82 impl ActivityHandler for AcceptFollowCommunity {
83 type DataType = LemmyContext;
86 context: &Data<LemmyContext>,
87 request_counter: &mut i32,
88 ) -> Result<(), LemmyError> {
89 verify_activity(self, &context.settings())?;
90 verify_urls_match(self.to.inner(), self.object.actor())?;
91 verify_urls_match(self.actor(), self.object.to.inner())?;
92 verify_community(&self.actor, context, request_counter).await?;
93 self.object.verify(context, request_counter).await?;
99 context: &Data<LemmyContext>,
100 request_counter: &mut i32,
101 ) -> Result<(), LemmyError> {
102 let actor = self.actor.dereference(context, request_counter).await?;
103 let to = self.to.dereference(context, request_counter).await?;
104 // This will throw an error if no follow was requested
105 blocking(context.pool(), move |conn| {
106 CommunityFollower::follow_accepted(conn, actor.id, to.id)