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
This commit is contained in:
Sander Saarend 2023-06-20 11:52:51 +03:00 committed by GitHub
parent d97ff65fe1
commit e23621c2cd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 40 additions and 2 deletions

View file

@ -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?;

View file

@ -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(())
}
}

View file

@ -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::<Self>(conn)
.await
}
pub async fn update_hot_rank(pool: &DbPool, comment_id: CommentId) -> Result<Self, Error> {
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::<Self>(conn)
.await
}
}
#[cfg(test)]

View file

@ -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::<Self>(conn)
.await
}
pub async fn update_hot_rank(pool: &DbPool, post_id: PostId) -> Result<Self, Error> {
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::<Self>(conn)
.await
}
}
#[cfg(test)]