From 61f22cc670676643e9d09646c503af54c9d99518 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Fri, 8 Oct 2021 00:50:42 -0400 Subject: [PATCH] Admins can view all reports. Fixes #1810 --- crates/api/src/comment_report.rs | 3 +- crates/api/src/local_user.rs | 5 ++- crates/api/src/post_report.rs | 3 +- crates/db_views/src/comment_report_view.rs | 44 +++++++++++----------- crates/db_views/src/post_report_view.rs | 43 ++++++++++----------- 5 files changed, 51 insertions(+), 47 deletions(-) diff --git a/crates/api/src/comment_report.rs b/crates/api/src/comment_report.rs index 32a4a5d9b..67bc42acc 100644 --- a/crates/api/src/comment_report.rs +++ b/crates/api/src/comment_report.rs @@ -155,13 +155,14 @@ impl Perform for ListCommentReports { get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; let person_id = local_user_view.person.id; + let admin = local_user_view.person.admin; let community_id = data.community_id; let unresolved_only = data.unresolved_only; let page = data.page; let limit = data.limit; let comment_reports = blocking(context.pool(), move |conn| { - CommentReportQueryBuilder::create(conn, person_id) + CommentReportQueryBuilder::create(conn, person_id, admin) .community_id(community_id) .unresolved_only(unresolved_only) .page(page) diff --git a/crates/api/src/local_user.rs b/crates/api/src/local_user.rs index 1d4f27b28..930be955d 100644 --- a/crates/api/src/local_user.rs +++ b/crates/api/src/local_user.rs @@ -822,15 +822,16 @@ impl Perform for GetReportCount { get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; let person_id = local_user_view.person.id; + let admin = local_user_view.person.admin; let community_id = data.community_id; let comment_reports = blocking(context.pool(), move |conn| { - CommentReportView::get_report_count(conn, person_id, community_id) + CommentReportView::get_report_count(conn, person_id, admin, community_id) }) .await??; let post_reports = blocking(context.pool(), move |conn| { - PostReportView::get_report_count(conn, person_id, community_id) + PostReportView::get_report_count(conn, person_id, admin, community_id) }) .await??; diff --git a/crates/api/src/post_report.rs b/crates/api/src/post_report.rs index 25af96ba6..8f5c72afa 100644 --- a/crates/api/src/post_report.rs +++ b/crates/api/src/post_report.rs @@ -158,13 +158,14 @@ impl Perform for ListPostReports { get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; let person_id = local_user_view.person.id; + let admin = local_user_view.person.admin; let community_id = data.community_id; let unresolved_only = data.unresolved_only; let page = data.page; let limit = data.limit; let post_reports = blocking(context.pool(), move |conn| { - PostReportQueryBuilder::create(conn, person_id) + PostReportQueryBuilder::create(conn, person_id, admin) .community_id(community_id) .unresolved_only(unresolved_only) .page(page) diff --git a/crates/db_views/src/comment_report_view.rs b/crates/db_views/src/comment_report_view.rs index 497dec6d6..682eaaa5a 100644 --- a/crates/db_views/src/comment_report_view.rs +++ b/crates/db_views/src/comment_report_view.rs @@ -141,15 +141,11 @@ impl CommentReportView { }) } - /// returns the current unresolved post report count for the supplied community ids - /// - /// * `community_ids` - a Vec of community_ids to get a count for - /// TODO this eq_any is a bad way to do this, would be better to join to communitymoderator - /// TODO FIX THIS NOW - /// for a person id + /// Returns the current unresolved post report count for the communities you mod pub fn get_report_count( conn: &PgConnection, my_person_id: PersonId, + admin: bool, community_id: Option, ) -> Result { use diesel::dsl::*; @@ -157,17 +153,17 @@ impl CommentReportView { let mut query = comment_report::table .inner_join(comment::table) .inner_join(post::table.on(comment::post_id.eq(post::id))) - // Test this join .inner_join( - community_moderator::table.on( - community_moderator::community_id - .eq(post::community_id) - .and(community_moderator::person_id.eq(my_person_id)), - ), + community_moderator::table.on(community_moderator::community_id.eq(post::community_id)), ) .filter(comment_report::resolved.eq(false)) .into_boxed(); + // If its not an admin, get only the ones you mod + if !admin { + query = query.filter(community_moderator::person_id.eq(my_person_id)); + } + if let Some(community_id) = community_id { query = query.filter(post::community_id.eq(community_id)) } @@ -179,6 +175,7 @@ impl CommentReportView { pub struct CommentReportQueryBuilder<'a> { conn: &'a PgConnection, my_person_id: PersonId, + admin: bool, community_id: Option, page: Option, limit: Option, @@ -186,10 +183,11 @@ pub struct CommentReportQueryBuilder<'a> { } impl<'a> CommentReportQueryBuilder<'a> { - pub fn create(conn: &'a PgConnection, my_person_id: PersonId) -> Self { + pub fn create(conn: &'a PgConnection, my_person_id: PersonId, admin: bool) -> Self { CommentReportQueryBuilder { conn, my_person_id, + admin, community_id: None, page: None, limit: None, @@ -226,11 +224,7 @@ impl<'a> CommentReportQueryBuilder<'a> { .inner_join(person_alias_1::table.on(post::creator_id.eq(person_alias_1::id))) // Test this join .inner_join( - community_moderator::table.on( - community_moderator::community_id - .eq(post::community_id) - .and(community_moderator::person_id.eq(self.my_person_id)), - ), + community_moderator::table.on(community_moderator::community_id.eq(post::community_id)), ) .inner_join( comment_aggregates::table.on(comment_report::comment_id.eq(comment_aggregates::comment_id)), @@ -266,6 +260,11 @@ impl<'a> CommentReportQueryBuilder<'a> { )) .into_boxed(); + // If its not an admin, get only the ones you mod + if !self.admin { + query = query.filter(community_moderator::person_id.eq(self.my_person_id)); + } + if let Some(community_id) = self.community_id { query = query.filter(post::community_id.eq(community_id)); } @@ -500,7 +499,7 @@ mod tests { }; // Do a batch read of timmys reports - let reports = CommentReportQueryBuilder::create(&conn, inserted_timmy.id) + let reports = CommentReportQueryBuilder::create(&conn, inserted_timmy.id, false) .list() .unwrap(); @@ -513,7 +512,8 @@ mod tests { ); // Make sure the counts are correct - let report_count = CommentReportView::get_report_count(&conn, inserted_timmy.id, None).unwrap(); + let report_count = + CommentReportView::get_report_count(&conn, inserted_timmy.id, false, None).unwrap(); assert_eq!(2, report_count); // Try to resolve the report @@ -560,14 +560,14 @@ mod tests { // Do a batch read of timmys reports // It should only show saras, which is unresolved - let reports_after_resolve = CommentReportQueryBuilder::create(&conn, inserted_timmy.id) + let reports_after_resolve = CommentReportQueryBuilder::create(&conn, inserted_timmy.id, false) .list() .unwrap(); assert_eq!(reports_after_resolve[0], expected_sara_report_view); // Make sure the counts are correct let report_count_after_resolved = - CommentReportView::get_report_count(&conn, inserted_timmy.id, None).unwrap(); + CommentReportView::get_report_count(&conn, inserted_timmy.id, false, None).unwrap(); assert_eq!(1, report_count_after_resolved); Person::delete(&conn, inserted_timmy.id).unwrap(); diff --git a/crates/db_views/src/post_report_view.rs b/crates/db_views/src/post_report_view.rs index b7becdbc5..de587c7c8 100644 --- a/crates/db_views/src/post_report_view.rs +++ b/crates/db_views/src/post_report_view.rs @@ -127,14 +127,11 @@ impl PostReportView { }) } - /// returns the current unresolved post report count for the supplied community ids - /// - /// * `community_ids` - a Vec of community_ids to get a count for - /// TODO this eq_any is a bad way to do this, would be better to join to communitymoderator - /// for a person id + /// returns the current unresolved post report count for the communities you mod pub fn get_report_count( conn: &PgConnection, my_person_id: PersonId, + admin: bool, community_id: Option, ) -> Result { use diesel::dsl::*; @@ -142,15 +139,16 @@ impl PostReportView { .inner_join(post::table) // Test this join .inner_join( - community_moderator::table.on( - community_moderator::community_id - .eq(post::community_id) - .and(community_moderator::person_id.eq(my_person_id)), - ), + community_moderator::table.on(community_moderator::community_id.eq(post::community_id)), ) .filter(post_report::resolved.eq(false)) .into_boxed(); + // If its not an admin, get only the ones you mod + if !admin { + query = query.filter(community_moderator::person_id.eq(my_person_id)); + } + if let Some(community_id) = community_id { query = query.filter(post::community_id.eq(community_id)) } @@ -162,6 +160,7 @@ impl PostReportView { pub struct PostReportQueryBuilder<'a> { conn: &'a PgConnection, my_person_id: PersonId, + admin: bool, community_id: Option, page: Option, limit: Option, @@ -169,10 +168,11 @@ pub struct PostReportQueryBuilder<'a> { } impl<'a> PostReportQueryBuilder<'a> { - pub fn create(conn: &'a PgConnection, my_person_id: PersonId) -> Self { + pub fn create(conn: &'a PgConnection, my_person_id: PersonId, admin: bool) -> Self { PostReportQueryBuilder { conn, my_person_id, + admin, community_id: None, page: None, limit: None, @@ -206,13 +206,8 @@ impl<'a> PostReportQueryBuilder<'a> { .inner_join(community::table.on(post::community_id.eq(community::id))) .inner_join(person::table.on(post_report::creator_id.eq(person::id))) .inner_join(person_alias_1::table.on(post::creator_id.eq(person_alias_1::id))) - // Test this join .inner_join( - community_moderator::table.on( - community_moderator::community_id - .eq(post::community_id) - .and(community_moderator::person_id.eq(self.my_person_id)), - ), + community_moderator::table.on(community_moderator::community_id.eq(post::community_id)), ) .left_join( community_person_ban::table.on( @@ -245,6 +240,11 @@ impl<'a> PostReportQueryBuilder<'a> { )) .into_boxed(); + // If its not an admin, get only the ones you mod + if !self.admin { + query = query.filter(community_moderator::person_id.eq(self.my_person_id)); + } + if let Some(community_id) = self.community_id { query = query.filter(post::community_id.eq(community_id)); } @@ -482,7 +482,7 @@ mod tests { }; // Do a batch read of timmys reports - let reports = PostReportQueryBuilder::create(&conn, inserted_timmy.id) + let reports = PostReportQueryBuilder::create(&conn, inserted_timmy.id, false) .list() .unwrap(); @@ -495,7 +495,8 @@ mod tests { ); // Make sure the counts are correct - let report_count = PostReportView::get_report_count(&conn, inserted_timmy.id, None).unwrap(); + let report_count = + PostReportView::get_report_count(&conn, inserted_timmy.id, false, None).unwrap(); assert_eq!(2, report_count); // Try to resolve the report @@ -540,14 +541,14 @@ mod tests { // Do a batch read of timmys reports // It should only show saras, which is unresolved - let reports_after_resolve = PostReportQueryBuilder::create(&conn, inserted_timmy.id) + let reports_after_resolve = PostReportQueryBuilder::create(&conn, inserted_timmy.id, false) .list() .unwrap(); assert_eq!(reports_after_resolve[0], expected_sara_report_view); // Make sure the counts are correct let report_count_after_resolved = - PostReportView::get_report_count(&conn, inserted_timmy.id, None).unwrap(); + PostReportView::get_report_count(&conn, inserted_timmy.id, false, None).unwrap(); assert_eq!(1, report_count_after_resolved); Person::delete(&conn, inserted_timmy.id).unwrap();