Merge pull request #705 from AppFlowy-IO/order-comments-by-recency
fix: order comments by recency
This commit is contained in:
commit
a81355e0f0
|
|
@ -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"
|
||||||
}
|
}
|
||||||
|
|
@ -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,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue