From e06cd9c0ac5e14e53b5fc06bbcb37fa6d9add72c Mon Sep 17 00:00:00 2001 From: Luna <46259660+LunaticHacker@users.noreply.github.com> Date: Fri, 8 Oct 2021 19:58:32 +0530 Subject: [PATCH] mark parent as read on reply (#1819) * mark parent as read on reply * mark as read only if you are the recipient * mark mentions as read on reply --- crates/api_crud/src/comment/create.rs | 35 +++++++++++++++++-- .../db_queries/src/source/person_mention.rs | 18 +++++++++- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/crates/api_crud/src/comment/create.rs b/crates/api_crud/src/comment/create.rs index fb175179..7d49fe13 100644 --- a/crates/api_crud/src/comment/create.rs +++ b/crates/api_crud/src/comment/create.rs @@ -19,8 +19,12 @@ use lemmy_apub::{ generate_apub_endpoint, EndpointType, }; -use lemmy_db_queries::{source::comment::Comment_, Crud, Likeable}; -use lemmy_db_schema::source::comment::*; +use lemmy_db_queries::{ + source::{comment::Comment_, person_mention::PersonMention_}, + Crud, + Likeable, +}; +use lemmy_db_schema::source::{comment::*, person_mention::PersonMention}; use lemmy_db_views::comment_view::CommentView; use lemmy_utils::{ utils::{remove_slurs, scrape_text_for_mentions}, @@ -168,6 +172,33 @@ impl PerformCrud for CreateComment { .await? .map_err(|_| ApiError::err("couldnt_update_comment"))?; } + // If its a reply, mark the parent as read + if let Some(parent_id) = data.parent_id { + let parent_comment = blocking(context.pool(), move |conn| { + CommentView::read(conn, parent_id, Some(person_id)) + }) + .await??; + if local_user_view.person.id == parent_comment.get_recipient_id() { + blocking(context.pool(), move |conn| { + Comment::update_read(conn, parent_id, true) + }) + .await? + .map_err(|_| ApiError::err("couldnt_update_parent_comment"))?; + } + // If the parent has PersonMentions mark them as read too + let person_id = local_user_view.person.id; + let person_mention = blocking(context.pool(), move |conn| { + PersonMention::read_by_comment_and_person(conn, parent_id, person_id) + }) + .await?; + if let Ok(mention) = person_mention { + blocking(context.pool(), move |conn| { + PersonMention::update_read(conn, mention.id, true) + }) + .await? + .map_err(|_| ApiError::err("couldnt_update_person_mentions"))?; + } + } send_comment_ws_message( inserted_comment.id, diff --git a/crates/db_queries/src/source/person_mention.rs b/crates/db_queries/src/source/person_mention.rs index 774f7918..1adcc3c9 100644 --- a/crates/db_queries/src/source/person_mention.rs +++ b/crates/db_queries/src/source/person_mention.rs @@ -1,6 +1,6 @@ use crate::Crud; use diesel::{dsl::*, result::Error, *}; -use lemmy_db_schema::{source::person_mention::*, PersonId, PersonMentionId}; +use lemmy_db_schema::{source::person_mention::*, CommentId, PersonId, PersonMentionId}; impl Crud for PersonMention { type Form = PersonMentionForm; @@ -44,6 +44,11 @@ pub trait PersonMention_ { conn: &PgConnection, for_recipient_id: PersonId, ) -> Result, Error>; + fn read_by_comment_and_person( + conn: &PgConnection, + for_comment_id: CommentId, + for_recipient_id: PersonId, + ) -> Result; } impl PersonMention_ for PersonMention { @@ -71,6 +76,17 @@ impl PersonMention_ for PersonMention { .set(read.eq(true)) .get_results::(conn) } + fn read_by_comment_and_person( + conn: &PgConnection, + for_comment_id: CommentId, + for_recipient_id: PersonId, + ) -> Result { + use lemmy_db_schema::schema::person_mention::dsl::*; + person_mention + .filter(comment_id.eq(for_comment_id)) + .filter(recipient_id.eq(for_recipient_id)) + .first::(conn) + } } #[cfg(test)] -- 2.44.1