From 3b54acb479053beadfab1b502c1e669969d656fd Mon Sep 17 00:00:00 2001 From: Dessalines Date: Tue, 14 Dec 2021 18:41:52 -0500 Subject: [PATCH] Adding temporary bans. Fixes #1423 --- crates/api/src/community.rs | 5 ++- crates/api/src/local_user.rs | 7 ++-- crates/api_common/src/lib.rs | 4 +-- .../src/activities/community/block_user.rs | 2 ++ .../activities/community/undo_block_user.rs | 1 + crates/apub/src/objects/person.rs | 1 + crates/db_schema/src/impls/community.rs | 5 +++ crates/db_schema/src/impls/person.rs | 36 +++++++++++++++++-- crates/db_schema/src/schema.rs | 4 +++ crates/db_schema/src/source/community.rs | 2 ++ crates/db_schema/src/source/person.rs | 7 ++++ crates/db_views/src/comment_report_view.rs | 20 +++++++++-- crates/db_views/src/comment_view.rs | 17 +++++++-- crates/db_views/src/post_report_view.rs | 20 +++++++++-- crates/db_views/src/post_view.rs | 17 +++++++-- .../src/community_person_ban_view.rs | 7 +++- .../db_views_actor/src/person_mention_view.rs | 16 +++++++-- crates/db_views_actor/src/person_view.rs | 8 ++++- .../down.sql | 7 ++++ .../up.sql | 8 +++++ 20 files changed, 166 insertions(+), 28 deletions(-) create mode 100644 migrations/2021-12-14-181537_add_temporary_bans/down.sql create mode 100644 migrations/2021-12-14-181537_add_temporary_bans/up.sql diff --git a/crates/api/src/community.rs b/crates/api/src/community.rs index c0aea6022..ef7daeb40 100644 --- a/crates/api/src/community.rs +++ b/crates/api/src/community.rs @@ -214,6 +214,7 @@ impl Perform for BanFromCommunity { let community_id = data.community_id; let banned_person_id = data.person_id; + let expires = data.expires.map(naive_from_unix); // Verify that only mods or admins can ban is_mod_or_admin(context.pool(), local_user_view.person.id, community_id).await?; @@ -221,6 +222,7 @@ impl Perform for BanFromCommunity { let community_user_ban_form = CommunityPersonBanForm { community_id: data.community_id, person_id: data.person_id, + expires: Some(expires), }; let community: ApubCommunity = blocking(context.pool(), move |conn: &'_ _| { @@ -304,9 +306,6 @@ impl Perform for BanFromCommunity { } // Mod tables - // TODO eventually do correct expires - let expires = data.expires.map(naive_from_unix); - let form = ModBanFromCommunityForm { mod_person_id: local_user_view.person.id, other_person_id: data.person_id, diff --git a/crates/api/src/local_user.rs b/crates/api/src/local_user.rs index 781a581a7..e8116e066 100644 --- a/crates/api/src/local_user.rs +++ b/crates/api/src/local_user.rs @@ -256,6 +256,7 @@ impl Perform for SaveUserSettings { shared_inbox_url: None, matrix_user_id, bot_account, + ban_expires: None, }; blocking(context.pool(), move |conn| { @@ -452,7 +453,9 @@ impl Perform for BanPerson { let ban = data.ban; let banned_person_id = data.person_id; - let ban_person = move |conn: &'_ _| Person::ban_person(conn, banned_person_id, ban); + let expires = data.expires.map(naive_from_unix); + + let ban_person = move |conn: &'_ _| Person::ban_person(conn, banned_person_id, ban, expires); blocking(context.pool(), ban_person) .await? .map_err(LemmyError::from) @@ -495,8 +498,6 @@ impl Perform for BanPerson { } // Mod tables - let expires = data.expires.map(naive_from_unix); - let form = ModBanForm { mod_person_id: local_user_view.person.id, other_person_id: data.person_id, diff --git a/crates/api_common/src/lib.rs b/crates/api_common/src/lib.rs index cd854a6d9..f02095f87 100644 --- a/crates/api_common/src/lib.rs +++ b/crates/api_common/src/lib.rs @@ -127,7 +127,7 @@ pub async fn get_local_user_view_from_jwt( let local_user_view = blocking(pool, move |conn| LocalUserView::read(conn, local_user_id)).await??; // Check for a site ban - if local_user_view.person.banned { + if local_user_view.person.is_banned() { return Err(LemmyError::from_message("site_ban")); } @@ -180,7 +180,7 @@ pub async fn get_local_user_settings_view_from_jwt( }) .await??; // Check for a site ban - if local_user_view.person.banned { + if local_user_view.person.is_banned() { return Err(LemmyError::from_message("site_ban")); } diff --git a/crates/apub/src/activities/community/block_user.rs b/crates/apub/src/activities/community/block_user.rs index cff72c5c8..92a7ba8a2 100644 --- a/crates/apub/src/activities/community/block_user.rs +++ b/crates/apub/src/activities/community/block_user.rs @@ -101,6 +101,8 @@ impl ActivityHandler for BlockUserFromCommunity { let community_user_ban_form = CommunityPersonBanForm { community_id: community.id, person_id: blocked_user.id, + // TODO how to carry across the ban expiration time? + expires: None, }; blocking(context.pool(), move |conn: &'_ _| { diff --git a/crates/apub/src/activities/community/undo_block_user.rs b/crates/apub/src/activities/community/undo_block_user.rs index 8add53b6a..e93f4ff29 100644 --- a/crates/apub/src/activities/community/undo_block_user.rs +++ b/crates/apub/src/activities/community/undo_block_user.rs @@ -93,6 +93,7 @@ impl ActivityHandler for UndoBlockUserFromCommunity { let community_user_ban_form = CommunityPersonBanForm { community_id: community.id, person_id: blocked_user.id, + expires: None, }; blocking(context.pool(), move |conn: &'_ _| { diff --git a/crates/apub/src/objects/person.rs b/crates/apub/src/objects/person.rs index aa658eb41..d4ac7abb3 100644 --- a/crates/apub/src/objects/person.rs +++ b/crates/apub/src/objects/person.rs @@ -168,6 +168,7 @@ impl ApubObject for ApubPerson { inbox_url: Some(person.inbox.into()), shared_inbox_url: Some(person.endpoints.shared_inbox.map(|s| s.into())), matrix_user_id: Some(person.matrix_user_id), + ban_expires: None, }; let person = blocking(context.pool(), move |conn| { DbPerson::upsert(conn, &person_form) diff --git a/crates/db_schema/src/impls/community.rs b/crates/db_schema/src/impls/community.rs index 19a3a9548..228cf23ff 100644 --- a/crates/db_schema/src/impls/community.rs +++ b/crates/db_schema/src/impls/community.rs @@ -225,6 +225,9 @@ impl Bannable for CommunityPersonBan { use crate::schema::community_person_ban::dsl::*; insert_into(community_person_ban) .values(community_person_ban_form) + .on_conflict((community_id, person_id)) + .do_update() + .set(community_person_ban_form) .get_result::(conn) } @@ -383,6 +386,7 @@ mod tests { let community_person_ban_form = CommunityPersonBanForm { community_id: inserted_community.id, person_id: inserted_person.id, + expires: None, }; let inserted_community_person_ban = @@ -393,6 +397,7 @@ mod tests { community_id: inserted_community.id, person_id: inserted_person.id, published: inserted_community_person_ban.published, + expires: None, }; let read_community = Community::read(&conn, inserted_community.id).unwrap(); diff --git a/crates/db_schema/src/impls/person.rs b/crates/db_schema/src/impls/person.rs index f09cdfa0e..7e756543b 100644 --- a/crates/db_schema/src/impls/person.rs +++ b/crates/db_schema/src/impls/person.rs @@ -3,7 +3,7 @@ use crate::{ naive_now, newtypes::{DbUrl, PersonId}, schema::person::dsl::*, - source::person::{Person, PersonForm}, + source::person::{Person, PersonForm, PersonSafe}, traits::Crud, }; use diesel::{dsl::*, result::Error, ExpressionMethods, PgConnection, QueryDsl, RunQueryDsl}; @@ -30,6 +30,7 @@ mod safe_type { matrix_user_id, admin, bot_account, + ban_expires, ); impl ToSafe for Person { @@ -53,6 +54,7 @@ mod safe_type { matrix_user_id, admin, bot_account, + ban_expires, ) } } @@ -79,6 +81,7 @@ mod safe_type_alias_1 { matrix_user_id, admin, bot_account, + ban_expires, ); impl ToSafe for PersonAlias1 { @@ -102,6 +105,7 @@ mod safe_type_alias_1 { matrix_user_id, admin, bot_account, + ban_expires, ) } } @@ -128,6 +132,7 @@ mod safe_type_alias_2 { matrix_user_id, admin, bot_account, + ban_expires, ); impl ToSafe for PersonAlias2 { @@ -151,6 +156,7 @@ mod safe_type_alias_2 { matrix_user_id, admin, bot_account, + ban_expires, ) } } @@ -179,9 +185,14 @@ impl Crud for Person { } impl Person { - pub fn ban_person(conn: &PgConnection, person_id: PersonId, ban: bool) -> Result { + pub fn ban_person( + conn: &PgConnection, + person_id: PersonId, + ban: bool, + expires: Option, + ) -> Result { diesel::update(person.find(person_id)) - .set(banned.eq(ban)) + .set((banned.eq(ban), ban_expires.eq(expires))) .get_result::(conn) } @@ -259,6 +270,24 @@ impl Person { .set(deleted.eq(new_deleted)) .get_result::(conn) } + + pub fn is_banned(&self) -> bool { + is_banned(self.banned, self.ban_expires) + } +} + +impl PersonSafe { + pub fn is_banned(&self) -> bool { + is_banned(self.banned, self.ban_expires) + } +} + +fn is_banned(banned_: bool, expires: Option) -> bool { + if let Some(expires) = expires { + banned_ && expires.gt(&naive_now()) + } else { + banned_ + } } #[cfg(test)] @@ -298,6 +327,7 @@ mod tests { inbox_url: inserted_person.inbox_url.to_owned(), shared_inbox_url: None, matrix_user_id: None, + ban_expires: None, }; let read_person = Person::read(&conn, inserted_person.id).unwrap(); diff --git a/crates/db_schema/src/schema.rs b/crates/db_schema/src/schema.rs index 89ba5a113..c01114d9e 100644 --- a/crates/db_schema/src/schema.rs +++ b/crates/db_schema/src/schema.rs @@ -136,6 +136,7 @@ table! { community_id -> Int4, person_id -> Int4, published -> Timestamp, + expires -> Nullable, } } @@ -304,6 +305,7 @@ table! { matrix_user_id -> Nullable, admin -> Bool, bot_account -> Bool, + ban_expires -> Nullable, } } @@ -529,6 +531,7 @@ table! { matrix_user_id -> Nullable, admin -> Bool, bot_account -> Bool, + ban_expires -> Nullable, } } @@ -554,6 +557,7 @@ table! { matrix_user_id -> Nullable, admin -> Bool, bot_account -> Bool, + ban_expires -> Nullable, } } diff --git a/crates/db_schema/src/source/community.rs b/crates/db_schema/src/source/community.rs index 269e7dbf9..986015e7d 100644 --- a/crates/db_schema/src/source/community.rs +++ b/crates/db_schema/src/source/community.rs @@ -95,6 +95,7 @@ pub struct CommunityPersonBan { pub community_id: CommunityId, pub person_id: PersonId, pub published: chrono::NaiveDateTime, + pub expires: Option, } #[derive(Insertable, AsChangeset, Clone)] @@ -102,6 +103,7 @@ pub struct CommunityPersonBan { pub struct CommunityPersonBanForm { pub community_id: CommunityId, pub person_id: PersonId, + pub expires: Option>, } #[derive(Identifiable, Queryable, Associations, PartialEq, Debug)] diff --git a/crates/db_schema/src/source/person.rs b/crates/db_schema/src/source/person.rs index 8ff56eba4..978298307 100644 --- a/crates/db_schema/src/source/person.rs +++ b/crates/db_schema/src/source/person.rs @@ -27,6 +27,7 @@ pub struct Person { pub matrix_user_id: Option, pub admin: bool, pub bot_account: bool, + pub ban_expires: Option, } /// A safe representation of person, without the sensitive info @@ -50,6 +51,7 @@ pub struct PersonSafe { pub matrix_user_id: Option, pub admin: bool, pub bot_account: bool, + pub ban_expires: Option, } #[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize)] @@ -75,6 +77,7 @@ pub struct PersonAlias1 { pub matrix_user_id: Option, pub admin: bool, pub bot_account: bool, + pub ban_expires: Option, } #[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize)] @@ -97,6 +100,7 @@ pub struct PersonSafeAlias1 { pub matrix_user_id: Option, pub admin: bool, pub bot_account: bool, + pub ban_expires: Option, } #[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize)] @@ -122,6 +126,7 @@ pub struct PersonAlias2 { pub matrix_user_id: Option, pub admin: bool, pub bot_account: bool, + pub ban_expires: Option, } #[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize)] @@ -144,6 +149,7 @@ pub struct PersonSafeAlias2 { pub matrix_user_id: Option, pub admin: bool, pub bot_account: bool, + pub ban_expires: Option, } #[derive(Insertable, AsChangeset, Clone, Default)] @@ -168,4 +174,5 @@ pub struct PersonForm { pub matrix_user_id: Option>, pub admin: Option, pub bot_account: Option, + pub ban_expires: Option>, } diff --git a/crates/db_views/src/comment_report_view.rs b/crates/db_views/src/comment_report_view.rs index 343851751..52089ec57 100644 --- a/crates/db_views/src/comment_report_view.rs +++ b/crates/db_views/src/comment_report_view.rs @@ -1,4 +1,4 @@ -use diesel::{result::Error, *}; +use diesel::{dsl::*, result::Error, *}; use lemmy_db_schema::{ aggregates::comment_aggregates::CommentAggregates, limit_and_offset, @@ -88,7 +88,12 @@ impl CommentReportView { community_person_ban::table.on( community::id .eq(community_person_ban::community_id) - .and(community_person_ban::person_id.eq(comment::creator_id)), + .and(community_person_ban::person_id.eq(comment::creator_id)) + .and( + community_person_ban::expires + .is_null() + .or(community_person_ban::expires.gt(now)), + ), ), ) .left_join( @@ -229,7 +234,12 @@ impl<'a> CommentReportQueryBuilder<'a> { community_person_ban::table.on( community::id .eq(community_person_ban::community_id) - .and(community_person_ban::person_id.eq(comment::creator_id)), + .and(community_person_ban::person_id.eq(comment::creator_id)) + .and( + community_person_ban::expires + .is_null() + .or(community_person_ban::expires.gt(now)), + ), ), ) .left_join( @@ -444,6 +454,7 @@ mod tests { inbox_url: inserted_jessica.inbox_url.to_owned(), shared_inbox_url: None, matrix_user_id: None, + ban_expires: None, }, comment_creator: PersonSafeAlias1 { id: inserted_timmy.id, @@ -463,6 +474,7 @@ mod tests { inbox_url: inserted_timmy.inbox_url.to_owned(), shared_inbox_url: None, matrix_user_id: None, + ban_expires: None, }, creator_banned_from_community: false, counts: CommentAggregates { @@ -499,6 +511,7 @@ mod tests { inbox_url: inserted_sara.inbox_url.to_owned(), shared_inbox_url: None, matrix_user_id: None, + ban_expires: None, }; // Do a batch read of timmys reports @@ -554,6 +567,7 @@ mod tests { inbox_url: inserted_timmy.inbox_url.to_owned(), shared_inbox_url: None, matrix_user_id: None, + ban_expires: None, }); assert_eq!( diff --git a/crates/db_views/src/comment_view.rs b/crates/db_views/src/comment_view.rs index 4fdd40970..6dcda899b 100644 --- a/crates/db_views/src/comment_view.rs +++ b/crates/db_views/src/comment_view.rs @@ -1,4 +1,4 @@ -use diesel::{result::Error, *}; +use diesel::{dsl::*, result::Error, *}; use lemmy_db_schema::{ aggregates::comment_aggregates::CommentAggregates, functions::hot_rank, @@ -98,7 +98,12 @@ impl CommentView { community_person_ban::table.on( community::id .eq(community_person_ban::community_id) - .and(community_person_ban::person_id.eq(comment::creator_id)), + .and(community_person_ban::person_id.eq(comment::creator_id)) + .and( + community_person_ban::expires + .is_null() + .or(community_person_ban::expires.gt(now)), + ), ), ) .left_join( @@ -345,7 +350,12 @@ impl<'a> CommentQueryBuilder<'a> { community_person_ban::table.on( community::id .eq(community_person_ban::community_id) - .and(community_person_ban::person_id.eq(comment::creator_id)), + .and(community_person_ban::person_id.eq(comment::creator_id)) + .and( + community_person_ban::expires + .is_null() + .or(community_person_ban::expires.gt(now)), + ), ), ) .left_join( @@ -646,6 +656,7 @@ mod tests { inbox_url: inserted_person.inbox_url.to_owned(), shared_inbox_url: None, matrix_user_id: None, + ban_expires: None, }, recipient: None, post: Post { diff --git a/crates/db_views/src/post_report_view.rs b/crates/db_views/src/post_report_view.rs index e5594487c..e7ba0308a 100644 --- a/crates/db_views/src/post_report_view.rs +++ b/crates/db_views/src/post_report_view.rs @@ -1,4 +1,4 @@ -use diesel::{result::Error, *}; +use diesel::{dsl::*, result::Error, *}; use lemmy_db_schema::{ aggregates::post_aggregates::PostAggregates, limit_and_offset, @@ -79,7 +79,12 @@ impl PostReportView { community_person_ban::table.on( post::community_id .eq(community_person_ban::community_id) - .and(community_person_ban::person_id.eq(post::creator_id)), + .and(community_person_ban::person_id.eq(post::creator_id)) + .and( + community_person_ban::expires + .is_null() + .or(community_person_ban::expires.gt(now)), + ), ), ) .left_join( @@ -209,7 +214,12 @@ impl<'a> PostReportQueryBuilder<'a> { community_person_ban::table.on( post::community_id .eq(community_person_ban::community_id) - .and(community_person_ban::person_id.eq(post::creator_id)), + .and(community_person_ban::person_id.eq(post::creator_id)) + .and( + community_person_ban::expires + .is_null() + .or(community_person_ban::expires.gt(now)), + ), ), ) .left_join( @@ -422,6 +432,7 @@ mod tests { inbox_url: inserted_jessica.inbox_url.to_owned(), shared_inbox_url: None, matrix_user_id: None, + ban_expires: None, }, post_creator: PersonSafeAlias1 { id: inserted_timmy.id, @@ -441,6 +452,7 @@ mod tests { inbox_url: inserted_timmy.inbox_url.to_owned(), shared_inbox_url: None, matrix_user_id: None, + ban_expires: None, }, creator_banned_from_community: false, my_vote: None, @@ -482,6 +494,7 @@ mod tests { inbox_url: inserted_sara.inbox_url.to_owned(), shared_inbox_url: None, matrix_user_id: None, + ban_expires: None, }; // Do a batch read of timmys reports @@ -535,6 +548,7 @@ mod tests { inbox_url: inserted_timmy.inbox_url.to_owned(), shared_inbox_url: None, matrix_user_id: None, + ban_expires: None, }); assert_eq!( diff --git a/crates/db_views/src/post_view.rs b/crates/db_views/src/post_view.rs index db7c76cda..14138374a 100644 --- a/crates/db_views/src/post_view.rs +++ b/crates/db_views/src/post_view.rs @@ -1,4 +1,4 @@ -use diesel::{pg::Pg, result::Error, *}; +use diesel::{dsl::*, pg::Pg, result::Error, *}; use lemmy_db_schema::{ aggregates::post_aggregates::PostAggregates, functions::hot_rank, @@ -86,7 +86,12 @@ impl PostView { community_person_ban::table.on( post::community_id .eq(community_person_ban::community_id) - .and(community_person_ban::person_id.eq(post::creator_id)), + .and(community_person_ban::person_id.eq(post::creator_id)) + .and( + community_person_ban::expires + .is_null() + .or(community_person_ban::expires.gt(now)), + ), ), ) .inner_join(post_aggregates::table) @@ -284,7 +289,12 @@ impl<'a> PostQueryBuilder<'a> { community_person_ban::table.on( post::community_id .eq(community_person_ban::community_id) - .and(community_person_ban::person_id.eq(post::creator_id)), + .and(community_person_ban::person_id.eq(post::creator_id)) + .and( + community_person_ban::expires + .is_null() + .or(community_person_ban::expires.gt(now)), + ), ), ) .inner_join(post_aggregates::table) @@ -653,6 +663,7 @@ mod tests { inbox_url: inserted_person.inbox_url.to_owned(), shared_inbox_url: None, matrix_user_id: None, + ban_expires: None, }, creator_banned_from_community: false, community: CommunitySafe { diff --git a/crates/db_views_actor/src/community_person_ban_view.rs b/crates/db_views_actor/src/community_person_ban_view.rs index bffbacb12..6c67bd82a 100644 --- a/crates/db_views_actor/src/community_person_ban_view.rs +++ b/crates/db_views_actor/src/community_person_ban_view.rs @@ -1,4 +1,4 @@ -use diesel::{result::Error, *}; +use diesel::{dsl::*, result::Error, *}; use lemmy_db_schema::{ newtypes::{CommunityId, PersonId}, schema::{community, community_person_ban, person}, @@ -31,6 +31,11 @@ impl CommunityPersonBanView { )) .filter(community_person_ban::community_id.eq(from_community_id)) .filter(community_person_ban::person_id.eq(from_person_id)) + .filter( + community_person_ban::expires + .is_null() + .or(community_person_ban::expires.gt(now)), + ) .order_by(community_person_ban::published) .first::<(CommunitySafe, PersonSafe)>(conn)?; diff --git a/crates/db_views_actor/src/person_mention_view.rs b/crates/db_views_actor/src/person_mention_view.rs index 5e6e3df3f..0be446a91 100644 --- a/crates/db_views_actor/src/person_mention_view.rs +++ b/crates/db_views_actor/src/person_mention_view.rs @@ -1,4 +1,4 @@ -use diesel::{result::Error, *}; +use diesel::{dsl::*, result::Error, *}; use lemmy_db_schema::{ aggregates::comment_aggregates::CommentAggregates, functions::hot_rank, @@ -96,7 +96,12 @@ impl PersonMentionView { community_person_ban::table.on( community::id .eq(community_person_ban::community_id) - .and(community_person_ban::person_id.eq(comment::creator_id)), + .and(community_person_ban::person_id.eq(comment::creator_id)) + .and( + community_person_ban::expires + .is_null() + .or(community_person_ban::expires.gt(now)), + ), ), ) .left_join( @@ -241,7 +246,12 @@ impl<'a> PersonMentionQueryBuilder<'a> { community_person_ban::table.on( community::id .eq(community_person_ban::community_id) - .and(community_person_ban::person_id.eq(comment::creator_id)), + .and(community_person_ban::person_id.eq(comment::creator_id)) + .and( + community_person_ban::expires + .is_null() + .or(community_person_ban::expires.gt(now)), + ), ), ) .left_join( diff --git a/crates/db_views_actor/src/person_view.rs b/crates/db_views_actor/src/person_view.rs index b6585196b..d4be05854 100644 --- a/crates/db_views_actor/src/person_view.rs +++ b/crates/db_views_actor/src/person_view.rs @@ -44,7 +44,13 @@ impl PersonViewSafe { let banned = person::table .inner_join(person_aggregates::table) .select((Person::safe_columns_tuple(), person_aggregates::all_columns)) - .filter(person::banned.eq(true)) + .filter( + person::banned.eq(true).and( + person::ban_expires + .is_null() + .or(person::ban_expires.gt(now)), + ), + ) .load::(conn)?; Ok(Self::from_tuple_to_vec(banned)) diff --git a/migrations/2021-12-14-181537_add_temporary_bans/down.sql b/migrations/2021-12-14-181537_add_temporary_bans/down.sql new file mode 100644 index 000000000..83a3715ec --- /dev/null +++ b/migrations/2021-12-14-181537_add_temporary_bans/down.sql @@ -0,0 +1,7 @@ +drop view person_alias_1, person_alias_2; + +alter table person drop column ban_expires; +alter table community_person_ban drop column expires; + +create view person_alias_1 as select * from person; +create view person_alias_2 as select * from person; diff --git a/migrations/2021-12-14-181537_add_temporary_bans/up.sql b/migrations/2021-12-14-181537_add_temporary_bans/up.sql new file mode 100644 index 000000000..7e6338361 --- /dev/null +++ b/migrations/2021-12-14-181537_add_temporary_bans/up.sql @@ -0,0 +1,8 @@ +-- Add ban_expires to person, community_person_ban +alter table person add column ban_expires timestamp; +alter table community_person_ban add column expires timestamp; + +drop view person_alias_1, person_alias_2; +create view person_alias_1 as select * from person; +create view person_alias_2 as select * from person; +