fix: order comments by recency

This commit is contained in:
Khor Shu Heng 2024-07-26 16:28:35 +08:00
parent 762e558d72
commit 122520e9f4
4 changed files with 22 additions and 21 deletions

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT\n avc.comment_id,\n avc.created_at,\n avc.updated_at,\n avc.content,\n avc.reply_comment_id,\n avc.is_deleted,\n au.uuid AS \"user_uuid?\",\n au.name AS \"user_name?\"\n FROM af_published_view_comment avc\n LEFT OUTER JOIN af_user au ON avc.created_by = au.uid\n WHERE view_id = $1\n ",
"query": "\n SELECT\n avc.comment_id,\n avc.created_at,\n avc.updated_at,\n avc.content,\n avc.reply_comment_id,\n avc.is_deleted,\n au.uuid AS \"user_uuid?\",\n au.name AS \"user_name?\"\n FROM af_published_view_comment avc\n LEFT OUTER JOIN af_user au ON avc.created_by = au.uid\n WHERE view_id = $1\n ORDER BY avc.created_at DESC\n ",
"describe": {
"columns": [
{
@ -60,5 +60,5 @@
false
]
},
"hash": "c2e4e6e5db677977c00654223532cadaec9513b76f79965d591cf5bf5cc68707"
"hash": "ba86638be27dfdf52e157e07e3e22ccb5547a7815b8313b241b8b535a83e6ff1"
}

View File

@ -1118,7 +1118,10 @@ pub async fn select_published_collab_info<'a, E: Executor<'a, Database = Postgre
Ok(res)
}
pub async fn select_comments_for_published_view<'a, E: Executor<'a, Database = Postgres>>(
pub async fn select_comments_for_published_view_orderd_by_recency<
'a,
E: Executor<'a, Database = Postgres>,
>(
executor: E,
view_id: &Uuid,
) -> Result<Vec<GlobalComment>, AppError> {
@ -1136,6 +1139,7 @@ pub async fn select_comments_for_published_view<'a, E: Executor<'a, Database = P
FROM af_published_view_comment avc
LEFT OUTER JOIN af_user au ON avc.created_by = au.uid
WHERE view_id = $1
ORDER BY avc.created_at DESC
"#,
view_id,
)

View File

@ -22,7 +22,7 @@ use database::workspace::{
change_workspace_icon, delete_from_workspace, delete_published_collabs, delete_workspace_members,
get_invitation_by_id, insert_comment_to_published_view, insert_or_replace_publish_collab_metas,
insert_user_workspace, insert_workspace_invitation, rename_workspace, select_all_user_workspaces,
select_comments_for_published_view, select_member_count_for_workspaces,
select_comments_for_published_view_orderd_by_recency, select_member_count_for_workspaces,
select_publish_collab_meta, select_published_collab_blob, select_published_collab_info,
select_user_is_allowed_to_delete_comment, select_user_is_collab_publisher_for_all_views,
select_user_is_workspace_owner, select_workspace, select_workspace_invitations_for_user,
@ -180,7 +180,7 @@ pub async fn get_comments_on_published_view(
pg_pool: &PgPool,
view_id: &Uuid,
) -> Result<Vec<GlobalComment>, AppError> {
let comments = select_comments_for_published_view(pg_pool, view_id).await?;
let comments = select_comments_for_published_view_orderd_by_recency(pg_pool, view_id).await?;
Ok(comments)
}

View File

@ -279,7 +279,7 @@ async fn test_publish_comments() {
.unwrap()
.comments;
assert_eq!(published_view_comments.len(), 2);
let mut published_view_comments: Vec<GlobalComment> = guest_client
let published_view_comments: Vec<GlobalComment> = guest_client
.get_published_view_comments(&view_id)
.await
.unwrap()
@ -287,8 +287,7 @@ async fn test_publish_comments() {
assert_eq!(published_view_comments.len(), 2);
assert!(published_view_comments.iter().all(|c| !c.is_deleted));
// Test if the comments have the correct content when sorted by creation time
published_view_comments.sort_by_key(|c| c.created_at);
// Test if the comments are correctly sorted
let comment_creators = published_view_comments
.iter()
.map(|c| {
@ -300,7 +299,7 @@ async fn test_publish_comments() {
.collect_vec();
assert_eq!(
comment_creators,
vec![page_owner.email.clone(), first_user.email.clone()]
vec![first_user.email.clone(), page_owner.email.clone()]
);
let comment_content = published_view_comments
.iter()
@ -308,7 +307,7 @@ async fn test_publish_comments() {
.collect_vec();
assert_eq!(
comment_content,
vec![page_owner_comment_content, first_user_comment_content]
vec![first_user_comment_content, page_owner_comment_content]
);
// Test if it's possible to reply to another user's comment
@ -319,16 +318,15 @@ async fn test_publish_comments() {
.create_comment_on_published_view(
&view_id,
second_user_comment_content,
&Some(published_view_comments[1].comment_id),
&Some(published_view_comments[0].comment_id),
)
.await
.unwrap();
let mut published_view_comments: Vec<GlobalComment> = guest_client
let published_view_comments: Vec<GlobalComment> = guest_client
.get_published_view_comments(&view_id)
.await
.unwrap()
.comments;
published_view_comments.sort_by_key(|c| c.created_at);
let comment_creators = published_view_comments
.iter()
.map(|c| {
@ -341,20 +339,20 @@ async fn test_publish_comments() {
assert_eq!(
comment_creators,
vec![
page_owner.email.clone(),
second_user.email.clone(),
first_user.email.clone(),
second_user.email.clone()
page_owner.email.clone()
]
);
assert_eq!(
published_view_comments[2].reply_comment_id,
published_view_comments[0].reply_comment_id,
Some(published_view_comments[1].comment_id)
);
// Test if only the page owner or the comment creator can delete a comment
// User 1 attempt to delete page owner's comment
let result = first_user_client
.delete_comment_on_published_view(&view_id, &published_view_comments[0].comment_id)
.delete_comment_on_published_view(&view_id, &published_view_comments[2].comment_id)
.await;
assert!(result.is_err());
assert_eq!(result.unwrap_err().code, ErrorCode::UserUnAuthorized);
@ -365,17 +363,16 @@ async fn test_publish_comments() {
.unwrap();
// Guest client attempt to delete user 2's comment
let result = guest_client
.delete_comment_on_published_view(&view_id, &published_view_comments[2].comment_id)
.delete_comment_on_published_view(&view_id, &published_view_comments[0].comment_id)
.await;
assert!(result.is_err());
assert_eq!(result.unwrap_err().code, ErrorCode::NotLoggedIn);
// Verify that the comments are not deleted from the database, only the is_deleted status changes.
let mut published_view_comments: Vec<GlobalComment> = guest_client
let published_view_comments: Vec<GlobalComment> = guest_client
.get_published_view_comments(&view_id)
.await
.unwrap()
.comments;
published_view_comments.sort_by_key(|c| c.created_at);
assert_eq!(
published_view_comments
.iter()
@ -385,7 +382,7 @@ async fn test_publish_comments() {
);
// Verify that the reference id is still preserved
assert_eq!(
published_view_comments[2].reply_comment_id,
published_view_comments[0].reply_comment_id,
Some(published_view_comments[1].comment_id)
);