send_local_notifs,
};
use lemmy_apub::{
- activities::comment::create::CreateComment as CreateApubComment,
+ activities::comment::create_or_update::{CreateOrUpdateComment, CreateOrUpdateType},
generate_apub_endpoint,
ApubLikeableType,
EndpointType,
.await?
.map_err(|_| ApiError::err("couldnt_create_comment"))?;
- CreateApubComment::send(&updated_comment, &local_user_view.person, context).await?;
+ CreateOrUpdateComment::send(
+ &updated_comment,
+ &local_user_view.person,
+ CreateOrUpdateType::Create,
+ context,
+ )
+ .await?;
// Scan the comment for user mentions, add those rows
let post_id = post.id;
get_local_user_view_from_jwt,
send_local_notifs,
};
-use lemmy_apub::activities::comment::update::UpdateComment;
+use lemmy_apub::activities::comment::create_or_update::{
+ CreateOrUpdateComment,
+ CreateOrUpdateType,
+};
use lemmy_db_queries::{source::comment::Comment_, DeleteableOrRemoveable};
use lemmy_db_schema::source::comment::*;
use lemmy_db_views::comment_view::CommentView;
.await?
.map_err(|_| ApiError::err("couldnt_update_comment"))?;
- // Send the apub update
- UpdateComment::send(&updated_comment, &local_user_view.person, context).await?;
+ CreateOrUpdateComment::send(
+ &updated_comment,
+ &local_user_view.person,
+ CreateOrUpdateType::Update,
+ context,
+ )
+ .await?;
// Do the mentions / recipients
let updated_comment_content = updated_comment.content.to_owned();
use lemmy_db_schema::source::{comment::Comment, community::Community, person::Person, post::Post};
use lemmy_utils::LemmyError;
use lemmy_websocket::{LemmyContext, UserOperationCrud};
+use serde::{Deserialize, Serialize};
use url::Url;
-#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
+#[derive(Clone, Debug, Deserialize, Serialize)]
+pub enum CreateOrUpdateType {
+ Create,
+ Update,
+}
+
+#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
-pub struct CreateComment {
+pub struct CreateOrUpdateComment {
to: PublicUrl,
object: Note,
cc: Vec<Url>,
tag: Vec<Mention>,
#[serde(rename = "type")]
- kind: CreateType,
+ kind: CreateOrUpdateType,
#[serde(flatten)]
common: ActivityCommonFields,
}
-impl CreateComment {
+impl CreateOrUpdateComment {
pub async fn send(
comment: &Comment,
actor: &Person,
+ kind: CreateOrUpdateType,
context: &LemmyContext,
) -> Result<(), LemmyError> {
- // TODO: would be helpful to add a comment method to retrieve community directly
+ // TODO: might be helpful to add a comment method to retrieve community directly
let post_id = comment.post_id;
let post = blocking(context.pool(), move |conn| Post::read(conn, post_id)).await??;
let community_id = post.community_id;
Community::read(conn, community_id)
})
.await??;
- let id = generate_activity_id(CreateType::Create)?;
+
+ let id = match kind {
+ CreateOrUpdateType::Create => generate_activity_id(CreateType::Create),
+ CreateOrUpdateType::Update => generate_activity_id(CreateType::Create),
+ }?;
let maa = collect_non_local_mentions(comment, &community, context).await?;
- let create = CreateComment {
+ let create_or_update = CreateOrUpdateComment {
to: PublicUrl::Public,
object: comment.to_apub(context.pool()).await?,
cc: maa.ccs,
tag: maa.tags,
- kind: Default::default(),
+ kind,
common: ActivityCommonFields {
context: lemmy_context(),
id: id.clone(),
},
};
- let activity = AnnouncableActivities::CreateComment(create);
+ let activity = AnnouncableActivities::CreateOrUpdateComment(create_or_update);
send_to_community_new(activity, &id, actor, &community, maa.inboxes, context).await
}
}
#[async_trait::async_trait(?Send)]
-impl ActivityHandler for CreateComment {
+impl ActivityHandler for CreateOrUpdateComment {
async fn verify(
&self,
context: &LemmyContext,
.await?;
let recipients =
get_notif_recipients(&self.common.actor, &comment, context, request_counter).await?;
- send_websocket_message(
- comment.id,
- recipients,
- UserOperationCrud::CreateComment,
- context,
- )
- .await
+ let notif_type = match self.kind {
+ CreateOrUpdateType::Create => UserOperationCrud::CreateComment,
+ CreateOrUpdateType::Update => UserOperationCrud::EditComment,
+ };
+ send_websocket_message(comment.id, recipients, notif_type, context).await
}
fn common(&self) -> &ActivityCommonFields {
use reqwest::Client;
use url::Url;
-pub mod create;
-pub mod update;
+pub mod create_or_update;
async fn get_notif_recipients(
actor: &Url,
+++ /dev/null
-use crate::{
- activities::{
- comment::{collect_non_local_mentions, get_notif_recipients, send_websocket_message},
- community::announce::AnnouncableActivities,
- extract_community,
- generate_activity_id,
- verify_activity,
- verify_person_in_community,
- },
- activity_queue::send_to_community_new,
- extensions::context::lemmy_context,
- objects::{comment::Note, FromApub, ToApub},
- ActorType,
-};
-use activitystreams::{activity::kind::UpdateType, link::Mention};
-use lemmy_api_common::blocking;
-use lemmy_apub_lib::{
- values::PublicUrl,
- verify_domains_match,
- ActivityCommonFields,
- ActivityHandler,
-};
-use lemmy_db_queries::Crud;
-use lemmy_db_schema::source::{comment::Comment, community::Community, person::Person, post::Post};
-use lemmy_utils::LemmyError;
-use lemmy_websocket::{LemmyContext, UserOperationCrud};
-use url::Url;
-
-#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct UpdateComment {
- to: PublicUrl,
- object: Note,
- cc: Vec<Url>,
- tag: Vec<Mention>,
- #[serde(rename = "type")]
- kind: UpdateType,
- #[serde(flatten)]
- common: ActivityCommonFields,
-}
-
-impl UpdateComment {
- pub async fn send(
- comment: &Comment,
- actor: &Person,
- context: &LemmyContext,
- ) -> Result<(), LemmyError> {
- // TODO: would be helpful to add a comment method to retrieve community directly
- let post_id = comment.post_id;
- let post = blocking(context.pool(), move |conn| Post::read(conn, post_id)).await??;
- let community_id = post.community_id;
- let community = blocking(context.pool(), move |conn| {
- Community::read(conn, community_id)
- })
- .await??;
- let id = generate_activity_id(UpdateType::Update)?;
- let maa = collect_non_local_mentions(comment, &community, context).await?;
-
- let update = UpdateComment {
- to: PublicUrl::Public,
- object: comment.to_apub(context.pool()).await?,
- cc: maa.ccs,
- tag: maa.tags,
- kind: Default::default(),
- common: ActivityCommonFields {
- context: lemmy_context(),
- id: id.clone(),
- actor: actor.actor_id(),
- unparsed: Default::default(),
- },
- };
-
- let activity = AnnouncableActivities::UpdateComment(update);
- send_to_community_new(activity, &id, actor, &community, maa.inboxes, context).await
- }
-}
-
-#[async_trait::async_trait(?Send)]
-impl ActivityHandler for UpdateComment {
- async fn verify(
- &self,
- context: &LemmyContext,
- request_counter: &mut i32,
- ) -> Result<(), LemmyError> {
- let community = extract_community(&self.cc, context, request_counter).await?;
-
- verify_activity(self.common())?;
- verify_person_in_community(
- &self.common.actor,
- &community.actor_id(),
- context,
- request_counter,
- )
- .await?;
- verify_domains_match(&self.common.actor, &self.object.id)?;
- self.object.verify(context, request_counter).await?;
- Ok(())
- }
-
- async fn receive(
- &self,
- context: &LemmyContext,
- request_counter: &mut i32,
- ) -> Result<(), LemmyError> {
- let comment = Comment::from_apub(
- &self.object,
- context,
- self.common.actor.clone(),
- request_counter,
- false,
- )
- .await?;
-
- let recipients =
- get_notif_recipients(&self.common.actor, &comment, context, request_counter).await?;
- send_websocket_message(
- comment.id,
- recipients,
- UserOperationCrud::EditComment,
- context,
- )
- .await
- }
-
- fn common(&self) -> &ActivityCommonFields {
- &self.common
- }
-}
use crate::{
activities::{
- comment::{create::CreateComment, update::UpdateComment},
+ comment::create_or_update::CreateOrUpdateComment,
community::{
add_mod::AddMod,
block_user::BlockUserFromCommunity,
#[derive(Clone, Debug, Deserialize, Serialize, ActivityHandler)]
#[serde(untagged)]
pub enum AnnouncableActivities {
- CreateComment(CreateComment),
- UpdateComment(UpdateComment),
+ CreateOrUpdateComment(CreateOrUpdateComment),
CreatePost(CreatePost),
UpdatePost(UpdatePost),
LikePostOrComment(LikePostOrComment),
use crate::activities::{
- comment::{create::CreateComment, update::UpdateComment},
+ comment::create_or_update::CreateOrUpdateComment,
community::{
add_mod::AddMod,
announce::AnnounceActivity,
pub enum GroupInboxActivities {
FollowCommunity(FollowCommunity),
UndoFollowCommunity(UndoFollowCommunity),
- CreateComment(CreateComment),
- UpdateComment(UpdateComment),
+ CreateOrUpdateComment(CreateOrUpdateComment),
CreatePost(CreatePost),
UpdatePost(UpdatePost),
LikePostOrComment(LikePostOrComment),
// received by group
FollowCommunity(FollowCommunity),
UndoFollowCommunity(UndoFollowCommunity),
- CreateComment(CreateComment),
- UpdateComment(UpdateComment),
+ CreateOrUpdateComment(CreateOrUpdateComment),
CreatePost(CreatePost),
UpdatePost(UpdatePost),
LikePostOrComment(LikePostOrComment),