From fd275231bc3adb04f832d3d47171939fc9f225cc Mon Sep 17 00:00:00 2001 From: Freakazoid182 <> Date: Sun, 31 Mar 2024 16:49:32 +0200 Subject: [PATCH 01/33] Add custom_emoji list route --- crates/api_common/src/custom_emoji.rs | 19 ++++++++++++++++ crates/api_crud/src/custom_emoji/list.rs | 27 ++++++++++++++++++++++ crates/api_crud/src/custom_emoji/mod.rs | 1 + crates/db_views/src/custom_emoji_view.rs | 29 +++++++++++++++++++++++- src/api_routes_http.rs | 10 ++++---- 5 files changed, 81 insertions(+), 5 deletions(-) create mode 100644 crates/api_crud/src/custom_emoji/list.rs diff --git a/crates/api_common/src/custom_emoji.rs b/crates/api_common/src/custom_emoji.rs index 468d2128d9..eab09f2a98 100644 --- a/crates/api_common/src/custom_emoji.rs +++ b/crates/api_common/src/custom_emoji.rs @@ -1,6 +1,7 @@ use lemmy_db_schema::newtypes::CustomEmojiId; use lemmy_db_views::structs::CustomEmojiView; use serde::{Deserialize, Serialize}; +use serde_with::skip_serializing_none; #[cfg(feature = "full")] use ts_rs::TS; use url::Url; @@ -46,3 +47,21 @@ pub struct DeleteCustomEmoji { pub struct CustomEmojiResponse { pub custom_emoji: CustomEmojiView, } + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[cfg_attr(feature = "full", derive(TS))] +#[cfg_attr(feature = "full", ts(export))] +/// A response for custom emojis. +pub struct ListCustomEmojisResponse { + pub custom_emojis: Vec, +} + +#[skip_serializing_none] +#[derive(Debug, Serialize, Deserialize, Clone, Copy, Default, PartialEq, Eq, Hash)] +#[cfg_attr(feature = "full", derive(TS))] +#[cfg_attr(feature = "full", ts(export))] +/// Fetches a list of registration applications. +pub struct ListCustomEmojis { + pub page: Option, + pub limit: Option, +} diff --git a/crates/api_crud/src/custom_emoji/list.rs b/crates/api_crud/src/custom_emoji/list.rs new file mode 100644 index 0000000000..86ec74bad2 --- /dev/null +++ b/crates/api_crud/src/custom_emoji/list.rs @@ -0,0 +1,27 @@ +use actix_web::web::{Data, Json, Query}; +use lemmy_api_common::{ + context::LemmyContext, + custom_emoji::{ListCustomEmojis, ListCustomEmojisResponse}, +}; +use lemmy_db_views::structs::{CustomEmojiView, LocalUserView, SiteView}; +use lemmy_utils::error::LemmyError; + +#[tracing::instrument(skip(context))] +pub async fn list_custom_emojis( + data: Query, + local_user_view: Option, + context: Data, +) -> Result, LemmyError> { + + let local_site = SiteView::read_local(&mut context.pool()).await?; + let custom_emojis = CustomEmojiView::list( + &mut context.pool(), + local_site.local_site.id, + data.page, + data.limit, + ) + .await + .map_err(|e| anyhow::anyhow!("Failed to construct custom emojis response: {e}"))?; + + Ok(Json(ListCustomEmojisResponse { custom_emojis })) +} diff --git a/crates/api_crud/src/custom_emoji/mod.rs b/crates/api_crud/src/custom_emoji/mod.rs index fdb2f55613..ffd48daf6b 100644 --- a/crates/api_crud/src/custom_emoji/mod.rs +++ b/crates/api_crud/src/custom_emoji/mod.rs @@ -1,3 +1,4 @@ pub mod create; pub mod delete; +pub mod list; pub mod update; diff --git a/crates/db_views/src/custom_emoji_view.rs b/crates/db_views/src/custom_emoji_view.rs index 4d2f1fd859..ef391954bc 100644 --- a/crates/db_views/src/custom_emoji_view.rs +++ b/crates/db_views/src/custom_emoji_view.rs @@ -5,7 +5,7 @@ use lemmy_db_schema::{ newtypes::{CustomEmojiId, LocalSiteId}, schema::{custom_emoji, custom_emoji_keyword}, source::{custom_emoji::CustomEmoji, custom_emoji_keyword::CustomEmojiKeyword}, - utils::{get_conn, DbPool}, + utils::{get_conn, limit_and_offset, DbPool}, }; use std::collections::HashMap; @@ -57,6 +57,33 @@ impl CustomEmojiView { Ok(CustomEmojiView::from_tuple_to_vec(emojis)) } + pub async fn list( + pool: &mut DbPool<'_>, + for_local_site_id: LocalSiteId, + page: Option, + limit: Option, + ) -> Result, Error> { + let conn = &mut get_conn(pool).await?; + let (limit, offset) = limit_and_offset(page, limit)?; + let emojis = custom_emoji::table + .filter(custom_emoji::local_site_id.eq(for_local_site_id)) + .left_join( + custom_emoji_keyword::table.on(custom_emoji_keyword::custom_emoji_id.eq(custom_emoji::id)), + ) + .order(custom_emoji::category) + .then_order_by(custom_emoji::id) + .select(( + custom_emoji::all_columns, + custom_emoji_keyword::all_columns.nullable(), // (or all the columns if you want) + )) + .limit(limit) + .offset(offset) + .load::(conn) + .await?; + + Ok(CustomEmojiView::from_tuple_to_vec(emojis)) + } + fn from_tuple_to_vec(items: Vec) -> Vec { let mut result = Vec::new(); let mut hash: HashMap> = HashMap::new(); diff --git a/src/api_routes_http.rs b/src/api_routes_http.rs index 013e2e0925..0dcdf5cf64 100644 --- a/src/api_routes_http.rs +++ b/src/api_routes_http.rs @@ -104,9 +104,10 @@ use lemmy_api_crud::{ update::update_community, }, custom_emoji::{ - create::create_custom_emoji, - delete::delete_custom_emoji, - update::update_custom_emoji, + create::create_custom_emoji, + delete::delete_custom_emoji, + list::list_custom_emojis, + update::update_custom_emoji }, post::{ create::create_post, @@ -361,7 +362,8 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) { .wrap(rate_limit.message()) .route("", web::post().to(create_custom_emoji)) .route("", web::put().to(update_custom_emoji)) - .route("/delete", web::post().to(delete_custom_emoji)), + .route("/delete", web::post().to(delete_custom_emoji)) + .route("/list", web::get().to(list_custom_emojis)), ), ); cfg.service( From b4a86157a5881a13c5f846f436529a6d508f2ff4 Mon Sep 17 00:00:00 2001 From: Freakazoid182 <> Date: Sun, 31 Mar 2024 17:25:54 +0200 Subject: [PATCH 02/33] Add tagline list route --- crates/api_common/src/lib.rs | 1 + crates/api_common/src/tagline.rs | 23 +++++++++++++++++ crates/api_crud/src/lib.rs | 1 + crates/api_crud/src/tagline/list.rs | 27 ++++++++++++++++++++ crates/api_crud/src/tagline/mod.rs | 1 + crates/db_views/src/lib.rs | 2 ++ crates/db_views/src/structs.rs | 12 ++++++++- crates/db_views/src/tagline_view.rs | 39 +++++++++++++++++++++++++++++ src/api_routes_http.rs | 8 +++++- 9 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 crates/api_common/src/tagline.rs create mode 100644 crates/api_crud/src/tagline/list.rs create mode 100644 crates/api_crud/src/tagline/mod.rs create mode 100644 crates/db_views/src/tagline_view.rs diff --git a/crates/api_common/src/lib.rs b/crates/api_common/src/lib.rs index b55dff32f9..b3a5293dfe 100644 --- a/crates/api_common/src/lib.rs +++ b/crates/api_common/src/lib.rs @@ -16,6 +16,7 @@ pub mod request; pub mod send_activity; pub mod sensitive; pub mod site; +pub mod tagline; #[cfg(feature = "full")] pub mod utils; diff --git a/crates/api_common/src/tagline.rs b/crates/api_common/src/tagline.rs new file mode 100644 index 0000000000..e837e8195b --- /dev/null +++ b/crates/api_common/src/tagline.rs @@ -0,0 +1,23 @@ +use serde::{Deserialize, Serialize}; +use lemmy_db_views::structs::TaglineView; +use serde_with::skip_serializing_none; +#[cfg(feature = "full")] +use ts_rs::TS; + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[cfg_attr(feature = "full", derive(TS))] +#[cfg_attr(feature = "full", ts(export))] +/// A response for custom emojis. +pub struct ListTaglinesResponse { + pub taglines: Vec, +} + +#[skip_serializing_none] +#[derive(Debug, Serialize, Deserialize, Clone, Copy, Default, PartialEq, Eq, Hash)] +#[cfg_attr(feature = "full", derive(TS))] +#[cfg_attr(feature = "full", ts(export))] +/// Fetches a list of registration applications. +pub struct ListTaglines { + pub page: Option, + pub limit: Option, +} diff --git a/crates/api_crud/src/lib.rs b/crates/api_crud/src/lib.rs index aee3e81345..b60fb32405 100644 --- a/crates/api_crud/src/lib.rs +++ b/crates/api_crud/src/lib.rs @@ -4,4 +4,5 @@ pub mod custom_emoji; pub mod post; pub mod private_message; pub mod site; +pub mod tagline; pub mod user; diff --git a/crates/api_crud/src/tagline/list.rs b/crates/api_crud/src/tagline/list.rs new file mode 100644 index 0000000000..35bfb71fcd --- /dev/null +++ b/crates/api_crud/src/tagline/list.rs @@ -0,0 +1,27 @@ +use actix_web::web::{Data, Json, Query}; +use lemmy_api_common::{ + context::LemmyContext, + tagline::{ListTaglines, ListTaglinesResponse}, +}; +use lemmy_db_views::structs::{TaglineView, LocalUserView, SiteView}; +use lemmy_utils::error::LemmyError; + +#[tracing::instrument(skip(context))] +pub async fn list_taglines( + data: Query, + local_user_view: Option, + context: Data, +) -> Result, LemmyError> { + + let local_site = SiteView::read_local(&mut context.pool()).await?; + let taglines = TaglineView::list( + &mut context.pool(), + local_site.local_site.id, + data.page, + data.limit, + ) + .await + .map_err(|e| anyhow::anyhow!("Failed to construct taglines response: {e}"))?; + + Ok(Json(ListTaglinesResponse { taglines })) +} diff --git a/crates/api_crud/src/tagline/mod.rs b/crates/api_crud/src/tagline/mod.rs new file mode 100644 index 0000000000..651aed76e4 --- /dev/null +++ b/crates/api_crud/src/tagline/mod.rs @@ -0,0 +1 @@ +pub mod list; \ No newline at end of file diff --git a/crates/db_views/src/lib.rs b/crates/db_views/src/lib.rs index 73310d7432..64bb58d631 100644 --- a/crates/db_views/src/lib.rs +++ b/crates/db_views/src/lib.rs @@ -21,6 +21,8 @@ pub mod private_message_view; pub mod registration_application_view; #[cfg(feature = "full")] pub mod site_view; +#[cfg(feature = "full")] +pub mod tagline_view; pub mod structs; #[cfg(feature = "full")] pub mod vote_view; diff --git a/crates/db_views/src/structs.rs b/crates/db_views/src/structs.rs index a290ca4a14..849897f734 100644 --- a/crates/db_views/src/structs.rs +++ b/crates/db_views/src/structs.rs @@ -18,7 +18,8 @@ use lemmy_db_schema::{ private_message::PrivateMessage, private_message_report::PrivateMessageReport, registration_application::RegistrationApplication, - site::Site, + site::Site, + tagline::Tagline, }, SubscribedType, }; @@ -193,6 +194,15 @@ pub struct SiteView { pub counts: SiteAggregates, } +#[derive(Debug, Serialize, Deserialize, Clone)] +#[cfg_attr(feature = "full", derive(TS, Queryable))] +#[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] +#[cfg_attr(feature = "full", ts(export))] +/// A custom emoji view. +pub struct TaglineView { + pub tagline: Tagline, +} + #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS, Queryable))] #[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] diff --git a/crates/db_views/src/tagline_view.rs b/crates/db_views/src/tagline_view.rs new file mode 100644 index 0000000000..35abb17062 --- /dev/null +++ b/crates/db_views/src/tagline_view.rs @@ -0,0 +1,39 @@ +use crate::structs::TaglineView; +use diesel::{result::Error, ExpressionMethods, QueryDsl}; +use diesel_async::RunQueryDsl; +use lemmy_db_schema::{ + newtypes::LocalSiteId, + schema::tagline, + source::tagline::Tagline, + utils::{get_conn, limit_and_offset, DbPool}, +}; + +impl TaglineView { + + pub async fn list( + pool: &mut DbPool<'_>, + for_local_site_id: LocalSiteId, + page: Option, + limit: Option, + ) -> Result, Error> { + let conn = &mut get_conn(pool).await?; + let (limit, offset) = limit_and_offset(page, limit)?; + let taglines = tagline::table + .filter(tagline::local_site_id.eq(for_local_site_id)) + .order(tagline::id) + .select(tagline::all_columns) + .limit(limit) + .offset(offset) + .load::(conn) + .await?; + + let mut result = Vec::new(); + for tagline in &taglines { + result.push(TaglineView { + tagline: tagline.clone() + }); + } + + Ok(result) + } + } diff --git a/src/api_routes_http.rs b/src/api_routes_http.rs index 0dcdf5cf64..e309d2dafc 100644 --- a/src/api_routes_http.rs +++ b/src/api_routes_http.rs @@ -123,6 +123,7 @@ use lemmy_api_crud::{ update::update_private_message, }, site::{create::create_site, read::get_site, update::update_site}, + tagline::list::list_taglines, user::{create::register, delete::delete_account}, }; use lemmy_apub::api::{ @@ -364,7 +365,12 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) { .route("", web::put().to(update_custom_emoji)) .route("/delete", web::post().to(delete_custom_emoji)) .route("/list", web::get().to(list_custom_emojis)), - ), + ) + .service( + web::scope("/tagline") + .wrap(rate_limit.message()) + .route("/list", web::get().to(list_taglines)) + ) ); cfg.service( web::scope("/sitemap.xml") From 10a8f01fade6ff4ebe84f5d90d5f155f074a9875 Mon Sep 17 00:00:00 2001 From: Freakazoid182 <> Date: Sun, 31 Mar 2024 17:42:48 +0200 Subject: [PATCH 03/33] Apply linting --- crates/api_common/src/tagline.rs | 2 +- crates/api_crud/src/custom_emoji/list.rs | 3 +-- crates/api_crud/src/tagline/list.rs | 5 ++--- crates/api_crud/src/tagline/mod.rs | 2 +- crates/db_views/src/lib.rs | 2 +- crates/db_views/src/structs.rs | 2 +- crates/db_views/src/tagline_view.rs | 7 +++---- src/api_routes_http.rs | 14 +++++++------- 8 files changed, 17 insertions(+), 20 deletions(-) diff --git a/crates/api_common/src/tagline.rs b/crates/api_common/src/tagline.rs index e837e8195b..4728d0cbbf 100644 --- a/crates/api_common/src/tagline.rs +++ b/crates/api_common/src/tagline.rs @@ -1,5 +1,5 @@ -use serde::{Deserialize, Serialize}; use lemmy_db_views::structs::TaglineView; +use serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; #[cfg(feature = "full")] use ts_rs::TS; diff --git a/crates/api_crud/src/custom_emoji/list.rs b/crates/api_crud/src/custom_emoji/list.rs index 86ec74bad2..811e32652c 100644 --- a/crates/api_crud/src/custom_emoji/list.rs +++ b/crates/api_crud/src/custom_emoji/list.rs @@ -12,7 +12,6 @@ pub async fn list_custom_emojis( local_user_view: Option, context: Data, ) -> Result, LemmyError> { - let local_site = SiteView::read_local(&mut context.pool()).await?; let custom_emojis = CustomEmojiView::list( &mut context.pool(), @@ -20,7 +19,7 @@ pub async fn list_custom_emojis( data.page, data.limit, ) - .await + .await .map_err(|e| anyhow::anyhow!("Failed to construct custom emojis response: {e}"))?; Ok(Json(ListCustomEmojisResponse { custom_emojis })) diff --git a/crates/api_crud/src/tagline/list.rs b/crates/api_crud/src/tagline/list.rs index 35bfb71fcd..22deeeb61f 100644 --- a/crates/api_crud/src/tagline/list.rs +++ b/crates/api_crud/src/tagline/list.rs @@ -3,7 +3,7 @@ use lemmy_api_common::{ context::LemmyContext, tagline::{ListTaglines, ListTaglinesResponse}, }; -use lemmy_db_views::structs::{TaglineView, LocalUserView, SiteView}; +use lemmy_db_views::structs::{LocalUserView, SiteView, TaglineView}; use lemmy_utils::error::LemmyError; #[tracing::instrument(skip(context))] @@ -12,7 +12,6 @@ pub async fn list_taglines( local_user_view: Option, context: Data, ) -> Result, LemmyError> { - let local_site = SiteView::read_local(&mut context.pool()).await?; let taglines = TaglineView::list( &mut context.pool(), @@ -20,7 +19,7 @@ pub async fn list_taglines( data.page, data.limit, ) - .await + .await .map_err(|e| anyhow::anyhow!("Failed to construct taglines response: {e}"))?; Ok(Json(ListTaglinesResponse { taglines })) diff --git a/crates/api_crud/src/tagline/mod.rs b/crates/api_crud/src/tagline/mod.rs index 651aed76e4..d17e233fbf 100644 --- a/crates/api_crud/src/tagline/mod.rs +++ b/crates/api_crud/src/tagline/mod.rs @@ -1 +1 @@ -pub mod list; \ No newline at end of file +pub mod list; diff --git a/crates/db_views/src/lib.rs b/crates/db_views/src/lib.rs index 64bb58d631..6cc951c86f 100644 --- a/crates/db_views/src/lib.rs +++ b/crates/db_views/src/lib.rs @@ -21,8 +21,8 @@ pub mod private_message_view; pub mod registration_application_view; #[cfg(feature = "full")] pub mod site_view; +pub mod structs; #[cfg(feature = "full")] pub mod tagline_view; -pub mod structs; #[cfg(feature = "full")] pub mod vote_view; diff --git a/crates/db_views/src/structs.rs b/crates/db_views/src/structs.rs index 849897f734..f9ad4dcd3d 100644 --- a/crates/db_views/src/structs.rs +++ b/crates/db_views/src/structs.rs @@ -18,7 +18,7 @@ use lemmy_db_schema::{ private_message::PrivateMessage, private_message_report::PrivateMessageReport, registration_application::RegistrationApplication, - site::Site, + site::Site, tagline::Tagline, }, SubscribedType, diff --git a/crates/db_views/src/tagline_view.rs b/crates/db_views/src/tagline_view.rs index 35abb17062..954460c582 100644 --- a/crates/db_views/src/tagline_view.rs +++ b/crates/db_views/src/tagline_view.rs @@ -9,7 +9,6 @@ use lemmy_db_schema::{ }; impl TaglineView { - pub async fn list( pool: &mut DbPool<'_>, for_local_site_id: LocalSiteId, @@ -29,11 +28,11 @@ impl TaglineView { let mut result = Vec::new(); for tagline in &taglines { - result.push(TaglineView { - tagline: tagline.clone() + result.push(TaglineView { + tagline: tagline.clone(), }); } Ok(result) } - } +} diff --git a/src/api_routes_http.rs b/src/api_routes_http.rs index e309d2dafc..ea84fd2491 100644 --- a/src/api_routes_http.rs +++ b/src/api_routes_http.rs @@ -104,10 +104,10 @@ use lemmy_api_crud::{ update::update_community, }, custom_emoji::{ - create::create_custom_emoji, - delete::delete_custom_emoji, - list::list_custom_emojis, - update::update_custom_emoji + create::create_custom_emoji, + delete::delete_custom_emoji, + list::list_custom_emojis, + update::update_custom_emoji, }, post::{ create::create_post, @@ -123,7 +123,7 @@ use lemmy_api_crud::{ update::update_private_message, }, site::{create::create_site, read::get_site, update::update_site}, - tagline::list::list_taglines, + tagline::list::list_taglines, user::{create::register, delete::delete_account}, }; use lemmy_apub::api::{ @@ -369,8 +369,8 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) { .service( web::scope("/tagline") .wrap(rate_limit.message()) - .route("/list", web::get().to(list_taglines)) - ) + .route("/list", web::get().to(list_taglines)), + ), ); cfg.service( web::scope("/sitemap.xml") From 17e2834e1b032e5d9ab3515c4a6fbfcdff6aad57 Mon Sep 17 00:00:00 2001 From: Freakazoid182 <> Date: Tue, 2 Apr 2024 22:27:53 +0200 Subject: [PATCH 04/33] Remove unecessary TaglineView --- crates/api_common/src/tagline.rs | 4 +-- crates/api_crud/src/tagline/list.rs | 8 +++--- crates/db_schema/src/impls/tagline.rs | 21 +++++++++++++-- crates/db_views/src/lib.rs | 2 -- crates/db_views/src/structs.rs | 10 ------- crates/db_views/src/tagline_view.rs | 38 --------------------------- 6 files changed, 25 insertions(+), 58 deletions(-) delete mode 100644 crates/db_views/src/tagline_view.rs diff --git a/crates/api_common/src/tagline.rs b/crates/api_common/src/tagline.rs index 4728d0cbbf..332a838c20 100644 --- a/crates/api_common/src/tagline.rs +++ b/crates/api_common/src/tagline.rs @@ -1,4 +1,4 @@ -use lemmy_db_views::structs::TaglineView; +use lemmy_db_schema::source::tagline::Tagline; use serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; #[cfg(feature = "full")] @@ -9,7 +9,7 @@ use ts_rs::TS; #[cfg_attr(feature = "full", ts(export))] /// A response for custom emojis. pub struct ListTaglinesResponse { - pub taglines: Vec, + pub taglines: Vec, } #[skip_serializing_none] diff --git a/crates/api_crud/src/tagline/list.rs b/crates/api_crud/src/tagline/list.rs index 22deeeb61f..d8f067ef12 100644 --- a/crates/api_crud/src/tagline/list.rs +++ b/crates/api_crud/src/tagline/list.rs @@ -3,7 +3,8 @@ use lemmy_api_common::{ context::LemmyContext, tagline::{ListTaglines, ListTaglinesResponse}, }; -use lemmy_db_views::structs::{LocalUserView, SiteView, TaglineView}; +use lemmy_db_schema::source::tagline::Tagline; +use lemmy_db_views::structs::{LocalUserView, SiteView}; use lemmy_utils::error::LemmyError; #[tracing::instrument(skip(context))] @@ -13,14 +14,13 @@ pub async fn list_taglines( context: Data, ) -> Result, LemmyError> { let local_site = SiteView::read_local(&mut context.pool()).await?; - let taglines = TaglineView::list( + let taglines = Tagline::list( &mut context.pool(), local_site.local_site.id, data.page, data.limit, ) - .await - .map_err(|e| anyhow::anyhow!("Failed to construct taglines response: {e}"))?; + .await?; Ok(Json(ListTaglinesResponse { taglines })) } diff --git a/crates/db_schema/src/impls/tagline.rs b/crates/db_schema/src/impls/tagline.rs index be4860e17f..94faee249f 100644 --- a/crates/db_schema/src/impls/tagline.rs +++ b/crates/db_schema/src/impls/tagline.rs @@ -1,8 +1,8 @@ use crate::{ newtypes::LocalSiteId, - schema::tagline::dsl::{local_site_id, tagline}, + schema::tagline::dsl::{local_site_id, published, tagline}, source::tagline::{Tagline, TaglineForm}, - utils::{get_conn, DbPool}, + utils::{get_conn, limit_and_offset, DbPool}, }; use diesel::{insert_into, result::Error, ExpressionMethods, QueryDsl}; use diesel_async::{AsyncPgConnection, RunQueryDsl}; @@ -55,4 +55,21 @@ impl Tagline { .get_results::(conn) .await } + + pub async fn list( + pool: &mut DbPool<'_>, + for_local_site_id: LocalSiteId, + page: Option, + limit: Option, + ) -> Result, Error> { + let conn = &mut get_conn(pool).await?; + let (limit, offset) = limit_and_offset(page, limit)?; + tagline + .order(published.desc()) + .offset(offset) + .limit(limit) + .filter(local_site_id.eq(for_local_site_id)) + .get_results::(conn) + .await + } } diff --git a/crates/db_views/src/lib.rs b/crates/db_views/src/lib.rs index 6cc951c86f..73310d7432 100644 --- a/crates/db_views/src/lib.rs +++ b/crates/db_views/src/lib.rs @@ -23,6 +23,4 @@ pub mod registration_application_view; pub mod site_view; pub mod structs; #[cfg(feature = "full")] -pub mod tagline_view; -#[cfg(feature = "full")] pub mod vote_view; diff --git a/crates/db_views/src/structs.rs b/crates/db_views/src/structs.rs index f9ad4dcd3d..a290ca4a14 100644 --- a/crates/db_views/src/structs.rs +++ b/crates/db_views/src/structs.rs @@ -19,7 +19,6 @@ use lemmy_db_schema::{ private_message_report::PrivateMessageReport, registration_application::RegistrationApplication, site::Site, - tagline::Tagline, }, SubscribedType, }; @@ -194,15 +193,6 @@ pub struct SiteView { pub counts: SiteAggregates, } -#[derive(Debug, Serialize, Deserialize, Clone)] -#[cfg_attr(feature = "full", derive(TS, Queryable))] -#[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] -#[cfg_attr(feature = "full", ts(export))] -/// A custom emoji view. -pub struct TaglineView { - pub tagline: Tagline, -} - #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS, Queryable))] #[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] diff --git a/crates/db_views/src/tagline_view.rs b/crates/db_views/src/tagline_view.rs deleted file mode 100644 index 954460c582..0000000000 --- a/crates/db_views/src/tagline_view.rs +++ /dev/null @@ -1,38 +0,0 @@ -use crate::structs::TaglineView; -use diesel::{result::Error, ExpressionMethods, QueryDsl}; -use diesel_async::RunQueryDsl; -use lemmy_db_schema::{ - newtypes::LocalSiteId, - schema::tagline, - source::tagline::Tagline, - utils::{get_conn, limit_and_offset, DbPool}, -}; - -impl TaglineView { - pub async fn list( - pool: &mut DbPool<'_>, - for_local_site_id: LocalSiteId, - page: Option, - limit: Option, - ) -> Result, Error> { - let conn = &mut get_conn(pool).await?; - let (limit, offset) = limit_and_offset(page, limit)?; - let taglines = tagline::table - .filter(tagline::local_site_id.eq(for_local_site_id)) - .order(tagline::id) - .select(tagline::all_columns) - .limit(limit) - .offset(offset) - .load::(conn) - .await?; - - let mut result = Vec::new(); - for tagline in &taglines { - result.push(TaglineView { - tagline: tagline.clone(), - }); - } - - Ok(result) - } -} From 486c746eb9be84992489edc52dfc5da9e47fcf93 Mon Sep 17 00:00:00 2001 From: Freakazoid182 <> Date: Tue, 2 Apr 2024 23:22:50 +0200 Subject: [PATCH 05/33] Add category filter for custom emoji --- crates/api_common/src/custom_emoji.rs | 5 +++-- crates/api_crud/src/custom_emoji/list.rs | 4 ++-- crates/db_views/src/custom_emoji_view.rs | 13 +++++++++++-- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/crates/api_common/src/custom_emoji.rs b/crates/api_common/src/custom_emoji.rs index eab09f2a98..7a846eae23 100644 --- a/crates/api_common/src/custom_emoji.rs +++ b/crates/api_common/src/custom_emoji.rs @@ -57,11 +57,12 @@ pub struct ListCustomEmojisResponse { } #[skip_serializing_none] -#[derive(Debug, Serialize, Deserialize, Clone, Copy, Default, PartialEq, Eq, Hash)] +#[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] -/// Fetches a list of registration applications. +/// Fetches a list of custom emojis. pub struct ListCustomEmojis { pub page: Option, pub limit: Option, + pub category: Option, } diff --git a/crates/api_crud/src/custom_emoji/list.rs b/crates/api_crud/src/custom_emoji/list.rs index 811e32652c..dab3e8823f 100644 --- a/crates/api_crud/src/custom_emoji/list.rs +++ b/crates/api_crud/src/custom_emoji/list.rs @@ -16,11 +16,11 @@ pub async fn list_custom_emojis( let custom_emojis = CustomEmojiView::list( &mut context.pool(), local_site.local_site.id, + &data.category, data.page, data.limit, ) - .await - .map_err(|e| anyhow::anyhow!("Failed to construct custom emojis response: {e}"))?; + .await?; Ok(Json(ListCustomEmojisResponse { custom_emojis })) } diff --git a/crates/db_views/src/custom_emoji_view.rs b/crates/db_views/src/custom_emoji_view.rs index ef391954bc..70dfb31e50 100644 --- a/crates/db_views/src/custom_emoji_view.rs +++ b/crates/db_views/src/custom_emoji_view.rs @@ -60,16 +60,25 @@ impl CustomEmojiView { pub async fn list( pool: &mut DbPool<'_>, for_local_site_id: LocalSiteId, + category: &Option, page: Option, limit: Option, ) -> Result, Error> { let conn = &mut get_conn(pool).await?; let (limit, offset) = limit_and_offset(page, limit)?; - let emojis = custom_emoji::table - .filter(custom_emoji::local_site_id.eq(for_local_site_id)) + let mut query = custom_emoji::table .left_join( custom_emoji_keyword::table.on(custom_emoji_keyword::custom_emoji_id.eq(custom_emoji::id)), ) + .into_boxed(); + + query = query.filter(custom_emoji::local_site_id.eq(for_local_site_id)); + + if let Some(category) = category { + query = query.filter(custom_emoji::category.eq(category)) + } + + let emojis = query .order(custom_emoji::category) .then_order_by(custom_emoji::id) .select(( From a1a7e2ca339b1fd7a664802ad953180e17d94f3c Mon Sep 17 00:00:00 2001 From: Freakazoid182 <> Date: Wed, 3 Apr 2024 22:14:25 +0200 Subject: [PATCH 06/33] Add create tagline endpoint --- crates/api_common/src/tagline.rs | 15 ++++++++++++ crates/api_crud/src/tagline/create.rs | 34 ++++++++++++++++++++++++++ crates/api_crud/src/tagline/mod.rs | 1 + crates/db_schema/src/impls/tagline.rs | 15 ++++++++++-- crates/db_schema/src/source/tagline.rs | 2 +- src/api_routes_http.rs | 3 ++- 6 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 crates/api_crud/src/tagline/create.rs diff --git a/crates/api_common/src/tagline.rs b/crates/api_common/src/tagline.rs index 332a838c20..cfc2501e87 100644 --- a/crates/api_common/src/tagline.rs +++ b/crates/api_common/src/tagline.rs @@ -4,6 +4,21 @@ use serde_with::skip_serializing_none; #[cfg(feature = "full")] use ts_rs::TS; +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] +#[cfg_attr(feature = "full", derive(TS))] +#[cfg_attr(feature = "full", ts(export))] +/// Create a tagline +pub struct CreateTagline { + pub content: String, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[cfg_attr(feature = "full", derive(TS))] +#[cfg_attr(feature = "full", ts(export))] +pub struct TaglineResponse { + pub tagline: Tagline, +} + #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] diff --git a/crates/api_crud/src/tagline/create.rs b/crates/api_crud/src/tagline/create.rs new file mode 100644 index 0000000000..43a48c0e76 --- /dev/null +++ b/crates/api_crud/src/tagline/create.rs @@ -0,0 +1,34 @@ +use activitypub_federation::config::Data; +use actix_web::web::Json; +use lemmy_api_common::{ + context::LemmyContext, + tagline::{CreateTagline, TaglineResponse}, + utils::is_admin, +}; +use lemmy_db_schema::source::{ + local_site::LocalSite, + tagline::{Tagline, TaglineInsertForm}, +}; +use lemmy_db_views::structs::LocalUserView; +use lemmy_utils::error::LemmyError; + +#[tracing::instrument(skip(context))] +pub async fn create_tagline( + data: Json, + context: Data, + local_user_view: LocalUserView, +) -> Result, LemmyError> { + let local_site = LocalSite::read(&mut context.pool()).await?; + // Make sure user is an admin + is_admin(&local_user_view)?; + + let tagline_form = TaglineInsertForm { + local_site_id: local_site.id, + content: data.content.to_string(), + updated: None, + }; + + let tagline = Tagline::create(&mut context.pool(), &tagline_form).await?; + + Ok(Json(TaglineResponse { tagline })) +} diff --git a/crates/api_crud/src/tagline/mod.rs b/crates/api_crud/src/tagline/mod.rs index d17e233fbf..fa6613e510 100644 --- a/crates/api_crud/src/tagline/mod.rs +++ b/crates/api_crud/src/tagline/mod.rs @@ -1 +1,2 @@ +pub mod create; pub mod list; diff --git a/crates/db_schema/src/impls/tagline.rs b/crates/db_schema/src/impls/tagline.rs index 94faee249f..9b3dffc132 100644 --- a/crates/db_schema/src/impls/tagline.rs +++ b/crates/db_schema/src/impls/tagline.rs @@ -1,7 +1,7 @@ use crate::{ newtypes::LocalSiteId, schema::tagline::dsl::{local_site_id, published, tagline}, - source::tagline::{Tagline, TaglineForm}, + source::tagline::{Tagline, TaglineInsertForm}, utils::{get_conn, limit_and_offset, DbPool}, }; use diesel::{insert_into, result::Error, ExpressionMethods, QueryDsl}; @@ -22,7 +22,7 @@ impl Tagline { Self::clear(conn).await?; for item in list { - let form = TaglineForm { + let form = TaglineInsertForm { local_site_id: for_local_site_id, content: item, updated: None, @@ -41,6 +41,17 @@ impl Tagline { } } + pub async fn create( + pool: &mut DbPool<'_>, + form: &TaglineInsertForm, + ) -> Result { + let conn = &mut get_conn(pool).await?; + insert_into(tagline) + .values(form) + .get_result::(conn) + .await + } + async fn clear(conn: &mut AsyncPgConnection) -> Result { diesel::delete(tagline).execute(conn).await } diff --git a/crates/db_schema/src/source/tagline.rs b/crates/db_schema/src/source/tagline.rs index dbc904a785..c08d9f22ca 100644 --- a/crates/db_schema/src/source/tagline.rs +++ b/crates/db_schema/src/source/tagline.rs @@ -32,7 +32,7 @@ pub struct Tagline { #[derive(Clone, Default)] #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = tagline))] -pub struct TaglineForm { +pub struct TaglineInsertForm { pub local_site_id: LocalSiteId, pub content: String, pub updated: Option>, diff --git a/src/api_routes_http.rs b/src/api_routes_http.rs index ea84fd2491..80b7ce6302 100644 --- a/src/api_routes_http.rs +++ b/src/api_routes_http.rs @@ -123,7 +123,7 @@ use lemmy_api_crud::{ update::update_private_message, }, site::{create::create_site, read::get_site, update::update_site}, - tagline::list::list_taglines, + tagline::{create::create_tagline, list::list_taglines}, user::{create::register, delete::delete_account}, }; use lemmy_apub::api::{ @@ -369,6 +369,7 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) { .service( web::scope("/tagline") .wrap(rate_limit.message()) + .route("/", web::post().to(create_tagline)) .route("/list", web::get().to(list_taglines)), ), ); From ab938062e4730a3fb6596848d34aa307bbb3c83a Mon Sep 17 00:00:00 2001 From: Freakazoid182 <> Date: Wed, 3 Apr 2024 22:33:43 +0200 Subject: [PATCH 07/33] Add update tagline endpoint --- crates/api_common/src/tagline.rs | 11 ++++++++- crates/api_crud/src/tagline/mod.rs | 1 + crates/api_crud/src/tagline/update.rs | 34 ++++++++++++++++++++++++++ crates/db_schema/src/impls/tagline.rs | 16 ++++++++++-- crates/db_schema/src/newtypes.rs | 6 +++++ crates/db_schema/src/source/tagline.rs | 9 +++++++ src/api_routes_http.rs | 7 +++++- 7 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 crates/api_crud/src/tagline/update.rs diff --git a/crates/api_common/src/tagline.rs b/crates/api_common/src/tagline.rs index cfc2501e87..e2dfd8ffde 100644 --- a/crates/api_common/src/tagline.rs +++ b/crates/api_common/src/tagline.rs @@ -1,4 +1,4 @@ -use lemmy_db_schema::source::tagline::Tagline; +use lemmy_db_schema::{newtypes::TaglineId, source::tagline::Tagline}; use serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; #[cfg(feature = "full")] @@ -12,6 +12,15 @@ pub struct CreateTagline { pub content: String, } +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] +#[cfg_attr(feature = "full", derive(TS))] +#[cfg_attr(feature = "full", ts(export))] +/// Update a tagline +pub struct UpdateTagline { + pub id: TaglineId, + pub content: String, +} + #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] diff --git a/crates/api_crud/src/tagline/mod.rs b/crates/api_crud/src/tagline/mod.rs index fa6613e510..9ab1b43f88 100644 --- a/crates/api_crud/src/tagline/mod.rs +++ b/crates/api_crud/src/tagline/mod.rs @@ -1,2 +1,3 @@ pub mod create; pub mod list; +pub mod update; diff --git a/crates/api_crud/src/tagline/update.rs b/crates/api_crud/src/tagline/update.rs new file mode 100644 index 0000000000..fe5709375c --- /dev/null +++ b/crates/api_crud/src/tagline/update.rs @@ -0,0 +1,34 @@ +use activitypub_federation::config::Data; +use actix_web::web::Json; +use lemmy_api_common::{ + context::LemmyContext, + tagline::{UpdateTagline, TaglineResponse}, + utils::is_admin, +}; +use lemmy_db_schema::{source::{ + local_site::LocalSite, + tagline::{Tagline, TaglineUpdateForm}, +}, utils::naive_now}; +use lemmy_db_views::structs::LocalUserView; +use lemmy_utils::error::LemmyError; + +#[tracing::instrument(skip(context))] +pub async fn update_tagline( + data: Json, + context: Data, + local_user_view: LocalUserView, +) -> Result, LemmyError> { + let local_site = LocalSite::read(&mut context.pool()).await?; + // Make sure user is an admin + is_admin(&local_user_view)?; + + let tagline_form = TaglineUpdateForm { + local_site_id: local_site.id, + content: data.content.to_string(), + updated: Some(naive_now()), + }; + + let tagline = Tagline::update(&mut context.pool(), data.id, &tagline_form).await?; + + Ok(Json(TaglineResponse { tagline })) +} diff --git a/crates/db_schema/src/impls/tagline.rs b/crates/db_schema/src/impls/tagline.rs index 9b3dffc132..d70d2fcd8a 100644 --- a/crates/db_schema/src/impls/tagline.rs +++ b/crates/db_schema/src/impls/tagline.rs @@ -1,7 +1,7 @@ use crate::{ - newtypes::LocalSiteId, + newtypes::{LocalSiteId, TaglineId}, schema::tagline::dsl::{local_site_id, published, tagline}, - source::tagline::{Tagline, TaglineInsertForm}, + source::tagline::{Tagline, TaglineInsertForm, TaglineUpdateForm}, utils::{get_conn, limit_and_offset, DbPool}, }; use diesel::{insert_into, result::Error, ExpressionMethods, QueryDsl}; @@ -52,6 +52,18 @@ impl Tagline { .await } + pub async fn update( + pool: &mut DbPool<'_>, + tagline_id: TaglineId, + form: &TaglineUpdateForm, + ) -> Result { + let conn = &mut get_conn(pool).await?; + diesel::update(tagline.find(tagline_id)) + .set(form) + .get_result::(conn) + .await + } + async fn clear(conn: &mut AsyncPgConnection) -> Result { diesel::delete(tagline).execute(conn).await } diff --git a/crates/db_schema/src/newtypes.rs b/crates/db_schema/src/newtypes.rs index 96fc23ac61..ceadb2b543 100644 --- a/crates/db_schema/src/newtypes.rs +++ b/crates/db_schema/src/newtypes.rs @@ -152,6 +152,12 @@ pub struct LocalSiteId(i32); /// The custom emoji id. pub struct CustomEmojiId(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 tagline id. +pub struct TaglineId(i32); + #[cfg(feature = "full")] #[derive(Serialize, Deserialize)] #[serde(remote = "Ltree")] diff --git a/crates/db_schema/src/source/tagline.rs b/crates/db_schema/src/source/tagline.rs index c08d9f22ca..6194d25c4a 100644 --- a/crates/db_schema/src/source/tagline.rs +++ b/crates/db_schema/src/source/tagline.rs @@ -37,3 +37,12 @@ pub struct TaglineInsertForm { pub content: String, pub updated: Option>, } + +#[derive(Clone, Default)] +#[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] +#[cfg_attr(feature = "full", diesel(table_name = tagline))] +pub struct TaglineUpdateForm { + pub local_site_id: LocalSiteId, + pub content: String, + pub updated: Option>, +} \ No newline at end of file diff --git a/src/api_routes_http.rs b/src/api_routes_http.rs index 80b7ce6302..305d666637 100644 --- a/src/api_routes_http.rs +++ b/src/api_routes_http.rs @@ -123,7 +123,11 @@ use lemmy_api_crud::{ update::update_private_message, }, site::{create::create_site, read::get_site, update::update_site}, - tagline::{create::create_tagline, list::list_taglines}, + tagline::{ + create::create_tagline, + list::list_taglines, + update::update_tagline + }, user::{create::register, delete::delete_account}, }; use lemmy_apub::api::{ @@ -370,6 +374,7 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) { web::scope("/tagline") .wrap(rate_limit.message()) .route("/", web::post().to(create_tagline)) + .route("/", web::put().to(update_tagline)) .route("/list", web::get().to(list_taglines)), ), ); From e536d39c2b7c46e680b40c7dbe039f73af6df805 Mon Sep 17 00:00:00 2001 From: Freakazoid182 <> Date: Wed, 3 Apr 2024 22:42:25 +0200 Subject: [PATCH 08/33] Add delete tagline endpoint --- crates/api_common/src/tagline.rs | 8 ++++++++ crates/api_crud/src/tagline/delete.rs | 25 +++++++++++++++++++++++++ crates/api_crud/src/tagline/mod.rs | 1 + crates/db_schema/src/impls/tagline.rs | 10 ++++++---- src/api_routes_http.rs | 2 ++ 5 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 crates/api_crud/src/tagline/delete.rs diff --git a/crates/api_common/src/tagline.rs b/crates/api_common/src/tagline.rs index e2dfd8ffde..88d5b64d37 100644 --- a/crates/api_common/src/tagline.rs +++ b/crates/api_common/src/tagline.rs @@ -21,6 +21,14 @@ pub struct UpdateTagline { pub content: String, } +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] +#[cfg_attr(feature = "full", derive(TS))] +#[cfg_attr(feature = "full", ts(export))] +/// Delete a tagline +pub struct DeleteTagline { + pub id: TaglineId, +} + #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] diff --git a/crates/api_crud/src/tagline/delete.rs b/crates/api_crud/src/tagline/delete.rs new file mode 100644 index 0000000000..26ae7fabb7 --- /dev/null +++ b/crates/api_crud/src/tagline/delete.rs @@ -0,0 +1,25 @@ +use activitypub_federation::config::Data; +use actix_web::web::Json; +use lemmy_api_common::{ + context::LemmyContext, + tagline::DeleteTagline, + utils::is_admin, + SuccessResponse, +}; +use lemmy_db_schema::source::tagline::Tagline; +use lemmy_db_views::structs::LocalUserView; +use lemmy_utils::error::LemmyError; + +#[tracing::instrument(skip(context))] +pub async fn delete_tagline( + data: Json, + context: Data, + local_user_view: LocalUserView, +) -> Result, LemmyError> { + // Make sure user is an admin + is_admin(&local_user_view)?; + + Tagline::delete(&mut context.pool(), data.id).await?; + + Ok(Json(SuccessResponse::default())) +} diff --git a/crates/api_crud/src/tagline/mod.rs b/crates/api_crud/src/tagline/mod.rs index 9ab1b43f88..709cbaf88a 100644 --- a/crates/api_crud/src/tagline/mod.rs +++ b/crates/api_crud/src/tagline/mod.rs @@ -1,3 +1,4 @@ pub mod create; pub mod list; pub mod update; +pub mod delete; diff --git a/crates/db_schema/src/impls/tagline.rs b/crates/db_schema/src/impls/tagline.rs index d70d2fcd8a..686474f22b 100644 --- a/crates/db_schema/src/impls/tagline.rs +++ b/crates/db_schema/src/impls/tagline.rs @@ -41,10 +41,7 @@ impl Tagline { } } - pub async fn create( - pool: &mut DbPool<'_>, - form: &TaglineInsertForm, - ) -> Result { + pub async fn create(pool: &mut DbPool<'_>, form: &TaglineInsertForm) -> Result { let conn = &mut get_conn(pool).await?; insert_into(tagline) .values(form) @@ -64,6 +61,11 @@ impl Tagline { .await } + pub async fn delete(pool: &mut DbPool<'_>, tagline_id: TaglineId) -> Result { + let conn = &mut get_conn(pool).await?; + diesel::delete(tagline.find(tagline_id)).execute(conn).await + } + async fn clear(conn: &mut AsyncPgConnection) -> Result { diesel::delete(tagline).execute(conn).await } diff --git a/src/api_routes_http.rs b/src/api_routes_http.rs index 305d666637..bfe567d1af 100644 --- a/src/api_routes_http.rs +++ b/src/api_routes_http.rs @@ -125,6 +125,7 @@ use lemmy_api_crud::{ site::{create::create_site, read::get_site, update::update_site}, tagline::{ create::create_tagline, + delete::delete_tagline, list::list_taglines, update::update_tagline }, @@ -375,6 +376,7 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) { .wrap(rate_limit.message()) .route("/", web::post().to(create_tagline)) .route("/", web::put().to(update_tagline)) + .route("/delete", web::post().to(delete_tagline)) .route("/list", web::get().to(list_taglines)), ), ); From 5358908c17c61b91e9d6162e8d0b439081d55beb Mon Sep 17 00:00:00 2001 From: Freakazoid182 <> Date: Wed, 3 Apr 2024 22:49:02 +0200 Subject: [PATCH 09/33] Format through lint.sh --- crates/api_crud/src/tagline/mod.rs | 2 +- crates/api_crud/src/tagline/update.rs | 13 ++++++++----- crates/db_schema/src/source/tagline.rs | 2 +- src/api_routes_http.rs | 8 ++++---- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/crates/api_crud/src/tagline/mod.rs b/crates/api_crud/src/tagline/mod.rs index 709cbaf88a..ffd48daf6b 100644 --- a/crates/api_crud/src/tagline/mod.rs +++ b/crates/api_crud/src/tagline/mod.rs @@ -1,4 +1,4 @@ pub mod create; +pub mod delete; pub mod list; pub mod update; -pub mod delete; diff --git a/crates/api_crud/src/tagline/update.rs b/crates/api_crud/src/tagline/update.rs index fe5709375c..d94cbd46ae 100644 --- a/crates/api_crud/src/tagline/update.rs +++ b/crates/api_crud/src/tagline/update.rs @@ -2,13 +2,16 @@ use activitypub_federation::config::Data; use actix_web::web::Json; use lemmy_api_common::{ context::LemmyContext, - tagline::{UpdateTagline, TaglineResponse}, + tagline::{TaglineResponse, UpdateTagline}, utils::is_admin, }; -use lemmy_db_schema::{source::{ - local_site::LocalSite, - tagline::{Tagline, TaglineUpdateForm}, -}, utils::naive_now}; +use lemmy_db_schema::{ + source::{ + local_site::LocalSite, + tagline::{Tagline, TaglineUpdateForm}, + }, + utils::naive_now, +}; use lemmy_db_views::structs::LocalUserView; use lemmy_utils::error::LemmyError; diff --git a/crates/db_schema/src/source/tagline.rs b/crates/db_schema/src/source/tagline.rs index 6194d25c4a..2fd913db65 100644 --- a/crates/db_schema/src/source/tagline.rs +++ b/crates/db_schema/src/source/tagline.rs @@ -45,4 +45,4 @@ pub struct TaglineUpdateForm { pub local_site_id: LocalSiteId, pub content: String, pub updated: Option>, -} \ No newline at end of file +} diff --git a/src/api_routes_http.rs b/src/api_routes_http.rs index bfe567d1af..5c6461bae2 100644 --- a/src/api_routes_http.rs +++ b/src/api_routes_http.rs @@ -124,10 +124,10 @@ use lemmy_api_crud::{ }, site::{create::create_site, read::get_site, update::update_site}, tagline::{ - create::create_tagline, - delete::delete_tagline, - list::list_taglines, - update::update_tagline + create::create_tagline, + delete::delete_tagline, + list::list_taglines, + update::update_tagline, }, user::{create::register, delete::delete_account}, }; From 2b1fdf106b1fb01c5aab191ff483fee1176045ad Mon Sep 17 00:00:00 2001 From: Freakazoid182 <> Date: Thu, 4 Apr 2024 21:57:43 +0200 Subject: [PATCH 10/33] Remove custom_emojis and taglines from site resource --- crates/api/src/site/leave_admin.rs | 8 +----- crates/api_common/src/site.rs | 10 ------- crates/api_crud/src/site/create.rs | 10 +------ crates/api_crud/src/site/read.rs | 8 +----- crates/api_crud/src/site/update.rs | 10 +------ crates/db_schema/src/impls/tagline.rs | 39 +-------------------------- src/api_routes_http.rs | 4 +-- 7 files changed, 7 insertions(+), 82 deletions(-) diff --git a/crates/api/src/site/leave_admin.rs b/crates/api/src/site/leave_admin.rs index 0d149d07d5..2ca010761d 100644 --- a/crates/api/src/site/leave_admin.rs +++ b/crates/api/src/site/leave_admin.rs @@ -7,11 +7,10 @@ use lemmy_db_schema::{ local_site_url_blocklist::LocalSiteUrlBlocklist, local_user::{LocalUser, LocalUserUpdateForm}, moderator::{ModAdd, ModAddForm}, - tagline::Tagline, }, traits::Crud, }; -use lemmy_db_views::structs::{CustomEmojiView, LocalUserView, SiteView}; +use lemmy_db_views::structs::{LocalUserView, SiteView}; use lemmy_db_views_actor::structs::PersonView; use lemmy_utils::{ error::{LemmyError, LemmyErrorType}, @@ -60,9 +59,6 @@ pub async fn leave_admin( let all_languages = Language::read_all(&mut context.pool()).await?; let discussion_languages = SiteLanguage::read_local_raw(&mut context.pool()).await?; - let taglines = Tagline::get_all(&mut context.pool(), site_view.local_site.id).await?; - let custom_emojis = - CustomEmojiView::get_all(&mut context.pool(), site_view.local_site.id).await?; let blocked_urls = LocalSiteUrlBlocklist::get_all(&mut context.pool()).await?; Ok(Json(GetSiteResponse { @@ -72,8 +68,6 @@ pub async fn leave_admin( my_user: None, all_languages, discussion_languages, - taglines, - custom_emojis, blocked_urls, })) } diff --git a/crates/api_common/src/site.rs b/crates/api_common/src/site.rs index d87cbdaaf2..e5ce3c2f80 100644 --- a/crates/api_common/src/site.rs +++ b/crates/api_common/src/site.rs @@ -7,7 +7,6 @@ use lemmy_db_schema::{ instance::Instance, language::Language, local_site_url_blocklist::LocalSiteUrlBlocklist, - tagline::Tagline, }, ListingType, ModlogActionType, @@ -18,7 +17,6 @@ use lemmy_db_schema::{ }; use lemmy_db_views::structs::{ CommentView, - CustomEmojiView, LocalUserView, PostView, RegistrationApplicationView, @@ -190,7 +188,6 @@ pub struct CreateSite { pub captcha_difficulty: Option, pub allowed_instances: Option>, pub blocked_instances: Option>, - pub taglines: Option>, pub registration_mode: Option, pub content_warning: Option, pub default_post_listing_mode: Option, @@ -271,8 +268,6 @@ pub struct EditSite { pub blocked_instances: Option>, /// A list of blocked URLs pub blocked_urls: Option>, - /// A list of taglines shown at the top of the front page. - pub taglines: Option>, pub registration_mode: Option, /// Whether to email admins for new reports. pub reports_email_admins: Option, @@ -289,7 +284,6 @@ pub struct EditSite { /// The response for a site. pub struct SiteResponse { pub site_view: SiteView, - pub taglines: Vec, } #[skip_serializing_none] @@ -304,10 +298,6 @@ pub struct GetSiteResponse { pub my_user: Option, pub all_languages: Vec, pub discussion_languages: Vec, - /// A list of taglines shown at the top of the front page. - pub taglines: Vec, - /// A list of custom emojis your site supports. - pub custom_emojis: Vec, pub blocked_urls: Vec, } diff --git a/crates/api_crud/src/site/create.rs b/crates/api_crud/src/site/create.rs index 8542117e77..b917cc9991 100644 --- a/crates/api_crud/src/site/create.rs +++ b/crates/api_crud/src/site/create.rs @@ -20,7 +20,6 @@ use lemmy_db_schema::{ local_site::{LocalSite, LocalSiteUpdateForm}, local_site_rate_limit::{LocalSiteRateLimit, LocalSiteRateLimitUpdateForm}, site::{Site, SiteUpdateForm}, - tagline::Tagline, }, traits::Crud, utils::{diesel_option_overwrite, naive_now}, @@ -131,17 +130,11 @@ pub async fn create_site( let site_view = SiteView::read_local(&mut context.pool()).await?; - let new_taglines = data.taglines.clone(); - let taglines = Tagline::replace(&mut context.pool(), local_site.id, new_taglines).await?; - let rate_limit_config = local_site_rate_limit_to_rate_limit_config(&site_view.local_site_rate_limit); context.rate_limit_cell().set_config(rate_limit_config); - Ok(Json(SiteResponse { - site_view, - taglines, - })) + Ok(Json(SiteResponse { site_view })) } fn validate_create_payload(local_site: &LocalSite, create_site: &CreateSite) -> LemmyResult<()> { @@ -584,7 +577,6 @@ mod tests { captcha_difficulty: None, allowed_instances: None, blocked_instances: None, - taglines: None, registration_mode: site_registration_mode, content_warning: None, default_post_listing_mode: None, diff --git a/crates/api_crud/src/site/read.rs b/crates/api_crud/src/site/read.rs index e99a222fa0..637e85b8f8 100644 --- a/crates/api_crud/src/site/read.rs +++ b/crates/api_crud/src/site/read.rs @@ -7,9 +7,8 @@ use lemmy_db_schema::source::{ actor_language::{LocalUserLanguage, SiteLanguage}, language::Language, local_site_url_blocklist::LocalSiteUrlBlocklist, - tagline::Tagline, }; -use lemmy_db_views::structs::{CustomEmojiView, LocalUserView, SiteView}; +use lemmy_db_views::structs::{LocalUserView, SiteView}; use lemmy_db_views_actor::structs::{ CommunityBlockView, CommunityFollowerView, @@ -45,9 +44,6 @@ pub async fn get_site( let admins = PersonView::admins(&mut context.pool()).await?; let all_languages = Language::read_all(&mut context.pool()).await?; let discussion_languages = SiteLanguage::read_local_raw(&mut context.pool()).await?; - let taglines = Tagline::get_all(&mut context.pool(), site_view.local_site.id).await?; - let custom_emojis = - CustomEmojiView::get_all(&mut context.pool(), site_view.local_site.id).await?; let blocked_urls = LocalSiteUrlBlocklist::get_all(&mut context.pool()).await?; Ok(GetSiteResponse { site_view, @@ -56,8 +52,6 @@ pub async fn get_site( my_user: None, all_languages, discussion_languages, - taglines, - custom_emojis, blocked_urls, }) }) diff --git a/crates/api_crud/src/site/update.rs b/crates/api_crud/src/site/update.rs index 530dbb47f0..25914bbf5a 100644 --- a/crates/api_crud/src/site/update.rs +++ b/crates/api_crud/src/site/update.rs @@ -24,7 +24,6 @@ use lemmy_db_schema::{ local_site_url_blocklist::LocalSiteUrlBlocklist, local_user::LocalUser, site::{Site, SiteUpdateForm}, - tagline::Tagline, }, traits::Crud, utils::{diesel_option_overwrite, naive_now}, @@ -178,19 +177,13 @@ pub async fn update_site( .with_lemmy_type(LemmyErrorType::CouldntSetAllEmailVerified)?; } - let new_taglines = data.taglines.clone(); - let taglines = Tagline::replace(&mut context.pool(), local_site.id, new_taglines).await?; - let site_view = SiteView::read_local(&mut context.pool()).await?; let rate_limit_config = local_site_rate_limit_to_rate_limit_config(&site_view.local_site_rate_limit); context.rate_limit_cell().set_config(rate_limit_config); - Ok(Json(SiteResponse { - site_view, - taglines, - })) + Ok(Json(SiteResponse { site_view })) } fn validate_update_payload(local_site: &LocalSite, edit_site: &EditSite) -> LemmyResult<()> { @@ -593,7 +586,6 @@ mod tests { allowed_instances: None, blocked_instances: None, blocked_urls: None, - taglines: None, registration_mode: site_registration_mode, reports_email_admins: None, content_warning: None, diff --git a/crates/db_schema/src/impls/tagline.rs b/crates/db_schema/src/impls/tagline.rs index 686474f22b..9e28c62ad0 100644 --- a/crates/db_schema/src/impls/tagline.rs +++ b/crates/db_schema/src/impls/tagline.rs @@ -5,42 +5,9 @@ use crate::{ utils::{get_conn, limit_and_offset, DbPool}, }; use diesel::{insert_into, result::Error, ExpressionMethods, QueryDsl}; -use diesel_async::{AsyncPgConnection, RunQueryDsl}; +use diesel_async::RunQueryDsl; impl Tagline { - pub async fn replace( - pool: &mut DbPool<'_>, - for_local_site_id: LocalSiteId, - list_content: Option>, - ) -> Result, Error> { - let conn = &mut get_conn(pool).await?; - if let Some(list) = list_content { - conn - .build_transaction() - .run(|conn| { - Box::pin(async move { - Self::clear(conn).await?; - - for item in list { - let form = TaglineInsertForm { - local_site_id: for_local_site_id, - content: item, - updated: None, - }; - insert_into(tagline) - .values(form) - .get_result::(conn) - .await?; - } - Self::get_all(&mut conn.into(), for_local_site_id).await - }) as _ - }) - .await - } else { - Self::get_all(&mut conn.into(), for_local_site_id).await - } - } - pub async fn create(pool: &mut DbPool<'_>, form: &TaglineInsertForm) -> Result { let conn = &mut get_conn(pool).await?; insert_into(tagline) @@ -66,10 +33,6 @@ impl Tagline { diesel::delete(tagline.find(tagline_id)).execute(conn).await } - async fn clear(conn: &mut AsyncPgConnection) -> Result { - diesel::delete(tagline).execute(conn).await - } - pub async fn get_all( pool: &mut DbPool<'_>, for_local_site_id: LocalSiteId, diff --git a/src/api_routes_http.rs b/src/api_routes_http.rs index 5c6461bae2..afd4dafe31 100644 --- a/src/api_routes_http.rs +++ b/src/api_routes_http.rs @@ -374,8 +374,8 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) { .service( web::scope("/tagline") .wrap(rate_limit.message()) - .route("/", web::post().to(create_tagline)) - .route("/", web::put().to(update_tagline)) + .route("", web::post().to(create_tagline)) + .route("", web::put().to(update_tagline)) .route("/delete", web::post().to(delete_tagline)) .route("/list", web::get().to(list_taglines)), ), From f1b993f90ed262b20e03bde4ed4233afd11695d0 Mon Sep 17 00:00:00 2001 From: Freakazoid182 <> Date: Thu, 4 Apr 2024 23:07:51 +0200 Subject: [PATCH 11/33] Get random tagline on site requets --- crates/api/src/site/leave_admin.rs | 3 +++ crates/api_common/src/site.rs | 2 ++ crates/api_crud/src/site/read.rs | 3 +++ crates/db_schema/src/impls/tagline.rs | 17 ++++++++++++++++- 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/crates/api/src/site/leave_admin.rs b/crates/api/src/site/leave_admin.rs index 2ca010761d..297c840844 100644 --- a/crates/api/src/site/leave_admin.rs +++ b/crates/api/src/site/leave_admin.rs @@ -7,6 +7,7 @@ use lemmy_db_schema::{ local_site_url_blocklist::LocalSiteUrlBlocklist, local_user::{LocalUser, LocalUserUpdateForm}, moderator::{ModAdd, ModAddForm}, + tagline::Tagline, }, traits::Crud, }; @@ -60,6 +61,7 @@ pub async fn leave_admin( let all_languages = Language::read_all(&mut context.pool()).await?; let discussion_languages = SiteLanguage::read_local_raw(&mut context.pool()).await?; let blocked_urls = LocalSiteUrlBlocklist::get_all(&mut context.pool()).await?; + let tagline = Tagline::get_random(&mut context.pool(), site_view.local_site.id).await?; Ok(Json(GetSiteResponse { site_view, @@ -69,5 +71,6 @@ pub async fn leave_admin( all_languages, discussion_languages, blocked_urls, + tagline, })) } diff --git a/crates/api_common/src/site.rs b/crates/api_common/src/site.rs index e5ce3c2f80..7fae247836 100644 --- a/crates/api_common/src/site.rs +++ b/crates/api_common/src/site.rs @@ -7,6 +7,7 @@ use lemmy_db_schema::{ instance::Instance, language::Language, local_site_url_blocklist::LocalSiteUrlBlocklist, + tagline::Tagline, }, ListingType, ModlogActionType, @@ -298,6 +299,7 @@ pub struct GetSiteResponse { pub my_user: Option, pub all_languages: Vec, pub discussion_languages: Vec, + pub tagline: Option, pub blocked_urls: Vec, } diff --git a/crates/api_crud/src/site/read.rs b/crates/api_crud/src/site/read.rs index 637e85b8f8..85a63a59e1 100644 --- a/crates/api_crud/src/site/read.rs +++ b/crates/api_crud/src/site/read.rs @@ -7,6 +7,7 @@ use lemmy_db_schema::source::{ actor_language::{LocalUserLanguage, SiteLanguage}, language::Language, local_site_url_blocklist::LocalSiteUrlBlocklist, + tagline::Tagline, }; use lemmy_db_views::structs::{LocalUserView, SiteView}; use lemmy_db_views_actor::structs::{ @@ -45,6 +46,7 @@ pub async fn get_site( let all_languages = Language::read_all(&mut context.pool()).await?; let discussion_languages = SiteLanguage::read_local_raw(&mut context.pool()).await?; let blocked_urls = LocalSiteUrlBlocklist::get_all(&mut context.pool()).await?; + let tagline = Tagline::get_random(&mut context.pool(), site_view.local_site.id).await?; Ok(GetSiteResponse { site_view, admins, @@ -53,6 +55,7 @@ pub async fn get_site( all_languages, discussion_languages, blocked_urls, + tagline, }) }) .await diff --git a/crates/db_schema/src/impls/tagline.rs b/crates/db_schema/src/impls/tagline.rs index 9e28c62ad0..1baabd9d1b 100644 --- a/crates/db_schema/src/impls/tagline.rs +++ b/crates/db_schema/src/impls/tagline.rs @@ -4,7 +4,7 @@ use crate::{ source::tagline::{Tagline, TaglineInsertForm, TaglineUpdateForm}, utils::{get_conn, limit_and_offset, DbPool}, }; -use diesel::{insert_into, result::Error, ExpressionMethods, QueryDsl}; +use diesel::{insert_into, result::Error, ExpressionMethods, OptionalExtension, QueryDsl}; use diesel_async::RunQueryDsl; impl Tagline { @@ -60,4 +60,19 @@ impl Tagline { .get_results::(conn) .await } + + pub async fn get_random( + pool: &mut DbPool<'_>, + for_local_site_id: LocalSiteId, + ) -> Result, Error> { + let conn = &mut get_conn(pool).await?; + sql_function!(fn random() -> Text); + tagline + .order(random()) + .limit(1) + .filter(local_site_id.eq(for_local_site_id)) + .first::(conn) + .await + .optional() + } } From 144c11224707c59caee527b9d417658073d1d46a Mon Sep 17 00:00:00 2001 From: Freakazoid182 <> Date: Fri, 5 Apr 2024 22:36:08 +0200 Subject: [PATCH 12/33] Impl Crud for Tagline Remove superfluous properties --- crates/api_crud/src/tagline/create.rs | 10 ++++---- crates/api_crud/src/tagline/delete.rs | 2 +- crates/api_crud/src/tagline/update.rs | 12 ++++------ crates/db_schema/src/impls/tagline.rs | 33 ++++++++++++-------------- crates/db_schema/src/source/tagline.rs | 6 ++--- 5 files changed, 28 insertions(+), 35 deletions(-) diff --git a/crates/api_crud/src/tagline/create.rs b/crates/api_crud/src/tagline/create.rs index 43a48c0e76..29821d321b 100644 --- a/crates/api_crud/src/tagline/create.rs +++ b/crates/api_crud/src/tagline/create.rs @@ -5,9 +5,12 @@ use lemmy_api_common::{ tagline::{CreateTagline, TaglineResponse}, utils::is_admin, }; -use lemmy_db_schema::source::{ - local_site::LocalSite, - tagline::{Tagline, TaglineInsertForm}, +use lemmy_db_schema::{ + source::{ + local_site::LocalSite, + tagline::{Tagline, TaglineInsertForm}, + }, + traits::Crud, }; use lemmy_db_views::structs::LocalUserView; use lemmy_utils::error::LemmyError; @@ -25,7 +28,6 @@ pub async fn create_tagline( let tagline_form = TaglineInsertForm { local_site_id: local_site.id, content: data.content.to_string(), - updated: None, }; let tagline = Tagline::create(&mut context.pool(), &tagline_form).await?; diff --git a/crates/api_crud/src/tagline/delete.rs b/crates/api_crud/src/tagline/delete.rs index 26ae7fabb7..9add3cfe64 100644 --- a/crates/api_crud/src/tagline/delete.rs +++ b/crates/api_crud/src/tagline/delete.rs @@ -6,7 +6,7 @@ use lemmy_api_common::{ utils::is_admin, SuccessResponse, }; -use lemmy_db_schema::source::tagline::Tagline; +use lemmy_db_schema::{source::tagline::Tagline, traits::Crud}; use lemmy_db_views::structs::LocalUserView; use lemmy_utils::error::LemmyError; diff --git a/crates/api_crud/src/tagline/update.rs b/crates/api_crud/src/tagline/update.rs index d94cbd46ae..7db5c3dc54 100644 --- a/crates/api_crud/src/tagline/update.rs +++ b/crates/api_crud/src/tagline/update.rs @@ -6,10 +6,8 @@ use lemmy_api_common::{ utils::is_admin, }; use lemmy_db_schema::{ - source::{ - local_site::LocalSite, - tagline::{Tagline, TaglineUpdateForm}, - }, + source::tagline::{Tagline, TaglineUpdateForm}, + traits::Crud, utils::naive_now, }; use lemmy_db_views::structs::LocalUserView; @@ -21,14 +19,12 @@ pub async fn update_tagline( context: Data, local_user_view: LocalUserView, ) -> Result, LemmyError> { - let local_site = LocalSite::read(&mut context.pool()).await?; // Make sure user is an admin is_admin(&local_user_view)?; let tagline_form = TaglineUpdateForm { - local_site_id: local_site.id, - content: data.content.to_string(), - updated: Some(naive_now()), + content: Some(data.content.to_string()), + updated: Some(Some(naive_now())), }; let tagline = Tagline::update(&mut context.pool(), data.id, &tagline_form).await?; diff --git a/crates/db_schema/src/impls/tagline.rs b/crates/db_schema/src/impls/tagline.rs index 1baabd9d1b..c872b14384 100644 --- a/crates/db_schema/src/impls/tagline.rs +++ b/crates/db_schema/src/impls/tagline.rs @@ -2,13 +2,19 @@ use crate::{ newtypes::{LocalSiteId, TaglineId}, schema::tagline::dsl::{local_site_id, published, tagline}, source::tagline::{Tagline, TaglineInsertForm, TaglineUpdateForm}, + traits::Crud, utils::{get_conn, limit_and_offset, DbPool}, }; use diesel::{insert_into, result::Error, ExpressionMethods, OptionalExtension, QueryDsl}; use diesel_async::RunQueryDsl; -impl Tagline { - pub async fn create(pool: &mut DbPool<'_>, form: &TaglineInsertForm) -> Result { +#[async_trait] +impl Crud for Tagline { + type InsertForm = TaglineInsertForm; + type UpdateForm = TaglineUpdateForm; + type IdType = TaglineId; + + async fn create(pool: &mut DbPool<'_>, form: &Self::InsertForm) -> Result { let conn = &mut get_conn(pool).await?; insert_into(tagline) .values(form) @@ -16,34 +22,25 @@ impl Tagline { .await } - pub async fn update( + async fn update( pool: &mut DbPool<'_>, tagline_id: TaglineId, - form: &TaglineUpdateForm, + new_tagline: &Self::UpdateForm, ) -> Result { let conn = &mut get_conn(pool).await?; diesel::update(tagline.find(tagline_id)) - .set(form) + .set(new_tagline) .get_result::(conn) .await } - pub async fn delete(pool: &mut DbPool<'_>, tagline_id: TaglineId) -> Result { - let conn = &mut get_conn(pool).await?; - diesel::delete(tagline.find(tagline_id)).execute(conn).await - } - - pub async fn get_all( - pool: &mut DbPool<'_>, - for_local_site_id: LocalSiteId, - ) -> Result, Error> { + async fn delete(pool: &mut DbPool<'_>, id: Self::IdType) -> Result { let conn = &mut get_conn(pool).await?; - tagline - .filter(local_site_id.eq(for_local_site_id)) - .get_results::(conn) - .await + diesel::delete(tagline.find(id)).execute(conn).await } +} +impl Tagline { pub async fn list( pool: &mut DbPool<'_>, for_local_site_id: LocalSiteId, diff --git a/crates/db_schema/src/source/tagline.rs b/crates/db_schema/src/source/tagline.rs index 2fd913db65..62dcf5a343 100644 --- a/crates/db_schema/src/source/tagline.rs +++ b/crates/db_schema/src/source/tagline.rs @@ -35,14 +35,12 @@ pub struct Tagline { pub struct TaglineInsertForm { pub local_site_id: LocalSiteId, pub content: String, - pub updated: Option>, } #[derive(Clone, Default)] #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = tagline))] pub struct TaglineUpdateForm { - pub local_site_id: LocalSiteId, - pub content: String, - pub updated: Option>, + pub content: Option, + pub updated: Option>>, } From 5342a227654aa8c1f41b514a747df5c9cc156602 Mon Sep 17 00:00:00 2001 From: Freakazoid182 <> Date: Fri, 5 Apr 2024 22:36:37 +0200 Subject: [PATCH 13/33] Move tagline endpoints under /admin --- src/api_routes_http.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/api_routes_http.rs b/src/api_routes_http.rs index afd4dafe31..9bea2c88b4 100644 --- a/src/api_routes_http.rs +++ b/src/api_routes_http.rs @@ -361,6 +361,14 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) { .route("/community", web::post().to(purge_community)) .route("/post", web::post().to(purge_post)) .route("/comment", web::post().to(purge_comment)), + ) + .service( + web::scope("/tagline") + .wrap(rate_limit.message()) + .route("", web::post().to(create_tagline)) + .route("", web::put().to(update_tagline)) + .route("/delete", web::post().to(delete_tagline)) + .route("/list", web::get().to(list_taglines)), ), ) .service( @@ -370,14 +378,6 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) { .route("", web::put().to(update_custom_emoji)) .route("/delete", web::post().to(delete_custom_emoji)) .route("/list", web::get().to(list_custom_emojis)), - ) - .service( - web::scope("/tagline") - .wrap(rate_limit.message()) - .route("", web::post().to(create_tagline)) - .route("", web::put().to(update_tagline)) - .route("/delete", web::post().to(delete_tagline)) - .route("/list", web::get().to(list_taglines)), ), ); cfg.service( From bab417a73e64dddd032bff6af94a375b2bf7174e Mon Sep 17 00:00:00 2001 From: Freakazoid182 <> Date: Fri, 5 Apr 2024 22:55:36 +0200 Subject: [PATCH 14/33] Impl Crud for CustomEmoji --- crates/api_crud/src/custom_emoji/create.rs | 11 +++++---- crates/api_crud/src/custom_emoji/delete.rs | 2 +- crates/api_crud/src/custom_emoji/update.rs | 11 +++++---- crates/db_schema/src/impls/custom_emoji.rs | 26 +++++++++++++--------- 4 files changed, 31 insertions(+), 19 deletions(-) diff --git a/crates/api_crud/src/custom_emoji/create.rs b/crates/api_crud/src/custom_emoji/create.rs index cd30ef1e99..54745577a3 100644 --- a/crates/api_crud/src/custom_emoji/create.rs +++ b/crates/api_crud/src/custom_emoji/create.rs @@ -5,10 +5,13 @@ use lemmy_api_common::{ custom_emoji::{CreateCustomEmoji, CustomEmojiResponse}, utils::is_admin, }; -use lemmy_db_schema::source::{ - custom_emoji::{CustomEmoji, CustomEmojiInsertForm}, - custom_emoji_keyword::{CustomEmojiKeyword, CustomEmojiKeywordInsertForm}, - local_site::LocalSite, +use lemmy_db_schema::{ + source::{ + custom_emoji::{CustomEmoji, CustomEmojiInsertForm}, + custom_emoji_keyword::{CustomEmojiKeyword, CustomEmojiKeywordInsertForm}, + local_site::LocalSite, + }, + traits::Crud, }; use lemmy_db_views::structs::{CustomEmojiView, LocalUserView}; use lemmy_utils::error::LemmyError; diff --git a/crates/api_crud/src/custom_emoji/delete.rs b/crates/api_crud/src/custom_emoji/delete.rs index 93c5f8d80b..9165a2a192 100644 --- a/crates/api_crud/src/custom_emoji/delete.rs +++ b/crates/api_crud/src/custom_emoji/delete.rs @@ -6,7 +6,7 @@ use lemmy_api_common::{ utils::is_admin, SuccessResponse, }; -use lemmy_db_schema::source::custom_emoji::CustomEmoji; +use lemmy_db_schema::{source::custom_emoji::CustomEmoji, traits::Crud}; use lemmy_db_views::structs::LocalUserView; use lemmy_utils::error::LemmyError; diff --git a/crates/api_crud/src/custom_emoji/update.rs b/crates/api_crud/src/custom_emoji/update.rs index 5a2631a629..0cabf77b9c 100644 --- a/crates/api_crud/src/custom_emoji/update.rs +++ b/crates/api_crud/src/custom_emoji/update.rs @@ -5,10 +5,13 @@ use lemmy_api_common::{ custom_emoji::{CustomEmojiResponse, EditCustomEmoji}, utils::is_admin, }; -use lemmy_db_schema::source::{ - custom_emoji::{CustomEmoji, CustomEmojiUpdateForm}, - custom_emoji_keyword::{CustomEmojiKeyword, CustomEmojiKeywordInsertForm}, - local_site::LocalSite, +use lemmy_db_schema::{ + source::{ + custom_emoji::{CustomEmoji, CustomEmojiUpdateForm}, + custom_emoji_keyword::{CustomEmojiKeyword, CustomEmojiKeywordInsertForm}, + local_site::LocalSite, + }, + traits::Crud, }; use lemmy_db_views::structs::{CustomEmojiView, LocalUserView}; use lemmy_utils::error::LemmyError; diff --git a/crates/db_schema/src/impls/custom_emoji.rs b/crates/db_schema/src/impls/custom_emoji.rs index 0503016594..80b2ebbffd 100644 --- a/crates/db_schema/src/impls/custom_emoji.rs +++ b/crates/db_schema/src/impls/custom_emoji.rs @@ -8,35 +8,41 @@ use crate::{ custom_emoji::{CustomEmoji, CustomEmojiInsertForm, CustomEmojiUpdateForm}, custom_emoji_keyword::{CustomEmojiKeyword, CustomEmojiKeywordInsertForm}, }, + traits::Crud, utils::{get_conn, DbPool}, }; use diesel::{dsl::insert_into, result::Error, ExpressionMethods, QueryDsl}; use diesel_async::RunQueryDsl; -impl CustomEmoji { - pub async fn create(pool: &mut DbPool<'_>, form: &CustomEmojiInsertForm) -> Result { +#[async_trait] +impl Crud for CustomEmoji { + type InsertForm = CustomEmojiInsertForm; + type UpdateForm = CustomEmojiUpdateForm; + type IdType = CustomEmojiId; + + async fn create(pool: &mut DbPool<'_>, form: &Self::InsertForm) -> Result { let conn = &mut get_conn(pool).await?; insert_into(custom_emoji) .values(form) .get_result::(conn) .await } - pub async fn update( + + async fn update( pool: &mut DbPool<'_>, - emoji_id: CustomEmojiId, - form: &CustomEmojiUpdateForm, + emoji_id: Self::IdType, + new_custom_emoji: &Self::UpdateForm, ) -> Result { let conn = &mut get_conn(pool).await?; diesel::update(custom_emoji.find(emoji_id)) - .set(form) + .set(new_custom_emoji) .get_result::(conn) .await } - pub async fn delete(pool: &mut DbPool<'_>, emoji_id: CustomEmojiId) -> Result { + + async fn delete(pool: &mut DbPool<'_>, id: Self::IdType) -> Result { let conn = &mut get_conn(pool).await?; - diesel::delete(custom_emoji.find(emoji_id)) - .execute(conn) - .await + diesel::delete(custom_emoji.find(id)).execute(conn).await } } From ead51517e4a2f65c9abe78a7108ff1e255b3c760 Mon Sep 17 00:00:00 2001 From: Freakazoid182 <> Date: Fri, 5 Apr 2024 22:57:36 +0200 Subject: [PATCH 15/33] Remove delete from tagline and custom emoji impls --- crates/db_schema/src/impls/custom_emoji.rs | 5 ----- crates/db_schema/src/impls/tagline.rs | 5 ----- 2 files changed, 10 deletions(-) diff --git a/crates/db_schema/src/impls/custom_emoji.rs b/crates/db_schema/src/impls/custom_emoji.rs index 80b2ebbffd..9ba3590716 100644 --- a/crates/db_schema/src/impls/custom_emoji.rs +++ b/crates/db_schema/src/impls/custom_emoji.rs @@ -39,11 +39,6 @@ impl Crud for CustomEmoji { .get_result::(conn) .await } - - async fn delete(pool: &mut DbPool<'_>, id: Self::IdType) -> Result { - let conn = &mut get_conn(pool).await?; - diesel::delete(custom_emoji.find(id)).execute(conn).await - } } impl CustomEmojiKeyword { diff --git a/crates/db_schema/src/impls/tagline.rs b/crates/db_schema/src/impls/tagline.rs index c872b14384..1bd7555625 100644 --- a/crates/db_schema/src/impls/tagline.rs +++ b/crates/db_schema/src/impls/tagline.rs @@ -33,11 +33,6 @@ impl Crud for Tagline { .get_result::(conn) .await } - - async fn delete(pool: &mut DbPool<'_>, id: Self::IdType) -> Result { - let conn = &mut get_conn(pool).await?; - diesel::delete(tagline.find(id)).execute(conn).await - } } impl Tagline { From abdfc90dbe120a4962eb9f6c96006f24f8980a57 Mon Sep 17 00:00:00 2001 From: Freakazoid182 <> Date: Fri, 5 Apr 2024 23:20:59 +0200 Subject: [PATCH 16/33] Check markdown for tagline --- crates/api_common/src/tagline.rs | 2 +- crates/api_crud/src/tagline/update.rs | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/crates/api_common/src/tagline.rs b/crates/api_common/src/tagline.rs index 88d5b64d37..40456277d2 100644 --- a/crates/api_common/src/tagline.rs +++ b/crates/api_common/src/tagline.rs @@ -18,7 +18,7 @@ pub struct CreateTagline { /// Update a tagline pub struct UpdateTagline { pub id: TaglineId, - pub content: String, + pub content: Option, } #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] diff --git a/crates/api_crud/src/tagline/update.rs b/crates/api_crud/src/tagline/update.rs index 7db5c3dc54..24475a24ff 100644 --- a/crates/api_crud/src/tagline/update.rs +++ b/crates/api_crud/src/tagline/update.rs @@ -3,15 +3,18 @@ use actix_web::web::Json; use lemmy_api_common::{ context::LemmyContext, tagline::{TaglineResponse, UpdateTagline}, - utils::is_admin, + utils::{get_url_blocklist, is_admin, local_site_to_slur_regex, process_markdown_opt}, }; use lemmy_db_schema::{ - source::tagline::{Tagline, TaglineUpdateForm}, + source::{ + local_site::LocalSite, + tagline::{Tagline, TaglineUpdateForm}, + }, traits::Crud, utils::naive_now, }; use lemmy_db_views::structs::LocalUserView; -use lemmy_utils::error::LemmyError; +use lemmy_utils::{error::LemmyError, utils::validation::is_valid_body_field}; #[tracing::instrument(skip(context))] pub async fn update_tagline( @@ -22,8 +25,15 @@ pub async fn update_tagline( // Make sure user is an admin is_admin(&local_user_view)?; + let local_site = LocalSite::read(&mut context.pool()).await?; + + let slur_regex = local_site_to_slur_regex(&local_site); + let url_blocklist = get_url_blocklist(&context).await?; + let content = process_markdown_opt(&data.content, &slur_regex, &url_blocklist, &context).await?; + is_valid_body_field(&content, false)?; + let tagline_form = TaglineUpdateForm { - content: Some(data.content.to_string()), + content, updated: Some(Some(naive_now())), }; From b2b8c43757ca8c2bd77dc04a42857df8d5e2a39a Mon Sep 17 00:00:00 2001 From: Freakazoid182 <> Date: Fri, 5 Apr 2024 23:34:43 +0200 Subject: [PATCH 17/33] Validate markdown on tagline --- crates/api_common/src/tagline.rs | 2 +- crates/api_crud/src/tagline/create.rs | 14 ++++++++++---- crates/db_schema/src/source/tagline.rs | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/crates/api_common/src/tagline.rs b/crates/api_common/src/tagline.rs index 40456277d2..14f2be7689 100644 --- a/crates/api_common/src/tagline.rs +++ b/crates/api_common/src/tagline.rs @@ -9,7 +9,7 @@ use ts_rs::TS; #[cfg_attr(feature = "full", ts(export))] /// Create a tagline pub struct CreateTagline { - pub content: String, + pub content: Option, } #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] diff --git a/crates/api_crud/src/tagline/create.rs b/crates/api_crud/src/tagline/create.rs index 29821d321b..85e0281a11 100644 --- a/crates/api_crud/src/tagline/create.rs +++ b/crates/api_crud/src/tagline/create.rs @@ -3,7 +3,7 @@ use actix_web::web::Json; use lemmy_api_common::{ context::LemmyContext, tagline::{CreateTagline, TaglineResponse}, - utils::is_admin, + utils::{get_url_blocklist, is_admin, local_site_to_slur_regex, process_markdown_opt}, }; use lemmy_db_schema::{ source::{ @@ -13,7 +13,7 @@ use lemmy_db_schema::{ traits::Crud, }; use lemmy_db_views::structs::LocalUserView; -use lemmy_utils::error::LemmyError; +use lemmy_utils::{error::LemmyError, utils::validation::is_valid_body_field}; #[tracing::instrument(skip(context))] pub async fn create_tagline( @@ -21,13 +21,19 @@ pub async fn create_tagline( context: Data, local_user_view: LocalUserView, ) -> Result, LemmyError> { - let local_site = LocalSite::read(&mut context.pool()).await?; // Make sure user is an admin is_admin(&local_user_view)?; + let local_site = LocalSite::read(&mut context.pool()).await?; + + let slur_regex = local_site_to_slur_regex(&local_site); + let url_blocklist = get_url_blocklist(&context).await?; + let content = process_markdown_opt(&data.content, &slur_regex, &url_blocklist, &context).await?; + is_valid_body_field(&content, false)?; + let tagline_form = TaglineInsertForm { local_site_id: local_site.id, - content: data.content.to_string(), + content, }; let tagline = Tagline::create(&mut context.pool(), &tagline_form).await?; diff --git a/crates/db_schema/src/source/tagline.rs b/crates/db_schema/src/source/tagline.rs index 62dcf5a343..ba026ca70a 100644 --- a/crates/db_schema/src/source/tagline.rs +++ b/crates/db_schema/src/source/tagline.rs @@ -34,7 +34,7 @@ pub struct Tagline { #[cfg_attr(feature = "full", diesel(table_name = tagline))] pub struct TaglineInsertForm { pub local_site_id: LocalSiteId, - pub content: String, + pub content: Option, } #[derive(Clone, Default)] From 7759602c9de8aaf7cd3d71dcb6cebb38d597094b Mon Sep 17 00:00:00 2001 From: Freakazoid182 <> Date: Sat, 6 Apr 2024 12:16:19 +0200 Subject: [PATCH 18/33] Make content fields non optional Add error types for tagline validation --- crates/api_common/src/tagline.rs | 4 ++-- crates/api_crud/src/tagline/create.rs | 12 +++++++++--- crates/api_crud/src/tagline/update.rs | 12 +++++++++--- crates/db_schema/src/source/tagline.rs | 4 ++-- crates/utils/src/error.rs | 2 ++ crates/utils/src/utils/validation.rs | 21 +++++++++++++++++++++ 6 files changed, 45 insertions(+), 10 deletions(-) diff --git a/crates/api_common/src/tagline.rs b/crates/api_common/src/tagline.rs index 14f2be7689..88d5b64d37 100644 --- a/crates/api_common/src/tagline.rs +++ b/crates/api_common/src/tagline.rs @@ -9,7 +9,7 @@ use ts_rs::TS; #[cfg_attr(feature = "full", ts(export))] /// Create a tagline pub struct CreateTagline { - pub content: Option, + pub content: String, } #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] @@ -18,7 +18,7 @@ pub struct CreateTagline { /// Update a tagline pub struct UpdateTagline { pub id: TaglineId, - pub content: Option, + pub content: String, } #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] diff --git a/crates/api_crud/src/tagline/create.rs b/crates/api_crud/src/tagline/create.rs index 85e0281a11..01c5a88132 100644 --- a/crates/api_crud/src/tagline/create.rs +++ b/crates/api_crud/src/tagline/create.rs @@ -13,7 +13,7 @@ use lemmy_db_schema::{ traits::Crud, }; use lemmy_db_views::structs::LocalUserView; -use lemmy_utils::{error::LemmyError, utils::validation::is_valid_body_field}; +use lemmy_utils::{error::LemmyError, utils::validation::is_valid_tagline_content}; #[tracing::instrument(skip(context))] pub async fn create_tagline( @@ -28,8 +28,14 @@ pub async fn create_tagline( let slur_regex = local_site_to_slur_regex(&local_site); let url_blocklist = get_url_blocklist(&context).await?; - let content = process_markdown_opt(&data.content, &slur_regex, &url_blocklist, &context).await?; - is_valid_body_field(&content, false)?; + let processed_content = process_markdown_opt( + &Some(data.content.to_owned()), + &slur_regex, + &url_blocklist, + &context, + ) + .await?; + let content = is_valid_tagline_content(processed_content)?; let tagline_form = TaglineInsertForm { local_site_id: local_site.id, diff --git a/crates/api_crud/src/tagline/update.rs b/crates/api_crud/src/tagline/update.rs index 24475a24ff..e80193f3ec 100644 --- a/crates/api_crud/src/tagline/update.rs +++ b/crates/api_crud/src/tagline/update.rs @@ -14,7 +14,7 @@ use lemmy_db_schema::{ utils::naive_now, }; use lemmy_db_views::structs::LocalUserView; -use lemmy_utils::{error::LemmyError, utils::validation::is_valid_body_field}; +use lemmy_utils::{error::LemmyError, utils::validation::is_valid_tagline_content}; #[tracing::instrument(skip(context))] pub async fn update_tagline( @@ -29,8 +29,14 @@ pub async fn update_tagline( let slur_regex = local_site_to_slur_regex(&local_site); let url_blocklist = get_url_blocklist(&context).await?; - let content = process_markdown_opt(&data.content, &slur_regex, &url_blocklist, &context).await?; - is_valid_body_field(&content, false)?; + let processed_content = process_markdown_opt( + &Some(data.content.to_owned()), + &slur_regex, + &url_blocklist, + &context, + ) + .await?; + let content = is_valid_tagline_content(processed_content)?; let tagline_form = TaglineUpdateForm { content, diff --git a/crates/db_schema/src/source/tagline.rs b/crates/db_schema/src/source/tagline.rs index ba026ca70a..df207e10e7 100644 --- a/crates/db_schema/src/source/tagline.rs +++ b/crates/db_schema/src/source/tagline.rs @@ -34,13 +34,13 @@ pub struct Tagline { #[cfg_attr(feature = "full", diesel(table_name = tagline))] pub struct TaglineInsertForm { pub local_site_id: LocalSiteId, - pub content: Option, + pub content: String, } #[derive(Clone, Default)] #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = tagline))] pub struct TaglineUpdateForm { - pub content: Option, + pub content: String, pub updated: Option>>, } diff --git a/crates/utils/src/error.rs b/crates/utils/src/error.rs index d25845894c..8a102b655e 100644 --- a/crates/utils/src/error.rs +++ b/crates/utils/src/error.rs @@ -165,6 +165,8 @@ pub enum LemmyErrorType { InvalidUnixTime, InvalidBotAction, CantBlockLocalInstance, + TaglineContentRequired, + TaglineContentLengthOverflow, Unknown(String), } diff --git a/crates/utils/src/utils/validation.rs b/crates/utils/src/utils/validation.rs index 93d581327a..3a2881151d 100644 --- a/crates/utils/src/utils/validation.rs +++ b/crates/utils/src/utils/validation.rs @@ -22,6 +22,8 @@ const BIO_MAX_LENGTH: usize = 300; const ALT_TEXT_MAX_LENGTH: usize = 300; const SITE_NAME_MAX_LENGTH: usize = 20; const SITE_NAME_MIN_LENGTH: usize = 1; +const TAGLINE_CONTENT_MIN_LENGTH: usize = 1; +const TAGLINE_CONTENT_MAX_LENGTH: usize = 50000; const SITE_DESCRIPTION_MAX_LENGTH: usize = 150; //Invisible unicode characters, taken from https://invisible-characters.com/ const FORBIDDEN_DISPLAY_CHARS: [char; 53] = [ @@ -169,6 +171,25 @@ pub fn is_valid_body_field(body: &Option, post: bool) -> LemmyResult<()> Ok(()) } +pub fn is_valid_tagline_content(content: Option) -> LemmyResult { + match content { + Some(content) => { + min_length_check( + &content, + TAGLINE_CONTENT_MIN_LENGTH, + LemmyErrorType::TaglineContentRequired, + )?; + max_length_check( + &content, + TAGLINE_CONTENT_MAX_LENGTH, + LemmyErrorType::TaglineContentLengthOverflow, + )?; + Ok(content) + } + None => Err(LemmyErrorType::TaglineContentRequired.into()), + } +} + pub fn is_valid_bio_field(bio: &str) -> LemmyResult<()> { max_length_check(bio, BIO_MAX_LENGTH, LemmyErrorType::BioLengthOverflow) } From 6ffcc1f98a4a80d474f4986c1f57223eab17a49b Mon Sep 17 00:00:00 2001 From: Freakazoid182 <> Date: Sat, 6 Apr 2024 12:33:49 +0200 Subject: [PATCH 19/33] Use process_markdown instead of process_markdown_opt --- crates/api_crud/src/tagline/create.rs | 14 ++++--------- crates/api_crud/src/tagline/update.rs | 12 +++-------- crates/utils/src/utils/validation.rs | 29 +++++++++++---------------- 3 files changed, 19 insertions(+), 36 deletions(-) diff --git a/crates/api_crud/src/tagline/create.rs b/crates/api_crud/src/tagline/create.rs index 01c5a88132..8111bd279b 100644 --- a/crates/api_crud/src/tagline/create.rs +++ b/crates/api_crud/src/tagline/create.rs @@ -3,7 +3,7 @@ use actix_web::web::Json; use lemmy_api_common::{ context::LemmyContext, tagline::{CreateTagline, TaglineResponse}, - utils::{get_url_blocklist, is_admin, local_site_to_slur_regex, process_markdown_opt}, + utils::{get_url_blocklist, is_admin, local_site_to_slur_regex, process_markdown}, }; use lemmy_db_schema::{ source::{ @@ -28,18 +28,12 @@ pub async fn create_tagline( let slur_regex = local_site_to_slur_regex(&local_site); let url_blocklist = get_url_blocklist(&context).await?; - let processed_content = process_markdown_opt( - &Some(data.content.to_owned()), - &slur_regex, - &url_blocklist, - &context, - ) - .await?; - let content = is_valid_tagline_content(processed_content)?; + let content = process_markdown(&data.content, &slur_regex, &url_blocklist, &context).await?; + is_valid_tagline_content(&content)?; let tagline_form = TaglineInsertForm { local_site_id: local_site.id, - content, + content: content.clone(), }; let tagline = Tagline::create(&mut context.pool(), &tagline_form).await?; diff --git a/crates/api_crud/src/tagline/update.rs b/crates/api_crud/src/tagline/update.rs index e80193f3ec..44a22f0c1d 100644 --- a/crates/api_crud/src/tagline/update.rs +++ b/crates/api_crud/src/tagline/update.rs @@ -3,7 +3,7 @@ use actix_web::web::Json; use lemmy_api_common::{ context::LemmyContext, tagline::{TaglineResponse, UpdateTagline}, - utils::{get_url_blocklist, is_admin, local_site_to_slur_regex, process_markdown_opt}, + utils::{get_url_blocklist, is_admin, local_site_to_slur_regex, process_markdown}, }; use lemmy_db_schema::{ source::{ @@ -29,14 +29,8 @@ pub async fn update_tagline( let slur_regex = local_site_to_slur_regex(&local_site); let url_blocklist = get_url_blocklist(&context).await?; - let processed_content = process_markdown_opt( - &Some(data.content.to_owned()), - &slur_regex, - &url_blocklist, - &context, - ) - .await?; - let content = is_valid_tagline_content(processed_content)?; + let content = process_markdown(&data.content, &slur_regex, &url_blocklist, &context).await?; + is_valid_tagline_content(&content)?; let tagline_form = TaglineUpdateForm { content, diff --git a/crates/utils/src/utils/validation.rs b/crates/utils/src/utils/validation.rs index 3a2881151d..067a7520c1 100644 --- a/crates/utils/src/utils/validation.rs +++ b/crates/utils/src/utils/validation.rs @@ -171,23 +171,18 @@ pub fn is_valid_body_field(body: &Option, post: bool) -> LemmyResult<()> Ok(()) } -pub fn is_valid_tagline_content(content: Option) -> LemmyResult { - match content { - Some(content) => { - min_length_check( - &content, - TAGLINE_CONTENT_MIN_LENGTH, - LemmyErrorType::TaglineContentRequired, - )?; - max_length_check( - &content, - TAGLINE_CONTENT_MAX_LENGTH, - LemmyErrorType::TaglineContentLengthOverflow, - )?; - Ok(content) - } - None => Err(LemmyErrorType::TaglineContentRequired.into()), - } +pub fn is_valid_tagline_content(content: &str) -> LemmyResult<()> { + min_length_check( + content, + TAGLINE_CONTENT_MIN_LENGTH, + LemmyErrorType::TaglineContentRequired, + )?; + max_length_check( + content, + TAGLINE_CONTENT_MAX_LENGTH, + LemmyErrorType::TaglineContentLengthOverflow, + )?; + Ok(()) } pub fn is_valid_bio_field(bio: &str) -> LemmyResult<()> { From 7ce89fb5e6a240ec334e025d39bfbb072cfa86cf Mon Sep 17 00:00:00 2001 From: Freek van Zee Date: Mon, 8 Apr 2024 21:28:55 +0200 Subject: [PATCH 20/33] Consolidate Tagline error types --- crates/utils/src/error.rs | 3 +-- crates/utils/src/utils/validation.rs | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/crates/utils/src/error.rs b/crates/utils/src/error.rs index 8a102b655e..61bc5091b8 100644 --- a/crates/utils/src/error.rs +++ b/crates/utils/src/error.rs @@ -165,8 +165,7 @@ pub enum LemmyErrorType { InvalidUnixTime, InvalidBotAction, CantBlockLocalInstance, - TaglineContentRequired, - TaglineContentLengthOverflow, + TaglineInvalid, Unknown(String), } diff --git a/crates/utils/src/utils/validation.rs b/crates/utils/src/utils/validation.rs index 067a7520c1..dd89609f8a 100644 --- a/crates/utils/src/utils/validation.rs +++ b/crates/utils/src/utils/validation.rs @@ -175,12 +175,12 @@ pub fn is_valid_tagline_content(content: &str) -> LemmyResult<()> { min_length_check( content, TAGLINE_CONTENT_MIN_LENGTH, - LemmyErrorType::TaglineContentRequired, + LemmyErrorType::TaglineInvalid, )?; max_length_check( content, TAGLINE_CONTENT_MAX_LENGTH, - LemmyErrorType::TaglineContentLengthOverflow, + LemmyErrorType::TaglineInvalid, )?; Ok(()) } From 8c7b3001ae5f1e015f28008f86dae0f818b0df33 Mon Sep 17 00:00:00 2001 From: Freek van Zee Date: Mon, 8 Apr 2024 21:39:17 +0200 Subject: [PATCH 21/33] Remove unecessary clone --- crates/api_crud/src/tagline/create.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/api_crud/src/tagline/create.rs b/crates/api_crud/src/tagline/create.rs index 8111bd279b..0b33a03f9a 100644 --- a/crates/api_crud/src/tagline/create.rs +++ b/crates/api_crud/src/tagline/create.rs @@ -33,7 +33,7 @@ pub async fn create_tagline( let tagline_form = TaglineInsertForm { local_site_id: local_site.id, - content: content.clone(), + content, }; let tagline = Tagline::create(&mut context.pool(), &tagline_form).await?; From 562c909f4b37f566c23e12fd8bbc238652c56f12 Mon Sep 17 00:00:00 2001 From: Freek van Zee Date: Mon, 8 Apr 2024 21:40:11 +0200 Subject: [PATCH 22/33] Updat misleading comments --- crates/api_common/src/tagline.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/api_common/src/tagline.rs b/crates/api_common/src/tagline.rs index 88d5b64d37..3090a2678a 100644 --- a/crates/api_common/src/tagline.rs +++ b/crates/api_common/src/tagline.rs @@ -39,7 +39,7 @@ pub struct TaglineResponse { #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] -/// A response for custom emojis. +/// A response for taglines. pub struct ListTaglinesResponse { pub taglines: Vec, } @@ -48,7 +48,7 @@ pub struct ListTaglinesResponse { #[derive(Debug, Serialize, Deserialize, Clone, Copy, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] -/// Fetches a list of registration applications. +/// Fetches a list of taglines. pub struct ListTaglines { pub page: Option, pub limit: Option, From 6935acba2ffbdf887b02e2701486cfacc84fccaa Mon Sep 17 00:00:00 2001 From: Freek van Zee Date: Mon, 8 Apr 2024 23:14:03 +0200 Subject: [PATCH 23/33] Remove local_site_id from tagline and custom_emoji --- crates/api/src/site/leave_admin.rs | 2 +- crates/api_crud/src/custom_emoji/create.rs | 3 -- crates/api_crud/src/custom_emoji/list.rs | 13 ++------ crates/api_crud/src/custom_emoji/update.rs | 3 -- crates/api_crud/src/site/read.rs | 2 +- crates/api_crud/src/tagline/create.rs | 5 +-- crates/api_crud/src/tagline/list.rs | 11 ++----- crates/db_schema/src/impls/tagline.rs | 12 ++----- crates/db_schema/src/schema.rs | 4 --- crates/db_schema/src/source/custom_emoji.rs | 14 ++------ crates/db_schema/src/source/tagline.rs | 12 +------ crates/db_views/src/custom_emoji_view.rs | 11 ++----- .../down.sql | 32 +++++++++++++++++++ .../up.sql | 6 ++++ 14 files changed, 54 insertions(+), 76 deletions(-) create mode 100644 migrations/2024-04-08-204327_custom_emoji_tagline_changes/down.sql create mode 100644 migrations/2024-04-08-204327_custom_emoji_tagline_changes/up.sql diff --git a/crates/api/src/site/leave_admin.rs b/crates/api/src/site/leave_admin.rs index fa91c726f2..57a134238b 100644 --- a/crates/api/src/site/leave_admin.rs +++ b/crates/api/src/site/leave_admin.rs @@ -61,7 +61,7 @@ pub async fn leave_admin( let all_languages = Language::read_all(&mut context.pool()).await?; let discussion_languages = SiteLanguage::read_local_raw(&mut context.pool()).await?; let blocked_urls = LocalSiteUrlBlocklist::get_all(&mut context.pool()).await?; - let tagline = Tagline::get_random(&mut context.pool(), site_view.local_site.id).await?; + let tagline = Tagline::get_random(&mut context.pool()).await?; Ok(Json(GetSiteResponse { site_view, diff --git a/crates/api_crud/src/custom_emoji/create.rs b/crates/api_crud/src/custom_emoji/create.rs index 54745577a3..5846c12439 100644 --- a/crates/api_crud/src/custom_emoji/create.rs +++ b/crates/api_crud/src/custom_emoji/create.rs @@ -9,7 +9,6 @@ use lemmy_db_schema::{ source::{ custom_emoji::{CustomEmoji, CustomEmojiInsertForm}, custom_emoji_keyword::{CustomEmojiKeyword, CustomEmojiKeywordInsertForm}, - local_site::LocalSite, }, traits::Crud, }; @@ -22,12 +21,10 @@ pub async fn create_custom_emoji( context: Data, local_user_view: LocalUserView, ) -> Result, LemmyError> { - let local_site = LocalSite::read(&mut context.pool()).await?; // Make sure user is an admin is_admin(&local_user_view)?; let emoji_form = CustomEmojiInsertForm::builder() - .local_site_id(local_site.id) .shortcode(data.shortcode.to_lowercase().trim().to_string()) .alt_text(data.alt_text.to_string()) .category(data.category.to_string()) diff --git a/crates/api_crud/src/custom_emoji/list.rs b/crates/api_crud/src/custom_emoji/list.rs index dab3e8823f..c60a03ed41 100644 --- a/crates/api_crud/src/custom_emoji/list.rs +++ b/crates/api_crud/src/custom_emoji/list.rs @@ -3,7 +3,7 @@ use lemmy_api_common::{ context::LemmyContext, custom_emoji::{ListCustomEmojis, ListCustomEmojisResponse}, }; -use lemmy_db_views::structs::{CustomEmojiView, LocalUserView, SiteView}; +use lemmy_db_views::structs::{CustomEmojiView, LocalUserView}; use lemmy_utils::error::LemmyError; #[tracing::instrument(skip(context))] @@ -12,15 +12,8 @@ pub async fn list_custom_emojis( local_user_view: Option, context: Data, ) -> Result, LemmyError> { - let local_site = SiteView::read_local(&mut context.pool()).await?; - let custom_emojis = CustomEmojiView::list( - &mut context.pool(), - local_site.local_site.id, - &data.category, - data.page, - data.limit, - ) - .await?; + let custom_emojis = + CustomEmojiView::list(&mut context.pool(), &data.category, data.page, data.limit).await?; Ok(Json(ListCustomEmojisResponse { custom_emojis })) } diff --git a/crates/api_crud/src/custom_emoji/update.rs b/crates/api_crud/src/custom_emoji/update.rs index 0cabf77b9c..4119ed9442 100644 --- a/crates/api_crud/src/custom_emoji/update.rs +++ b/crates/api_crud/src/custom_emoji/update.rs @@ -9,7 +9,6 @@ use lemmy_db_schema::{ source::{ custom_emoji::{CustomEmoji, CustomEmojiUpdateForm}, custom_emoji_keyword::{CustomEmojiKeyword, CustomEmojiKeywordInsertForm}, - local_site::LocalSite, }, traits::Crud, }; @@ -22,12 +21,10 @@ pub async fn update_custom_emoji( context: Data, local_user_view: LocalUserView, ) -> Result, LemmyError> { - let local_site = LocalSite::read(&mut context.pool()).await?; // Make sure user is an admin is_admin(&local_user_view)?; let emoji_form = CustomEmojiUpdateForm::builder() - .local_site_id(local_site.id) .alt_text(data.alt_text.to_string()) .category(data.category.to_string()) .image_url(data.clone().image_url.into()) diff --git a/crates/api_crud/src/site/read.rs b/crates/api_crud/src/site/read.rs index 90e04946e8..bbead78a09 100644 --- a/crates/api_crud/src/site/read.rs +++ b/crates/api_crud/src/site/read.rs @@ -46,7 +46,7 @@ pub async fn get_site( let all_languages = Language::read_all(&mut context.pool()).await?; let discussion_languages = SiteLanguage::read_local_raw(&mut context.pool()).await?; let blocked_urls = LocalSiteUrlBlocklist::get_all(&mut context.pool()).await?; - let tagline = Tagline::get_random(&mut context.pool(), site_view.local_site.id).await?; + let tagline = Tagline::get_random(&mut context.pool()).await?; Ok(GetSiteResponse { site_view, admins, diff --git a/crates/api_crud/src/tagline/create.rs b/crates/api_crud/src/tagline/create.rs index 0b33a03f9a..50bb50c122 100644 --- a/crates/api_crud/src/tagline/create.rs +++ b/crates/api_crud/src/tagline/create.rs @@ -31,10 +31,7 @@ pub async fn create_tagline( let content = process_markdown(&data.content, &slur_regex, &url_blocklist, &context).await?; is_valid_tagline_content(&content)?; - let tagline_form = TaglineInsertForm { - local_site_id: local_site.id, - content, - }; + let tagline_form = TaglineInsertForm { content }; let tagline = Tagline::create(&mut context.pool(), &tagline_form).await?; diff --git a/crates/api_crud/src/tagline/list.rs b/crates/api_crud/src/tagline/list.rs index d8f067ef12..21929f5478 100644 --- a/crates/api_crud/src/tagline/list.rs +++ b/crates/api_crud/src/tagline/list.rs @@ -4,7 +4,7 @@ use lemmy_api_common::{ tagline::{ListTaglines, ListTaglinesResponse}, }; use lemmy_db_schema::source::tagline::Tagline; -use lemmy_db_views::structs::{LocalUserView, SiteView}; +use lemmy_db_views::structs::LocalUserView; use lemmy_utils::error::LemmyError; #[tracing::instrument(skip(context))] @@ -13,14 +13,7 @@ pub async fn list_taglines( local_user_view: Option, context: Data, ) -> Result, LemmyError> { - let local_site = SiteView::read_local(&mut context.pool()).await?; - let taglines = Tagline::list( - &mut context.pool(), - local_site.local_site.id, - data.page, - data.limit, - ) - .await?; + let taglines = Tagline::list(&mut context.pool(), data.page, data.limit).await?; Ok(Json(ListTaglinesResponse { taglines })) } diff --git a/crates/db_schema/src/impls/tagline.rs b/crates/db_schema/src/impls/tagline.rs index 1bd7555625..656d537d6b 100644 --- a/crates/db_schema/src/impls/tagline.rs +++ b/crates/db_schema/src/impls/tagline.rs @@ -1,6 +1,6 @@ use crate::{ - newtypes::{LocalSiteId, TaglineId}, - schema::tagline::dsl::{local_site_id, published, tagline}, + newtypes::TaglineId, + schema::tagline::dsl::{published, tagline}, source::tagline::{Tagline, TaglineInsertForm, TaglineUpdateForm}, traits::Crud, utils::{get_conn, limit_and_offset, DbPool}, @@ -38,7 +38,6 @@ impl Crud for Tagline { impl Tagline { pub async fn list( pool: &mut DbPool<'_>, - for_local_site_id: LocalSiteId, page: Option, limit: Option, ) -> Result, Error> { @@ -48,21 +47,16 @@ impl Tagline { .order(published.desc()) .offset(offset) .limit(limit) - .filter(local_site_id.eq(for_local_site_id)) .get_results::(conn) .await } - pub async fn get_random( - pool: &mut DbPool<'_>, - for_local_site_id: LocalSiteId, - ) -> Result, Error> { + pub async fn get_random(pool: &mut DbPool<'_>) -> Result, Error> { let conn = &mut get_conn(pool).await?; sql_function!(fn random() -> Text); tagline .order(random()) .limit(1) - .filter(local_site_id.eq(for_local_site_id)) .first::(conn) .await .optional() diff --git a/crates/db_schema/src/schema.rs b/crates/db_schema/src/schema.rs index 408ed05403..dca1cac484 100644 --- a/crates/db_schema/src/schema.rs +++ b/crates/db_schema/src/schema.rs @@ -254,7 +254,6 @@ diesel::table! { diesel::table! { custom_emoji (id) { id -> Int4, - local_site_id -> Int4, #[max_length = 128] shortcode -> Varchar, image_url -> Text, @@ -929,7 +928,6 @@ diesel::table! { diesel::table! { tagline (id) { id -> Int4, - local_site_id -> Int4, content -> Text, published -> Timestamptz, updated -> Nullable, @@ -966,7 +964,6 @@ diesel::joinable!(community_moderator -> community (community_id)); diesel::joinable!(community_moderator -> person (person_id)); diesel::joinable!(community_person_ban -> community (community_id)); diesel::joinable!(community_person_ban -> person (person_id)); -diesel::joinable!(custom_emoji -> local_site (local_site_id)); diesel::joinable!(custom_emoji_keyword -> custom_emoji (custom_emoji_id)); diesel::joinable!(email_verification -> local_user (local_user_id)); diesel::joinable!(federation_allowlist -> instance (instance_id)); @@ -1028,7 +1025,6 @@ diesel::joinable!(site -> instance (instance_id)); diesel::joinable!(site_aggregates -> site (site_id)); diesel::joinable!(site_language -> language (language_id)); diesel::joinable!(site_language -> site (site_id)); -diesel::joinable!(tagline -> local_site (local_site_id)); diesel::allow_tables_to_appear_in_same_query!( admin_purge_comment, diff --git a/crates/db_schema/src/source/custom_emoji.rs b/crates/db_schema/src/source/custom_emoji.rs index 3217c9736b..788885c978 100644 --- a/crates/db_schema/src/source/custom_emoji.rs +++ b/crates/db_schema/src/source/custom_emoji.rs @@ -1,4 +1,4 @@ -use crate::newtypes::{CustomEmojiId, DbUrl, LocalSiteId}; +use crate::newtypes::{CustomEmojiId, DbUrl}; #[cfg(feature = "full")] use crate::schema::custom_emoji; use chrono::{DateTime, Utc}; @@ -10,21 +10,13 @@ use typed_builder::TypedBuilder; #[skip_serializing_none] #[derive(PartialEq, Eq, Debug, Clone, Serialize, Deserialize)] -#[cfg_attr( - feature = "full", - derive(Queryable, Selectable, Associations, Identifiable, TS) -)] +#[cfg_attr(feature = "full", derive(Queryable, Selectable, Identifiable, TS))] #[cfg_attr(feature = "full", diesel(table_name = custom_emoji))] -#[cfg_attr( - feature = "full", - diesel(belongs_to(crate::source::local_site::LocalSite)) -)] #[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] #[cfg_attr(feature = "full", ts(export))] /// A custom emoji. pub struct CustomEmoji { pub id: CustomEmojiId, - pub local_site_id: LocalSiteId, pub shortcode: String, pub image_url: DbUrl, pub alt_text: String, @@ -37,7 +29,6 @@ pub struct CustomEmoji { #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = custom_emoji))] pub struct CustomEmojiInsertForm { - pub local_site_id: LocalSiteId, pub shortcode: String, pub image_url: DbUrl, pub alt_text: String, @@ -48,7 +39,6 @@ pub struct CustomEmojiInsertForm { #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = custom_emoji))] pub struct CustomEmojiUpdateForm { - pub local_site_id: LocalSiteId, pub image_url: DbUrl, pub alt_text: String, pub category: String, diff --git a/crates/db_schema/src/source/tagline.rs b/crates/db_schema/src/source/tagline.rs index df207e10e7..ac6726601d 100644 --- a/crates/db_schema/src/source/tagline.rs +++ b/crates/db_schema/src/source/tagline.rs @@ -1,4 +1,3 @@ -use crate::newtypes::LocalSiteId; #[cfg(feature = "full")] use crate::schema::tagline; use chrono::{DateTime, Utc}; @@ -9,21 +8,13 @@ use ts_rs::TS; #[skip_serializing_none] #[derive(PartialEq, Eq, Debug, Clone, Serialize, Deserialize)] -#[cfg_attr( - feature = "full", - derive(Queryable, Selectable, Associations, Identifiable, TS) -)] +#[cfg_attr(feature = "full", derive(Queryable, Selectable, Identifiable, TS))] #[cfg_attr(feature = "full", diesel(table_name = tagline))] -#[cfg_attr( - feature = "full", - diesel(belongs_to(crate::source::local_site::LocalSite)) -)] #[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] #[cfg_attr(feature = "full", ts(export))] /// A tagline, shown at the top of your site. pub struct Tagline { pub id: i32, - pub local_site_id: LocalSiteId, pub content: String, pub published: DateTime, pub updated: Option>, @@ -33,7 +24,6 @@ pub struct Tagline { #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = tagline))] pub struct TaglineInsertForm { - pub local_site_id: LocalSiteId, pub content: String, } diff --git a/crates/db_views/src/custom_emoji_view.rs b/crates/db_views/src/custom_emoji_view.rs index 70dfb31e50..8c17190a2c 100644 --- a/crates/db_views/src/custom_emoji_view.rs +++ b/crates/db_views/src/custom_emoji_view.rs @@ -2,7 +2,7 @@ use crate::structs::CustomEmojiView; use diesel::{result::Error, ExpressionMethods, JoinOnDsl, NullableExpressionMethods, QueryDsl}; use diesel_async::RunQueryDsl; use lemmy_db_schema::{ - newtypes::{CustomEmojiId, LocalSiteId}, + newtypes::CustomEmojiId, schema::{custom_emoji, custom_emoji_keyword}, source::{custom_emoji::CustomEmoji, custom_emoji_keyword::CustomEmojiKeyword}, utils::{get_conn, limit_and_offset, DbPool}, @@ -35,13 +35,9 @@ impl CustomEmojiView { } } - pub async fn get_all( - pool: &mut DbPool<'_>, - for_local_site_id: LocalSiteId, - ) -> Result, Error> { + pub async fn get_all(pool: &mut DbPool<'_>) -> Result, Error> { let conn = &mut get_conn(pool).await?; let emojis = custom_emoji::table - .filter(custom_emoji::local_site_id.eq(for_local_site_id)) .left_join( custom_emoji_keyword::table.on(custom_emoji_keyword::custom_emoji_id.eq(custom_emoji::id)), ) @@ -59,7 +55,6 @@ impl CustomEmojiView { pub async fn list( pool: &mut DbPool<'_>, - for_local_site_id: LocalSiteId, category: &Option, page: Option, limit: Option, @@ -72,8 +67,6 @@ impl CustomEmojiView { ) .into_boxed(); - query = query.filter(custom_emoji::local_site_id.eq(for_local_site_id)); - if let Some(category) = category { query = query.filter(custom_emoji::category.eq(category)) } diff --git a/migrations/2024-04-08-204327_custom_emoji_tagline_changes/down.sql b/migrations/2024-04-08-204327_custom_emoji_tagline_changes/down.sql new file mode 100644 index 0000000000..a6b01a1d1f --- /dev/null +++ b/migrations/2024-04-08-204327_custom_emoji_tagline_changes/down.sql @@ -0,0 +1,32 @@ +ALTER TABLE custom_emoji + ADD COLUMN local_site_id int REFERENCES local_site (site_id) ON UPDATE CASCADE ON DELETE CASCADE; + +UPDATE + custom_emoji +SET + local_site_id = ( + SELECT + site_id + FROM + local_site + LIMIT 1); + +ALTER TABLE custom_emoji + ALTER COLUMN local_site_id SET NOT NULL; + +ALTER TABLE tagline + ADD COLUMN local_site_id int REFERENCES local_site (site_id) ON UPDATE CASCADE ON DELETE CASCADE; + +UPDATE + tagline +SET + local_site_id = ( + SELECT + site_id + FROM + local_site + LIMIT 1); + +ALTER TABLE tagline + ALTER COLUMN local_site_id SET NOT NULL; + diff --git a/migrations/2024-04-08-204327_custom_emoji_tagline_changes/up.sql b/migrations/2024-04-08-204327_custom_emoji_tagline_changes/up.sql new file mode 100644 index 0000000000..5aa073f766 --- /dev/null +++ b/migrations/2024-04-08-204327_custom_emoji_tagline_changes/up.sql @@ -0,0 +1,6 @@ +ALTER TABLE custom_emoji + DROP COLUMN local_site_id; + +ALTER TABLE tagline + DROP COLUMN local_site_id; + From 999e9845e79b7f63f7342bd0717b7fcdd4bac0a5 Mon Sep 17 00:00:00 2001 From: Freek van Zee Date: Thu, 11 Apr 2024 21:40:50 +0200 Subject: [PATCH 24/33] Update TaglineInserForm and TaglineUpdateForm --- crates/api_crud/src/tagline/create.rs | 4 +++- crates/api_crud/src/tagline/update.rs | 2 +- crates/db_schema/src/source/tagline.rs | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/crates/api_crud/src/tagline/create.rs b/crates/api_crud/src/tagline/create.rs index 50bb50c122..cf9fc8aa05 100644 --- a/crates/api_crud/src/tagline/create.rs +++ b/crates/api_crud/src/tagline/create.rs @@ -31,7 +31,9 @@ pub async fn create_tagline( let content = process_markdown(&data.content, &slur_regex, &url_blocklist, &context).await?; is_valid_tagline_content(&content)?; - let tagline_form = TaglineInsertForm { content }; + let tagline_form = TaglineInsertForm { + content: Some(content), + }; let tagline = Tagline::create(&mut context.pool(), &tagline_form).await?; diff --git a/crates/api_crud/src/tagline/update.rs b/crates/api_crud/src/tagline/update.rs index 44a22f0c1d..ba293b0b0c 100644 --- a/crates/api_crud/src/tagline/update.rs +++ b/crates/api_crud/src/tagline/update.rs @@ -33,7 +33,7 @@ pub async fn update_tagline( is_valid_tagline_content(&content)?; let tagline_form = TaglineUpdateForm { - content, + content: Some(content), updated: Some(Some(naive_now())), }; diff --git a/crates/db_schema/src/source/tagline.rs b/crates/db_schema/src/source/tagline.rs index ac6726601d..7ad1475ec5 100644 --- a/crates/db_schema/src/source/tagline.rs +++ b/crates/db_schema/src/source/tagline.rs @@ -24,13 +24,13 @@ pub struct Tagline { #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = tagline))] pub struct TaglineInsertForm { - pub content: String, + pub content: Option, } #[derive(Clone, Default)] #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = tagline))] pub struct TaglineUpdateForm { - pub content: String, + pub content: Option, pub updated: Option>>, } From 1f629cc02d6e2e39d45429d0330bd7c5465f1b25 Mon Sep 17 00:00:00 2001 From: Freek van Zee Date: Sun, 14 Apr 2024 12:44:46 +0200 Subject: [PATCH 25/33] Add ignore_page_limits for custom emojis EmojiPicker needs to be able to retrieve all emojis in 1 call --- crates/api_common/src/custom_emoji.rs | 1 + crates/api_crud/src/custom_emoji/list.rs | 10 ++++++++-- crates/db_views/src/custom_emoji_view.rs | 10 +++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/crates/api_common/src/custom_emoji.rs b/crates/api_common/src/custom_emoji.rs index 7a846eae23..3804b71af2 100644 --- a/crates/api_common/src/custom_emoji.rs +++ b/crates/api_common/src/custom_emoji.rs @@ -65,4 +65,5 @@ pub struct ListCustomEmojis { pub page: Option, pub limit: Option, pub category: Option, + pub ignore_page_limits: Option, } diff --git a/crates/api_crud/src/custom_emoji/list.rs b/crates/api_crud/src/custom_emoji/list.rs index c60a03ed41..6ee5a44b03 100644 --- a/crates/api_crud/src/custom_emoji/list.rs +++ b/crates/api_crud/src/custom_emoji/list.rs @@ -12,8 +12,14 @@ pub async fn list_custom_emojis( local_user_view: Option, context: Data, ) -> Result, LemmyError> { - let custom_emojis = - CustomEmojiView::list(&mut context.pool(), &data.category, data.page, data.limit).await?; + let custom_emojis = CustomEmojiView::list( + &mut context.pool(), + &data.category, + data.page, + data.limit, + data.ignore_page_limits.unwrap_or(false), + ) + .await?; Ok(Json(ListCustomEmojisResponse { custom_emojis })) } diff --git a/crates/db_views/src/custom_emoji_view.rs b/crates/db_views/src/custom_emoji_view.rs index 8c17190a2c..1ee40fac31 100644 --- a/crates/db_views/src/custom_emoji_view.rs +++ b/crates/db_views/src/custom_emoji_view.rs @@ -58,15 +58,21 @@ impl CustomEmojiView { category: &Option, page: Option, limit: Option, + ignore_page_limits: bool, ) -> Result, Error> { let conn = &mut get_conn(pool).await?; - let (limit, offset) = limit_and_offset(page, limit)?; + let mut query = custom_emoji::table .left_join( custom_emoji_keyword::table.on(custom_emoji_keyword::custom_emoji_id.eq(custom_emoji::id)), ) .into_boxed(); + if !ignore_page_limits { + let (limit, offset) = limit_and_offset(page, limit)?; + query = query.limit(limit).offset(offset); + } + if let Some(category) = category { query = query.filter(custom_emoji::category.eq(category)) } @@ -78,8 +84,6 @@ impl CustomEmojiView { custom_emoji::all_columns, custom_emoji_keyword::all_columns.nullable(), // (or all the columns if you want) )) - .limit(limit) - .offset(offset) .load::(conn) .await?; From 47710852531f874fd0bfade2498d5cc5ef621223 Mon Sep 17 00:00:00 2001 From: Freek van Zee Date: Tue, 16 Apr 2024 22:03:06 +0200 Subject: [PATCH 26/33] Update custom_emoji_view Only keep get_all als helper function calling list with paging ignored Only order on category when filtering on category --- crates/db_views/src/custom_emoji_view.rs | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/crates/db_views/src/custom_emoji_view.rs b/crates/db_views/src/custom_emoji_view.rs index 1ee40fac31..0f1b9e0dea 100644 --- a/crates/db_views/src/custom_emoji_view.rs +++ b/crates/db_views/src/custom_emoji_view.rs @@ -36,21 +36,7 @@ impl CustomEmojiView { } pub async fn get_all(pool: &mut DbPool<'_>) -> Result, Error> { - let conn = &mut get_conn(pool).await?; - let emojis = custom_emoji::table - .left_join( - custom_emoji_keyword::table.on(custom_emoji_keyword::custom_emoji_id.eq(custom_emoji::id)), - ) - .order(custom_emoji::category) - .then_order_by(custom_emoji::id) - .select(( - custom_emoji::all_columns, - custom_emoji_keyword::all_columns.nullable(), // (or all the columns if you want) - )) - .load::(conn) - .await?; - - Ok(CustomEmojiView::from_tuple_to_vec(emojis)) + Self::list(pool, &None, None, None, true).await } pub async fn list( @@ -74,12 +60,14 @@ impl CustomEmojiView { } if let Some(category) = category { - query = query.filter(custom_emoji::category.eq(category)) + query = query + .filter(custom_emoji::category.eq(category)) + .order(custom_emoji::category) } + query = query.then_order_by(custom_emoji::id); + let emojis = query - .order(custom_emoji::category) - .then_order_by(custom_emoji::id) .select(( custom_emoji::all_columns, custom_emoji_keyword::all_columns.nullable(), // (or all the columns if you want) From 004b1b2f08b99fcd2655e68b3b483b0750610d59 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Mon, 16 Sep 2024 17:11:37 -0400 Subject: [PATCH 27/33] Removing pointless get_all fn. --- crates/db_views/src/custom_emoji_view.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/crates/db_views/src/custom_emoji_view.rs b/crates/db_views/src/custom_emoji_view.rs index 0f1b9e0dea..df1f613cdb 100644 --- a/crates/db_views/src/custom_emoji_view.rs +++ b/crates/db_views/src/custom_emoji_view.rs @@ -35,10 +35,6 @@ impl CustomEmojiView { } } - pub async fn get_all(pool: &mut DbPool<'_>) -> Result, Error> { - Self::list(pool, &None, None, None, true).await - } - pub async fn list( pool: &mut DbPool<'_>, category: &Option, From e09e54efaeb945f72a3c1b915b65ff73af267c28 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Wed, 18 Sep 2024 14:24:20 +0200 Subject: [PATCH 28/33] remove tagline length checks --- crates/api_crud/src/tagline/create.rs | 3 +-- crates/api_crud/src/tagline/update.rs | 3 +-- crates/utils/src/error.rs | 1 - crates/utils/src/utils/validation.rs | 16 ---------------- 4 files changed, 2 insertions(+), 21 deletions(-) diff --git a/crates/api_crud/src/tagline/create.rs b/crates/api_crud/src/tagline/create.rs index cf9fc8aa05..b43c930956 100644 --- a/crates/api_crud/src/tagline/create.rs +++ b/crates/api_crud/src/tagline/create.rs @@ -13,7 +13,7 @@ use lemmy_db_schema::{ traits::Crud, }; use lemmy_db_views::structs::LocalUserView; -use lemmy_utils::{error::LemmyError, utils::validation::is_valid_tagline_content}; +use lemmy_utils::error::LemmyError; #[tracing::instrument(skip(context))] pub async fn create_tagline( @@ -29,7 +29,6 @@ pub async fn create_tagline( let slur_regex = local_site_to_slur_regex(&local_site); let url_blocklist = get_url_blocklist(&context).await?; let content = process_markdown(&data.content, &slur_regex, &url_blocklist, &context).await?; - is_valid_tagline_content(&content)?; let tagline_form = TaglineInsertForm { content: Some(content), diff --git a/crates/api_crud/src/tagline/update.rs b/crates/api_crud/src/tagline/update.rs index ba293b0b0c..63223033d9 100644 --- a/crates/api_crud/src/tagline/update.rs +++ b/crates/api_crud/src/tagline/update.rs @@ -14,7 +14,7 @@ use lemmy_db_schema::{ utils::naive_now, }; use lemmy_db_views::structs::LocalUserView; -use lemmy_utils::{error::LemmyError, utils::validation::is_valid_tagline_content}; +use lemmy_utils::error::LemmyError; #[tracing::instrument(skip(context))] pub async fn update_tagline( @@ -30,7 +30,6 @@ pub async fn update_tagline( let slur_regex = local_site_to_slur_regex(&local_site); let url_blocklist = get_url_blocklist(&context).await?; let content = process_markdown(&data.content, &slur_regex, &url_blocklist, &context).await?; - is_valid_tagline_content(&content)?; let tagline_form = TaglineUpdateForm { content: Some(content), diff --git a/crates/utils/src/error.rs b/crates/utils/src/error.rs index bce3a55568..4e634bde38 100644 --- a/crates/utils/src/error.rs +++ b/crates/utils/src/error.rs @@ -176,7 +176,6 @@ pub enum LemmyErrorType { InvalidUnixTime, InvalidBotAction, CantBlockLocalInstance, - TaglineInvalid, UrlWithoutDomain, InboxTimeout, Unknown(String), diff --git a/crates/utils/src/utils/validation.rs b/crates/utils/src/utils/validation.rs index 9137ca9ead..9493ca2fcb 100644 --- a/crates/utils/src/utils/validation.rs +++ b/crates/utils/src/utils/validation.rs @@ -22,8 +22,6 @@ const URL_MAX_LENGTH: usize = 2000; const ALT_TEXT_MAX_LENGTH: usize = 1500; const SITE_NAME_MAX_LENGTH: usize = 20; const SITE_NAME_MIN_LENGTH: usize = 1; -const TAGLINE_CONTENT_MIN_LENGTH: usize = 1; -const TAGLINE_CONTENT_MAX_LENGTH: usize = 50000; const SITE_DESCRIPTION_MAX_LENGTH: usize = 150; //Invisible unicode characters, taken from https://invisible-characters.com/ const FORBIDDEN_DISPLAY_CHARS: [char; 53] = [ @@ -169,20 +167,6 @@ pub fn is_valid_body_field(body: &str, post: bool) -> LemmyResult<()> { Ok(()) } -pub fn is_valid_tagline_content(content: &str) -> LemmyResult<()> { - min_length_check( - content, - TAGLINE_CONTENT_MIN_LENGTH, - LemmyErrorType::TaglineInvalid, - )?; - max_length_check( - content, - TAGLINE_CONTENT_MAX_LENGTH, - LemmyErrorType::TaglineInvalid, - )?; - Ok(()) -} - pub fn is_valid_bio_field(bio: &str) -> LemmyResult<()> { max_length_check(bio, BIO_MAX_LENGTH, LemmyErrorType::BioLengthOverflow) } From 215ebf7e6217ac279fc0455115620866222b8d16 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Wed, 18 Sep 2024 14:27:58 +0200 Subject: [PATCH 29/33] make fields of TaglineInsertForm and TaglineUpdateForm mandatory --- crates/api_crud/src/tagline/create.rs | 4 +--- crates/api_crud/src/tagline/update.rs | 4 ++-- crates/db_schema/src/source/tagline.rs | 6 +++--- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/crates/api_crud/src/tagline/create.rs b/crates/api_crud/src/tagline/create.rs index b43c930956..f67a26f68b 100644 --- a/crates/api_crud/src/tagline/create.rs +++ b/crates/api_crud/src/tagline/create.rs @@ -30,9 +30,7 @@ pub async fn create_tagline( let url_blocklist = get_url_blocklist(&context).await?; let content = process_markdown(&data.content, &slur_regex, &url_blocklist, &context).await?; - let tagline_form = TaglineInsertForm { - content: Some(content), - }; + let tagline_form = TaglineInsertForm { content }; let tagline = Tagline::create(&mut context.pool(), &tagline_form).await?; diff --git a/crates/api_crud/src/tagline/update.rs b/crates/api_crud/src/tagline/update.rs index 63223033d9..043589d26b 100644 --- a/crates/api_crud/src/tagline/update.rs +++ b/crates/api_crud/src/tagline/update.rs @@ -32,8 +32,8 @@ pub async fn update_tagline( let content = process_markdown(&data.content, &slur_regex, &url_blocklist, &context).await?; let tagline_form = TaglineUpdateForm { - content: Some(content), - updated: Some(Some(naive_now())), + content, + updated: naive_now(), }; let tagline = Tagline::update(&mut context.pool(), data.id, &tagline_form).await?; diff --git a/crates/db_schema/src/source/tagline.rs b/crates/db_schema/src/source/tagline.rs index 7ad1475ec5..05f7e0520b 100644 --- a/crates/db_schema/src/source/tagline.rs +++ b/crates/db_schema/src/source/tagline.rs @@ -24,13 +24,13 @@ pub struct Tagline { #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = tagline))] pub struct TaglineInsertForm { - pub content: Option, + pub content: String, } #[derive(Clone, Default)] #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = tagline))] pub struct TaglineUpdateForm { - pub content: Option, - pub updated: Option>>, + pub content: String, + pub updated: DateTime, } From 2de4503c7c25f1cbb9d5dfd5de3f29fcc2cffccd Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Wed, 18 Sep 2024 14:32:34 +0200 Subject: [PATCH 30/33] move emoji order statement --- crates/db_views/src/custom_emoji_view.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/db_views/src/custom_emoji_view.rs b/crates/db_views/src/custom_emoji_view.rs index df1f613cdb..078bd33386 100644 --- a/crates/db_views/src/custom_emoji_view.rs +++ b/crates/db_views/src/custom_emoji_view.rs @@ -48,6 +48,7 @@ impl CustomEmojiView { .left_join( custom_emoji_keyword::table.on(custom_emoji_keyword::custom_emoji_id.eq(custom_emoji::id)), ) + .order(custom_emoji::category) .into_boxed(); if !ignore_page_limits { @@ -58,7 +59,6 @@ impl CustomEmojiView { if let Some(category) = category { query = query .filter(custom_emoji::category.eq(category)) - .order(custom_emoji::category) } query = query.then_order_by(custom_emoji::id); From 18a4cf9fb8d11f70b2177c903348d619af66485b Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Wed, 18 Sep 2024 14:34:14 +0200 Subject: [PATCH 31/33] add comment for GetSiteResponse.tagline --- crates/api_common/src/site.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/api_common/src/site.rs b/crates/api_common/src/site.rs index f33c4add12..98f383c2dc 100644 --- a/crates/api_common/src/site.rs +++ b/crates/api_common/src/site.rs @@ -307,6 +307,7 @@ pub struct GetSiteResponse { pub my_user: Option, pub all_languages: Vec, pub discussion_languages: Vec, + /// If the site has any taglines, a random one is included here for displaying pub tagline: Option, pub blocked_urls: Vec, } From 8076dd8004a545214a2374e5991f8a6d9efca8eb Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 19 Sep 2024 04:03:58 -0400 Subject: [PATCH 32/33] Adding a default_comment_sort_type column for local_site and local_user. (#4469) * Adding a default_comment_sort_type column for local_site and local_user. - Renamed SortType to PostSortType in the DB and code. - Renamed references to default_sort_type to default_post_sort_type. - Fixes #4128 * Renaming migration to current date. * Simplifying PostSortType. --- crates/api/src/local_user/save_settings.rs | 6 +- crates/api_common/src/community.rs | 4 +- crates/api_common/src/person.rs | 14 +++-- crates/api_common/src/post.rs | 4 +- crates/api_common/src/site.rs | 21 ++++--- crates/api_crud/src/site/create.rs | 50 +++++++++++----- crates/api_crud/src/site/update.rs | 47 ++++++++++----- crates/apub/src/api/list_comments.rs | 8 ++- crates/apub/src/api/list_posts.rs | 4 +- crates/apub/src/api/mod.rs | 29 ++++++--- crates/apub/src/api/user_settings_backup.rs | 3 +- .../apub/src/collections/community_outbox.rs | 4 +- crates/db_perf/src/main.rs | 4 +- crates/db_schema/src/lib.rs | 16 +++-- crates/db_schema/src/schema.rs | 24 +++++--- crates/db_schema/src/source/local_site.rs | 15 +++-- crates/db_schema/src/source/local_user.rs | 13 ++-- crates/db_schema/src/utils.rs | 26 +++----- crates/db_views/src/post_view.rs | 59 ++++++++++--------- .../src/registration_application_view.rs | 3 +- crates/db_views_actor/src/community_view.rs | 6 +- crates/db_views_actor/src/person_view.rs | 17 +++--- crates/routes/src/feeds.rs | 16 ++--- .../down.sql | 19 ++++++ .../up.sql | 24 ++++++++ 25 files changed, 286 insertions(+), 150 deletions(-) create mode 100644 migrations/2024-09-16-000000_default_comment_sort_type/down.sql create mode 100644 migrations/2024-09-16-000000_default_comment_sort_type/up.sql diff --git a/crates/api/src/local_user/save_settings.rs b/crates/api/src/local_user/save_settings.rs index d5b6a7ec1e..c62ab0e014 100644 --- a/crates/api/src/local_user/save_settings.rs +++ b/crates/api/src/local_user/save_settings.rs @@ -102,7 +102,8 @@ pub async fn save_user_settings( let local_user_id = local_user_view.local_user.id; let person_id = local_user_view.person.id; let default_listing_type = data.default_listing_type; - let default_sort_type = data.default_sort_type; + let default_post_sort_type = data.default_post_sort_type; + let default_comment_sort_type = data.default_comment_sort_type; let person_form = PersonUpdateForm { display_name, @@ -133,7 +134,8 @@ pub async fn save_user_settings( blur_nsfw: data.blur_nsfw, auto_expand: data.auto_expand, show_bot_accounts: data.show_bot_accounts, - default_sort_type, + default_post_sort_type, + default_comment_sort_type, default_listing_type, theme: data.theme.clone(), interface_language: data.interface_language.clone(), diff --git a/crates/api_common/src/community.rs b/crates/api_common/src/community.rs index 3dad04af5e..e1c1c5d768 100644 --- a/crates/api_common/src/community.rs +++ b/crates/api_common/src/community.rs @@ -3,7 +3,7 @@ use lemmy_db_schema::{ source::site::Site, CommunityVisibility, ListingType, - SortType, + PostSortType, }; use lemmy_db_views_actor::structs::{CommunityModeratorView, CommunityView, PersonView}; use serde::{Deserialize, Serialize}; @@ -74,7 +74,7 @@ pub struct CommunityResponse { /// Fetches a list of communities. pub struct ListCommunities { pub type_: Option, - pub sort: Option, + pub sort: Option, pub show_nsfw: Option, pub page: Option, pub limit: Option, diff --git a/crates/api_common/src/person.rs b/crates/api_common/src/person.rs index 64b09e1327..40e8df4cef 100644 --- a/crates/api_common/src/person.rs +++ b/crates/api_common/src/person.rs @@ -5,7 +5,7 @@ use lemmy_db_schema::{ CommentSortType, ListingType, PostListingMode, - SortType, + PostSortType, }; use lemmy_db_views::structs::{CommentView, LocalImageView, PostView}; use lemmy_db_views_actor::structs::{ @@ -88,8 +88,14 @@ pub struct SaveUserSettings { pub auto_expand: Option, /// Your user's theme. pub theme: Option, - pub default_sort_type: Option, + /// The default post listing type, usually "local" pub default_listing_type: Option, + /// A post-view mode that changes how multiple post listings look. + pub post_listing_mode: Option, + /// The default post sort, usually "active" + pub default_post_sort_type: Option, + /// The default comment sort, usually "hot" + pub default_comment_sort_type: Option, /// The language of the lemmy interface pub interface_language: Option, /// A URL for your avatar. @@ -120,8 +126,6 @@ pub struct SaveUserSettings { pub open_links_in_new_tab: Option, /// Enable infinite scroll pub infinite_scroll_enabled: Option, - /// A post-view mode that changes how multiple post listings look. - pub post_listing_mode: Option, /// Whether to allow keyboard navigation (for browsing and interacting with posts and comments). pub enable_keyboard_navigation: Option, /// Whether user avatars or inline images in the UI that are gifs should be allowed to play or @@ -172,7 +176,7 @@ pub struct GetPersonDetails { pub person_id: Option, /// Example: dessalines , or dessalines@xyz.tld pub username: Option, - pub sort: Option, + pub sort: Option, pub page: Option, pub limit: Option, pub community_id: Option, diff --git a/crates/api_common/src/post.rs b/crates/api_common/src/post.rs index 74369173be..44436fa843 100644 --- a/crates/api_common/src/post.rs +++ b/crates/api_common/src/post.rs @@ -2,7 +2,7 @@ use lemmy_db_schema::{ newtypes::{CommentId, CommunityId, DbUrl, LanguageId, PostId, PostReportId}, ListingType, PostFeatureType, - SortType, + PostSortType, }; use lemmy_db_views::structs::{PaginationCursor, PostReportView, PostView, VoteView}; use lemmy_db_views_actor::structs::{CommunityModeratorView, CommunityView}; @@ -69,7 +69,7 @@ pub struct GetPostResponse { /// Get a list of posts. pub struct GetPosts { pub type_: Option, - pub sort: Option, + pub sort: Option, /// DEPRECATED, use page_cursor pub page: Option, pub limit: Option, diff --git a/crates/api_common/src/site.rs b/crates/api_common/src/site.rs index 148947cd15..a4f4ea71e0 100644 --- a/crates/api_common/src/site.rs +++ b/crates/api_common/src/site.rs @@ -20,12 +20,13 @@ use lemmy_db_schema::{ person::Person, tagline::Tagline, }, + CommentSortType, ListingType, ModlogActionType, PostListingMode, + PostSortType, RegistrationMode, SearchType, - SortType, }; use lemmy_db_views::structs::{ CommentView, @@ -73,7 +74,7 @@ pub struct Search { pub community_name: Option, pub creator_id: Option, pub type_: Option, - pub sort: Option, + pub sort: Option, pub listing_type: Option, pub page: Option, pub limit: Option, @@ -173,7 +174,9 @@ pub struct CreateSite { pub private_instance: Option, pub default_theme: Option, pub default_post_listing_type: Option, - pub default_sort_type: Option, + pub default_post_listing_mode: Option, + pub default_post_sort_type: Option, + pub default_comment_sort_type: Option, pub legal_information: Option, pub application_email_admins: Option, pub hide_modlog_mod_names: Option, @@ -201,7 +204,6 @@ pub struct CreateSite { pub registration_mode: Option, pub oauth_registration: Option, pub content_warning: Option, - pub default_post_listing_mode: Option, } #[skip_serializing_none] @@ -232,9 +234,14 @@ pub struct EditSite { pub private_instance: Option, /// The default theme. Usually "browser" pub default_theme: Option, + /// The default post listing type, usually "local" pub default_post_listing_type: Option, - /// The default sort, usually "active" - pub default_sort_type: Option, + /// Default value for listing mode, usually "list" + pub default_post_listing_mode: Option, + /// The default post sort, usually "active" + pub default_post_sort_type: Option, + /// The default comment sort, usually "hot" + pub default_comment_sort_type: Option, /// An optional page of legal information pub legal_information: Option, /// Whether to email admins when receiving a new application. @@ -287,8 +294,6 @@ pub struct EditSite { /// If present, nsfw content is visible by default. Should be displayed by frontends/clients /// when the site is first opened by a user. pub content_warning: Option, - /// Default value for [LocalUser.post_listing_mode] - pub default_post_listing_mode: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] diff --git a/crates/api_crud/src/site/create.rs b/crates/api_crud/src/site/create.rs index 735dc94268..868152756e 100644 --- a/crates/api_crud/src/site/create.rs +++ b/crates/api_crud/src/site/create.rs @@ -97,7 +97,8 @@ pub async fn create_site( private_instance: data.private_instance, default_theme: data.default_theme.clone(), default_post_listing_type: data.default_post_listing_type, - default_sort_type: data.default_sort_type, + default_post_sort_type: data.default_post_sort_type, + default_comment_sort_type: data.default_comment_sort_type, legal_information: diesel_string_update(data.legal_information.as_deref()), application_email_admins: data.application_email_admins, hide_modlog_mod_names: data.hide_modlog_mod_names, @@ -193,7 +194,13 @@ mod tests { use crate::site::create::validate_create_payload; use lemmy_api_common::site::CreateSite; - use lemmy_db_schema::{source::local_site::LocalSite, ListingType, RegistrationMode, SortType}; + use lemmy_db_schema::{ + source::local_site::LocalSite, + CommentSortType, + ListingType, + PostSortType, + RegistrationMode, + }; use lemmy_utils::error::LemmyErrorType; #[test] @@ -215,7 +222,8 @@ mod tests { None::, None::, None::, - None::, + None::, + None::, None::, None::, None::, @@ -239,7 +247,8 @@ mod tests { None::, None::, None::, - None::, + None::, + None::, None::, None::, None::, @@ -263,7 +272,8 @@ mod tests { None::, None::, None::, - None::, + None::, + None::, Some(String::from("(zeta|alpha)")), None::, None::, @@ -287,7 +297,8 @@ mod tests { None::, None::, Some(ListingType::Subscribed), - None::, + None::, + None::, None::, None::, None::, @@ -311,7 +322,8 @@ mod tests { None::, None::, None::, - None::, + None::, + None::, None::, Some(true), Some(true), @@ -335,7 +347,8 @@ mod tests { None::, None::, None::, - None::, + None::, + None::, None::, None::, Some(true), @@ -359,7 +372,8 @@ mod tests { None::, None::, None::, - None::, + None::, + None::, None::, None::, None::, @@ -417,7 +431,8 @@ mod tests { None::, None::, None::, - None::, + None::, + None::, None::, None::, None::, @@ -440,7 +455,8 @@ mod tests { Some(String::new()), Some(String::new()), Some(ListingType::All), - Some(SortType::Active), + Some(PostSortType::Active), + Some(CommentSortType::Hot), Some(String::new()), Some(false), Some(true), @@ -463,7 +479,8 @@ mod tests { None::, None::, None::, - None::, + None::, + None::, Some(String::new()), None::, None::, @@ -486,7 +503,8 @@ mod tests { None::, None::, None::, - None::, + None::, + None::, None::, None::, None::, @@ -536,7 +554,8 @@ mod tests { site_description: Option, site_sidebar: Option, site_listing_type: Option, - site_sort_type: Option, + site_post_sort_type: Option, + site_comment_sort_type: Option, site_slur_filter_regex: Option, site_is_private: Option, site_is_federated: Option, @@ -557,7 +576,8 @@ mod tests { private_instance: site_is_private, default_theme: None, default_post_listing_type: site_listing_type, - default_sort_type: site_sort_type, + default_post_sort_type: site_post_sort_type, + default_comment_sort_type: site_comment_sort_type, legal_information: None, application_email_admins: None, hide_modlog_mod_names: None, diff --git a/crates/api_crud/src/site/update.rs b/crates/api_crud/src/site/update.rs index 9472d42549..7bfd884238 100644 --- a/crates/api_crud/src/site/update.rs +++ b/crates/api_crud/src/site/update.rs @@ -106,7 +106,8 @@ pub async fn update_site( private_instance: data.private_instance, default_theme: data.default_theme.clone(), default_post_listing_type: data.default_post_listing_type, - default_sort_type: data.default_sort_type, + default_post_sort_type: data.default_post_sort_type, + default_comment_sort_type: data.default_comment_sort_type, legal_information: diesel_string_update(data.legal_information.as_deref()), application_email_admins: data.application_email_admins, hide_modlog_mod_names: data.hide_modlog_mod_names, @@ -245,7 +246,13 @@ mod tests { use crate::site::update::validate_update_payload; use lemmy_api_common::site::EditSite; - use lemmy_db_schema::{source::local_site::LocalSite, ListingType, RegistrationMode, SortType}; + use lemmy_db_schema::{ + source::local_site::LocalSite, + CommentSortType, + ListingType, + PostSortType, + RegistrationMode, + }; use lemmy_utils::error::LemmyErrorType; #[test] @@ -266,7 +273,8 @@ mod tests { None::, None::, None::, - None::, + None::, + None::, None::, None::, None::, @@ -290,7 +298,8 @@ mod tests { None::, None::, None::, - None::, + None::, + None::, Some(String::from("(zeta|alpha)")), None::, None::, @@ -314,7 +323,8 @@ mod tests { None::, None::, Some(ListingType::Subscribed), - None::, + None::, + None::, None::, None::, None::, @@ -338,7 +348,8 @@ mod tests { None::, None::, None::, - None::, + None::, + None::, None::, Some(true), Some(true), @@ -362,7 +373,8 @@ mod tests { None::, None::, None::, - None::, + None::, + None::, None::, None::, Some(true), @@ -386,7 +398,8 @@ mod tests { None::, None::, None::, - None::, + None::, + None::, None::, None::, None::, @@ -441,7 +454,8 @@ mod tests { None::, None::, None::, - None::, + None::, + None::, None::, None::, None::, @@ -464,7 +478,8 @@ mod tests { Some(String::new()), Some(String::new()), Some(ListingType::All), - Some(SortType::Active), + Some(PostSortType::Active), + Some(CommentSortType::Hot), Some(String::new()), Some(false), Some(true), @@ -487,7 +502,8 @@ mod tests { None::, None::, None::, - None::, + None::, + None::, Some(String::new()), None::, None::, @@ -510,7 +526,8 @@ mod tests { None::, None::, None::, - None::, + None::, + None::, None::, None::, None::, @@ -559,7 +576,8 @@ mod tests { site_description: Option, site_sidebar: Option, site_listing_type: Option, - site_sort_type: Option, + site_post_sort_type: Option, + site_comment_sort_type: Option, site_slur_filter_regex: Option, site_is_private: Option, site_is_federated: Option, @@ -581,7 +599,8 @@ mod tests { private_instance: site_is_private, default_theme: None, default_post_listing_type: site_listing_type, - default_sort_type: site_sort_type, + default_post_sort_type: site_post_sort_type, + default_comment_sort_type: site_comment_sort_type, legal_information: None, application_email_admins: None, hide_modlog_mod_names: None, diff --git a/crates/apub/src/api/list_comments.rs b/crates/apub/src/api/list_comments.rs index 12d18110e9..3223921bc1 100644 --- a/crates/apub/src/api/list_comments.rs +++ b/crates/apub/src/api/list_comments.rs @@ -1,3 +1,4 @@ +use super::comment_sort_type_with_default; use crate::{ api::listing_type_with_default, fetcher::resolve_actor_identifier, @@ -35,7 +36,12 @@ pub async fn list_comments( } else { data.community_id }; - let sort = data.sort; + let local_user_ref = local_user_view.as_ref().map(|u| &u.local_user); + let sort = Some(comment_sort_type_with_default( + data.sort, + local_user_ref, + &local_site, + )); let max_depth = data.max_depth; let saved_only = data.saved_only; diff --git a/crates/apub/src/api/list_posts.rs b/crates/apub/src/api/list_posts.rs index cb2a37a3cc..9b504dbe35 100644 --- a/crates/apub/src/api/list_posts.rs +++ b/crates/apub/src/api/list_posts.rs @@ -1,5 +1,5 @@ use crate::{ - api::{listing_type_with_default, sort_type_with_default}, + api::{listing_type_with_default, post_sort_type_with_default}, fetcher::resolve_actor_identifier, objects::community::ApubCommunity, }; @@ -57,7 +57,7 @@ pub async fn list_posts( community_id, )); - let sort = Some(sort_type_with_default( + let sort = Some(post_sort_type_with_default( data.sort, local_user, &local_site.local_site, diff --git a/crates/apub/src/api/mod.rs b/crates/apub/src/api/mod.rs index dab2ace068..580be32286 100644 --- a/crates/apub/src/api/mod.rs +++ b/crates/apub/src/api/mod.rs @@ -1,8 +1,9 @@ use lemmy_db_schema::{ newtypes::CommunityId, source::{local_site::LocalSite, local_user::LocalUser}, + CommentSortType, ListingType, - SortType, + PostSortType, }; pub mod list_comments; @@ -33,16 +34,30 @@ fn listing_type_with_default( } } -/// Returns a default instance-level sort type, if none is given by the user. +/// Returns a default instance-level post sort type, if none is given by the user. /// Order is type, local user default, then site default. -fn sort_type_with_default( - type_: Option, +fn post_sort_type_with_default( + type_: Option, local_user: Option<&LocalUser>, local_site: &LocalSite, -) -> SortType { +) -> PostSortType { type_.unwrap_or( local_user - .map(|u| u.default_sort_type) - .unwrap_or(local_site.default_sort_type), + .map(|u| u.default_post_sort_type) + .unwrap_or(local_site.default_post_sort_type), + ) +} + +/// Returns a default instance-level comment sort type, if none is given by the user. +/// Order is type, local user default, then site default. +fn comment_sort_type_with_default( + type_: Option, + local_user: Option<&LocalUser>, + local_site: &LocalSite, +) -> CommentSortType { + type_.unwrap_or( + local_user + .map(|u| u.default_comment_sort_type) + .unwrap_or(local_site.default_comment_sort_type), ) } diff --git a/crates/apub/src/api/user_settings_backup.rs b/crates/apub/src/api/user_settings_backup.rs index fdf8dc2ad8..c94fee9b83 100644 --- a/crates/apub/src/api/user_settings_backup.rs +++ b/crates/apub/src/api/user_settings_backup.rs @@ -114,7 +114,8 @@ pub async fn import_settings( let local_user_form = LocalUserUpdateForm { show_nsfw: data.settings.as_ref().map(|s| s.show_nsfw), theme: data.settings.clone().map(|s| s.theme.clone()), - default_sort_type: data.settings.as_ref().map(|s| s.default_sort_type), + default_post_sort_type: data.settings.as_ref().map(|s| s.default_post_sort_type), + default_comment_sort_type: data.settings.as_ref().map(|s| s.default_comment_sort_type), default_listing_type: data.settings.as_ref().map(|s| s.default_listing_type), interface_language: data.settings.clone().map(|s| s.interface_language), show_avatars: data.settings.as_ref().map(|s| s.show_avatars), diff --git a/crates/apub/src/collections/community_outbox.rs b/crates/apub/src/collections/community_outbox.rs index 38a66c62b1..01199bc2bb 100644 --- a/crates/apub/src/collections/community_outbox.rs +++ b/crates/apub/src/collections/community_outbox.rs @@ -18,7 +18,7 @@ use activitypub_federation::{ }; use futures::future::join_all; use lemmy_api_common::{context::LemmyContext, utils::generate_outbox_url}; -use lemmy_db_schema::{source::site::Site, utils::FETCH_LIMIT_MAX, SortType}; +use lemmy_db_schema::{source::site::Site, utils::FETCH_LIMIT_MAX, PostSortType}; use lemmy_db_views::post_view::PostQuery; use lemmy_utils::error::{LemmyError, LemmyResult}; use url::Url; @@ -39,7 +39,7 @@ impl Collection for ApubCommunityOutbox { let post_views = PostQuery { community_id: Some(owner.id), - sort: Some(SortType::New), + sort: Some(PostSortType::New), limit: Some(FETCH_LIMIT_MAX), ..Default::default() } diff --git a/crates/db_perf/src/main.rs b/crates/db_perf/src/main.rs index 8e03a0a1dd..4abe14794e 100644 --- a/crates/db_perf/src/main.rs +++ b/crates/db_perf/src/main.rs @@ -20,7 +20,7 @@ use lemmy_db_schema::{ }, traits::Crud, utils::{build_db_pool, get_conn, now}, - SortType, + PostSortType, }; use lemmy_db_views::{post_view::PostQuery, structs::PaginationCursor}; use lemmy_utils::error::{LemmyErrorExt2, LemmyResult}; @@ -151,7 +151,7 @@ async fn try_main() -> LemmyResult<()> { // TODO: include local_user let post_views = PostQuery { community_id: community_ids.as_slice().first().cloned(), - sort: Some(SortType::New), + sort: Some(PostSortType::New), limit: Some(20), page_after, ..Default::default() diff --git a/crates/db_schema/src/lib.rs b/crates/db_schema/src/lib.rs index c29ec64439..1e3d96a1df 100644 --- a/crates/db_schema/src/lib.rs +++ b/crates/db_schema/src/lib.rs @@ -58,13 +58,13 @@ use ts_rs::TS; #[cfg_attr(feature = "full", derive(DbEnum, TS))] #[cfg_attr( feature = "full", - ExistingTypePath = "crate::schema::sql_types::SortTypeEnum" + ExistingTypePath = "crate::schema::sql_types::PostSortTypeEnum" )] #[cfg_attr(feature = "full", DbValueStyle = "verbatim")] #[cfg_attr(feature = "full", ts(export))] // TODO add the controversial and scaled rankings to the doc below /// The post sort types. See here for descriptions: https://join-lemmy.org/docs/en/users/03-votes-and-ranking.html -pub enum SortType { +pub enum PostSortType { #[default] Active, Hot, @@ -87,11 +87,19 @@ pub enum SortType { Scaled, } -#[derive(EnumString, Display, Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "full", derive(TS))] +#[derive( + EnumString, Display, Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Default, Hash, +)] +#[cfg_attr(feature = "full", derive(DbEnum, TS))] +#[cfg_attr( + feature = "full", + ExistingTypePath = "crate::schema::sql_types::CommentSortTypeEnum" +)] +#[cfg_attr(feature = "full", DbValueStyle = "verbatim")] #[cfg_attr(feature = "full", ts(export))] /// The comment sort types. See here for descriptions: https://join-lemmy.org/docs/en/users/03-votes-and-ranking.html pub enum CommentSortType { + #[default] Hot, Top, New, diff --git a/crates/db_schema/src/schema.rs b/crates/db_schema/src/schema.rs index ac1ad888db..289032e008 100644 --- a/crates/db_schema/src/schema.rs +++ b/crates/db_schema/src/schema.rs @@ -5,6 +5,10 @@ pub mod sql_types { #[diesel(postgres_type(name = "actor_type_enum"))] pub struct ActorTypeEnum; + #[derive(diesel::sql_types::SqlType)] + #[diesel(postgres_type(name = "comment_sort_type_enum"))] + pub struct CommentSortTypeEnum; + #[derive(diesel::sql_types::SqlType)] #[diesel(postgres_type(name = "community_visibility"))] pub struct CommunityVisibility; @@ -22,12 +26,12 @@ pub mod sql_types { pub struct PostListingModeEnum; #[derive(diesel::sql_types::SqlType)] - #[diesel(postgres_type(name = "registration_mode_enum"))] - pub struct RegistrationModeEnum; + #[diesel(postgres_type(name = "post_sort_type_enum"))] + pub struct PostSortTypeEnum; #[derive(diesel::sql_types::SqlType)] - #[diesel(postgres_type(name = "sort_type_enum"))] - pub struct SortTypeEnum; + #[diesel(postgres_type(name = "registration_mode_enum"))] + pub struct RegistrationModeEnum; } diesel::table! { @@ -362,7 +366,8 @@ diesel::table! { use super::sql_types::ListingTypeEnum; use super::sql_types::RegistrationModeEnum; use super::sql_types::PostListingModeEnum; - use super::sql_types::SortTypeEnum; + use super::sql_types::PostSortTypeEnum; + use super::sql_types::CommentSortTypeEnum; local_site (id) { id -> Int4, @@ -390,7 +395,8 @@ diesel::table! { reports_email_admins -> Bool, federation_signed_fetch -> Bool, default_post_listing_mode -> PostListingModeEnum, - default_sort_type -> SortTypeEnum, + default_post_sort_type -> PostSortTypeEnum, + default_comment_sort_type -> CommentSortTypeEnum, oauth_registration -> Bool, } } @@ -428,9 +434,10 @@ diesel::table! { diesel::table! { use diesel::sql_types::*; - use super::sql_types::SortTypeEnum; + use super::sql_types::PostSortTypeEnum; use super::sql_types::ListingTypeEnum; use super::sql_types::PostListingModeEnum; + use super::sql_types::CommentSortTypeEnum; local_user (id) { id -> Int4, @@ -439,7 +446,7 @@ diesel::table! { email -> Nullable, show_nsfw -> Bool, theme -> Text, - default_sort_type -> SortTypeEnum, + default_post_sort_type -> PostSortTypeEnum, default_listing_type -> ListingTypeEnum, #[max_length = 20] interface_language -> Varchar, @@ -460,6 +467,7 @@ diesel::table! { enable_keyboard_navigation -> Bool, enable_animated_images -> Bool, collapse_bot_comments -> Bool, + default_comment_sort_type -> CommentSortTypeEnum, } } diff --git a/crates/db_schema/src/source/local_site.rs b/crates/db_schema/src/source/local_site.rs index 8dc81a9a55..001c8cc522 100644 --- a/crates/db_schema/src/source/local_site.rs +++ b/crates/db_schema/src/source/local_site.rs @@ -2,10 +2,11 @@ use crate::schema::local_site; use crate::{ newtypes::{LocalSiteId, SiteId}, + CommentSortType, ListingType, PostListingMode, + PostSortType, RegistrationMode, - SortType, }; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; @@ -66,8 +67,10 @@ pub struct LocalSite { pub federation_signed_fetch: bool, /// Default value for [LocalSite.post_listing_mode] pub default_post_listing_mode: PostListingMode, - /// Default value for [LocalUser.post_listing_mode] - pub default_sort_type: SortType, + /// Default value for [LocalUser.post_sort_type] + pub default_post_sort_type: PostSortType, + /// Default value for [LocalUser.comment_sort_type] + pub default_comment_sort_type: CommentSortType, /// Whether or not external auth methods can auto-register users. pub oauth_registration: bool, } @@ -100,7 +103,8 @@ pub struct LocalSiteInsertForm { pub reports_email_admins: Option, pub federation_signed_fetch: Option, pub default_post_listing_mode: Option, - pub default_sort_type: Option, + pub default_post_sort_type: Option, + pub default_comment_sort_type: Option, } #[derive(Clone, Default)] @@ -129,5 +133,6 @@ pub struct LocalSiteUpdateForm { pub updated: Option>>, pub federation_signed_fetch: Option, pub default_post_listing_mode: Option, - pub default_sort_type: Option, + pub default_post_sort_type: Option, + pub default_comment_sort_type: Option, } diff --git a/crates/db_schema/src/source/local_user.rs b/crates/db_schema/src/source/local_user.rs index e184d3605b..876bfa4870 100644 --- a/crates/db_schema/src/source/local_user.rs +++ b/crates/db_schema/src/source/local_user.rs @@ -3,9 +3,10 @@ use crate::schema::local_user; use crate::{ newtypes::{LocalUserId, PersonId}, sensitive::SensitiveString, + CommentSortType, ListingType, PostListingMode, - SortType, + PostSortType, }; use serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; @@ -29,7 +30,7 @@ pub struct LocalUser { /// Whether to show NSFW content. pub show_nsfw: bool, pub theme: String, - pub default_sort_type: SortType, + pub default_post_sort_type: PostSortType, pub default_listing_type: ListingType, pub interface_language: String, /// Whether to show avatars. @@ -63,6 +64,7 @@ pub struct LocalUser { pub enable_animated_images: bool, /// Whether to auto-collapse bot comments. pub collapse_bot_comments: bool, + pub default_comment_sort_type: CommentSortType, } #[derive(Clone, derive_new::new)] @@ -78,7 +80,7 @@ pub struct LocalUserInsertForm { #[new(default)] pub theme: Option, #[new(default)] - pub default_sort_type: Option, + pub default_post_sort_type: Option, #[new(default)] pub default_listing_type: Option, #[new(default)] @@ -117,6 +119,8 @@ pub struct LocalUserInsertForm { pub enable_animated_images: Option, #[new(default)] pub collapse_bot_comments: Option, + #[new(default)] + pub default_comment_sort_type: Option, } #[derive(Clone, Default)] @@ -127,7 +131,7 @@ pub struct LocalUserUpdateForm { pub email: Option>, pub show_nsfw: Option, pub theme: Option, - pub default_sort_type: Option, + pub default_post_sort_type: Option, pub default_listing_type: Option, pub interface_language: Option, pub show_avatars: Option, @@ -147,4 +151,5 @@ pub struct LocalUserUpdateForm { pub enable_keyboard_navigation: Option, pub enable_animated_images: Option, pub collapse_bot_comments: Option, + pub default_comment_sort_type: Option, } diff --git a/crates/db_schema/src/utils.rs b/crates/db_schema/src/utils.rs index a174e3cb90..a61a230faa 100644 --- a/crates/db_schema/src/utils.rs +++ b/crates/db_schema/src/utils.rs @@ -1,4 +1,4 @@ -use crate::{newtypes::DbUrl, CommentSortType, SortType}; +use crate::{newtypes::DbUrl, CommentSortType, PostSortType}; use chrono::{DateTime, TimeDelta, Utc}; use deadpool::Runtime; use diesel::{ @@ -481,23 +481,15 @@ pub fn naive_now() -> DateTime { Utc::now() } -pub fn post_to_comment_sort_type(sort: SortType) -> CommentSortType { +pub fn post_to_comment_sort_type(sort: PostSortType) -> CommentSortType { + use PostSortType::*; match sort { - SortType::Active | SortType::Hot | SortType::Scaled => CommentSortType::Hot, - SortType::New | SortType::NewComments | SortType::MostComments => CommentSortType::New, - SortType::Old => CommentSortType::Old, - SortType::Controversial => CommentSortType::Controversial, - SortType::TopHour - | SortType::TopSixHour - | SortType::TopTwelveHour - | SortType::TopDay - | SortType::TopAll - | SortType::TopWeek - | SortType::TopYear - | SortType::TopMonth - | SortType::TopThreeMonths - | SortType::TopSixMonths - | SortType::TopNineMonths => CommentSortType::Top, + Active | Hot | Scaled => CommentSortType::Hot, + New | NewComments | MostComments => CommentSortType::New, + Old => CommentSortType::Old, + Controversial => CommentSortType::Controversial, + TopHour | TopSixHour | TopTwelveHour | TopDay | TopAll | TopWeek | TopYear | TopMonth + | TopThreeMonths | TopSixMonths | TopNineMonths => CommentSortType::Top, } } diff --git a/crates/db_views/src/post_view.rs b/crates/db_views/src/post_view.rs index df6216bf78..acd8debf33 100644 --- a/crates/db_views/src/post_view.rs +++ b/crates/db_views/src/post_view.rs @@ -58,9 +58,10 @@ use lemmy_db_schema::{ ReverseTimestampKey, }, ListingType, - SortType, + PostSortType, }; use tracing::debug; +use PostSortType::*; fn queries<'a>() -> Queries< impl ReadFn<'a, PostView, (PostId, Option<&'a LocalUser>, bool)>, @@ -510,33 +511,33 @@ fn queries<'a>() -> Queries< let time = |interval| post_aggregates::published.gt(now() - interval); // then use the main sort - query = match options.sort.unwrap_or(SortType::Hot) { - SortType::Active => query.then_desc(key::hot_rank_active), - SortType::Hot => query.then_desc(key::hot_rank), - SortType::Scaled => query.then_desc(key::scaled_rank), - SortType::Controversial => query.then_desc(key::controversy_rank), - SortType::New => query.then_desc(key::published), - SortType::Old => query.then_desc(ReverseTimestampKey(key::published)), - SortType::NewComments => query.then_desc(key::newest_comment_time), - SortType::MostComments => query.then_desc(key::comments), - SortType::TopAll => query.then_desc(key::score), - SortType::TopYear => query.then_desc(key::score).filter(time(1.years())), - SortType::TopMonth => query.then_desc(key::score).filter(time(1.months())), - SortType::TopWeek => query.then_desc(key::score).filter(time(1.weeks())), - SortType::TopDay => query.then_desc(key::score).filter(time(1.days())), - SortType::TopHour => query.then_desc(key::score).filter(time(1.hours())), - SortType::TopSixHour => query.then_desc(key::score).filter(time(6.hours())), - SortType::TopTwelveHour => query.then_desc(key::score).filter(time(12.hours())), - SortType::TopThreeMonths => query.then_desc(key::score).filter(time(3.months())), - SortType::TopSixMonths => query.then_desc(key::score).filter(time(6.months())), - SortType::TopNineMonths => query.then_desc(key::score).filter(time(9.months())), + query = match options.sort.unwrap_or(Hot) { + Active => query.then_desc(key::hot_rank_active), + Hot => query.then_desc(key::hot_rank), + Scaled => query.then_desc(key::scaled_rank), + Controversial => query.then_desc(key::controversy_rank), + New => query.then_desc(key::published), + Old => query.then_desc(ReverseTimestampKey(key::published)), + NewComments => query.then_desc(key::newest_comment_time), + MostComments => query.then_desc(key::comments), + TopAll => query.then_desc(key::score), + TopYear => query.then_desc(key::score).filter(time(1.years())), + TopMonth => query.then_desc(key::score).filter(time(1.months())), + TopWeek => query.then_desc(key::score).filter(time(1.weeks())), + TopDay => query.then_desc(key::score).filter(time(1.days())), + TopHour => query.then_desc(key::score).filter(time(1.hours())), + TopSixHour => query.then_desc(key::score).filter(time(6.hours())), + TopTwelveHour => query.then_desc(key::score).filter(time(12.hours())), + TopThreeMonths => query.then_desc(key::score).filter(time(3.months())), + TopSixMonths => query.then_desc(key::score).filter(time(6.months())), + TopNineMonths => query.then_desc(key::score).filter(time(9.months())), }; // use publish as fallback. especially useful for hot rank which reaches zero after some days. // necessary because old posts can be fetched over federation and inserted with high post id - query = match options.sort.unwrap_or(SortType::Hot) { + query = match options.sort.unwrap_or(Hot) { // A second time-based sort would not be very useful - SortType::New | SortType::Old | SortType::NewComments => query, + New | Old | NewComments => query, _ => query.then_desc(key::published), }; @@ -608,7 +609,7 @@ pub struct PaginationCursorData(PostAggregates); #[derive(Clone, Default)] pub struct PostQuery<'a> { pub listing_type: Option, - pub sort: Option, + pub sort: Option, pub creator_id: Option, pub community_id: Option, // if true, the query should be handled as if community_id was not given except adding the @@ -770,7 +771,7 @@ mod tests { traits::{Bannable, Blockable, Crud, Joinable, Likeable}, utils::{build_db_pool, build_db_pool_for_tests, DbPool, RANK_DEFAULT}, CommunityVisibility, - SortType, + PostSortType, SubscribedType, }; use lemmy_utils::error::{LemmyErrorType, LemmyResult}; @@ -801,7 +802,7 @@ mod tests { impl Data { fn default_post_query(&self) -> PostQuery<'_> { PostQuery { - sort: Some(SortType::New), + sort: Some(PostSortType::New), local_user: Some(&self.local_user_view.local_user), ..Default::default() } @@ -1445,7 +1446,7 @@ mod tests { let options = PostQuery { community_id: Some(inserted_community.id), - sort: Some(SortType::MostComments), + sort: Some(PostSortType::MostComments), limit: Some(10), ..Default::default() }; @@ -1577,7 +1578,7 @@ mod tests { // Make sure it does come back with the show_hidden option let post_listings_show_hidden = PostQuery { - sort: Some(SortType::New), + sort: Some(PostSortType::New), local_user: Some(&data.local_user_view.local_user), show_hidden: Some(true), ..Default::default() @@ -1618,7 +1619,7 @@ mod tests { // Make sure it does come back with the show_nsfw option let post_listings_show_nsfw = PostQuery { - sort: Some(SortType::New), + sort: Some(PostSortType::New), show_nsfw: Some(true), local_user: Some(&data.local_user_view.local_user), ..Default::default() diff --git a/crates/db_views/src/registration_application_view.rs b/crates/db_views/src/registration_application_view.rs index 6f806be13c..51e2ff1a6a 100644 --- a/crates/db_views/src/registration_application_view.rs +++ b/crates/db_views/src/registration_application_view.rs @@ -246,7 +246,8 @@ mod tests { auto_expand: inserted_sara_local_user.auto_expand, blur_nsfw: inserted_sara_local_user.blur_nsfw, theme: inserted_sara_local_user.theme, - default_sort_type: inserted_sara_local_user.default_sort_type, + default_post_sort_type: inserted_sara_local_user.default_post_sort_type, + default_comment_sort_type: inserted_sara_local_user.default_comment_sort_type, default_listing_type: inserted_sara_local_user.default_listing_type, interface_language: inserted_sara_local_user.interface_language, show_avatars: inserted_sara_local_user.show_avatars, diff --git a/crates/db_views_actor/src/community_view.rs b/crates/db_views_actor/src/community_view.rs index 0e731878a6..4e09c4c438 100644 --- a/crates/db_views_actor/src/community_view.rs +++ b/crates/db_views_actor/src/community_view.rs @@ -24,7 +24,7 @@ use lemmy_db_schema::{ source::{community::CommunityFollower, local_user::LocalUser, site::Site}, utils::{fuzzy_search, limit_and_offset, DbConn, DbPool, ListFn, Queries, ReadFn}, ListingType, - SortType, + PostSortType, }; fn queries<'a>() -> Queries< @@ -102,7 +102,7 @@ fn queries<'a>() -> Queries< }; let list = move |mut conn: DbConn<'a>, (options, site): (CommunityQuery<'a>, &'a Site)| async move { - use SortType::*; + use PostSortType::*; // The left join below will return None in this case let person_id_join = options.local_user.person_id().unwrap_or(PersonId(-1)); @@ -221,7 +221,7 @@ impl CommunityView { #[derive(Default)] pub struct CommunityQuery<'a> { pub listing_type: Option, - pub sort: Option, + pub sort: Option, pub local_user: Option<&'a LocalUser>, pub search_term: Option, pub is_mod_or_admin: bool, diff --git a/crates/db_views_actor/src/person_view.rs b/crates/db_views_actor/src/person_view.rs index 7a2edfb449..fe9877d014 100644 --- a/crates/db_views_actor/src/person_view.rs +++ b/crates/db_views_actor/src/person_view.rs @@ -24,7 +24,7 @@ use lemmy_db_schema::{ ReadFn, }, ListingType, - SortType, + PostSortType, }; use serde::{Deserialize, Serialize}; use strum::{Display, EnumString}; @@ -46,12 +46,13 @@ enum PersonSortType { PostCount, } -fn post_to_person_sort_type(sort: SortType) -> PersonSortType { +fn post_to_person_sort_type(sort: PostSortType) -> PersonSortType { + use PostSortType::*; match sort { - SortType::Active | SortType::Hot | SortType::Controversial => PersonSortType::CommentScore, - SortType::New | SortType::NewComments => PersonSortType::New, - SortType::MostComments => PersonSortType::MostComments, - SortType::Old => PersonSortType::Old, + Active | Hot | Controversial => PersonSortType::CommentScore, + New | NewComments => PersonSortType::New, + MostComments => PersonSortType::MostComments, + Old => PersonSortType::Old, _ => PersonSortType::CommentScore, } } @@ -149,7 +150,7 @@ impl PersonView { #[derive(Default)] pub struct PersonQuery { - pub sort: Option, + pub sort: Option, pub search_term: Option, pub listing_type: Option, pub page: Option, @@ -246,7 +247,7 @@ mod tests { assert!(read.is_none()); let list = PersonQuery { - sort: Some(SortType::New), + sort: Some(PostSortType::New), ..Default::default() } .list(pool) diff --git a/crates/routes/src/feeds.rs b/crates/routes/src/feeds.rs index 02114f3829..80c1c7281c 100644 --- a/crates/routes/src/feeds.rs +++ b/crates/routes/src/feeds.rs @@ -9,7 +9,7 @@ use lemmy_db_schema::{ CommentSortType, CommunityVisibility, ListingType, - SortType, + PostSortType, }; use lemmy_db_views::{ post_view::PostQuery, @@ -45,12 +45,12 @@ struct Params { } impl Params { - fn sort_type(&self) -> Result { + fn sort_type(&self) -> Result { let sort_query = self .sort .clone() - .unwrap_or_else(|| SortType::Hot.to_string()); - SortType::from_str(&sort_query).map_err(ErrorBadRequest) + .unwrap_or_else(|| PostSortType::Hot.to_string()); + PostSortType::from_str(&sort_query).map_err(ErrorBadRequest) } fn get_limit(&self) -> i64 { self.limit.unwrap_or(RSS_FETCH_LIMIT) @@ -147,7 +147,7 @@ async fn get_local_feed( async fn get_feed_data( context: &LemmyContext, listing_type: ListingType, - sort_type: SortType, + sort_type: PostSortType, limit: i64, page: i64, ) -> LemmyResult { @@ -251,7 +251,7 @@ async fn get_feed( #[tracing::instrument(skip_all)] async fn get_feed_user( context: &LemmyContext, - sort_type: &SortType, + sort_type: &PostSortType, limit: &i64, page: &i64, user_name: &str, @@ -289,7 +289,7 @@ async fn get_feed_user( #[tracing::instrument(skip_all)] async fn get_feed_community( context: &LemmyContext, - sort_type: &SortType, + sort_type: &PostSortType, limit: &i64, page: &i64, community_name: &str, @@ -334,7 +334,7 @@ async fn get_feed_community( #[tracing::instrument(skip_all)] async fn get_feed_front( context: &LemmyContext, - sort_type: &SortType, + sort_type: &PostSortType, limit: &i64, page: &i64, jwt: &str, diff --git a/migrations/2024-09-16-000000_default_comment_sort_type/down.sql b/migrations/2024-09-16-000000_default_comment_sort_type/down.sql new file mode 100644 index 0000000000..2a7ba16ea1 --- /dev/null +++ b/migrations/2024-09-16-000000_default_comment_sort_type/down.sql @@ -0,0 +1,19 @@ +-- This file should undo anything in `up.sql` +-- Rename the post sort enum +ALTER TYPE post_sort_type_enum RENAME TO sort_type_enum; + +-- Rename the default post sort columns +ALTER TABLE local_user RENAME COLUMN default_post_sort_type TO default_sort_type; + +ALTER TABLE local_site RENAME COLUMN default_post_sort_type TO default_sort_type; + +-- Create the comment sort type enum +ALTER TABLE local_user + DROP COLUMN default_comment_sort_type; + +ALTER TABLE local_site + DROP COLUMN default_comment_sort_type; + +-- Drop the comment enum +DROP TYPE comment_sort_type_enum; + diff --git a/migrations/2024-09-16-000000_default_comment_sort_type/up.sql b/migrations/2024-09-16-000000_default_comment_sort_type/up.sql new file mode 100644 index 0000000000..adea1896ab --- /dev/null +++ b/migrations/2024-09-16-000000_default_comment_sort_type/up.sql @@ -0,0 +1,24 @@ +-- Rename the post sort enum +ALTER TYPE sort_type_enum RENAME TO post_sort_type_enum; + +-- Rename the default post sort columns +ALTER TABLE local_user RENAME COLUMN default_sort_type TO default_post_sort_type; + +ALTER TABLE local_site RENAME COLUMN default_sort_type TO default_post_sort_type; + +-- Create the comment sort type enum +CREATE TYPE comment_sort_type_enum AS ENUM ( + 'Hot', + 'Top', + 'New', + 'Old', + 'Controversial' +); + +-- Add the new default comment sort columns to local_user and local_site +ALTER TABLE local_user + ADD COLUMN default_comment_sort_type comment_sort_type_enum NOT NULL DEFAULT 'Hot'; + +ALTER TABLE local_site + ADD COLUMN default_comment_sort_type comment_sort_type_enum NOT NULL DEFAULT 'Hot'; + From afe5ff660cfcabaa0b9825a6aa2435b2e1402e10 Mon Sep 17 00:00:00 2001 From: Nutomic Date: Thu, 19 Sep 2024 10:43:27 +0200 Subject: [PATCH 33/33] Simplify tests using default (#5026) --- crates/api_crud/src/site/create.rs | 455 +++++++---------------- crates/api_crud/src/site/update.rs | 412 ++++++-------------- crates/db_views/src/custom_emoji_view.rs | 3 +- 3 files changed, 260 insertions(+), 610 deletions(-) diff --git a/crates/api_crud/src/site/create.rs b/crates/api_crud/src/site/create.rs index 868152756e..162f5a355d 100644 --- a/crates/api_crud/src/site/create.rs +++ b/crates/api_crud/src/site/create.rs @@ -196,7 +196,6 @@ mod tests { use lemmy_api_common::site::CreateSite; use lemmy_db_schema::{ source::local_site::LocalSite, - CommentSortType, ListingType, PostSortType, RegistrationMode, @@ -209,177 +208,114 @@ mod tests { ( "CreateSite attempted on set up LocalSite", LemmyErrorType::SiteAlreadyExists, - &generate_local_site( - true, - None::, - true, - false, - None::, - RegistrationMode::Open, - ), - &generate_create_site( - String::from("site_name"), - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - ), + &LocalSite { + site_setup: true, + private_instance: true, + federation_enabled: false, + registration_mode: RegistrationMode::Open, + ..Default::default() + }, + &CreateSite { + name: String::from("site_name"), + ..Default::default() + }, ), ( "CreateSite name matches LocalSite slur filter", LemmyErrorType::Slurs, - &generate_local_site( - false, - Some(String::from("(foo|bar)")), - true, - false, - None::, - RegistrationMode::Open, - ), - &generate_create_site( - String::from("foo site_name"), - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - ), + &LocalSite { + site_setup: false, + private_instance: true, + slur_filter_regex: Some(String::from("(foo|bar)")), + federation_enabled: false, + registration_mode: RegistrationMode::Open, + ..Default::default() + }, + &CreateSite { + name: String::from("foo site_name"), + ..Default::default() + }, ), ( "CreateSite name matches new slur filter", LemmyErrorType::Slurs, - &generate_local_site( - false, - Some(String::from("(foo|bar)")), - true, - false, - None::, - RegistrationMode::Open, - ), - &generate_create_site( - String::from("zeta site_name"), - None::, - None::, - None::, - None::, - None::, - Some(String::from("(zeta|alpha)")), - None::, - None::, - None::, - None::, - ), + &LocalSite { + site_setup: false, + private_instance: true, + slur_filter_regex: Some(String::from("(foo|bar)")), + federation_enabled: false, + registration_mode: RegistrationMode::Open, + ..Default::default() + }, + &CreateSite { + name: String::from("zeta site_name"), + slur_filter_regex: Some(String::from("(zeta|alpha)")), + ..Default::default() + }, ), ( "CreateSite listing type is Subscribed, which is invalid", LemmyErrorType::InvalidDefaultPostListingType, - &generate_local_site( - false, - None::, - true, - false, - None::, - RegistrationMode::Open, - ), - &generate_create_site( - String::from("site_name"), - None::, - None::, - Some(ListingType::Subscribed), - None::, - None::, - None::, - None::, - None::, - None::, - None::, - ), + &LocalSite { + site_setup: false, + private_instance: true, + federation_enabled: false, + registration_mode: RegistrationMode::Open, + ..Default::default() + }, + &CreateSite { + name: String::from("site_name"), + default_post_listing_type: Some(ListingType::Subscribed), + ..Default::default() + }, ), ( "CreateSite is both private and federated", LemmyErrorType::CantEnablePrivateInstanceAndFederationTogether, - &generate_local_site( - false, - None::, - true, - false, - None::, - RegistrationMode::Open, - ), - &generate_create_site( - String::from("site_name"), - None::, - None::, - None::, - None::, - None::, - None::, - Some(true), - Some(true), - None::, - None::, - ), + &LocalSite { + site_setup: false, + private_instance: true, + federation_enabled: false, + ..Default::default() + }, + &CreateSite { + name: String::from("site_name"), + private_instance: Some(true), + federation_enabled: Some(true), + ..Default::default() + }, ), ( "LocalSite is private, but CreateSite also makes it federated", LemmyErrorType::CantEnablePrivateInstanceAndFederationTogether, - &generate_local_site( - false, - None::, - true, - false, - None::, - RegistrationMode::Open, - ), - &generate_create_site( - String::from("site_name"), - None::, - None::, - None::, - None::, - None::, - None::, - None::, - Some(true), - None::, - None::, - ), + &LocalSite { + site_setup: false, + private_instance: true, + federation_enabled: false, + registration_mode: RegistrationMode::Open, + ..Default::default() + }, + &CreateSite { + name: String::from("site_name"), + federation_enabled: Some(true), + ..Default::default() + }, ), ( "CreateSite requires application, but neither it nor LocalSite has an application question", LemmyErrorType::ApplicationQuestionRequired, - &generate_local_site( - false, - None::, - true, - false, - None::, - RegistrationMode::Open, - ), - &generate_create_site( - String::from("site_name"), - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - Some(RegistrationMode::RequireApplication), - ), + &LocalSite { + site_setup: false, + private_instance: true, + federation_enabled: false, + registration_mode: RegistrationMode::Open, + ..Default::default() + }, + &CreateSite { + name: String::from("site_name"), + registration_mode: Some(RegistrationMode::RequireApplication), + ..Default::default() + }, ), ]; @@ -418,99 +354,72 @@ mod tests { let valid_payloads = [ ( "No changes between LocalSite and CreateSite", - &generate_local_site( - false, - None::, - true, - false, - None::, - RegistrationMode::Open, - ), - &generate_create_site( - String::from("site_name"), - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - ), + &LocalSite { + site_setup: false, + private_instance: true, + federation_enabled: false, + registration_mode: RegistrationMode::Open, + ..Default::default() + }, + &CreateSite { + name: String::from("site_name"), + ..Default::default() + }, ), ( "CreateSite allows clearing and changing values", - &generate_local_site( - false, - None::, - true, - false, - None::, - RegistrationMode::Open, - ), - &generate_create_site( - String::from("site_name"), - Some(String::new()), - Some(String::new()), - Some(ListingType::All), - Some(PostSortType::Active), - Some(CommentSortType::Hot), - Some(String::new()), - Some(false), - Some(true), - Some(String::new()), - Some(RegistrationMode::Open), - ), + &LocalSite { + site_setup: false, + private_instance: true, + federation_enabled: false, + registration_mode: RegistrationMode::Open, + ..Default::default() + }, + &CreateSite { + name: String::from("site_name"), + sidebar: Some(String::new()), + description: Some(String::new()), + application_question: Some(String::new()), + private_instance: Some(false), + default_post_listing_type: Some(ListingType::All), + default_post_sort_type: Some(PostSortType::Active), + slur_filter_regex: Some(String::new()), + federation_enabled: Some(true), + registration_mode: Some(RegistrationMode::Open), + ..Default::default() + }, ), ( "CreateSite clears existing slur filter regex", - &generate_local_site( - false, - Some(String::from("(foo|bar)")), - true, - false, - None::, - RegistrationMode::Open, - ), - &generate_create_site( - String::from("foo site_name"), - None::, - None::, - None::, - None::, - None::, - Some(String::new()), - None::, - None::, - None::, - None::, - ), + &LocalSite { + site_setup: false, + private_instance: true, + slur_filter_regex: Some(String::from("(foo|bar)")), + federation_enabled: false, + registration_mode: RegistrationMode::Open, + ..Default::default() + }, + &CreateSite { + name: String::from("foo site_name"), + slur_filter_regex: Some(String::new()), + ..Default::default() + }, ), ( "LocalSite has application question and CreateSite now requires applications,", - &generate_local_site( - false, - None::, - true, - false, - Some(String::from("question")), - RegistrationMode::Open, - ), - &generate_create_site( - String::from("site_name"), - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - Some(RegistrationMode::RequireApplication), - ), + &LocalSite { + site_setup: false, + application_question: Some(String::from("question")), + private_instance: true, + federation_enabled: false, + registration_mode: RegistrationMode::Open, + ..Default::default() + }, + &CreateSite { + name: String::from("site_name"), + registration_mode: Some(RegistrationMode::RequireApplication), + ..Default::default() + }, ), ]; @@ -526,86 +435,4 @@ mod tests { ); }) } - - fn generate_local_site( - site_setup: bool, - site_slur_filter_regex: Option, - site_is_private: bool, - site_is_federated: bool, - site_application_question: Option, - site_registration_mode: RegistrationMode, - ) -> LocalSite { - LocalSite { - site_setup, - application_question: site_application_question, - private_instance: site_is_private, - slur_filter_regex: site_slur_filter_regex, - federation_enabled: site_is_federated, - registration_mode: site_registration_mode, - ..Default::default() - } - } - - // Allow the test helper function to have too many arguments. - // It's either this or generate the entire struct each time for testing. - #[allow(clippy::too_many_arguments)] - fn generate_create_site( - site_name: String, - site_description: Option, - site_sidebar: Option, - site_listing_type: Option, - site_post_sort_type: Option, - site_comment_sort_type: Option, - site_slur_filter_regex: Option, - site_is_private: Option, - site_is_federated: Option, - site_application_question: Option, - site_registration_mode: Option, - ) -> CreateSite { - CreateSite { - name: site_name, - sidebar: site_sidebar, - description: site_description, - icon: None, - banner: None, - enable_downvotes: None, - enable_nsfw: None, - community_creation_admin_only: None, - require_email_verification: None, - application_question: site_application_question, - private_instance: site_is_private, - default_theme: None, - default_post_listing_type: site_listing_type, - default_post_sort_type: site_post_sort_type, - default_comment_sort_type: site_comment_sort_type, - legal_information: None, - application_email_admins: None, - hide_modlog_mod_names: None, - discussion_languages: None, - slur_filter_regex: site_slur_filter_regex, - actor_name_max_length: None, - rate_limit_message: None, - rate_limit_message_per_second: None, - rate_limit_post: None, - rate_limit_post_per_second: None, - rate_limit_register: None, - rate_limit_register_per_second: None, - rate_limit_image: None, - rate_limit_image_per_second: None, - rate_limit_comment: None, - rate_limit_comment_per_second: None, - rate_limit_search: None, - rate_limit_search_per_second: None, - federation_enabled: site_is_federated, - federation_debug: None, - captcha_enabled: None, - captcha_difficulty: None, - allowed_instances: None, - blocked_instances: None, - registration_mode: site_registration_mode, - oauth_registration: None, - content_warning: None, - default_post_listing_mode: None, - } - } } diff --git a/crates/api_crud/src/site/update.rs b/crates/api_crud/src/site/update.rs index 7bfd884238..1ae531bb7c 100644 --- a/crates/api_crud/src/site/update.rs +++ b/crates/api_crud/src/site/update.rs @@ -248,7 +248,6 @@ mod tests { use lemmy_api_common::site::EditSite; use lemmy_db_schema::{ source::local_site::LocalSite, - CommentSortType, ListingType, PostSortType, RegistrationMode, @@ -261,152 +260,94 @@ mod tests { ( "EditSite name matches LocalSite slur filter", LemmyErrorType::Slurs, - &generate_local_site( - Some(String::from("(foo|bar)")), - true, - false, - None::, - RegistrationMode::Open, - ), - &generate_edit_site( - Some(String::from("foo site_name")), - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - ), + &LocalSite { + private_instance: true, + slur_filter_regex: Some(String::from("(foo|bar)")), + federation_enabled: false, + registration_mode: RegistrationMode::Open, + ..Default::default() + }, + &EditSite { + name: Some(String::from("foo site_name")), + ..Default::default() + }, ), ( "EditSite name matches new slur filter", LemmyErrorType::Slurs, - &generate_local_site( - Some(String::from("(foo|bar)")), - true, - false, - None::, - RegistrationMode::Open, - ), - &generate_edit_site( - Some(String::from("zeta site_name")), - None::, - None::, - None::, - None::, - None::, - Some(String::from("(zeta|alpha)")), - None::, - None::, - None::, - None::, - None::, - ), + &LocalSite { + private_instance: true, + slur_filter_regex: Some(String::from("(foo|bar)")), + federation_enabled: false, + registration_mode: RegistrationMode::Open, + ..Default::default() + }, + &EditSite { + name: Some(String::from("zeta site_name")), + slur_filter_regex: Some(String::from("(zeta|alpha)")), + ..Default::default() + }, ), ( "EditSite listing type is Subscribed, which is invalid", LemmyErrorType::InvalidDefaultPostListingType, - &generate_local_site( - None::, - true, - false, - None::, - RegistrationMode::Open, - ), - &generate_edit_site( - Some(String::from("site_name")), - None::, - None::, - Some(ListingType::Subscribed), - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - ), + &LocalSite { + private_instance: true, + federation_enabled: false, + registration_mode: RegistrationMode::Open, + ..Default::default() + }, + &EditSite { + name: Some(String::from("site_name")), + default_post_listing_type: Some(ListingType::Subscribed), + ..Default::default() + }, ), ( "EditSite is both private and federated", LemmyErrorType::CantEnablePrivateInstanceAndFederationTogether, - &generate_local_site( - None::, - true, - false, - None::, - RegistrationMode::Open, - ), - &generate_edit_site( - Some(String::from("site_name")), - None::, - None::, - None::, - None::, - None::, - None::, - Some(true), - Some(true), - None::, - None::, - None::, - ), + &LocalSite { + private_instance: true, + federation_enabled: false, + registration_mode: RegistrationMode::Open, + ..Default::default() + }, + &EditSite { + name: Some(String::from("site_name")), + private_instance: Some(true), + federation_enabled: Some(true), + ..Default::default() + }, ), ( "LocalSite is private, but EditSite also makes it federated", LemmyErrorType::CantEnablePrivateInstanceAndFederationTogether, - &generate_local_site( - None::, - true, - false, - None::, - RegistrationMode::Open, - ), - &generate_edit_site( - Some(String::from("site_name")), - None::, - None::, - None::, - None::, - None::, - None::, - None::, - Some(true), - None::, - None::, - None::, - ), + &LocalSite { + private_instance: true, + federation_enabled: false, + registration_mode: RegistrationMode::Open, + ..Default::default() + }, + &EditSite { + name: Some(String::from("site_name")), + federation_enabled: Some(true), + ..Default::default() + }, ), ( "EditSite requires application, but neither it nor LocalSite has an application question", LemmyErrorType::ApplicationQuestionRequired, - &generate_local_site( - None::, - true, - false, - None::, - RegistrationMode::Open, - ), - &generate_edit_site( - Some(String::from("site_name")), - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - Some(RegistrationMode::RequireApplication), - None::, - ), + &LocalSite { + private_instance: true, + federation_enabled: false, + registration_mode: RegistrationMode::Open, + ..Default::default() + }, + &EditSite { + name: Some(String::from("site_name")), + registration_mode: Some(RegistrationMode::RequireApplication), + ..Default::default() + }, ), ]; @@ -442,99 +383,65 @@ mod tests { let valid_payloads = [ ( "No changes between LocalSite and EditSite", - &generate_local_site( - None::, - true, - false, - None::, - RegistrationMode::Open, - ), - &generate_edit_site( - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - ), + &LocalSite { + private_instance: true, + federation_enabled: false, + registration_mode: RegistrationMode::Open, + ..Default::default() + }, + &EditSite::default(), ), ( "EditSite allows clearing and changing values", - &generate_local_site( - None::, - true, - false, - None::, - RegistrationMode::Open, - ), - &generate_edit_site( - Some(String::from("site_name")), - Some(String::new()), - Some(String::new()), - Some(ListingType::All), - Some(PostSortType::Active), - Some(CommentSortType::Hot), - Some(String::new()), - Some(false), - Some(true), - Some(String::new()), - Some(RegistrationMode::Open), - None::, - ), + &LocalSite { + private_instance: true, + federation_enabled: false, + registration_mode: RegistrationMode::Open, + ..Default::default() + }, + &EditSite { + name: Some(String::from("site_name")), + sidebar: Some(String::new()), + description: Some(String::new()), + application_question: Some(String::new()), + private_instance: Some(false), + default_post_listing_type: Some(ListingType::All), + default_post_sort_type: Some(PostSortType::Active), + slur_filter_regex: Some(String::new()), + registration_mode: Some(RegistrationMode::Open), + federation_enabled: Some(true), + ..Default::default() + }, ), ( "EditSite name passes slur filter regex", - &generate_local_site( - Some(String::from("(foo|bar)")), - true, - false, - None::, - RegistrationMode::Open, - ), - &generate_edit_site( - Some(String::from("foo site_name")), - None::, - None::, - None::, - None::, - None::, - Some(String::new()), - None::, - None::, - None::, - None::, - None::, - ), + &LocalSite { + private_instance: true, + slur_filter_regex: Some(String::from("(foo|bar)")), + registration_mode: RegistrationMode::Open, + federation_enabled: false, + ..Default::default() + }, + &EditSite { + name: Some(String::from("foo site_name")), + slur_filter_regex: Some(String::new()), + ..Default::default() + }, ), ( "LocalSite has application question and EditSite now requires applications,", - &generate_local_site( - None::, - true, - false, - Some(String::from("question")), - RegistrationMode::Open, - ), - &generate_edit_site( - Some(String::from("site_name")), - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - None::, - Some(RegistrationMode::RequireApplication), - None::, - ), + &LocalSite { + application_question: Some(String::from("question")), + private_instance: true, + federation_enabled: false, + registration_mode: RegistrationMode::Open, + ..Default::default() + }, + &EditSite { + name: Some(String::from("site_name")), + registration_mode: Some(RegistrationMode::RequireApplication), + ..Default::default() + }, ), ]; @@ -550,87 +457,4 @@ mod tests { ); }) } - - fn generate_local_site( - site_slur_filter_regex: Option, - site_is_private: bool, - site_is_federated: bool, - site_application_question: Option, - site_registration_mode: RegistrationMode, - ) -> LocalSite { - LocalSite { - application_question: site_application_question, - private_instance: site_is_private, - slur_filter_regex: site_slur_filter_regex, - federation_enabled: site_is_federated, - registration_mode: site_registration_mode, - ..Default::default() - } - } - - // Allow the test helper function to have too many arguments. - // It's either this or generate the entire struct each time for testing. - #[allow(clippy::too_many_arguments)] - fn generate_edit_site( - site_name: Option, - site_description: Option, - site_sidebar: Option, - site_listing_type: Option, - site_post_sort_type: Option, - site_comment_sort_type: Option, - site_slur_filter_regex: Option, - site_is_private: Option, - site_is_federated: Option, - site_application_question: Option, - site_registration_mode: Option, - site_oauth_registration: Option, - ) -> EditSite { - EditSite { - name: site_name, - sidebar: site_sidebar, - description: site_description, - icon: None, - banner: None, - enable_downvotes: None, - enable_nsfw: None, - community_creation_admin_only: None, - require_email_verification: None, - application_question: site_application_question, - private_instance: site_is_private, - default_theme: None, - default_post_listing_type: site_listing_type, - default_post_sort_type: site_post_sort_type, - default_comment_sort_type: site_comment_sort_type, - legal_information: None, - application_email_admins: None, - hide_modlog_mod_names: None, - discussion_languages: None, - slur_filter_regex: site_slur_filter_regex, - actor_name_max_length: None, - rate_limit_message: None, - rate_limit_message_per_second: None, - rate_limit_post: None, - rate_limit_post_per_second: None, - rate_limit_register: None, - rate_limit_register_per_second: None, - rate_limit_image: None, - rate_limit_image_per_second: None, - rate_limit_comment: None, - rate_limit_comment_per_second: None, - rate_limit_search: None, - rate_limit_search_per_second: None, - federation_enabled: site_is_federated, - federation_debug: None, - captcha_enabled: None, - captcha_difficulty: None, - allowed_instances: None, - blocked_instances: None, - blocked_urls: None, - registration_mode: site_registration_mode, - reports_email_admins: None, - content_warning: None, - default_post_listing_mode: None, - oauth_registration: site_oauth_registration, - } - } } diff --git a/crates/db_views/src/custom_emoji_view.rs b/crates/db_views/src/custom_emoji_view.rs index 078bd33386..a346c086dd 100644 --- a/crates/db_views/src/custom_emoji_view.rs +++ b/crates/db_views/src/custom_emoji_view.rs @@ -57,8 +57,7 @@ impl CustomEmojiView { } if let Some(category) = category { - query = query - .filter(custom_emoji::category.eq(category)) + query = query.filter(custom_emoji::category.eq(category)) } query = query.then_order_by(custom_emoji::id);