2 use actix_web::web::Data;
3 use lemmy_api_common::{
5 site::{GetModlog, GetModlogResponse},
6 utils::{check_private_instance, is_admin, is_mod_or_admin, local_user_view_from_jwt_opt},
9 newtypes::{CommunityId, PersonId},
10 source::local_site::LocalSite,
13 use lemmy_db_views_moderator::structs::{
14 AdminPurgeCommentView,
15 AdminPurgeCommunityView,
20 ModBanFromCommunityView,
26 ModRemoveCommunityView,
28 ModTransferCommunityView,
31 use lemmy_utils::error::LemmyError;
32 use ModlogActionType::*;
34 #[async_trait::async_trait(?Send)]
35 impl Perform for GetModlog {
36 type Response = GetModlogResponse;
38 #[tracing::instrument(skip(context))]
39 async fn perform(&self, context: &Data<LemmyContext>) -> Result<GetModlogResponse, LemmyError> {
40 let data: &GetModlog = self;
42 let local_user_view = local_user_view_from_jwt_opt(data.auth.as_ref(), context).await;
43 let local_site = LocalSite::read(context.pool()).await?;
45 check_private_instance(&local_user_view, &local_site)?;
47 let type_ = data.type_.unwrap_or(All);
48 let community_id = data.community_id;
50 let (local_person_id, is_admin) = match local_user_view {
51 Some(s) => (s.person.id, is_admin(&s).is_ok()),
52 None => (PersonId(-1), false),
54 let community_id_value = match community_id {
56 None => CommunityId(-1),
58 let is_mod_of_community = data.community_id.is_some()
59 && is_mod_or_admin(context.pool(), local_person_id, community_id_value)
62 let hide_modlog_names = local_site.hide_modlog_mod_names && !is_mod_of_community && !is_admin;
64 let mod_person_id = if hide_modlog_names {
69 let other_person_id = data.other_person_id;
70 let params = ModlogListParams {
78 let removed_posts = match type_ {
79 All | ModRemovePost => ModRemovePostView::list(context.pool(), params).await?,
80 _ => Default::default(),
83 let locked_posts = match type_ {
84 All | ModLockPost => ModLockPostView::list(context.pool(), params).await?,
85 _ => Default::default(),
88 let featured_posts = match type_ {
89 All | ModFeaturePost => ModFeaturePostView::list(context.pool(), params).await?,
90 _ => Default::default(),
93 let removed_comments = match type_ {
94 All | ModRemoveComment => ModRemoveCommentView::list(context.pool(), params).await?,
95 _ => Default::default(),
98 let banned_from_community = match type_ {
99 All | ModBanFromCommunity => ModBanFromCommunityView::list(context.pool(), params).await?,
100 _ => Default::default(),
103 let added_to_community = match type_ {
104 All | ModAddCommunity => ModAddCommunityView::list(context.pool(), params).await?,
105 _ => Default::default(),
108 let transferred_to_community = match type_ {
109 All | ModTransferCommunity => ModTransferCommunityView::list(context.pool(), params).await?,
110 _ => Default::default(),
113 let hidden_communities = match type_ {
114 All | ModHideCommunity if other_person_id.is_none() => {
115 ModHideCommunityView::list(context.pool(), params).await?
117 _ => Default::default(),
120 // These arrays are only for the full modlog, when a community isn't given
125 admin_purged_persons,
126 admin_purged_communities,
128 admin_purged_comments,
129 ) = if data.community_id.is_none() {
132 All | ModBan => ModBanView::list(context.pool(), params).await?,
133 _ => Default::default(),
136 All | ModAdd => ModAddView::list(context.pool(), params).await?,
137 _ => Default::default(),
140 All | ModRemoveCommunity if other_person_id.is_none() => {
141 ModRemoveCommunityView::list(context.pool(), params).await?
143 _ => Default::default(),
146 All | AdminPurgePerson if other_person_id.is_none() => {
147 AdminPurgePersonView::list(context.pool(), params).await?
149 _ => Default::default(),
152 All | AdminPurgeCommunity if other_person_id.is_none() => {
153 AdminPurgeCommunityView::list(context.pool(), params).await?
155 _ => Default::default(),
158 All | AdminPurgePost if other_person_id.is_none() => {
159 AdminPurgePostView::list(context.pool(), params).await?
161 _ => Default::default(),
164 All | AdminPurgeComment if other_person_id.is_none() => {
165 AdminPurgeCommentView::list(context.pool(), params).await?
167 _ => Default::default(),
175 Ok(GetModlogResponse {
181 banned_from_community,
185 transferred_to_community,
186 admin_purged_persons,
187 admin_purged_communities,
189 admin_purged_comments,