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
This commit is contained in:
Luna 2021-10-08 19:58:32 +05:30 committed by GitHub
parent b96ce81f89
commit e06cd9c0ac
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 3 deletions

View file

@ -19,8 +19,12 @@ use lemmy_apub::{
generate_apub_endpoint, generate_apub_endpoint,
EndpointType, EndpointType,
}; };
use lemmy_db_queries::{source::comment::Comment_, Crud, Likeable}; use lemmy_db_queries::{
use lemmy_db_schema::source::comment::*; 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_db_views::comment_view::CommentView;
use lemmy_utils::{ use lemmy_utils::{
utils::{remove_slurs, scrape_text_for_mentions}, utils::{remove_slurs, scrape_text_for_mentions},
@ -168,6 +172,33 @@ impl PerformCrud for CreateComment {
.await? .await?
.map_err(|_| ApiError::err("couldnt_update_comment"))?; .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( send_comment_ws_message(
inserted_comment.id, inserted_comment.id,

View file

@ -1,6 +1,6 @@
use crate::Crud; use crate::Crud;
use diesel::{dsl::*, result::Error, *}; 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 { impl Crud for PersonMention {
type Form = PersonMentionForm; type Form = PersonMentionForm;
@ -44,6 +44,11 @@ pub trait PersonMention_ {
conn: &PgConnection, conn: &PgConnection,
for_recipient_id: PersonId, for_recipient_id: PersonId,
) -> Result<Vec<PersonMention>, Error>; ) -> Result<Vec<PersonMention>, Error>;
fn read_by_comment_and_person(
conn: &PgConnection,
for_comment_id: CommentId,
for_recipient_id: PersonId,
) -> Result<PersonMention, Error>;
} }
impl PersonMention_ for PersonMention { impl PersonMention_ for PersonMention {
@ -71,6 +76,17 @@ impl PersonMention_ for PersonMention {
.set(read.eq(true)) .set(read.eq(true))
.get_results::<Self>(conn) .get_results::<Self>(conn)
} }
fn read_by_comment_and_person(
conn: &PgConnection,
for_comment_id: CommentId,
for_recipient_id: PersonId,
) -> Result<Self, Error> {
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::<Self>(conn)
}
} }
#[cfg(test)] #[cfg(test)]