diff --git a/.sqlx/query-c2e4e6e5db677977c00654223532cadaec9513b76f79965d591cf5bf5cc68707.json b/.sqlx/query-ba86638be27dfdf52e157e07e3e22ccb5547a7815b8313b241b8b535a83e6ff1.json similarity index 92% rename from .sqlx/query-c2e4e6e5db677977c00654223532cadaec9513b76f79965d591cf5bf5cc68707.json rename to .sqlx/query-ba86638be27dfdf52e157e07e3e22ccb5547a7815b8313b241b8b535a83e6ff1.json index a49cfc46..9cc3cf81 100644 --- a/.sqlx/query-c2e4e6e5db677977c00654223532cadaec9513b76f79965d591cf5bf5cc68707.json +++ b/.sqlx/query-ba86638be27dfdf52e157e07e3e22ccb5547a7815b8313b241b8b535a83e6ff1.json @@ -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" } diff --git a/libs/database/src/workspace.rs b/libs/database/src/workspace.rs index 2a5d8fff..cde624aa 100644 --- a/libs/database/src/workspace.rs +++ b/libs/database/src/workspace.rs @@ -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, 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, ) diff --git a/src/biz/workspace/ops.rs b/src/biz/workspace/ops.rs index 8b163809..50c7594f 100644 --- a/src/biz/workspace/ops.rs +++ b/src/biz/workspace/ops.rs @@ -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, 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) } diff --git a/tests/workspace/publish.rs b/tests/workspace/publish.rs index d91ba26f..383e48f5 100644 --- a/tests/workspace/publish.rs +++ b/tests/workspace/publish.rs @@ -279,7 +279,7 @@ async fn test_publish_comments() { .unwrap() .comments; assert_eq!(published_view_comments.len(), 2); - let mut published_view_comments: Vec = guest_client + let published_view_comments: Vec = 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 = guest_client + let published_view_comments: Vec = 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 = guest_client + let published_view_comments: Vec = 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) );