From e23621c2cdd2209dca34640c2b15e10a4d149112 Mon Sep 17 00:00:00 2001 From: Sander Saarend Date: Tue, 20 Jun 2023 11:52:51 +0300 Subject: [PATCH] Calculate initial hot_rank and hot_rank_active for posts and comments from other instances (#3131) * Calculate initial hot_rank when receiving posts and comments from other instances * Move hot rank update logic into db_schema --- .../src/activities/create_or_update/comment.rs | 4 ++++ .../src/activities/create_or_update/post.rs | 5 +++++ .../src/aggregates/comment_aggregates.rs | 15 ++++++++++++++- .../src/aggregates/post_aggregates.rs | 18 +++++++++++++++++- 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/crates/apub/src/activities/create_or_update/comment.rs b/crates/apub/src/activities/create_or_update/comment.rs index 814ec0f87..e9e567335 100644 --- a/crates/apub/src/activities/create_or_update/comment.rs +++ b/crates/apub/src/activities/create_or_update/comment.rs @@ -30,6 +30,7 @@ use lemmy_api_common::{ utils::{check_post_deleted_or_removed, is_mod_or_admin}, }; use lemmy_db_schema::{ + aggregates::structs::CommentAggregates, newtypes::PersonId, source::{ comment::{Comment, CommentLike, CommentLikeForm}, @@ -191,6 +192,9 @@ impl ActivityHandler for CreateOrUpdateNote { }; CommentLike::like(context.pool(), &like_form).await?; + // Calculate initial hot_rank + CommentAggregates::update_hot_rank(context.pool(), comment.id).await?; + let do_send_email = self.kind == CreateOrUpdateType::Create; let post_id = comment.post_id; let post = Post::read(context.pool(), post_id).await?; diff --git a/crates/apub/src/activities/create_or_update/post.rs b/crates/apub/src/activities/create_or_update/post.rs index f2923bfbd..916111fc5 100644 --- a/crates/apub/src/activities/create_or_update/post.rs +++ b/crates/apub/src/activities/create_or_update/post.rs @@ -27,6 +27,7 @@ use lemmy_api_common::{ post::{CreatePost, EditPost, PostResponse}, }; use lemmy_db_schema::{ + aggregates::structs::PostAggregates, newtypes::PersonId, source::{ community::Community, @@ -187,6 +188,10 @@ impl ActivityHandler for CreateOrUpdatePage { score: 1, }; PostLike::like(context.pool(), &like_form).await?; + + // Calculate initial hot_rank for post + PostAggregates::update_hot_rank(context.pool(), post.id).await?; + Ok(()) } } diff --git a/crates/db_schema/src/aggregates/comment_aggregates.rs b/crates/db_schema/src/aggregates/comment_aggregates.rs index f56fd8cbe..5a5550a2e 100644 --- a/crates/db_schema/src/aggregates/comment_aggregates.rs +++ b/crates/db_schema/src/aggregates/comment_aggregates.rs @@ -2,7 +2,7 @@ use crate::{ aggregates::structs::CommentAggregates, newtypes::CommentId, schema::comment_aggregates, - utils::{get_conn, DbPool}, + utils::{functions::hot_rank, get_conn, DbPool}, }; use diesel::{result::Error, ExpressionMethods, QueryDsl}; use diesel_async::RunQueryDsl; @@ -15,6 +15,19 @@ impl CommentAggregates { .first::(conn) .await } + + pub async fn update_hot_rank(pool: &DbPool, comment_id: CommentId) -> Result { + let conn = &mut get_conn(pool).await?; + + diesel::update(comment_aggregates::table) + .filter(comment_aggregates::comment_id.eq(comment_id)) + .set(comment_aggregates::hot_rank.eq(hot_rank( + comment_aggregates::score, + comment_aggregates::published, + ))) + .get_result::(conn) + .await + } } #[cfg(test)] diff --git a/crates/db_schema/src/aggregates/post_aggregates.rs b/crates/db_schema/src/aggregates/post_aggregates.rs index 848f2014b..176f694a7 100644 --- a/crates/db_schema/src/aggregates/post_aggregates.rs +++ b/crates/db_schema/src/aggregates/post_aggregates.rs @@ -2,7 +2,7 @@ use crate::{ aggregates::structs::PostAggregates, newtypes::PostId, schema::post_aggregates, - utils::{get_conn, DbPool}, + utils::{functions::hot_rank, get_conn, DbPool}, }; use diesel::{result::Error, ExpressionMethods, QueryDsl}; use diesel_async::RunQueryDsl; @@ -15,6 +15,22 @@ impl PostAggregates { .first::(conn) .await } + + pub async fn update_hot_rank(pool: &DbPool, post_id: PostId) -> Result { + let conn = &mut get_conn(pool).await?; + + diesel::update(post_aggregates::table) + .filter(post_aggregates::post_id.eq(post_id)) + .set(( + post_aggregates::hot_rank.eq(hot_rank(post_aggregates::score, post_aggregates::published)), + post_aggregates::hot_rank_active.eq(hot_rank( + post_aggregates::score, + post_aggregates::newest_comment_time_necro, + )), + )) + .get_result::(conn) + .await + } } #[cfg(test)]