From 8a202ef4ec6208c57f7acc8555dbb38676dad65d Mon Sep 17 00:00:00 2001 From: Anon Date: Sat, 4 Jun 2022 20:53:39 -0500 Subject: [PATCH] Add support for filtering mod logs --- crates/api/src/site/mod_log.rs | 287 +++++++++++++++--- crates/api_common/src/site.rs | 5 + crates/api_crud/src/site/create.rs | 1 + crates/api_crud/src/site/update.rs | 1 + crates/db_schema/src/lib.rs | 20 ++ crates/db_schema/src/schema.rs | 1 + crates/db_schema/src/source/site.rs | 2 + .../src/admin_purge_comment_view.rs | 11 +- .../src/admin_purge_community_view.rs | 11 +- .../src/admin_purge_person_view.rs | 11 +- .../src/admin_purge_post_view.rs | 11 +- .../src/mod_add_community_view.rs | 27 +- crates/db_views_moderator/src/mod_add_view.rs | 22 +- .../src/mod_ban_from_community_view.rs | 22 +- crates/db_views_moderator/src/mod_ban_view.rs | 22 +- .../src/mod_hide_community_view.rs | 17 +- .../src/mod_lock_post_view.rs | 25 +- .../src/mod_remove_comment_view.rs | 22 +- .../src/mod_remove_community_view.rs | 17 +- .../src/mod_remove_post_view.rs | 25 +- .../src/mod_sticky_post_view.rs | 25 +- .../src/mod_transfer_community_view.rs | 22 +- crates/db_views_moderator/src/structs.rs | 30 +- .../down.sql | 1 + .../up.sql | 1 + 25 files changed, 528 insertions(+), 111 deletions(-) create mode 100644 migrations/2022-06-12-012121_add_site_hide_modlog_names/down.sql create mode 100644 migrations/2022-06-12-012121_add_site_hide_modlog_names/up.sql diff --git a/crates/api/src/site/mod_log.rs b/crates/api/src/site/mod_log.rs index a96595da9c..e63ddaa767 100644 --- a/crates/api/src/site/mod_log.rs +++ b/crates/api/src/site/mod_log.rs @@ -2,8 +2,15 @@ use crate::Perform; use actix_web::web::Data; use lemmy_api_common::{ site::{GetModlog, GetModlogResponse}, - utils::{blocking, check_private_instance, get_local_user_view_from_jwt_opt}, + utils::{ + blocking, + check_private_instance, + get_local_user_view_from_jwt_opt, + is_admin, + is_mod_or_admin, + }, }; +use lemmy_db_schema::{source::site::Site, ModlogActionType}; use lemmy_db_views_moderator::structs::{ AdminPurgeCommentView, AdminPurgeCommunityView, @@ -42,49 +49,185 @@ impl Perform for GetModlog { check_private_instance(&local_user_view, context.pool()).await?; + let type_ = data.type_.unwrap_or(ModlogActionType::All); let community_id = data.community_id; - let mod_person_id = data.mod_person_id; + + let site = blocking(context.pool(), Site::read_local_site).await??; + let is_admin = is_admin(&local_user_view.as_ref().expect("")).is_ok(); + let is_mod_of_community = data.community_id.is_some() + && is_mod_or_admin( + context.pool(), + local_user_view.expect("").person.id, + data.community_id.expect(""), + ) + .await + .is_ok(); + let hide_modlog_names = site.hide_modlog_mod_names && !is_mod_of_community && !is_admin; + + let mod_person_id = if hide_modlog_names { + None + } else { + data.mod_person_id + }; + let other_person_id = data.other_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 removed_posts = if matches!( + type_, + ModlogActionType::All | ModlogActionType::ModRemovePost + ) { + blocking(context.pool(), move |conn| { + ModRemovePostView::list( + conn, + community_id, + mod_person_id, + other_person_id, + page, + limit, + hide_modlog_names, + ) + }) + .await?? + } else { + Vec::::new() + }; - let locked_posts = blocking(context.pool(), move |conn| { - ModLockPostView::list(conn, community_id, mod_person_id, page, limit) - }) - .await??; + let locked_posts = if matches!(type_, ModlogActionType::All | ModlogActionType::ModLockPost) { + blocking(context.pool(), move |conn| { + ModLockPostView::list( + conn, + community_id, + mod_person_id, + other_person_id, + page, + limit, + hide_modlog_names, + ) + }) + .await?? + } else { + Vec::::new() + }; - let stickied_posts = blocking(context.pool(), move |conn| { - ModStickyPostView::list(conn, community_id, mod_person_id, page, limit) - }) - .await??; + let stickied_posts = if matches!( + type_, + ModlogActionType::All | ModlogActionType::ModStickyPost + ) { + blocking(context.pool(), move |conn| { + ModStickyPostView::list( + conn, + community_id, + mod_person_id, + other_person_id, + page, + limit, + hide_modlog_names, + ) + }) + .await?? + } else { + Vec::::new() + }; - let removed_comments = blocking(context.pool(), move |conn| { - ModRemoveCommentView::list(conn, community_id, mod_person_id, page, limit) - }) - .await??; + let removed_comments = if matches!( + type_, + ModlogActionType::All | ModlogActionType::ModRemoveComment + ) { + blocking(context.pool(), move |conn| { + ModRemoveCommentView::list( + conn, + community_id, + mod_person_id, + other_person_id, + page, + limit, + hide_modlog_names, + ) + }) + .await?? + } else { + Vec::::new() + }; - let banned_from_community = blocking(context.pool(), move |conn| { - ModBanFromCommunityView::list(conn, community_id, mod_person_id, page, limit) - }) - .await??; + let banned_from_community = if matches!( + type_, + ModlogActionType::All | ModlogActionType::ModBanFromCommunity + ) { + blocking(context.pool(), move |conn| { + ModBanFromCommunityView::list( + conn, + community_id, + mod_person_id, + other_person_id, + page, + limit, + hide_modlog_names, + ) + }) + .await?? + } else { + Vec::::new() + }; - let added_to_community = blocking(context.pool(), move |conn| { - ModAddCommunityView::list(conn, community_id, mod_person_id, page, limit) - }) - .await??; + let added_to_community = if matches!( + type_, + ModlogActionType::All | ModlogActionType::ModAddCommunity + ) { + blocking(context.pool(), move |conn| { + ModAddCommunityView::list( + conn, + community_id, + mod_person_id, + other_person_id, + page, + limit, + hide_modlog_names, + ) + }) + .await?? + } else { + Vec::::new() + }; - let transferred_to_community = blocking(context.pool(), move |conn| { - ModTransferCommunityView::list(conn, community_id, mod_person_id, page, limit) - }) - .await??; + let transferred_to_community = if matches!( + type_, + ModlogActionType::All | ModlogActionType::ModTransferCommunity + ) { + blocking(context.pool(), move |conn| { + ModTransferCommunityView::list( + conn, + community_id, + mod_person_id, + other_person_id, + page, + limit, + hide_modlog_names, + ) + }) + .await?? + } else { + Vec::::new() + }; - let hidden_communities = blocking(context.pool(), move |conn| { - ModHideCommunityView::list(conn, community_id, mod_person_id, page, limit) - }) - .await??; + let hidden_communities = if matches!( + type_, + ModlogActionType::All | ModlogActionType::ModHideCommunity + ) && other_person_id.is_none() + { + blocking(context.pool(), move |conn| { + ModHideCommunityView::list( + conn, + community_id, + mod_person_id, + page, + limit, + hide_modlog_names, + ) + }) + .await?? + } else { + Vec::::new() + }; // These arrays are only for the full modlog, when a community isn't given let ( @@ -98,13 +241,75 @@ impl Perform for GetModlog { ) = 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)?, - AdminPurgePersonView::list(conn, mod_person_id, page, limit)?, - AdminPurgeCommunityView::list(conn, mod_person_id, page, limit)?, - AdminPurgePostView::list(conn, mod_person_id, page, limit)?, - AdminPurgeCommentView::list(conn, mod_person_id, page, limit)?, + if matches!( + type_, + ModlogActionType::All | ModlogActionType::ModRemoveCommunity + ) && other_person_id.is_none() + { + ModRemoveCommunityView::list(conn, mod_person_id, page, limit, hide_modlog_names)? + } else { + Vec::::new() + }, + if matches!(type_, ModlogActionType::All | ModlogActionType::ModBan) { + ModBanView::list( + conn, + mod_person_id, + other_person_id, + page, + limit, + hide_modlog_names, + )? + } else { + Vec::::new() + }, + if matches!(type_, ModlogActionType::All | ModlogActionType::ModAdd) { + ModAddView::list( + conn, + mod_person_id, + other_person_id, + page, + limit, + hide_modlog_names, + )? + } else { + Vec::::new() + }, + if matches!( + type_, + ModlogActionType::All | ModlogActionType::AdminPurgePerson + ) && other_person_id.is_none() + { + AdminPurgePersonView::list(conn, mod_person_id, page, limit, hide_modlog_names)? + } else { + Vec::::new() + }, + if matches!( + type_, + ModlogActionType::All | ModlogActionType::AdminPurgeCommunity + ) && other_person_id.is_none() + { + AdminPurgeCommunityView::list(conn, mod_person_id, page, limit, hide_modlog_names)? + } else { + Vec::::new() + }, + if matches!( + type_, + ModlogActionType::All | ModlogActionType::AdminPurgePost + ) && other_person_id.is_none() + { + AdminPurgePostView::list(conn, mod_person_id, page, limit, hide_modlog_names)? + } else { + Vec::::new() + }, + if matches!( + type_, + ModlogActionType::All | ModlogActionType::AdminPurgeComment + ) && other_person_id.is_none() + { + AdminPurgeCommentView::list(conn, mod_person_id, page, limit, hide_modlog_names)? + } else { + Vec::::new() + }, )) as Result<_, LemmyError> }) .await?? diff --git a/crates/api_common/src/site.rs b/crates/api_common/src/site.rs index f61d340555..41de09c25b 100644 --- a/crates/api_common/src/site.rs +++ b/crates/api_common/src/site.rs @@ -2,6 +2,7 @@ use crate::sensitive::Sensitive; use lemmy_db_schema::{ newtypes::{CommentId, CommunityId, PersonId, PostId}, ListingType, + ModlogActionType, SearchType, SortType, }; @@ -83,6 +84,8 @@ pub struct GetModlog { pub page: Option, pub limit: Option, pub auth: Option>, + pub type_: Option, + pub other_person_id: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] @@ -122,6 +125,7 @@ pub struct CreateSite { pub default_theme: Option, pub default_post_listing_type: Option, pub auth: Sensitive, + pub hide_modlog_mod_names: Option, } #[derive(Debug, Serialize, Deserialize, Clone, Default)] @@ -143,6 +147,7 @@ pub struct EditSite { pub default_post_listing_type: Option, pub legal_information: Option, pub auth: Sensitive, + pub hide_modlog_mod_names: Option, } #[derive(Debug, Serialize, Deserialize, Clone, Default)] diff --git a/crates/api_crud/src/site/create.rs b/crates/api_crud/src/site/create.rs index 57301e1081..d2b56d61f9 100644 --- a/crates/api_crud/src/site/create.rs +++ b/crates/api_crud/src/site/create.rs @@ -77,6 +77,7 @@ impl PerformCrud for CreateSite { public_key: Some(keypair.public_key), default_theme: data.default_theme.clone(), default_post_listing_type: data.default_post_listing_type.clone(), + hide_modlog_mod_names: data.hide_modlog_mod_names, ..SiteForm::default() }; diff --git a/crates/api_crud/src/site/update.rs b/crates/api_crud/src/site/update.rs index 6e88e42ec9..96cc7db447 100644 --- a/crates/api_crud/src/site/update.rs +++ b/crates/api_crud/src/site/update.rs @@ -85,6 +85,7 @@ impl PerformCrud for EditSite { default_theme: data.default_theme.clone(), default_post_listing_type: data.default_post_listing_type.clone(), legal_information: data.legal_information.clone(), + hide_modlog_mod_names: data.hide_modlog_mod_names, ..SiteForm::default() }; diff --git a/crates/db_schema/src/lib.rs b/crates/db_schema/src/lib.rs index 5c63f393a0..e027f53e91 100644 --- a/crates/db_schema/src/lib.rs +++ b/crates/db_schema/src/lib.rs @@ -56,3 +56,23 @@ pub enum SearchType { Users, Url, } + +#[derive(EnumString, Display, Debug, Serialize, Deserialize, Clone, Copy, PartialEq)] +pub enum ModlogActionType { + All, + ModRemovePost, + ModLockPost, + ModStickyPost, + ModRemoveComment, + ModRemoveCommunity, + ModBanFromCommunity, + ModAddCommunity, + ModTransferCommunity, + ModAdd, + ModBan, + ModHideCommunity, + AdminPurgePerson, + AdminPurgeCommunity, + AdminPurgePost, + AdminPurgeComment, +} diff --git a/crates/db_schema/src/schema.rs b/crates/db_schema/src/schema.rs index 91ad72789d..6c1b11aadc 100644 --- a/crates/db_schema/src/schema.rs +++ b/crates/db_schema/src/schema.rs @@ -464,6 +464,7 @@ table! { default_theme -> Text, default_post_listing_type -> Text, legal_information -> Nullable, + hide_modlog_mod_names -> Bool, } } diff --git a/crates/db_schema/src/source/site.rs b/crates/db_schema/src/source/site.rs index 9ba8697527..a7d1867231 100644 --- a/crates/db_schema/src/source/site.rs +++ b/crates/db_schema/src/source/site.rs @@ -32,6 +32,7 @@ pub struct Site { pub default_theme: String, pub default_post_listing_type: String, pub legal_information: Option, + pub hide_modlog_mod_names: bool, } #[derive(Default)] @@ -61,4 +62,5 @@ pub struct SiteForm { pub default_theme: Option, pub default_post_listing_type: Option, pub legal_information: Option, + pub hide_modlog_mod_names: Option, } diff --git a/crates/db_views_moderator/src/admin_purge_comment_view.rs b/crates/db_views_moderator/src/admin_purge_comment_view.rs index b8c8f7456b..3bc4503f3f 100644 --- a/crates/db_views_moderator/src/admin_purge_comment_view.rs +++ b/crates/db_views_moderator/src/admin_purge_comment_view.rs @@ -20,6 +20,7 @@ impl AdminPurgeCommentView { admin_person_id: Option, page: Option, limit: Option, + hide_mod_names: bool, ) -> Result, Error> { let mut query = admin_purge_comment::table .inner_join(person::table.on(admin_purge_comment::admin_person_id.eq(person::id))) @@ -43,7 +44,13 @@ impl AdminPurgeCommentView { .order_by(admin_purge_comment::when_.desc()) .load::(conn)?; - Ok(Self::from_tuple_to_vec(res)) + let mut results = Self::from_tuple_to_vec(res); + if hide_mod_names { + results.iter_mut().for_each(|item| { + item.admin = None; + }) + } + Ok(results) } } @@ -54,7 +61,7 @@ impl ViewToVec for AdminPurgeCommentView { .iter() .map(|a| Self { admin_purge_comment: a.0.to_owned(), - admin: a.1.to_owned(), + admin: Some(a.1.to_owned()), post: a.2.to_owned(), }) .collect::>() diff --git a/crates/db_views_moderator/src/admin_purge_community_view.rs b/crates/db_views_moderator/src/admin_purge_community_view.rs index 0c40a3963c..6e81aaad2e 100644 --- a/crates/db_views_moderator/src/admin_purge_community_view.rs +++ b/crates/db_views_moderator/src/admin_purge_community_view.rs @@ -19,6 +19,7 @@ impl AdminPurgeCommunityView { admin_person_id: Option, page: Option, limit: Option, + hide_mod_names: bool, ) -> Result, Error> { let mut query = admin_purge_community::table .inner_join(person::table.on(admin_purge_community::admin_person_id.eq(person::id))) @@ -40,7 +41,13 @@ impl AdminPurgeCommunityView { .order_by(admin_purge_community::when_.desc()) .load::(conn)?; - Ok(Self::from_tuple_to_vec(res)) + let mut results = Self::from_tuple_to_vec(res); + if hide_mod_names { + results.iter_mut().for_each(|item| { + item.admin = None; + }) + } + Ok(results) } } @@ -51,7 +58,7 @@ impl ViewToVec for AdminPurgeCommunityView { .iter() .map(|a| Self { admin_purge_community: a.0.to_owned(), - admin: a.1.to_owned(), + admin: Some(a.1.to_owned()), }) .collect::>() } diff --git a/crates/db_views_moderator/src/admin_purge_person_view.rs b/crates/db_views_moderator/src/admin_purge_person_view.rs index 9828e432c8..fd2b00e404 100644 --- a/crates/db_views_moderator/src/admin_purge_person_view.rs +++ b/crates/db_views_moderator/src/admin_purge_person_view.rs @@ -19,6 +19,7 @@ impl AdminPurgePersonView { admin_person_id: Option, page: Option, limit: Option, + hide_mod_names: bool, ) -> Result, Error> { let mut query = admin_purge_person::table .inner_join(person::table.on(admin_purge_person::admin_person_id.eq(person::id))) @@ -40,7 +41,13 @@ impl AdminPurgePersonView { .order_by(admin_purge_person::when_.desc()) .load::(conn)?; - Ok(Self::from_tuple_to_vec(res)) + let mut results = Self::from_tuple_to_vec(res); + if hide_mod_names { + results.iter_mut().for_each(|item| { + item.admin = None; + }) + } + Ok(results) } } @@ -51,7 +58,7 @@ impl ViewToVec for AdminPurgePersonView { .iter() .map(|a| Self { admin_purge_person: a.0.to_owned(), - admin: a.1.to_owned(), + admin: Some(a.1.to_owned()), }) .collect::>() } diff --git a/crates/db_views_moderator/src/admin_purge_post_view.rs b/crates/db_views_moderator/src/admin_purge_post_view.rs index 6665e46755..39039d5c85 100644 --- a/crates/db_views_moderator/src/admin_purge_post_view.rs +++ b/crates/db_views_moderator/src/admin_purge_post_view.rs @@ -20,6 +20,7 @@ impl AdminPurgePostView { admin_person_id: Option, page: Option, limit: Option, + hide_mod_names: bool, ) -> Result, Error> { let mut query = admin_purge_post::table .inner_join(person::table.on(admin_purge_post::admin_person_id.eq(person::id))) @@ -43,7 +44,13 @@ impl AdminPurgePostView { .order_by(admin_purge_post::when_.desc()) .load::(conn)?; - Ok(Self::from_tuple_to_vec(res)) + let mut results = Self::from_tuple_to_vec(res); + if hide_mod_names { + results.iter_mut().for_each(|item| { + item.admin = None; + }) + } + Ok(results) } } @@ -54,7 +61,7 @@ impl ViewToVec for AdminPurgePostView { .iter() .map(|a| Self { admin_purge_post: a.0.to_owned(), - admin: a.1.to_owned(), + admin: Some(a.1.to_owned()), community: a.2.to_owned(), }) .collect::>() diff --git a/crates/db_views_moderator/src/mod_add_community_view.rs b/crates/db_views_moderator/src/mod_add_community_view.rs index 55bb9d99b3..3acc012a21 100644 --- a/crates/db_views_moderator/src/mod_add_community_view.rs +++ b/crates/db_views_moderator/src/mod_add_community_view.rs @@ -12,25 +12,39 @@ use lemmy_db_schema::{ utils::limit_and_offset, }; -type ModAddCommunityViewTuple = (ModAddCommunity, PersonSafe, CommunitySafe, PersonSafeAlias1); +type ModAddCommunityViewTuple = ( + ModAddCommunity, + Option, + CommunitySafe, + PersonSafeAlias1, +); impl ModAddCommunityView { pub fn list( conn: &PgConnection, community_id: Option, mod_person_id: Option, + other_person_id: Option, page: Option, limit: Option, + hide_mod_names: bool, ) -> Result, Error> { + let admin_person_id_join = mod_person_id.unwrap_or(PersonId(-1)); + let show_mod_names = !hide_mod_names; + let show_mod_names_expr = show_mod_names.as_sql::(); + + let admin_names_join = mod_add_community::mod_person_id + .eq(person::id) + .and(show_mod_names_expr.or(person::id.eq(admin_person_id_join))); let mut query = mod_add_community::table - .inner_join(person::table.on(mod_add_community::mod_person_id.eq(person::id))) + .left_join(person::table.on(admin_names_join)) .inner_join(community::table) .inner_join( person_alias_1::table.on(mod_add_community::other_person_id.eq(person_alias_1::id)), ) .select(( mod_add_community::all_columns, - Person::safe_columns_tuple(), + Person::safe_columns_tuple().nullable(), Community::safe_columns_tuple(), PersonAlias1::safe_columns_tuple(), )) @@ -44,6 +58,10 @@ impl ModAddCommunityView { query = query.filter(mod_add_community::community_id.eq(community_id)); }; + if let Some(other_person_id) = other_person_id { + query = query.filter(person_alias_1::id.eq(other_person_id)); + }; + let (limit, offset) = limit_and_offset(page, limit); let res = query @@ -52,7 +70,8 @@ impl ModAddCommunityView { .order_by(mod_add_community::when_.desc()) .load::(conn)?; - Ok(Self::from_tuple_to_vec(res)) + let results = Self::from_tuple_to_vec(res); + Ok(results) } } diff --git a/crates/db_views_moderator/src/mod_add_view.rs b/crates/db_views_moderator/src/mod_add_view.rs index 5b48d00668..80939df588 100644 --- a/crates/db_views_moderator/src/mod_add_view.rs +++ b/crates/db_views_moderator/src/mod_add_view.rs @@ -11,21 +11,30 @@ use lemmy_db_schema::{ utils::limit_and_offset, }; -type ModAddViewTuple = (ModAdd, PersonSafe, PersonSafeAlias1); +type ModAddViewTuple = (ModAdd, Option, PersonSafeAlias1); impl ModAddView { pub fn list( conn: &PgConnection, mod_person_id: Option, + other_person_id: Option, page: Option, limit: Option, + hide_mod_names: bool, ) -> Result, Error> { + let admin_person_id_join = mod_person_id.unwrap_or(PersonId(-1)); + let show_mod_names = !hide_mod_names; + let show_mod_names_expr = show_mod_names.as_sql::(); + + let admin_names_join = mod_add::mod_person_id + .eq(person::id) + .and(show_mod_names_expr.or(person::id.eq(admin_person_id_join))); let mut query = mod_add::table - .inner_join(person::table.on(mod_add::mod_person_id.eq(person::id))) + .left_join(person::table.on(admin_names_join)) .inner_join(person_alias_1::table.on(mod_add::other_person_id.eq(person_alias_1::id))) .select(( mod_add::all_columns, - Person::safe_columns_tuple(), + Person::safe_columns_tuple().nullable(), PersonAlias1::safe_columns_tuple(), )) .into_boxed(); @@ -34,6 +43,10 @@ impl ModAddView { query = query.filter(mod_add::mod_person_id.eq(mod_person_id)); }; + if let Some(other_person_id) = other_person_id { + query = query.filter(person_alias_1::id.eq(other_person_id)); + }; + let (limit, offset) = limit_and_offset(page, limit); let res = query @@ -42,7 +55,8 @@ impl ModAddView { .order_by(mod_add::when_.desc()) .load::(conn)?; - Ok(Self::from_tuple_to_vec(res)) + let results = Self::from_tuple_to_vec(res); + Ok(results) } } diff --git a/crates/db_views_moderator/src/mod_ban_from_community_view.rs b/crates/db_views_moderator/src/mod_ban_from_community_view.rs index 9e44e4797a..fce6051a74 100644 --- a/crates/db_views_moderator/src/mod_ban_from_community_view.rs +++ b/crates/db_views_moderator/src/mod_ban_from_community_view.rs @@ -14,7 +14,7 @@ use lemmy_db_schema::{ type ModBanFromCommunityViewTuple = ( ModBanFromCommunity, - PersonSafe, + Option, CommunitySafe, PersonSafeAlias1, ); @@ -24,18 +24,27 @@ impl ModBanFromCommunityView { conn: &PgConnection, community_id: Option, mod_person_id: Option, + other_person_id: Option, page: Option, limit: Option, + hide_mod_names: bool, ) -> Result, Error> { + let admin_person_id_join = mod_person_id.unwrap_or(PersonId(-1)); + let show_mod_names = !hide_mod_names; + let show_mod_names_expr = show_mod_names.as_sql::(); + + let admin_names_join = mod_ban_from_community::mod_person_id + .eq(person::id) + .and(show_mod_names_expr.or(person::id.eq(admin_person_id_join))); let mut query = mod_ban_from_community::table - .inner_join(person::table.on(mod_ban_from_community::mod_person_id.eq(person::id))) + .left_join(person::table.on(admin_names_join)) .inner_join(community::table) .inner_join( person_alias_1::table.on(mod_ban_from_community::other_person_id.eq(person_alias_1::id)), ) .select(( mod_ban_from_community::all_columns, - Person::safe_columns_tuple(), + Person::safe_columns_tuple().nullable(), Community::safe_columns_tuple(), PersonAlias1::safe_columns_tuple(), )) @@ -49,6 +58,10 @@ impl ModBanFromCommunityView { query = query.filter(mod_ban_from_community::community_id.eq(community_id)); }; + if let Some(other_person_id) = other_person_id { + query = query.filter(mod_ban_from_community::other_person_id.eq(other_person_id)); + }; + let (limit, offset) = limit_and_offset(page, limit); let res = query @@ -57,7 +70,8 @@ impl ModBanFromCommunityView { .order_by(mod_ban_from_community::when_.desc()) .load::(conn)?; - Ok(Self::from_tuple_to_vec(res)) + let results = Self::from_tuple_to_vec(res); + Ok(results) } } diff --git a/crates/db_views_moderator/src/mod_ban_view.rs b/crates/db_views_moderator/src/mod_ban_view.rs index a36adaad07..c03693cdf2 100644 --- a/crates/db_views_moderator/src/mod_ban_view.rs +++ b/crates/db_views_moderator/src/mod_ban_view.rs @@ -11,21 +11,30 @@ use lemmy_db_schema::{ utils::limit_and_offset, }; -type ModBanViewTuple = (ModBan, PersonSafe, PersonSafeAlias1); +type ModBanViewTuple = (ModBan, Option, PersonSafeAlias1); impl ModBanView { pub fn list( conn: &PgConnection, mod_person_id: Option, + other_person_id: Option, page: Option, limit: Option, + hide_mod_names: bool, ) -> Result, Error> { + let admin_person_id_join = mod_person_id.unwrap_or(PersonId(-1)); + let show_mod_names = !hide_mod_names; + let show_mod_names_expr = show_mod_names.as_sql::(); + + let admin_names_join = mod_ban::mod_person_id + .eq(person::id) + .and(show_mod_names_expr.or(person::id.eq(admin_person_id_join))); let mut query = mod_ban::table - .inner_join(person::table.on(mod_ban::mod_person_id.eq(person::id))) + .left_join(person::table.on(admin_names_join)) .inner_join(person_alias_1::table.on(mod_ban::other_person_id.eq(person_alias_1::id))) .select(( mod_ban::all_columns, - Person::safe_columns_tuple(), + Person::safe_columns_tuple().nullable(), PersonAlias1::safe_columns_tuple(), )) .into_boxed(); @@ -34,6 +43,10 @@ impl ModBanView { query = query.filter(mod_ban::mod_person_id.eq(mod_person_id)); }; + if let Some(other_person_id) = other_person_id { + query = query.filter(person_alias_1::id.eq(other_person_id)); + }; + let (limit, offset) = limit_and_offset(page, limit); let res = query @@ -42,7 +55,8 @@ impl ModBanView { .order_by(mod_ban::when_.desc()) .load::(conn)?; - Ok(Self::from_tuple_to_vec(res)) + let results = Self::from_tuple_to_vec(res); + Ok(results) } } diff --git a/crates/db_views_moderator/src/mod_hide_community_view.rs b/crates/db_views_moderator/src/mod_hide_community_view.rs index a838056227..87f74b631f 100644 --- a/crates/db_views_moderator/src/mod_hide_community_view.rs +++ b/crates/db_views_moderator/src/mod_hide_community_view.rs @@ -12,7 +12,7 @@ use lemmy_db_schema::{ utils::limit_and_offset, }; -type ModHideCommunityViewTuple = (ModHideCommunity, PersonSafe, CommunitySafe); +type ModHideCommunityViewTuple = (ModHideCommunity, Option, CommunitySafe); impl ModHideCommunityView { // Pass in mod_id as admin_id because only admins can do this action @@ -22,13 +22,21 @@ impl ModHideCommunityView { admin_id: Option, page: Option, limit: Option, + hide_mod_names: bool, ) -> Result, Error> { + let admin_person_id_join = admin_id.unwrap_or(PersonId(-1)); + let show_mod_names = !hide_mod_names; + let show_mod_names_expr = show_mod_names.as_sql::(); + + let admin_names_join = mod_hide_community::mod_person_id + .eq(person::id) + .and(show_mod_names_expr.or(person::id.eq(admin_person_id_join))); let mut query = mod_hide_community::table - .inner_join(person::table) + .left_join(person::table.on(admin_names_join)) .inner_join(community::table.on(mod_hide_community::community_id.eq(community::id))) .select(( mod_hide_community::all_columns, - Person::safe_columns_tuple(), + Person::safe_columns_tuple().nullable(), Community::safe_columns_tuple(), )) .into_boxed(); @@ -49,7 +57,8 @@ impl ModHideCommunityView { .order_by(mod_hide_community::when_.desc()) .load::(conn)?; - Ok(Self::from_tuple_to_vec(res)) + let results = Self::from_tuple_to_vec(res); + Ok(results) } } diff --git a/crates/db_views_moderator/src/mod_lock_post_view.rs b/crates/db_views_moderator/src/mod_lock_post_view.rs index e9ec5f6679..443596aa1d 100644 --- a/crates/db_views_moderator/src/mod_lock_post_view.rs +++ b/crates/db_views_moderator/src/mod_lock_post_view.rs @@ -2,7 +2,7 @@ use crate::structs::ModLockPostView; use diesel::{result::Error, *}; use lemmy_db_schema::{ newtypes::{CommunityId, PersonId}, - schema::{community, mod_lock_post, person, post}, + schema::{community, mod_lock_post, person, person_alias_1, post}, source::{ community::{Community, CommunitySafe}, moderator::ModLockPost, @@ -13,23 +13,33 @@ use lemmy_db_schema::{ utils::limit_and_offset, }; -type ModLockPostViewTuple = (ModLockPost, PersonSafe, Post, CommunitySafe); +type ModLockPostViewTuple = (ModLockPost, Option, Post, CommunitySafe); impl ModLockPostView { pub fn list( conn: &PgConnection, community_id: Option, mod_person_id: Option, + other_person_id: Option, page: Option, limit: Option, + hide_mod_names: bool, ) -> Result, Error> { + let admin_person_id_join = mod_person_id.unwrap_or(PersonId(-1)); + let show_mod_names = !hide_mod_names; + let show_mod_names_expr = show_mod_names.as_sql::(); + + let admin_names_join = mod_lock_post::mod_person_id + .eq(person::id) + .and(show_mod_names_expr.or(person::id.eq(admin_person_id_join))); let mut query = mod_lock_post::table - .inner_join(person::table) + .left_join(person::table.on(admin_names_join)) .inner_join(post::table) .inner_join(community::table.on(post::community_id.eq(community::id))) + .inner_join(person_alias_1::table.on(post::creator_id.eq(person_alias_1::id))) .select(( mod_lock_post::all_columns, - Person::safe_columns_tuple(), + Person::safe_columns_tuple().nullable(), post::all_columns, Community::safe_columns_tuple(), )) @@ -43,6 +53,10 @@ impl ModLockPostView { query = query.filter(mod_lock_post::mod_person_id.eq(mod_person_id)); }; + if let Some(other_person_id) = other_person_id { + query = query.filter(person_alias_1::id.eq(other_person_id)); + }; + let (limit, offset) = limit_and_offset(page, limit); let res = query @@ -51,7 +65,8 @@ impl ModLockPostView { .order_by(mod_lock_post::when_.desc()) .load::(conn)?; - Ok(Self::from_tuple_to_vec(res)) + let results = Self::from_tuple_to_vec(res); + Ok(results) } } diff --git a/crates/db_views_moderator/src/mod_remove_comment_view.rs b/crates/db_views_moderator/src/mod_remove_comment_view.rs index b2b14f2204..4dba987ae6 100644 --- a/crates/db_views_moderator/src/mod_remove_comment_view.rs +++ b/crates/db_views_moderator/src/mod_remove_comment_view.rs @@ -16,7 +16,7 @@ use lemmy_db_schema::{ type ModRemoveCommentViewTuple = ( ModRemoveComment, - PersonSafe, + Option, Comment, PersonSafeAlias1, Post, @@ -28,18 +28,27 @@ impl ModRemoveCommentView { conn: &PgConnection, community_id: Option, mod_person_id: Option, + other_person_id: Option, page: Option, limit: Option, + hide_mod_names: bool, ) -> Result, Error> { + let admin_person_id_join = mod_person_id.unwrap_or(PersonId(-1)); + let show_mod_names = !hide_mod_names; + let show_mod_names_expr = show_mod_names.as_sql::(); + + let admin_names_join = mod_remove_comment::mod_person_id + .eq(person::id) + .and(show_mod_names_expr.or(person::id.eq(admin_person_id_join))); let mut query = mod_remove_comment::table - .inner_join(person::table) + .left_join(person::table.on(admin_names_join)) .inner_join(comment::table) .inner_join(person_alias_1::table.on(comment::creator_id.eq(person_alias_1::id))) .inner_join(post::table.on(comment::post_id.eq(post::id))) .inner_join(community::table.on(post::community_id.eq(community::id))) .select(( mod_remove_comment::all_columns, - Person::safe_columns_tuple(), + Person::safe_columns_tuple().nullable(), comment::all_columns, PersonAlias1::safe_columns_tuple(), post::all_columns, @@ -55,6 +64,10 @@ impl ModRemoveCommentView { query = query.filter(mod_remove_comment::mod_person_id.eq(mod_person_id)); }; + if let Some(other_person_id) = other_person_id { + query = query.filter(person_alias_1::id.eq(other_person_id)); + }; + let (limit, offset) = limit_and_offset(page, limit); let res = query @@ -63,7 +76,8 @@ impl ModRemoveCommentView { .order_by(mod_remove_comment::when_.desc()) .load::(conn)?; - Ok(Self::from_tuple_to_vec(res)) + let results = Self::from_tuple_to_vec(res); + Ok(results) } } diff --git a/crates/db_views_moderator/src/mod_remove_community_view.rs b/crates/db_views_moderator/src/mod_remove_community_view.rs index 29aad7f92d..dd7b63d378 100644 --- a/crates/db_views_moderator/src/mod_remove_community_view.rs +++ b/crates/db_views_moderator/src/mod_remove_community_view.rs @@ -12,7 +12,7 @@ use lemmy_db_schema::{ utils::limit_and_offset, }; -type ModRemoveCommunityTuple = (ModRemoveCommunity, PersonSafe, CommunitySafe); +type ModRemoveCommunityTuple = (ModRemoveCommunity, Option, CommunitySafe); impl ModRemoveCommunityView { pub fn list( @@ -20,13 +20,21 @@ impl ModRemoveCommunityView { mod_person_id: Option, page: Option, limit: Option, + hide_mod_names: bool, ) -> Result, Error> { + let admin_person_id_join = mod_person_id.unwrap_or(PersonId(-1)); + let show_mod_names = !hide_mod_names; + let show_mod_names_expr = show_mod_names.as_sql::(); + + let admin_names_join = mod_remove_community::mod_person_id + .eq(person::id) + .and(show_mod_names_expr.or(person::id.eq(admin_person_id_join))); let mut query = mod_remove_community::table - .inner_join(person::table) + .left_join(person::table.on(admin_names_join)) .inner_join(community::table) .select(( mod_remove_community::all_columns, - Person::safe_columns_tuple(), + Person::safe_columns_tuple().nullable(), Community::safe_columns_tuple(), )) .into_boxed(); @@ -43,7 +51,8 @@ impl ModRemoveCommunityView { .order_by(mod_remove_community::when_.desc()) .load::(conn)?; - Ok(Self::from_tuple_to_vec(res)) + let results = Self::from_tuple_to_vec(res); + Ok(results) } } diff --git a/crates/db_views_moderator/src/mod_remove_post_view.rs b/crates/db_views_moderator/src/mod_remove_post_view.rs index 849b563912..caa1e6b861 100644 --- a/crates/db_views_moderator/src/mod_remove_post_view.rs +++ b/crates/db_views_moderator/src/mod_remove_post_view.rs @@ -2,7 +2,7 @@ use crate::structs::ModRemovePostView; use diesel::{result::Error, *}; use lemmy_db_schema::{ newtypes::{CommunityId, PersonId}, - schema::{community, mod_remove_post, person, post}, + schema::{community, mod_remove_post, person, person_alias_1, post}, source::{ community::{Community, CommunitySafe}, moderator::ModRemovePost, @@ -13,23 +13,33 @@ use lemmy_db_schema::{ utils::limit_and_offset, }; -type ModRemovePostViewTuple = (ModRemovePost, PersonSafe, Post, CommunitySafe); +type ModRemovePostViewTuple = (ModRemovePost, Option, Post, CommunitySafe); impl ModRemovePostView { pub fn list( conn: &PgConnection, community_id: Option, mod_person_id: Option, + other_person_id: Option, page: Option, limit: Option, + hide_mod_names: bool, ) -> Result, Error> { + let admin_person_id_join = mod_person_id.unwrap_or(PersonId(-1)); + let show_mod_names = !hide_mod_names; + let show_mod_names_expr = show_mod_names.as_sql::(); + + let admin_names_join = mod_remove_post::mod_person_id + .eq(person::id) + .and(show_mod_names_expr.or(person::id.eq(admin_person_id_join))); let mut query = mod_remove_post::table - .inner_join(person::table) + .left_join(person::table.on(admin_names_join)) .inner_join(post::table) .inner_join(community::table.on(post::community_id.eq(community::id))) + .inner_join(person_alias_1::table.on(post::creator_id.eq(person_alias_1::id))) .select(( mod_remove_post::all_columns, - Person::safe_columns_tuple(), + Person::safe_columns_tuple().nullable(), post::all_columns, Community::safe_columns_tuple(), )) @@ -43,6 +53,10 @@ impl ModRemovePostView { query = query.filter(mod_remove_post::mod_person_id.eq(mod_person_id)); }; + if let Some(other_person_id) = other_person_id { + query = query.filter(person_alias_1::id.eq(other_person_id)); + }; + let (limit, offset) = limit_and_offset(page, limit); let res = query @@ -51,7 +65,8 @@ impl ModRemovePostView { .order_by(mod_remove_post::when_.desc()) .load::(conn)?; - Ok(Self::from_tuple_to_vec(res)) + let results = Self::from_tuple_to_vec(res); + Ok(results) } } diff --git a/crates/db_views_moderator/src/mod_sticky_post_view.rs b/crates/db_views_moderator/src/mod_sticky_post_view.rs index 8b2383ee5f..10f9bb2604 100644 --- a/crates/db_views_moderator/src/mod_sticky_post_view.rs +++ b/crates/db_views_moderator/src/mod_sticky_post_view.rs @@ -2,7 +2,7 @@ use crate::structs::ModStickyPostView; use diesel::{result::Error, *}; use lemmy_db_schema::{ newtypes::{CommunityId, PersonId}, - schema::{community, mod_sticky_post, person, post}, + schema::{community, mod_sticky_post, person, person_alias_1, post}, source::{ community::{Community, CommunitySafe}, moderator::ModStickyPost, @@ -13,23 +13,33 @@ use lemmy_db_schema::{ utils::limit_and_offset, }; -type ModStickyPostViewTuple = (ModStickyPost, PersonSafe, Post, CommunitySafe); +type ModStickyPostViewTuple = (ModStickyPost, Option, Post, CommunitySafe); impl ModStickyPostView { pub fn list( conn: &PgConnection, community_id: Option, mod_person_id: Option, + other_person_id: Option, page: Option, limit: Option, + hide_mod_names: bool, ) -> Result, Error> { + let admin_person_id_join = mod_person_id.unwrap_or(PersonId(-1)); + let show_mod_names = !hide_mod_names; + let show_mod_names_expr = show_mod_names.as_sql::(); + + let admin_names_join = mod_sticky_post::mod_person_id + .eq(person::id) + .and(show_mod_names_expr.or(person::id.eq(admin_person_id_join))); let mut query = mod_sticky_post::table - .inner_join(person::table) + .left_join(person::table.on(admin_names_join)) .inner_join(post::table) + .inner_join(person_alias_1::table.on(post::creator_id.eq(person_alias_1::id))) .inner_join(community::table.on(post::community_id.eq(community::id))) .select(( mod_sticky_post::all_columns, - Person::safe_columns_tuple(), + Person::safe_columns_tuple().nullable(), post::all_columns, Community::safe_columns_tuple(), )) @@ -43,6 +53,10 @@ impl ModStickyPostView { query = query.filter(mod_sticky_post::mod_person_id.eq(mod_person_id)); }; + if let Some(other_person_id) = other_person_id { + query = query.filter(person_alias_1::id.eq(other_person_id)); + }; + let (limit, offset) = limit_and_offset(page, limit); let res = query @@ -51,7 +65,8 @@ impl ModStickyPostView { .order_by(mod_sticky_post::when_.desc()) .load::(conn)?; - Ok(Self::from_tuple_to_vec(res)) + let results = Self::from_tuple_to_vec(res); + Ok(results) } } diff --git a/crates/db_views_moderator/src/mod_transfer_community_view.rs b/crates/db_views_moderator/src/mod_transfer_community_view.rs index c944a9a10b..03b22ce3dd 100644 --- a/crates/db_views_moderator/src/mod_transfer_community_view.rs +++ b/crates/db_views_moderator/src/mod_transfer_community_view.rs @@ -14,7 +14,7 @@ use lemmy_db_schema::{ type ModTransferCommunityViewTuple = ( ModTransferCommunity, - PersonSafe, + Option, CommunitySafe, PersonSafeAlias1, ); @@ -24,18 +24,27 @@ impl ModTransferCommunityView { conn: &PgConnection, community_id: Option, mod_person_id: Option, + other_person_id: Option, page: Option, limit: Option, + hide_mod_names: bool, ) -> Result, Error> { + let admin_person_id_join = mod_person_id.unwrap_or(PersonId(-1)); + let show_mod_names = !hide_mod_names; + let show_mod_names_expr = show_mod_names.as_sql::(); + + let admin_names_join = mod_transfer_community::mod_person_id + .eq(person::id) + .and(show_mod_names_expr.or(person::id.eq(admin_person_id_join))); let mut query = mod_transfer_community::table - .inner_join(person::table.on(mod_transfer_community::mod_person_id.eq(person::id))) + .left_join(person::table.on(admin_names_join)) .inner_join(community::table) .inner_join( person_alias_1::table.on(mod_transfer_community::other_person_id.eq(person_alias_1::id)), ) .select(( mod_transfer_community::all_columns, - Person::safe_columns_tuple(), + Person::safe_columns_tuple().nullable(), Community::safe_columns_tuple(), PersonAlias1::safe_columns_tuple(), )) @@ -49,6 +58,10 @@ impl ModTransferCommunityView { query = query.filter(mod_transfer_community::community_id.eq(community_id)); }; + if let Some(other_person_id) = other_person_id { + query = query.filter(person_alias_1::id.eq(other_person_id)); + }; + let (limit, offset) = limit_and_offset(page, limit); let res = query @@ -57,7 +70,8 @@ impl ModTransferCommunityView { .order_by(mod_transfer_community::when_.desc()) .load::(conn)?; - Ok(Self::from_tuple_to_vec(res)) + let results = Self::from_tuple_to_vec(res); + Ok(results) } } diff --git a/crates/db_views_moderator/src/structs.rs b/crates/db_views_moderator/src/structs.rs index ebe93399c0..48bce6ecd5 100644 --- a/crates/db_views_moderator/src/structs.rs +++ b/crates/db_views_moderator/src/structs.rs @@ -26,7 +26,7 @@ use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize, Clone)] pub struct ModAddCommunityView { pub mod_add_community: ModAddCommunity, - pub moderator: PersonSafe, + pub moderator: Option, pub community: CommunitySafe, pub modded_person: PersonSafeAlias1, } @@ -34,14 +34,14 @@ pub struct ModAddCommunityView { #[derive(Debug, Serialize, Deserialize, Clone)] pub struct ModAddView { pub mod_add: ModAdd, - pub moderator: PersonSafe, + pub moderator: Option, pub modded_person: PersonSafeAlias1, } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct ModBanFromCommunityView { pub mod_ban_from_community: ModBanFromCommunity, - pub moderator: PersonSafe, + pub moderator: Option, pub community: CommunitySafe, pub banned_person: PersonSafeAlias1, } @@ -49,21 +49,21 @@ pub struct ModBanFromCommunityView { #[derive(Debug, Serialize, Deserialize, Clone)] pub struct ModBanView { pub mod_ban: ModBan, - pub moderator: PersonSafe, + pub moderator: Option, pub banned_person: PersonSafeAlias1, } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct ModHideCommunityView { pub mod_hide_community: ModHideCommunity, - pub admin: PersonSafe, + pub admin: Option, pub community: CommunitySafe, } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct ModLockPostView { pub mod_lock_post: ModLockPost, - pub moderator: PersonSafe, + pub moderator: Option, pub post: Post, pub community: CommunitySafe, } @@ -71,7 +71,7 @@ pub struct ModLockPostView { #[derive(Debug, Serialize, Deserialize, Clone)] pub struct ModRemoveCommentView { pub mod_remove_comment: ModRemoveComment, - pub moderator: PersonSafe, + pub moderator: Option, pub comment: Comment, pub commenter: PersonSafeAlias1, pub post: Post, @@ -81,14 +81,14 @@ pub struct ModRemoveCommentView { #[derive(Debug, Serialize, Deserialize, Clone)] pub struct ModRemoveCommunityView { pub mod_remove_community: ModRemoveCommunity, - pub moderator: PersonSafe, + pub moderator: Option, pub community: CommunitySafe, } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct ModRemovePostView { pub mod_remove_post: ModRemovePost, - pub moderator: PersonSafe, + pub moderator: Option, pub post: Post, pub community: CommunitySafe, } @@ -96,7 +96,7 @@ pub struct ModRemovePostView { #[derive(Debug, Serialize, Deserialize, Clone)] pub struct ModStickyPostView { pub mod_sticky_post: ModStickyPost, - pub moderator: PersonSafe, + pub moderator: Option, pub post: Post, pub community: CommunitySafe, } @@ -104,7 +104,7 @@ pub struct ModStickyPostView { #[derive(Debug, Serialize, Deserialize, Clone)] pub struct ModTransferCommunityView { pub mod_transfer_community: ModTransferCommunity, - pub moderator: PersonSafe, + pub moderator: Option, pub community: CommunitySafe, pub modded_person: PersonSafeAlias1, } @@ -112,25 +112,25 @@ pub struct ModTransferCommunityView { #[derive(Debug, Serialize, Deserialize, Clone)] pub struct AdminPurgeCommentView { pub admin_purge_comment: AdminPurgeComment, - pub admin: PersonSafe, + pub admin: Option, pub post: Post, } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct AdminPurgeCommunityView { pub admin_purge_community: AdminPurgeCommunity, - pub admin: PersonSafe, + pub admin: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct AdminPurgePersonView { pub admin_purge_person: AdminPurgePerson, - pub admin: PersonSafe, + pub admin: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct AdminPurgePostView { pub admin_purge_post: AdminPurgePost, - pub admin: PersonSafe, + pub admin: Option, pub community: CommunitySafe, } diff --git a/migrations/2022-06-12-012121_add_site_hide_modlog_names/down.sql b/migrations/2022-06-12-012121_add_site_hide_modlog_names/down.sql new file mode 100644 index 0000000000..c3f658175f --- /dev/null +++ b/migrations/2022-06-12-012121_add_site_hide_modlog_names/down.sql @@ -0,0 +1 @@ +alter table site drop column hide_modlog_mod_names; \ No newline at end of file diff --git a/migrations/2022-06-12-012121_add_site_hide_modlog_names/up.sql b/migrations/2022-06-12-012121_add_site_hide_modlog_names/up.sql new file mode 100644 index 0000000000..329ad6f425 --- /dev/null +++ b/migrations/2022-06-12-012121_add_site_hide_modlog_names/up.sql @@ -0,0 +1 @@ +alter table site add column hide_modlog_mod_names boolean default true NOT NULL; \ No newline at end of file