Merge pull request #705 from AppFlowy-IO/order-comments-by-recency

fix: order comments by recency
This commit is contained in:
Khor Shu Heng 2024-07-26 17:20:59 +08:00 committed by GitHub
commit a81355e0f0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 22 additions and 21 deletions

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "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": { "describe": {
"columns": [ "columns": [
{ {
@ -60,5 +60,5 @@
false 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) 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, executor: E,
view_id: &Uuid, view_id: &Uuid,
) -> Result<Vec<GlobalComment>, AppError> { ) -> 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 FROM af_published_view_comment avc
LEFT OUTER JOIN af_user au ON avc.created_by = au.uid LEFT OUTER JOIN af_user au ON avc.created_by = au.uid
WHERE view_id = $1 WHERE view_id = $1
ORDER BY avc.created_at DESC
"#, "#,
view_id, view_id,
) )

View File

@ -22,7 +22,7 @@ use database::workspace::{
change_workspace_icon, delete_from_workspace, delete_published_collabs, delete_workspace_members, 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, 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, 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_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_allowed_to_delete_comment, select_user_is_collab_publisher_for_all_views,
select_user_is_workspace_owner, select_workspace, select_workspace_invitations_for_user, 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, pg_pool: &PgPool,
view_id: &Uuid, view_id: &Uuid,
) -> Result<Vec<GlobalComment>, AppError> { ) -> 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) Ok(comments)
} }

View File

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