]> Untitled Git - lemmy.git/blobdiff - crates/api/src/site/mod_log.rs
Make functions work with both connection and pool (#3420)
[lemmy.git] / crates / api / src / site / mod_log.rs
index 45335d5d383140f169281998d7034bd6d1a737e9..a06689804b04461f29cb3303e03ce1cedb006411 100644 (file)
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   site::{GetModlog, GetModlogResponse},
-  utils::{blocking, check_private_instance, get_local_user_view_from_jwt_opt},
+  utils::{check_private_instance, is_admin, is_mod_or_admin, local_user_view_from_jwt_opt},
+};
+use lemmy_db_schema::{
+  newtypes::{CommunityId, PersonId},
+  source::local_site::LocalSite,
+  ModlogActionType,
 };
 use lemmy_db_views_moderator::structs::{
+  AdminPurgeCommentView,
+  AdminPurgeCommunityView,
+  AdminPurgePersonView,
+  AdminPurgePostView,
   ModAddCommunityView,
   ModAddView,
   ModBanFromCommunityView,
   ModBanView,
+  ModFeaturePostView,
   ModHideCommunityView,
   ModLockPostView,
   ModRemoveCommentView,
   ModRemoveCommunityView,
   ModRemovePostView,
-  ModStickyPostView,
   ModTransferCommunityView,
+  ModlogListParams,
 };
-use lemmy_utils::{ConnectionId, LemmyError};
-use lemmy_websocket::LemmyContext;
+use lemmy_utils::error::LemmyError;
+use ModlogActionType::*;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for GetModlog {
   type Response = GetModlogResponse;
 
-  #[tracing::instrument(skip(context, _websocket_id))]
-  async fn perform(
-    &self,
-    context: &Data<LemmyContext>,
-    _websocket_id: Option<ConnectionId>,
-  ) -> Result<GetModlogResponse, LemmyError> {
+  #[tracing::instrument(skip(context))]
+  async fn perform(&self, context: &Data<LemmyContext>) -> Result<GetModlogResponse, LemmyError> {
     let data: &GetModlog = self;
 
-    let local_user_view =
-      get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret())
-        .await?;
+    let local_user_view = local_user_view_from_jwt_opt(data.auth.as_ref(), context).await;
+    let local_site = LocalSite::read(&mut context.pool()).await?;
 
-    check_private_instance(&local_user_view, context.pool()).await?;
+    check_private_instance(&local_user_view, &local_site)?;
 
+    let type_ = data.type_.unwrap_or(All);
     let community_id = data.community_id;
-    let mod_person_id = data.mod_person_id;
-    let page = data.page;
-    let limit = data.limit;
-    let removed_posts = blocking(context.pool(), move |conn| {
-      ModRemovePostView::list(conn, community_id, mod_person_id, page, limit)
-    })
-    .await??;
 
-    let locked_posts = blocking(context.pool(), move |conn| {
-      ModLockPostView::list(conn, community_id, mod_person_id, page, limit)
-    })
-    .await??;
+    let (local_person_id, is_admin) = match local_user_view {
+      Some(s) => (s.person.id, is_admin(&s).is_ok()),
+      None => (PersonId(-1), false),
+    };
+    let community_id_value = match community_id {
+      Some(s) => s,
+      None => CommunityId(-1),
+    };
+    let is_mod_of_community = data.community_id.is_some()
+      && is_mod_or_admin(&mut context.pool(), local_person_id, community_id_value)
+        .await
+        .is_ok();
+    let hide_modlog_names = local_site.hide_modlog_mod_names && !is_mod_of_community && !is_admin;
 
-    let stickied_posts = blocking(context.pool(), move |conn| {
-      ModStickyPostView::list(conn, community_id, mod_person_id, page, limit)
-    })
-    .await??;
+    let mod_person_id = if hide_modlog_names {
+      None
+    } else {
+      data.mod_person_id
+    };
+    let other_person_id = data.other_person_id;
+    let params = ModlogListParams {
+      community_id,
+      mod_person_id,
+      other_person_id,
+      page: data.page,
+      limit: data.limit,
+      hide_modlog_names,
+    };
+    let removed_posts = match type_ {
+      All | ModRemovePost => ModRemovePostView::list(&mut context.pool(), params).await?,
+      _ => Default::default(),
+    };
 
-    let removed_comments = blocking(context.pool(), move |conn| {
-      ModRemoveCommentView::list(conn, community_id, mod_person_id, page, limit)
-    })
-    .await??;
+    let locked_posts = match type_ {
+      All | ModLockPost => ModLockPostView::list(&mut context.pool(), params).await?,
+      _ => Default::default(),
+    };
 
-    let banned_from_community = blocking(context.pool(), move |conn| {
-      ModBanFromCommunityView::list(conn, community_id, mod_person_id, page, limit)
-    })
-    .await??;
+    let featured_posts = match type_ {
+      All | ModFeaturePost => ModFeaturePostView::list(&mut context.pool(), params).await?,
+      _ => Default::default(),
+    };
 
-    let added_to_community = blocking(context.pool(), move |conn| {
-      ModAddCommunityView::list(conn, community_id, mod_person_id, page, limit)
-    })
-    .await??;
+    let removed_comments = match type_ {
+      All | ModRemoveComment => ModRemoveCommentView::list(&mut context.pool(), params).await?,
+      _ => Default::default(),
+    };
 
-    let transferred_to_community = blocking(context.pool(), move |conn| {
-      ModTransferCommunityView::list(conn, community_id, mod_person_id, page, limit)
-    })
-    .await??;
+    let banned_from_community = match type_ {
+      All | ModBanFromCommunity => {
+        ModBanFromCommunityView::list(&mut context.pool(), params).await?
+      }
+      _ => Default::default(),
+    };
 
-    let hidden_communities = blocking(context.pool(), move |conn| {
-      ModHideCommunityView::list(conn, community_id, mod_person_id, page, limit)
-    })
-    .await??;
+    let added_to_community = match type_ {
+      All | ModAddCommunity => ModAddCommunityView::list(&mut context.pool(), params).await?,
+      _ => Default::default(),
+    };
+
+    let transferred_to_community = match type_ {
+      All | ModTransferCommunity => {
+        ModTransferCommunityView::list(&mut context.pool(), params).await?
+      }
+      _ => Default::default(),
+    };
+
+    let hidden_communities = match type_ {
+      All | ModHideCommunity if other_person_id.is_none() => {
+        ModHideCommunityView::list(&mut context.pool(), params).await?
+      }
+      _ => Default::default(),
+    };
 
     // These arrays are only for the full modlog, when a community isn't given
-    let (removed_communities, banned, added) = if data.community_id.is_none() {
-      blocking(context.pool(), move |conn| {
-        Ok((
-          ModRemoveCommunityView::list(conn, mod_person_id, page, limit)?,
-          ModBanView::list(conn, mod_person_id, page, limit)?,
-          ModAddView::list(conn, mod_person_id, page, limit)?,
-        )) as Result<_, LemmyError>
-      })
-      .await??
+    let (
+      banned,
+      added,
+      removed_communities,
+      admin_purged_persons,
+      admin_purged_communities,
+      admin_purged_posts,
+      admin_purged_comments,
+    ) = if data.community_id.is_none() {
+      (
+        match type_ {
+          All | ModBan => ModBanView::list(&mut context.pool(), params).await?,
+          _ => Default::default(),
+        },
+        match type_ {
+          All | ModAdd => ModAddView::list(&mut context.pool(), params).await?,
+          _ => Default::default(),
+        },
+        match type_ {
+          All | ModRemoveCommunity if other_person_id.is_none() => {
+            ModRemoveCommunityView::list(&mut context.pool(), params).await?
+          }
+          _ => Default::default(),
+        },
+        match type_ {
+          All | AdminPurgePerson if other_person_id.is_none() => {
+            AdminPurgePersonView::list(&mut context.pool(), params).await?
+          }
+          _ => Default::default(),
+        },
+        match type_ {
+          All | AdminPurgeCommunity if other_person_id.is_none() => {
+            AdminPurgeCommunityView::list(&mut context.pool(), params).await?
+          }
+          _ => Default::default(),
+        },
+        match type_ {
+          All | AdminPurgePost if other_person_id.is_none() => {
+            AdminPurgePostView::list(&mut context.pool(), params).await?
+          }
+          _ => Default::default(),
+        },
+        match type_ {
+          All | AdminPurgeComment if other_person_id.is_none() => {
+            AdminPurgeCommentView::list(&mut context.pool(), params).await?
+          }
+          _ => Default::default(),
+        },
+      )
     } else {
-      (Vec::new(), Vec::new(), Vec::new())
+      Default::default()
     };
 
     // Return the jwt
     Ok(GetModlogResponse {
       removed_posts,
       locked_posts,
-      stickied_posts,
+      featured_posts,
       removed_comments,
       removed_communities,
       banned_from_community,
@@ -108,6 +187,10 @@ impl Perform for GetModlog {
       added_to_community,
       added,
       transferred_to_community,
+      admin_purged_persons,
+      admin_purged_communities,
+      admin_purged_posts,
+      admin_purged_comments,
       hidden_communities,
     })
   }