Admins can view all reports. Fixes #1810 (#1825)
authorDessalines <dessalines@users.noreply.github.com>
Tue, 12 Oct 2021 12:02:16 +0000 (08:02 -0400)
committerGitHub <noreply@github.com>
Tue, 12 Oct 2021 12:02:16 +0000 (12:02 +0000)
crates/api/src/comment_report.rs
crates/api/src/local_user.rs
crates/api/src/post_report.rs
crates/db_views/src/comment_report_view.rs
crates/db_views/src/post_report_view.rs

index 32a4a5d9b8ef078ada09161ff39580af70b4abe5..67bc42acc00fc16e3d830e51b3f94f111070207c 100644 (file)
@@ -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)
index 1d4f27b28676a8f0eef9c268b16aec7ae210a14b..930be955de83cce4ae7b2770f6730ee07f8d98ee 100644 (file)
@@ -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??;
 
index 25af96ba6e63bd4275357e75b941f4b181da6675..8f5c72afa5e0ec0a1713758231f081434eeeae2c 100644 (file)
@@ -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)
index 497dec6d62ba197d2a554b781ed6c366496332f9..682eaaa5a20e211031557fe84188745de6ac57a2 100644 (file)
@@ -141,15 +141,11 @@ impl CommentReportView {
     })
   }
 
-  /// returns the current unresolved post report count for the supplied community ids
-  ///
-  /// * `community_ids` - a Vec<i32> 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<CommunityId>,
   ) -> Result<i64, Error> {
     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<CommunityId>,
   page: Option<i64>,
   limit: Option<i64>,
@@ -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();
index b7becdbc5615589f28e444b932137d23d6852307..de587c7c87b489c28a88c5e8452047c059fd7451 100644 (file)
@@ -127,14 +127,11 @@ impl PostReportView {
     })
   }
 
-  /// returns the current unresolved post report count for the supplied community ids
-  ///
-  /// * `community_ids` - a Vec<i32> 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<CommunityId>,
   ) -> Result<i64, Error> {
     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<CommunityId>,
   page: Option<i64>,
   limit: Option<i64>,
@@ -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();