From 924b76a6e6fa51589d605c53e265856b495d165b Mon Sep 17 00:00:00 2001 From: lseeger Date: Sat, 14 Dec 2024 15:32:26 +0100 Subject: [PATCH] created new table post_keyword_block related to a person and corresponding functions in diesel --- crates/db_schema/src/impls/mod.rs | 1 + .../db_schema/src/impls/post_keyword_block.rs | 53 +++++++++++++++++++ crates/db_schema/src/newtypes.rs | 6 +++ crates/db_schema/src/schema.rs | 9 ++++ crates/db_schema/src/source/mod.rs | 1 + .../src/source/post_keyword_block.rs | 31 +++++++++++ crates/db_views/src/post_view.rs | 12 +++++ 7 files changed, 113 insertions(+) create mode 100644 crates/db_schema/src/impls/post_keyword_block.rs create mode 100644 crates/db_schema/src/source/post_keyword_block.rs diff --git a/crates/db_schema/src/impls/mod.rs b/crates/db_schema/src/impls/mod.rs index d4ea47800..ec00ddaa5 100644 --- a/crates/db_schema/src/impls/mod.rs +++ b/crates/db_schema/src/impls/mod.rs @@ -36,3 +36,4 @@ pub mod registration_application; pub mod secret; pub mod site; pub mod tagline; +mod post_keyword_block; diff --git a/crates/db_schema/src/impls/post_keyword_block.rs b/crates/db_schema/src/impls/post_keyword_block.rs new file mode 100644 index 000000000..9611cc9df --- /dev/null +++ b/crates/db_schema/src/impls/post_keyword_block.rs @@ -0,0 +1,53 @@ +use diesel::{delete, insert_into}; +use diesel::result::Error; +use diesel::prelude::*; +use diesel::QueryDsl; +use diesel_async::RunQueryDsl; +use crate::{ + newtypes::{PersonId}, + schema::post_keyword_block, + source::{ + post_keyword_block::{PostKeywordBlock, PostKeywordBlockForm}, + } +}; +use crate::traits::Crud; +use crate::utils::{get_conn, DbPool}; + +impl PostKeywordBlock { + + + pub async fn for_person( + pool: &mut DbPool<'_>, + person_id: PersonId, + ) -> Result, Error> { + let conn = &mut get_conn(pool).await?; + post_keyword_block::table + .filter(post_keyword_block::person_id.eq(person_id)) + .load::(conn) + .await + } + + pub async fn block_keyword( + pool: &mut DbPool<'_>, + post_keyword_block_form: &PostKeywordBlockForm + ) -> Result { + let conn = &mut get_conn(pool).await?; + insert_into(post_keyword_block::table) + .values(post_keyword_block_form) + .get_result::(conn) + .await + } + + pub async fn unblock_keyword( + pool: &mut DbPool<'_>, + post_keyword_block_form: &PostKeywordBlockForm, + ) -> QueryResult { + let conn = &mut get_conn(pool).await?; + delete(post_keyword_block::table) + .filter(post_keyword_block::person_id.eq(post_keyword_block_form.person_id)) + .filter(post_keyword_block::keyword.eq(&post_keyword_block_form.keyword)) + .execute(conn) + .await + } +} + diff --git a/crates/db_schema/src/newtypes.rs b/crates/db_schema/src/newtypes.rs index c28be8222..2059896a7 100644 --- a/crates/db_schema/src/newtypes.rs +++ b/crates/db_schema/src/newtypes.rs @@ -121,6 +121,12 @@ pub struct LanguageId(pub i32); /// The comment reply id. pub struct CommentReplyId(i32); +#[derive(Debug, Copy, Clone, Hash, Eq, PartialEq, Serialize, Deserialize, Default)] +#[cfg_attr(feature = "full", derive(DieselNewType, TS))] +#[cfg_attr(feature = "full", ts(export))] +/// The comment reply id. +pub struct PostKeywordBlockId(i32); + #[derive( Debug, Copy, Clone, Hash, Eq, PartialEq, Serialize, Deserialize, Default, Ord, PartialOrd, )] diff --git a/crates/db_schema/src/schema.rs b/crates/db_schema/src/schema.rs index 66a65d143..f8117f673 100644 --- a/crates/db_schema/src/schema.rs +++ b/crates/db_schema/src/schema.rs @@ -826,6 +826,15 @@ diesel::table! { } } +diesel::table! { + post_keyword_block (id) { + id -> Int4, + #[max_length = 50] + keyword -> Varchar, + person_id -> Int4, + } +} + diesel::table! { private_message (id) { id -> Int4, diff --git a/crates/db_schema/src/source/mod.rs b/crates/db_schema/src/source/mod.rs index 86def9691..e69b6be0f 100644 --- a/crates/db_schema/src/source/mod.rs +++ b/crates/db_schema/src/source/mod.rs @@ -41,6 +41,7 @@ pub mod registration_application; pub mod secret; pub mod site; pub mod tagline; +pub mod post_keyword_block; /// Default value for columns like [community::Community.inbox_url] which are marked as serde(skip). /// diff --git a/crates/db_schema/src/source/post_keyword_block.rs b/crates/db_schema/src/source/post_keyword_block.rs new file mode 100644 index 000000000..f7feaebd6 --- /dev/null +++ b/crates/db_schema/src/source/post_keyword_block.rs @@ -0,0 +1,31 @@ +use crate::newtypes::{PersonId, PostKeywordBlockId}; +use serde::{Deserialize, Serialize}; +#[cfg(feature = "full")] +use crate::schema::post_keyword_block; +#[cfg(feature = "full")] +use ts_rs::TS; + +#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] +#[cfg_attr( + feature = "full", + derive(Queryable, Selectable, Associations, Identifiable,TS) +)] +#[cfg_attr( + feature = "full", + diesel(belongs_to(crate::source::person::Person)) +)] +#[cfg_attr(feature = "full", diesel(table_name = post_keyword_block))] +#[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] +#[cfg_attr(feature = "full", ts(export))] +pub struct PostKeywordBlock { + pub id : PostKeywordBlockId, + pub keyword: String, + pub person_id: PersonId, +} + +#[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] +#[cfg_attr(feature = "full", diesel(table_name = post_keyword_block))] +pub struct PostKeywordBlockForm { + pub person_id: PersonId, + pub keyword: String, +} \ No newline at end of file diff --git a/crates/db_views/src/post_view.rs b/crates/db_views/src/post_view.rs index c6d1b036f..4923f5517 100644 --- a/crates/db_views/src/post_view.rs +++ b/crates/db_views/src/post_view.rs @@ -32,6 +32,7 @@ use lemmy_db_schema::{ post, post_actions, post_aggregates, + post_keyword_block }, source::{ community::{CommunityFollower, CommunityFollowerState}, @@ -85,6 +86,10 @@ fn queries<'a>() -> Queries< .inner_join(community::table) .inner_join(post::table) .left_join(image_details::table.on(post::thumbnail_url.eq(image_details::link.nullable()))) + .left_join(post_keyword_block::table.on( + post_keyword_block::person_id.eq(my_person_id.unwrap_or(PersonId(-1))), + ), + ) .left_join(actions( community_actions::table, my_person_id, @@ -115,6 +120,7 @@ fn queries<'a>() -> Queries< person::all_columns, community::all_columns, image_details::all_columns.nullable(), + post_keyword_block::keyword, creator_community_actions .field(community_actions::received_ban) .nullable() @@ -208,6 +214,8 @@ fn queries<'a>() -> Queries< options.local_user.person_id(), ); + query.filter + // hide posts from deleted communities query = query.filter(community::deleted.eq(false)); @@ -351,6 +359,10 @@ fn queries<'a>() -> Queries< query = query.filter(community_actions::blocked.is_null()); query = query.filter(instance_actions::blocked.is_null()); query = query.filter(person_actions::blocked.is_null()); + query = query.filter( + not(post::name.like(any(post_keyword_block::keyword))) + .and(not(post::body.like(any(post_keyword_block::keyword)))) + .and(not(post::url.like(any(post_keyword_block::keyword))))); } let (limit, offset) = limit_and_offset(options.page, options.limit)?;