mirror of https://github.com/LemmyNet/lemmy.git
Merge logic for comment create and update
parent
43ad99bbe8
commit
3eb46868ff
|
@ -9,7 +9,7 @@ use lemmy_api_common::{
|
||||||
send_local_notifs,
|
send_local_notifs,
|
||||||
};
|
};
|
||||||
use lemmy_apub::{
|
use lemmy_apub::{
|
||||||
activities::comment::create::CreateComment as CreateApubComment,
|
activities::comment::create_or_update::{CreateOrUpdateComment, CreateOrUpdateType},
|
||||||
generate_apub_endpoint,
|
generate_apub_endpoint,
|
||||||
ApubLikeableType,
|
ApubLikeableType,
|
||||||
EndpointType,
|
EndpointType,
|
||||||
|
@ -88,7 +88,13 @@ impl PerformCrud for CreateComment {
|
||||||
.await?
|
.await?
|
||||||
.map_err(|_| ApiError::err("couldnt_create_comment"))?;
|
.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
|
// Scan the comment for user mentions, add those rows
|
||||||
let post_id = post.id;
|
let post_id = post.id;
|
||||||
|
|
|
@ -7,7 +7,10 @@ use lemmy_api_common::{
|
||||||
get_local_user_view_from_jwt,
|
get_local_user_view_from_jwt,
|
||||||
send_local_notifs,
|
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_queries::{source::comment::Comment_, DeleteableOrRemoveable};
|
||||||
use lemmy_db_schema::source::comment::*;
|
use lemmy_db_schema::source::comment::*;
|
||||||
use lemmy_db_views::comment_view::CommentView;
|
use lemmy_db_views::comment_view::CommentView;
|
||||||
|
@ -58,8 +61,13 @@ impl PerformCrud for EditComment {
|
||||||
.await?
|
.await?
|
||||||
.map_err(|_| ApiError::err("couldnt_update_comment"))?;
|
.map_err(|_| ApiError::err("couldnt_update_comment"))?;
|
||||||
|
|
||||||
// Send the apub update
|
CreateOrUpdateComment::send(
|
||||||
UpdateComment::send(&updated_comment, &local_user_view.person, context).await?;
|
&updated_comment,
|
||||||
|
&local_user_view.person,
|
||||||
|
CreateOrUpdateType::Update,
|
||||||
|
context,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
// Do the mentions / recipients
|
// Do the mentions / recipients
|
||||||
let updated_comment_content = updated_comment.content.to_owned();
|
let updated_comment_content = updated_comment.content.to_owned();
|
||||||
|
|
|
@ -24,28 +24,36 @@ use lemmy_db_queries::Crud;
|
||||||
use lemmy_db_schema::source::{comment::Comment, community::Community, person::Person, post::Post};
|
use lemmy_db_schema::source::{comment::Comment, community::Community, person::Person, post::Post};
|
||||||
use lemmy_utils::LemmyError;
|
use lemmy_utils::LemmyError;
|
||||||
use lemmy_websocket::{LemmyContext, UserOperationCrud};
|
use lemmy_websocket::{LemmyContext, UserOperationCrud};
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
use url::Url;
|
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")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct CreateComment {
|
pub struct CreateOrUpdateComment {
|
||||||
to: PublicUrl,
|
to: PublicUrl,
|
||||||
object: Note,
|
object: Note,
|
||||||
cc: Vec<Url>,
|
cc: Vec<Url>,
|
||||||
tag: Vec<Mention>,
|
tag: Vec<Mention>,
|
||||||
#[serde(rename = "type")]
|
#[serde(rename = "type")]
|
||||||
kind: CreateType,
|
kind: CreateOrUpdateType,
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
common: ActivityCommonFields,
|
common: ActivityCommonFields,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CreateComment {
|
impl CreateOrUpdateComment {
|
||||||
pub async fn send(
|
pub async fn send(
|
||||||
comment: &Comment,
|
comment: &Comment,
|
||||||
actor: &Person,
|
actor: &Person,
|
||||||
|
kind: CreateOrUpdateType,
|
||||||
context: &LemmyContext,
|
context: &LemmyContext,
|
||||||
) -> Result<(), LemmyError> {
|
) -> 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_id = comment.post_id;
|
||||||
let post = blocking(context.pool(), move |conn| Post::read(conn, post_id)).await??;
|
let post = blocking(context.pool(), move |conn| Post::read(conn, post_id)).await??;
|
||||||
let community_id = post.community_id;
|
let community_id = post.community_id;
|
||||||
|
@ -53,15 +61,19 @@ impl CreateComment {
|
||||||
Community::read(conn, community_id)
|
Community::read(conn, community_id)
|
||||||
})
|
})
|
||||||
.await??;
|
.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 maa = collect_non_local_mentions(comment, &community, context).await?;
|
||||||
|
|
||||||
let create = CreateComment {
|
let create_or_update = CreateOrUpdateComment {
|
||||||
to: PublicUrl::Public,
|
to: PublicUrl::Public,
|
||||||
object: comment.to_apub(context.pool()).await?,
|
object: comment.to_apub(context.pool()).await?,
|
||||||
cc: maa.ccs,
|
cc: maa.ccs,
|
||||||
tag: maa.tags,
|
tag: maa.tags,
|
||||||
kind: Default::default(),
|
kind,
|
||||||
common: ActivityCommonFields {
|
common: ActivityCommonFields {
|
||||||
context: lemmy_context(),
|
context: lemmy_context(),
|
||||||
id: id.clone(),
|
id: id.clone(),
|
||||||
|
@ -70,13 +82,13 @@ impl CreateComment {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
let activity = AnnouncableActivities::CreateComment(create);
|
let activity = AnnouncableActivities::CreateOrUpdateComment(create_or_update);
|
||||||
send_to_community_new(activity, &id, actor, &community, maa.inboxes, context).await
|
send_to_community_new(activity, &id, actor, &community, maa.inboxes, context).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[async_trait::async_trait(?Send)]
|
#[async_trait::async_trait(?Send)]
|
||||||
impl ActivityHandler for CreateComment {
|
impl ActivityHandler for CreateOrUpdateComment {
|
||||||
async fn verify(
|
async fn verify(
|
||||||
&self,
|
&self,
|
||||||
context: &LemmyContext,
|
context: &LemmyContext,
|
||||||
|
@ -114,13 +126,11 @@ impl ActivityHandler for CreateComment {
|
||||||
.await?;
|
.await?;
|
||||||
let recipients =
|
let recipients =
|
||||||
get_notif_recipients(&self.common.actor, &comment, context, request_counter).await?;
|
get_notif_recipients(&self.common.actor, &comment, context, request_counter).await?;
|
||||||
send_websocket_message(
|
let notif_type = match self.kind {
|
||||||
comment.id,
|
CreateOrUpdateType::Create => UserOperationCrud::CreateComment,
|
||||||
recipients,
|
CreateOrUpdateType::Update => UserOperationCrud::EditComment,
|
||||||
UserOperationCrud::CreateComment,
|
};
|
||||||
context,
|
send_websocket_message(comment.id, recipients, notif_type, context).await
|
||||||
)
|
|
||||||
.await
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn common(&self) -> &ActivityCommonFields {
|
fn common(&self) -> &ActivityCommonFields {
|
|
@ -24,8 +24,7 @@ use log::debug;
|
||||||
use reqwest::Client;
|
use reqwest::Client;
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
pub mod create;
|
pub mod create_or_update;
|
||||||
pub mod update;
|
|
||||||
|
|
||||||
async fn get_notif_recipients(
|
async fn get_notif_recipients(
|
||||||
actor: &Url,
|
actor: &Url,
|
||||||
|
|
|
@ -1,128 +0,0 @@
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,6 +1,6 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
activities::{
|
activities::{
|
||||||
comment::{create::CreateComment, update::UpdateComment},
|
comment::create_or_update::CreateOrUpdateComment,
|
||||||
community::{
|
community::{
|
||||||
add_mod::AddMod,
|
add_mod::AddMod,
|
||||||
block_user::BlockUserFromCommunity,
|
block_user::BlockUserFromCommunity,
|
||||||
|
@ -44,8 +44,7 @@ use url::Url;
|
||||||
#[derive(Clone, Debug, Deserialize, Serialize, ActivityHandler)]
|
#[derive(Clone, Debug, Deserialize, Serialize, ActivityHandler)]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
pub enum AnnouncableActivities {
|
pub enum AnnouncableActivities {
|
||||||
CreateComment(CreateComment),
|
CreateOrUpdateComment(CreateOrUpdateComment),
|
||||||
UpdateComment(UpdateComment),
|
|
||||||
CreatePost(CreatePost),
|
CreatePost(CreatePost),
|
||||||
UpdatePost(UpdatePost),
|
UpdatePost(UpdatePost),
|
||||||
LikePostOrComment(LikePostOrComment),
|
LikePostOrComment(LikePostOrComment),
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::activities::{
|
use crate::activities::{
|
||||||
comment::{create::CreateComment, update::UpdateComment},
|
comment::create_or_update::CreateOrUpdateComment,
|
||||||
community::{
|
community::{
|
||||||
add_mod::AddMod,
|
add_mod::AddMod,
|
||||||
announce::AnnounceActivity,
|
announce::AnnounceActivity,
|
||||||
|
@ -48,8 +48,7 @@ pub enum PersonInboxActivities {
|
||||||
pub enum GroupInboxActivities {
|
pub enum GroupInboxActivities {
|
||||||
FollowCommunity(FollowCommunity),
|
FollowCommunity(FollowCommunity),
|
||||||
UndoFollowCommunity(UndoFollowCommunity),
|
UndoFollowCommunity(UndoFollowCommunity),
|
||||||
CreateComment(CreateComment),
|
CreateOrUpdateComment(CreateOrUpdateComment),
|
||||||
UpdateComment(UpdateComment),
|
|
||||||
CreatePost(CreatePost),
|
CreatePost(CreatePost),
|
||||||
UpdatePost(UpdatePost),
|
UpdatePost(UpdatePost),
|
||||||
LikePostOrComment(LikePostOrComment),
|
LikePostOrComment(LikePostOrComment),
|
||||||
|
@ -72,8 +71,7 @@ pub enum SharedInboxActivities {
|
||||||
// received by group
|
// received by group
|
||||||
FollowCommunity(FollowCommunity),
|
FollowCommunity(FollowCommunity),
|
||||||
UndoFollowCommunity(UndoFollowCommunity),
|
UndoFollowCommunity(UndoFollowCommunity),
|
||||||
CreateComment(CreateComment),
|
CreateOrUpdateComment(CreateOrUpdateComment),
|
||||||
UpdateComment(UpdateComment),
|
|
||||||
CreatePost(CreatePost),
|
CreatePost(CreatePost),
|
||||||
UpdatePost(UpdatePost),
|
UpdatePost(UpdatePost),
|
||||||
LikePostOrComment(LikePostOrComment),
|
LikePostOrComment(LikePostOrComment),
|
||||||
|
|
Loading…
Reference in New Issue