]> Untitled Git - lemmy.git/commitdiff
Merge pull request #1566 from LemmyNet/additional_search_filters
authorNutomic <me@nutomic.com>
Mon, 26 Apr 2021 14:17:21 +0000 (14:17 +0000)
committerGitHub <noreply@github.com>
Mon, 26 Apr 2021 14:17:21 +0000 (14:17 +0000)
Add creator id to search. Fixes #765

29 files changed:
crates/api/src/community.rs
crates/api/src/local_user.rs
crates/api/src/site.rs
crates/api_common/src/comment.rs
crates/api_common/src/community.rs
crates/api_common/src/person.rs
crates/api_common/src/post.rs
crates/api_common/src/site.rs
crates/api_crud/src/comment/read.rs
crates/api_crud/src/community/read.rs
crates/api_crud/src/community/update.rs
crates/api_crud/src/post/read.rs
crates/api_crud/src/post/update.rs
crates/api_crud/src/site/create.rs
crates/api_crud/src/site/read.rs
crates/api_crud/src/site/update.rs
crates/api_crud/src/user/read.rs
crates/apub/src/objects/post.rs
crates/db_queries/src/aggregates/site_aggregates.rs
crates/db_queries/src/lib.rs
crates/db_schema/src/source/post.rs
crates/db_schema/src/source/site.rs
crates/db_views/src/comment_view.rs
crates/db_views/src/post_view.rs
crates/db_views/src/private_message_view.rs
crates/db_views_actor/src/community_view.rs
crates/db_views_actor/src/person_mention_view.rs
crates/db_views_actor/src/person_view.rs
crates/routes/src/feeds.rs

index fec943343f09a446c8ecc7f2fd0534dacb833cba..b00160538b07ab0372ac55e5b22edfe0885f7db5 100644 (file)
@@ -171,7 +171,7 @@ impl Perform for BanFromCommunity {
     }
 
     // Remove/Restore their data if that's desired
-    if data.remove_data {
+    if data.remove_data.unwrap_or(false) {
       // Posts
       blocking(context.pool(), move |conn: &'_ _| {
         Post::update_removed_for_creator(conn, banned_person_id, Some(community_id), true)
index b273b58208c888b56dc98b9322e92ec67b248709..e36e86b4c976212da820d094859340245757ceb6 100644 (file)
@@ -16,6 +16,7 @@ use lemmy_api_common::{
 use lemmy_db_queries::{
   diesel_option_overwrite,
   diesel_option_overwrite_to_url,
+  from_opt_str_to_opt_enum,
   source::{
     comment::Comment_,
     local_user::LocalUser_,
@@ -68,7 +69,6 @@ use lemmy_websocket::{
   LemmyContext,
   UserOperation,
 };
-use std::str::FromStr;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for Login {
@@ -397,7 +397,7 @@ impl Perform for BanPerson {
     }
 
     // Remove their data if that's desired
-    if data.remove_data {
+    if data.remove_data.unwrap_or(false) {
       // Posts
       blocking(context.pool(), move |conn: &'_ _| {
         Post::update_removed_for_creator(conn, banned_person_id, None, true)
@@ -462,7 +462,7 @@ impl Perform for GetReplies {
     let data: &GetReplies = &self;
     let local_user_view = get_local_user_view_from_jwt(&data.auth, context.pool()).await?;
 
-    let sort = SortType::from_str(&data.sort)?;
+    let sort: Option<SortType> = from_opt_str_to_opt_enum(&data.sort);
 
     let page = data.page;
     let limit = data.limit;
@@ -472,7 +472,7 @@ impl Perform for GetReplies {
 
     let replies = blocking(context.pool(), move |conn| {
       CommentQueryBuilder::create(conn)
-        .sort(&sort)
+        .sort(sort)
         .unread_only(unread_only)
         .recipient_id(person_id)
         .show_bot_accounts(show_bot_accounts)
@@ -499,7 +499,7 @@ impl Perform for GetPersonMentions {
     let data: &GetPersonMentions = &self;
     let local_user_view = get_local_user_view_from_jwt(&data.auth, context.pool()).await?;
 
-    let sort = SortType::from_str(&data.sort)?;
+    let sort: Option<SortType> = from_opt_str_to_opt_enum(&data.sort);
 
     let page = data.page;
     let limit = data.limit;
@@ -509,7 +509,7 @@ impl Perform for GetPersonMentions {
       PersonMentionQueryBuilder::create(conn)
         .recipient_id(person_id)
         .my_person_id(person_id)
-        .sort(&sort)
+        .sort(sort)
         .unread_only(unread_only)
         .page(page)
         .limit(limit)
index aae400ca7464188a48ef8778567280ac4b5cc140..c55ac6645d202f4f45fc7d628a37e168e6dd445c 100644 (file)
@@ -13,7 +13,14 @@ use lemmy_api_common::{
   user_show_nsfw,
 };
 use lemmy_apub::fetcher::search::search_by_apub_id;
-use lemmy_db_queries::{source::site::Site_, Crud, SearchType, SortType};
+use lemmy_db_queries::{
+  from_opt_str_to_opt_enum,
+  source::site::Site_,
+  Crud,
+  ListingType,
+  SearchType,
+  SortType,
+};
 use lemmy_db_schema::source::{moderator::*, site::Site};
 use lemmy_db_views::{
   comment_view::CommentQueryBuilder,
@@ -45,7 +52,6 @@ use lemmy_utils::{
 };
 use lemmy_websocket::LemmyContext;
 use log::debug;
-use std::str::FromStr;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for GetModlog {
@@ -144,8 +150,6 @@ impl Perform for Search {
 
     let person_id = local_user_view.map(|u| u.person.id);
 
-    let type_ = SearchType::from_str(&data.type_)?;
-
     let mut posts = Vec::new();
     let mut comments = Vec::new();
     let mut communities = Vec::new();
@@ -156,18 +160,23 @@ impl Perform for Search {
     let q = data.q.to_owned();
     let page = data.page;
     let limit = data.limit;
-    let sort = SortType::from_str(&data.sort)?;
+    let sort: Option<SortType> = from_opt_str_to_opt_enum(&data.sort);
+    let listing_type: Option<ListingType> = from_opt_str_to_opt_enum(&data.listing_type);
+    let search_type: SearchType = from_opt_str_to_opt_enum(&data.type_).unwrap_or(SearchType::All);
     let community_id = data.community_id;
     let community_name = data.community_name.to_owned();
-    match type_ {
+    let creator_id = data.creator_id;
+    match search_type {
       SearchType::Posts => {
         posts = blocking(context.pool(), move |conn| {
           PostQueryBuilder::create(conn)
-            .sort(&sort)
+            .sort(sort)
             .show_nsfw(show_nsfw)
             .show_bot_accounts(show_bot_accounts)
+            .listing_type(listing_type)
             .community_id(community_id)
             .community_name(community_name)
+            .creator_id(creator_id)
             .my_person_id(person_id)
             .search_term(q)
             .page(page)
@@ -179,9 +188,13 @@ impl Perform for Search {
       SearchType::Comments => {
         comments = blocking(context.pool(), move |conn| {
           CommentQueryBuilder::create(&conn)
-            .sort(&sort)
+            .sort(sort)
+            .listing_type(listing_type)
             .search_term(q)
             .show_bot_accounts(show_bot_accounts)
+            .community_id(community_id)
+            .community_name(community_name)
+            .creator_id(creator_id)
             .my_person_id(person_id)
             .page(page)
             .limit(limit)
@@ -192,7 +205,8 @@ impl Perform for Search {
       SearchType::Communities => {
         communities = blocking(context.pool(), move |conn| {
           CommunityQueryBuilder::create(conn)
-            .sort(&sort)
+            .sort(sort)
+            .listing_type(listing_type)
             .search_term(q)
             .my_person_id(person_id)
             .page(page)
@@ -204,7 +218,7 @@ impl Perform for Search {
       SearchType::Users => {
         users = blocking(context.pool(), move |conn| {
           PersonQueryBuilder::create(conn)
-            .sort(&sort)
+            .sort(sort)
             .search_term(q)
             .page(page)
             .limit(limit)
@@ -213,13 +227,19 @@ impl Perform for Search {
         .await??;
       }
       SearchType::All => {
+        // If the community or creator is included, dont search communities or users
+        let community_or_creator_included =
+          data.community_id.is_some() || data.community_name.is_some() || data.creator_id.is_some();
+
         posts = blocking(context.pool(), move |conn| {
           PostQueryBuilder::create(conn)
-            .sort(&sort)
+            .sort(sort)
             .show_nsfw(show_nsfw)
             .show_bot_accounts(show_bot_accounts)
+            .listing_type(listing_type)
             .community_id(community_id)
             .community_name(community_name)
+            .creator_id(creator_id)
             .my_person_id(person_id)
             .search_term(q)
             .page(page)
@@ -229,13 +249,17 @@ impl Perform for Search {
         .await??;
 
         let q = data.q.to_owned();
-        let sort = SortType::from_str(&data.sort)?;
+        let community_name = data.community_name.to_owned();
 
         comments = blocking(context.pool(), move |conn| {
           CommentQueryBuilder::create(conn)
-            .sort(&sort)
+            .sort(sort)
+            .listing_type(listing_type)
             .search_term(q)
             .show_bot_accounts(show_bot_accounts)
+            .community_id(community_id)
+            .community_name(community_name)
+            .creator_id(creator_id)
             .my_person_id(person_id)
             .page(page)
             .limit(limit)
@@ -244,41 +268,50 @@ impl Perform for Search {
         .await??;
 
         let q = data.q.to_owned();
-        let sort = SortType::from_str(&data.sort)?;
 
-        communities = blocking(context.pool(), move |conn| {
-          CommunityQueryBuilder::create(conn)
-            .sort(&sort)
-            .search_term(q)
-            .my_person_id(person_id)
-            .page(page)
-            .limit(limit)
-            .list()
-        })
-        .await??;
+        communities = if community_or_creator_included {
+          vec![]
+        } else {
+          blocking(context.pool(), move |conn| {
+            CommunityQueryBuilder::create(conn)
+              .sort(sort)
+              .listing_type(listing_type)
+              .search_term(q)
+              .my_person_id(person_id)
+              .page(page)
+              .limit(limit)
+              .list()
+          })
+          .await??
+        };
 
         let q = data.q.to_owned();
-        let sort = SortType::from_str(&data.sort)?;
 
-        users = blocking(context.pool(), move |conn| {
-          PersonQueryBuilder::create(conn)
-            .sort(&sort)
-            .search_term(q)
-            .page(page)
-            .limit(limit)
-            .list()
-        })
-        .await??;
+        users = if community_or_creator_included {
+          vec![]
+        } else {
+          blocking(context.pool(), move |conn| {
+            PersonQueryBuilder::create(conn)
+              .sort(sort)
+              .search_term(q)
+              .page(page)
+              .limit(limit)
+              .list()
+          })
+          .await??
+        };
       }
       SearchType::Url => {
         posts = blocking(context.pool(), move |conn| {
           PostQueryBuilder::create(conn)
-            .sort(&sort)
+            .sort(sort)
             .show_nsfw(show_nsfw)
             .show_bot_accounts(show_bot_accounts)
+            .listing_type(listing_type)
             .my_person_id(person_id)
             .community_id(community_id)
             .community_name(community_name)
+            .creator_id(creator_id)
             .url_search(q)
             .page(page)
             .limit(limit)
@@ -290,7 +323,7 @@ impl Perform for Search {
 
     // Return the jwt
     Ok(SearchResponse {
-      type_: data.type_.to_owned(),
+      type_: search_type.to_string(),
       comments,
       posts,
       communities,
index 1457f181a5203d907bd39f349efb2d54b149e084..ce5182cf3d04c819ab6ead9571fd81194f0acd17 100644 (file)
@@ -5,8 +5,8 @@ use serde::{Deserialize, Serialize};
 #[derive(Deserialize)]
 pub struct CreateComment {
   pub content: String,
-  pub parent_id: Option<CommentId>,
   pub post_id: PostId,
+  pub parent_id: Option<CommentId>,
   pub form_id: Option<String>,
   pub auth: String,
 }
@@ -64,13 +64,13 @@ pub struct CreateCommentLike {
 
 #[derive(Deserialize)]
 pub struct GetComments {
-  pub type_: String,
-  pub sort: String,
+  pub type_: Option<String>,
+  pub sort: Option<String>,
   pub page: Option<i64>,
   pub limit: Option<i64>,
   pub community_id: Option<CommunityId>,
   pub community_name: Option<String>,
-  pub saved_only: bool,
+  pub saved_only: Option<bool>,
   pub auth: Option<String>,
 }
 
index a034404471f0556cf3d4e838051cd2efe8daeec9..129b149adfe17c44d2080f95e84efd3b4cf9aa5d 100644 (file)
@@ -39,8 +39,8 @@ pub struct CommunityResponse {
 
 #[derive(Deserialize, Debug)]
 pub struct ListCommunities {
-  pub type_: String,
-  pub sort: String,
+  pub type_: Option<String>,
+  pub sort: Option<String>,
   pub page: Option<i64>,
   pub limit: Option<i64>,
   pub auth: Option<String>,
@@ -56,7 +56,7 @@ pub struct BanFromCommunity {
   pub community_id: CommunityId,
   pub person_id: PersonId,
   pub ban: bool,
-  pub remove_data: bool,
+  pub remove_data: Option<bool>,
   pub reason: Option<String>,
   pub expires: Option<i64>,
   pub auth: String,
@@ -84,7 +84,7 @@ pub struct AddModToCommunityResponse {
 #[derive(Deserialize)]
 pub struct EditCommunity {
   pub community_id: CommunityId,
-  pub title: String,
+  pub title: Option<String>,
   pub description: Option<String>,
   pub icon: Option<String>,
   pub banner: Option<String>,
index 5473a482017459fd124fae95b956459a5e159d8b..8349f2a1f869fe1aff74d4e26e8fed77e67cdca3 100644 (file)
@@ -21,10 +21,10 @@ use lemmy_db_schema::{CommunityId, PersonId, PersonMentionId, PrivateMessageId};
 #[derive(Deserialize)]
 pub struct Register {
   pub username: String,
-  pub email: Option<String>,
   pub password: String,
   pub password_verify: String,
   pub show_nsfw: bool,
+  pub email: Option<String>,
   pub captcha_uuid: Option<String>,
   pub captcha_answer: Option<String>,
 }
@@ -80,13 +80,13 @@ pub struct LoginResponse {
 
 #[derive(Deserialize)]
 pub struct GetPersonDetails {
-  pub person_id: Option<PersonId>,
+  pub person_id: Option<PersonId>, // One of these two are required
   pub username: Option<String>,
-  pub sort: String,
+  pub sort: Option<String>,
   pub page: Option<i64>,
   pub limit: Option<i64>,
   pub community_id: Option<CommunityId>,
-  pub saved_only: bool,
+  pub saved_only: Option<bool>,
   pub auth: Option<String>,
 }
 
@@ -130,7 +130,7 @@ pub struct AddAdminResponse {
 pub struct BanPerson {
   pub person_id: PersonId,
   pub ban: bool,
-  pub remove_data: bool,
+  pub remove_data: Option<bool>,
   pub reason: Option<String>,
   pub expires: Option<i64>,
   pub auth: String,
@@ -144,19 +144,19 @@ pub struct BanPersonResponse {
 
 #[derive(Deserialize)]
 pub struct GetReplies {
-  pub sort: String,
+  pub sort: Option<String>,
   pub page: Option<i64>,
   pub limit: Option<i64>,
-  pub unread_only: bool,
+  pub unread_only: Option<bool>,
   pub auth: String,
 }
 
 #[derive(Deserialize)]
 pub struct GetPersonMentions {
-  pub sort: String,
+  pub sort: Option<String>,
   pub page: Option<i64>,
   pub limit: Option<i64>,
-  pub unread_only: bool,
+  pub unread_only: Option<bool>,
   pub auth: String,
 }
 
@@ -223,7 +223,7 @@ pub struct MarkPrivateMessageAsRead {
 
 #[derive(Deserialize)]
 pub struct GetPrivateMessages {
-  pub unread_only: bool,
+  pub unread_only: Option<bool>,
   pub page: Option<i64>,
   pub limit: Option<i64>,
   pub auth: String,
index 727859bc4cc7c7db55d034cfd851a81b66af572a..bb6b3624905bc0099b6ec779db9f3bc02884dee0 100644 (file)
@@ -14,10 +14,10 @@ use url::Url;
 #[derive(Deserialize, Debug)]
 pub struct CreatePost {
   pub name: String,
+  pub community_id: CommunityId,
   pub url: Option<Url>,
   pub body: Option<String>,
-  pub nsfw: bool,
-  pub community_id: CommunityId,
+  pub nsfw: Option<bool>,
   pub auth: String,
 }
 
@@ -43,13 +43,13 @@ pub struct GetPostResponse {
 
 #[derive(Deserialize, Debug)]
 pub struct GetPosts {
-  pub type_: String,
-  pub sort: String,
+  pub type_: Option<String>,
+  pub sort: Option<String>,
   pub page: Option<i64>,
   pub limit: Option<i64>,
   pub community_id: Option<CommunityId>,
   pub community_name: Option<String>,
-  pub saved_only: bool,
+  pub saved_only: Option<bool>,
   pub auth: Option<String>,
 }
 
@@ -68,10 +68,10 @@ pub struct CreatePostLike {
 #[derive(Deserialize)]
 pub struct EditPost {
   pub post_id: PostId,
-  pub name: String,
+  pub name: Option<String>,
   pub url: Option<Url>,
   pub body: Option<String>,
-  pub nsfw: bool,
+  pub nsfw: Option<bool>,
   pub auth: String,
 }
 
index ffee7ba8685df0fc56a192313c499722ae8fab2f..e5c167f425175d6125ff71105a5000aa2ede461d 100644 (file)
@@ -22,10 +22,12 @@ use serde::{Deserialize, Serialize};
 #[derive(Deserialize, Debug)]
 pub struct Search {
   pub q: String,
-  pub type_: String,
   pub community_id: Option<CommunityId>,
   pub community_name: Option<String>,
-  pub sort: String,
+  pub creator_id: Option<PersonId>,
+  pub type_: Option<String>,
+  pub sort: Option<String>,
+  pub listing_type: Option<String>,
   pub page: Option<i64>,
   pub limit: Option<i64>,
   pub auth: Option<String>,
@@ -68,23 +70,23 @@ pub struct CreateSite {
   pub description: Option<String>,
   pub icon: Option<String>,
   pub banner: Option<String>,
-  pub enable_downvotes: bool,
-  pub open_registration: bool,
-  pub enable_nsfw: bool,
-  pub community_creation_admin_only: bool,
+  pub enable_downvotes: Option<bool>,
+  pub open_registration: Option<bool>,
+  pub enable_nsfw: Option<bool>,
+  pub community_creation_admin_only: Option<bool>,
   pub auth: String,
 }
 
 #[derive(Deserialize)]
 pub struct EditSite {
-  pub name: String,
+  pub name: Option<String>,
   pub sidebar: Option<String>,
   pub description: Option<String>,
   pub icon: Option<String>,
   pub banner: Option<String>,
-  pub enable_downvotes: bool,
-  pub open_registration: bool,
-  pub enable_nsfw: bool,
+  pub enable_downvotes: Option<bool>,
+  pub open_registration: Option<bool>,
+  pub enable_nsfw: Option<bool>,
   pub community_creation_admin_only: Option<bool>,
   pub auth: String,
 }
index 4d144382089688aa2b1a2eeb137941b4dad884b1..f82b97481844eab8c314ebb2dd339662b87fa906 100644 (file)
@@ -6,11 +6,10 @@ use lemmy_api_common::{
   get_local_user_view_from_jwt_opt,
   user_show_bot_accounts,
 };
-use lemmy_db_queries::{ListingType, SortType};
+use lemmy_db_queries::{from_opt_str_to_opt_enum, ListingType, SortType};
 use lemmy_db_views::comment_view::CommentQueryBuilder;
 use lemmy_utils::{ApiError, ConnectionId, LemmyError};
 use lemmy_websocket::LemmyContext;
-use std::str::FromStr;
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for GetComments {
@@ -27,8 +26,8 @@ impl PerformCrud for GetComments {
     let show_bot_accounts = user_show_bot_accounts(&local_user_view);
     let person_id = local_user_view.map(|u| u.person.id);
 
-    let type_ = ListingType::from_str(&data.type_)?;
-    let sort = SortType::from_str(&data.sort)?;
+    let sort: Option<SortType> = from_opt_str_to_opt_enum(&data.sort);
+    let listing_type: Option<ListingType> = from_opt_str_to_opt_enum(&data.type_);
 
     let community_id = data.community_id;
     let community_name = data.community_name.to_owned();
@@ -37,8 +36,8 @@ impl PerformCrud for GetComments {
     let limit = data.limit;
     let comments = blocking(context.pool(), move |conn| {
       CommentQueryBuilder::create(conn)
-        .listing_type(type_)
-        .sort(&sort)
+        .listing_type(listing_type)
+        .sort(sort)
         .saved_only(saved_only)
         .community_id(community_id)
         .community_name(community_name)
index 422161ae175ba9e9f851e326c1865b752b09064d..7836878e96654d0c9624dc85bd32d4b09d64515d 100644 (file)
@@ -1,7 +1,12 @@
 use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{blocking, community::*, get_local_user_view_from_jwt_opt};
-use lemmy_db_queries::{source::community::Community_, ListingType, SortType};
+use lemmy_db_queries::{
+  from_opt_str_to_opt_enum,
+  source::community::Community_,
+  ListingType,
+  SortType,
+};
 use lemmy_db_schema::source::community::*;
 use lemmy_db_views_actor::{
   community_moderator_view::CommunityModeratorView,
@@ -9,7 +14,6 @@ use lemmy_db_views_actor::{
 };
 use lemmy_utils::{ApiError, ConnectionId, LemmyError};
 use lemmy_websocket::{messages::GetCommunityUsersOnline, LemmyContext};
-use std::str::FromStr;
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for GetCommunity {
@@ -86,15 +90,15 @@ impl PerformCrud for ListCommunities {
       None => false,
     };
 
-    let type_ = ListingType::from_str(&data.type_)?;
-    let sort = SortType::from_str(&data.sort)?;
+    let sort: Option<SortType> = from_opt_str_to_opt_enum(&data.sort);
+    let listing_type: Option<ListingType> = from_opt_str_to_opt_enum(&data.type_);
 
     let page = data.page;
     let limit = data.limit;
     let communities = blocking(context.pool(), move |conn| {
       CommunityQueryBuilder::create(conn)
-        .listing_type(&type_)
-        .sort(&sort)
+        .listing_type(listing_type)
+        .sort(sort)
         .show_nsfw(show_nsfw)
         .my_person_id(person_id)
         .page(page)
index 644581a5dd7e4fd84c007904c86a5332811193ad..f28f771195f3c4ee04f5bb31760293f17e63bd2c 100644 (file)
@@ -16,12 +16,7 @@ use lemmy_db_views_actor::{
   community_moderator_view::CommunityModeratorView,
   community_view::CommunityView,
 };
-use lemmy_utils::{
-  utils::{check_slurs, check_slurs_opt},
-  ApiError,
-  ConnectionId,
-  LemmyError,
-};
+use lemmy_utils::{utils::check_slurs_opt, ApiError, ConnectionId, LemmyError};
 use lemmy_websocket::{LemmyContext, UserOperationCrud};
 
 #[async_trait::async_trait(?Send)]
@@ -36,7 +31,7 @@ impl PerformCrud for EditCommunity {
     let data: &EditCommunity = &self;
     let local_user_view = get_local_user_view_from_jwt(&data.auth, context.pool()).await?;
 
-    check_slurs(&data.title)?;
+    check_slurs_opt(&data.title)?;
     check_slurs_opt(&data.description)?;
 
     // Verify its a mod (only mods can edit it)
@@ -61,7 +56,7 @@ impl PerformCrud for EditCommunity {
 
     let community_form = CommunityForm {
       name: read_community.name,
-      title: data.title.to_owned(),
+      title: data.title.to_owned().unwrap_or(read_community.title),
       description: data.description.to_owned(),
       icon,
       banner,
index d2231d24b5e2cfe5ad6838a186ded5f74a807538..14c6cad5f453d1ccd1e9d6433d50c78d0fc6315a 100644 (file)
@@ -7,7 +7,7 @@ use lemmy_api_common::{
   user_show_bot_accounts,
   user_show_nsfw,
 };
-use lemmy_db_queries::{ListingType, SortType};
+use lemmy_db_queries::{from_opt_str_to_opt_enum, ListingType, SortType};
 use lemmy_db_views::{
   comment_view::CommentQueryBuilder,
   post_view::{PostQueryBuilder, PostView},
@@ -18,7 +18,6 @@ use lemmy_db_views_actor::{
 };
 use lemmy_utils::{ApiError, ConnectionId, LemmyError};
 use lemmy_websocket::{messages::GetPostUsersOnline, LemmyContext};
-use std::str::FromStr;
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for GetPost {
@@ -101,8 +100,8 @@ impl PerformCrud for GetPosts {
     let show_nsfw = user_show_nsfw(&local_user_view);
     let show_bot_accounts = user_show_bot_accounts(&local_user_view);
 
-    let type_ = ListingType::from_str(&data.type_)?;
-    let sort = SortType::from_str(&data.sort)?;
+    let sort: Option<SortType> = from_opt_str_to_opt_enum(&data.sort);
+    let listing_type: Option<ListingType> = from_opt_str_to_opt_enum(&data.type_);
 
     let page = data.page;
     let limit = data.limit;
@@ -112,8 +111,8 @@ impl PerformCrud for GetPosts {
 
     let posts = blocking(context.pool(), move |conn| {
       PostQueryBuilder::create(conn)
-        .listing_type(&type_)
-        .sort(&sort)
+        .listing_type(listing_type)
+        .sort(sort)
         .show_nsfw(show_nsfw)
         .show_bot_accounts(show_bot_accounts)
         .community_id(community_id)
index 8ca0dcd1d3536bff8d9ecee9c825b83e50530e6b..ca7634d5ab8a2eed7d499a67504698a6168942c2 100644 (file)
@@ -7,7 +7,7 @@ use lemmy_db_schema::{naive_now, source::post::*};
 use lemmy_db_views::post_view::PostView;
 use lemmy_utils::{
   request::fetch_iframely_and_pictrs_data,
-  utils::{check_slurs, check_slurs_opt, is_valid_post_title},
+  utils::{check_slurs_opt, is_valid_post_title},
   ApiError,
   ConnectionId,
   LemmyError,
@@ -26,11 +26,13 @@ impl PerformCrud for EditPost {
     let data: &EditPost = &self;
     let local_user_view = get_local_user_view_from_jwt(&data.auth, context.pool()).await?;
 
-    check_slurs(&data.name)?;
+    check_slurs_opt(&data.name)?;
     check_slurs_opt(&data.body)?;
 
-    if !is_valid_post_title(&data.name) {
-      return Err(ApiError::err("invalid_post_title").into());
+    if let Some(name) = &data.name {
+      if !is_valid_post_title(name) {
+        return Err(ApiError::err("invalid_post_title").into());
+      }
     }
 
     let post_id = data.post_id;
@@ -56,7 +58,7 @@ impl PerformCrud for EditPost {
     let post_form = PostForm {
       creator_id: orig_post.creator_id.to_owned(),
       community_id: orig_post.community_id,
-      name: data.name.trim().to_owned(),
+      name: data.name.to_owned().unwrap_or(orig_post.name),
       url: data_url.map(|u| u.to_owned().into()),
       body: data.body.to_owned(),
       nsfw: data.nsfw,
index dc6e649d6a096a5816e08c19c8af93ed024d24dc..2b876c2ff6cd7a8b8ea4d7c3f17662b40e60b16d 100644 (file)
@@ -67,7 +67,7 @@ impl PerformCrud for CreateSite {
       open_registration: data.open_registration,
       enable_nsfw: data.enable_nsfw,
       updated: None,
-      community_creation_admin_only: Some(data.community_creation_admin_only),
+      community_creation_admin_only: data.community_creation_admin_only,
     };
 
     let create_site = move |conn: &'_ _| Site::create(conn, &site_form);
index e378b26b0a4f01f7b193e976c99f4e63cc0e29ec..9b73c12f83666c88cf4b5b91095106a816300f9c 100644 (file)
@@ -47,11 +47,11 @@ impl PerformCrud for GetSite {
             description: None,
             icon: None,
             banner: None,
-            enable_downvotes: true,
-            open_registration: true,
-            enable_nsfw: true,
+            enable_downvotes: None,
+            open_registration: None,
+            enable_nsfw: None,
             auth: login_response.jwt,
-            community_creation_admin_only: false,
+            community_creation_admin_only: None,
           };
           create_site.perform(context, websocket_id).await?;
           info!("Site {} created", setup.site_name);
index 58f4084925d0080c53487cf4e2c65c4eb5360a3f..14716e782282ff2433df17112969ab616ee63a90 100644 (file)
@@ -18,12 +18,7 @@ use lemmy_db_schema::{
   source::site::{Site, SiteForm},
 };
 use lemmy_db_views::site_view::SiteView;
-use lemmy_utils::{
-  utils::{check_slurs, check_slurs_opt},
-  ApiError,
-  ConnectionId,
-  LemmyError,
-};
+use lemmy_utils::{utils::check_slurs_opt, ApiError, ConnectionId, LemmyError};
 use lemmy_websocket::{messages::SendAllMessage, LemmyContext, UserOperationCrud};
 
 #[async_trait::async_trait(?Send)]
@@ -37,7 +32,7 @@ impl PerformCrud for EditSite {
     let data: &EditSite = &self;
     let local_user_view = get_local_user_view_from_jwt(&data.auth, context.pool()).await?;
 
-    check_slurs(&data.name)?;
+    check_slurs_opt(&data.name)?;
     check_slurs_opt(&data.description)?;
 
     // Make sure user is an admin
@@ -55,12 +50,12 @@ impl PerformCrud for EditSite {
     }
 
     let site_form = SiteForm {
-      name: data.name.to_owned(),
+      creator_id: found_site.creator_id,
+      name: data.name.to_owned().unwrap_or(found_site.name),
       sidebar,
       description,
       icon,
       banner,
-      creator_id: found_site.creator_id,
       updated: Some(naive_now()),
       enable_downvotes: data.enable_downvotes,
       open_registration: data.open_registration,
index 24ac2f61e3610ea2d55543a756a7d3b74510c743..39431128aee3d70846a5278ff5bb2425b9d84907 100644 (file)
@@ -7,7 +7,7 @@ use lemmy_api_common::{
   user_show_bot_accounts,
   user_show_nsfw,
 };
-use lemmy_db_queries::{source::person::Person_, SortType};
+use lemmy_db_queries::{from_opt_str_to_opt_enum, source::person::Person_, SortType};
 use lemmy_db_schema::source::person::*;
 use lemmy_db_views::{comment_view::CommentQueryBuilder, post_view::PostQueryBuilder};
 use lemmy_db_views_actor::{
@@ -17,7 +17,6 @@ use lemmy_db_views_actor::{
 };
 use lemmy_utils::{ApiError, ConnectionId, LemmyError};
 use lemmy_websocket::LemmyContext;
-use std::str::FromStr;
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for GetPersonDetails {
@@ -34,7 +33,7 @@ impl PerformCrud for GetPersonDetails {
     let show_nsfw = user_show_nsfw(&local_user_view);
     let show_bot_accounts = user_show_bot_accounts(&local_user_view);
 
-    let sort = SortType::from_str(&data.sort)?;
+    let sort: Option<SortType> = from_opt_str_to_opt_enum(&data.sort);
 
     let username = data
       .username
@@ -69,7 +68,7 @@ impl PerformCrud for GetPersonDetails {
 
     let (posts, comments) = blocking(context.pool(), move |conn| {
       let mut posts_query = PostQueryBuilder::create(conn)
-        .sort(&sort)
+        .sort(sort)
         .show_nsfw(show_nsfw)
         .show_bot_accounts(show_bot_accounts)
         .saved_only(saved_only)
@@ -81,7 +80,7 @@ impl PerformCrud for GetPersonDetails {
       let mut comments_query = CommentQueryBuilder::create(conn)
         .my_person_id(person_id)
         .show_bot_accounts(show_bot_accounts)
-        .sort(&sort)
+        .sort(sort)
         .saved_only(saved_only)
         .community_id(community_id)
         .page(page)
@@ -89,7 +88,7 @@ impl PerformCrud for GetPersonDetails {
 
       // If its saved only, you don't care what creator it was
       // Or, if its not saved, then you only want it for that specific creator
-      if !saved_only {
+      if !saved_only.unwrap_or(false) {
         posts_query = posts_query.creator_id(person_details_id);
         comments_query = comments_query.creator_id(person_details_id);
       }
index 8bbc07605acfe6f2c6465ae26d9e907cecd59c2e..1c984d84dee050bbf48e9796525285d256f49964 100644 (file)
@@ -230,8 +230,8 @@ impl FromApubToForm<PageExt> for PostForm {
         .as_ref()
         .map(|u| u.to_owned().naive_local()),
       deleted: None,
-      nsfw: ext.sensitive.unwrap_or(false),
-      stickied: ext.stickied.or(Some(false)),
+      nsfw: ext.sensitive,
+      stickied: ext.stickied,
       embed_title: iframely_title,
       embed_description: iframely_description,
       embed_html: iframely_html,
index 934a730510b06ef557544ccd910a1da1952db97f..109e4bd6554f50fcc78e7c5f1906b9e9194cd717 100644 (file)
@@ -49,14 +49,14 @@ mod tests {
 
     let site_form = SiteForm {
       name: "test_site".into(),
+      creator_id: inserted_person.id,
       sidebar: None,
       description: None,
       icon: None,
       banner: None,
-      creator_id: inserted_person.id,
-      enable_downvotes: true,
-      open_registration: true,
-      enable_nsfw: true,
+      enable_downvotes: None,
+      open_registration: None,
+      enable_nsfw: None,
       updated: None,
       community_creation_admin_only: Some(false),
     };
index 285ba332383639eda7a91c15433b1e464a965388..0665ac95d00a7261e8518cf15a5010eb2e9e3037 100644 (file)
@@ -163,7 +163,7 @@ pub fn get_database_url_from_env() -> Result<String, VarError> {
   env::var("LEMMY_DATABASE_URL")
 }
 
-#[derive(EnumString, ToString, Debug, Serialize, Deserialize)]
+#[derive(EnumString, ToString, Debug, Serialize, Deserialize, Clone, Copy)]
 pub enum SortType {
   Active,
   Hot,
@@ -177,7 +177,7 @@ pub enum SortType {
   NewComments,
 }
 
-#[derive(EnumString, ToString, Debug, Serialize, Deserialize, Clone)]
+#[derive(EnumString, ToString, Debug, Serialize, Deserialize, Clone, Copy)]
 pub enum ListingType {
   All,
   Local,
@@ -185,7 +185,7 @@ pub enum ListingType {
   Community,
 }
 
-#[derive(EnumString, ToString, Debug, Serialize, Deserialize)]
+#[derive(EnumString, ToString, Debug, Serialize, Deserialize, Clone, Copy)]
 pub enum SearchType {
   All,
   Comments,
@@ -195,6 +195,10 @@ pub enum SearchType {
   Url,
 }
 
+pub fn from_opt_str_to_opt_enum<T: std::str::FromStr>(opt: &Option<String>) -> Option<T> {
+  opt.as_ref().map(|t| T::from_str(t).ok()).flatten()
+}
+
 pub fn fuzzy_search(q: &str) -> String {
   let replaced = q.replace(" ", "%");
   format!("%{}%", replaced)
index 2581db95c77967eb12bec91cba77c2a790cdcf8b..536dd9606a7fcfaf703f8b4340580a050271eb29 100644 (file)
@@ -37,7 +37,7 @@ pub struct PostForm {
   pub name: String,
   pub creator_id: PersonId,
   pub community_id: CommunityId,
-  pub nsfw: bool,
+  pub nsfw: Option<bool>,
   pub url: Option<DbUrl>,
   pub body: Option<String>,
   pub removed: Option<bool>,
index 67bba99331034614f5acc8ba89c8d65048bb4dc9..19c41bf73303ca16c23950784b41375563a1d7f1 100644 (file)
@@ -23,12 +23,12 @@ pub struct Site {
 #[table_name = "site"]
 pub struct SiteForm {
   pub name: String,
-  pub sidebar: Option<Option<String>>,
   pub creator_id: PersonId,
+  pub sidebar: Option<Option<String>>,
   pub updated: Option<chrono::NaiveDateTime>,
-  pub enable_downvotes: bool,
-  pub open_registration: bool,
-  pub enable_nsfw: bool,
+  pub enable_downvotes: Option<bool>,
+  pub open_registration: Option<bool>,
+  pub enable_nsfw: Option<bool>,
   // when you want to null out a column, you have to send Some(None)), since sending None means you just don't want to update that column.
   pub icon: Option<Option<DbUrl>>,
   pub banner: Option<Option<DbUrl>>,
index b85b1c77a654d38a544458e1d9890f989ab88d78..fbb2b7f7d8e8b79c0719de0ae9e9c8eee87bc3d8 100644 (file)
@@ -172,8 +172,8 @@ impl CommentView {
 
 pub struct CommentQueryBuilder<'a> {
   conn: &'a PgConnection,
-  listing_type: ListingType,
-  sort: &'a SortType,
+  listing_type: Option<ListingType>,
+  sort: Option<SortType>,
   community_id: Option<CommunityId>,
   community_name: Option<String>,
   post_id: Option<PostId>,
@@ -181,9 +181,9 @@ pub struct CommentQueryBuilder<'a> {
   recipient_id: Option<PersonId>,
   my_person_id: Option<PersonId>,
   search_term: Option<String>,
-  saved_only: bool,
-  unread_only: bool,
-  show_bot_accounts: bool,
+  saved_only: Option<bool>,
+  unread_only: Option<bool>,
+  show_bot_accounts: Option<bool>,
   page: Option<i64>,
   limit: Option<i64>,
 }
@@ -192,8 +192,8 @@ impl<'a> CommentQueryBuilder<'a> {
   pub fn create(conn: &'a PgConnection) -> Self {
     CommentQueryBuilder {
       conn,
-      listing_type: ListingType::All,
-      sort: &SortType::New,
+      listing_type: None,
+      sort: None,
       community_id: None,
       community_name: None,
       post_id: None,
@@ -201,21 +201,21 @@ impl<'a> CommentQueryBuilder<'a> {
       recipient_id: None,
       my_person_id: None,
       search_term: None,
-      saved_only: false,
-      unread_only: false,
-      show_bot_accounts: true,
+      saved_only: None,
+      unread_only: None,
+      show_bot_accounts: None,
       page: None,
       limit: None,
     }
   }
 
-  pub fn listing_type(mut self, listing_type: ListingType) -> Self {
-    self.listing_type = listing_type;
+  pub fn listing_type<T: MaybeOptional<ListingType>>(mut self, listing_type: T) -> Self {
+    self.listing_type = listing_type.get_optional();
     self
   }
 
-  pub fn sort(mut self, sort: &'a SortType) -> Self {
-    self.sort = sort;
+  pub fn sort<T: MaybeOptional<SortType>>(mut self, sort: T) -> Self {
+    self.sort = sort.get_optional();
     self
   }
 
@@ -254,18 +254,18 @@ impl<'a> CommentQueryBuilder<'a> {
     self
   }
 
-  pub fn saved_only(mut self, saved_only: bool) -> Self {
-    self.saved_only = saved_only;
+  pub fn saved_only<T: MaybeOptional<bool>>(mut self, saved_only: T) -> Self {
+    self.saved_only = saved_only.get_optional();
     self
   }
 
-  pub fn unread_only(mut self, unread_only: bool) -> Self {
-    self.unread_only = unread_only;
+  pub fn unread_only<T: MaybeOptional<bool>>(mut self, unread_only: T) -> Self {
+    self.unread_only = unread_only.get_optional();
     self
   }
 
-  pub fn show_bot_accounts(mut self, show_bot_accounts: bool) -> Self {
-    self.show_bot_accounts = show_bot_accounts;
+  pub fn show_bot_accounts<T: MaybeOptional<bool>>(mut self, show_bot_accounts: T) -> Self {
+    self.show_bot_accounts = show_bot_accounts.get_optional();
     self
   }
 
@@ -350,7 +350,7 @@ impl<'a> CommentQueryBuilder<'a> {
         .filter(comment::removed.eq(false));
     }
 
-    if self.unread_only {
+    if self.unread_only.unwrap_or(false) {
       query = query.filter(comment::read.eq(false));
     }
 
@@ -376,22 +376,23 @@ impl<'a> CommentQueryBuilder<'a> {
       query = query.filter(comment::content.ilike(fuzzy_search(&search_term)));
     };
 
-    query = match self.listing_type {
-      // ListingType::Subscribed => query.filter(community_follower::subscribed.eq(true)),
-      ListingType::Subscribed => query.filter(community_follower::person_id.is_not_null()), // TODO could be this: and(community_follower::person_id.eq(person_id_join)),
-      ListingType::Local => query.filter(community::local.eq(true)),
-      _ => query,
-    };
+    if let Some(listing_type) = self.listing_type {
+      query = match listing_type {
+        ListingType::Subscribed => query.filter(community_follower::person_id.is_not_null()), // TODO could be this: and(community_follower::person_id.eq(person_id_join)),
+        ListingType::Local => query.filter(community::local.eq(true)),
+        _ => query,
+      };
+    }
 
-    if self.saved_only {
+    if self.saved_only.unwrap_or(false) {
       query = query.filter(comment_saved::id.is_not_null());
     }
 
-    if !self.show_bot_accounts {
+    if !self.show_bot_accounts.unwrap_or(true) {
       query = query.filter(person::bot_account.eq(false));
     };
 
-    query = match self.sort {
+    query = match self.sort.unwrap_or(SortType::New) {
       SortType::Hot | SortType::Active => query
         .order_by(hot_rank(comment_aggregates::score, comment_aggregates::published).desc())
         .then_order_by(comment_aggregates::published.desc()),
index 8248bfd292d19c585b360088250f1a764ba39fce..fb8f073365ad49b5c8e496e971ae99759966a530 100644 (file)
@@ -155,18 +155,18 @@ impl PostView {
 
 pub struct PostQueryBuilder<'a> {
   conn: &'a PgConnection,
-  listing_type: &'a ListingType,
-  sort: &'a SortType,
+  listing_type: Option<ListingType>,
+  sort: Option<SortType>,
   creator_id: Option<PersonId>,
   community_id: Option<CommunityId>,
   community_name: Option<String>,
   my_person_id: Option<PersonId>,
   search_term: Option<String>,
   url_search: Option<String>,
-  show_nsfw: bool,
-  show_bot_accounts: bool,
-  saved_only: bool,
-  unread_only: bool,
+  show_nsfw: Option<bool>,
+  show_bot_accounts: Option<bool>,
+  saved_only: Option<bool>,
+  unread_only: Option<bool>,
   page: Option<i64>,
   limit: Option<i64>,
 }
@@ -175,30 +175,30 @@ impl<'a> PostQueryBuilder<'a> {
   pub fn create(conn: &'a PgConnection) -> Self {
     PostQueryBuilder {
       conn,
-      listing_type: &ListingType::All,
-      sort: &SortType::Hot,
+      listing_type: None,
+      sort: None,
       creator_id: None,
       community_id: None,
       community_name: None,
       my_person_id: None,
       search_term: None,
       url_search: None,
-      show_nsfw: true,
-      show_bot_accounts: true,
-      saved_only: false,
-      unread_only: false,
+      show_nsfw: None,
+      show_bot_accounts: None,
+      saved_only: None,
+      unread_only: None,
       page: None,
       limit: None,
     }
   }
 
-  pub fn listing_type(mut self, listing_type: &'a ListingType) -> Self {
-    self.listing_type = listing_type;
+  pub fn listing_type<T: MaybeOptional<ListingType>>(mut self, listing_type: T) -> Self {
+    self.listing_type = listing_type.get_optional();
     self
   }
 
-  pub fn sort(mut self, sort: &'a SortType) -> Self {
-    self.sort = sort;
+  pub fn sort<T: MaybeOptional<SortType>>(mut self, sort: T) -> Self {
+    self.sort = sort.get_optional();
     self
   }
 
@@ -232,18 +232,18 @@ impl<'a> PostQueryBuilder<'a> {
     self
   }
 
-  pub fn show_nsfw(mut self, show_nsfw: bool) -> Self {
-    self.show_nsfw = show_nsfw;
+  pub fn show_nsfw<T: MaybeOptional<bool>>(mut self, show_nsfw: T) -> Self {
+    self.show_nsfw = show_nsfw.get_optional();
     self
   }
 
-  pub fn show_bot_accounts(mut self, show_bot_accounts: bool) -> Self {
-    self.show_bot_accounts = show_bot_accounts;
+  pub fn show_bot_accounts<T: MaybeOptional<bool>>(mut self, show_bot_accounts: T) -> Self {
+    self.show_bot_accounts = show_bot_accounts.get_optional();
     self
   }
 
-  pub fn saved_only(mut self, saved_only: bool) -> Self {
-    self.saved_only = saved_only;
+  pub fn saved_only<T: MaybeOptional<bool>>(mut self, saved_only: T) -> Self {
+    self.saved_only = saved_only.get_optional();
     self
   }
 
@@ -315,11 +315,13 @@ impl<'a> PostQueryBuilder<'a> {
       ))
       .into_boxed();
 
-    query = match self.listing_type {
-      ListingType::Subscribed => query.filter(community_follower::person_id.is_not_null()), // TODO could be this: and(community_follower::person_id.eq(person_id_join)),
-      ListingType::Local => query.filter(community::local.eq(true)),
-      _ => query,
-    };
+    if let Some(listing_type) = self.listing_type {
+      query = match listing_type {
+        ListingType::Subscribed => query.filter(community_follower::person_id.is_not_null()),
+        ListingType::Local => query.filter(community::local.eq(true)),
+        _ => query,
+      };
+    }
 
     if let Some(community_id) = self.community_id {
       query = query
@@ -352,26 +354,25 @@ impl<'a> PostQueryBuilder<'a> {
       query = query.filter(post::creator_id.eq(creator_id));
     }
 
-    if !self.show_nsfw {
+    if !self.show_nsfw.unwrap_or(true) {
       query = query
         .filter(post::nsfw.eq(false))
         .filter(community::nsfw.eq(false));
     };
 
-    if !self.show_bot_accounts {
+    if !self.show_bot_accounts.unwrap_or(true) {
       query = query.filter(person::bot_account.eq(false));
     };
 
-    // TODO  These two might be wrong
-    if self.saved_only {
+    if self.saved_only.unwrap_or(false) {
       query = query.filter(post_saved::id.is_not_null());
     };
 
-    if self.unread_only {
+    if self.unread_only.unwrap_or(false) {
       query = query.filter(post_read::id.is_not_null());
     };
 
-    query = match self.sort {
+    query = match self.sort.unwrap_or(SortType::Hot) {
       SortType::Active => query
         .then_order_by(
           hot_rank(
@@ -522,8 +523,8 @@ mod tests {
     };
 
     let read_post_listings_with_person = PostQueryBuilder::create(&conn)
-      .listing_type(&ListingType::Community)
-      .sort(&SortType::New)
+      .listing_type(ListingType::Community)
+      .sort(SortType::New)
       .show_bot_accounts(false)
       .community_id(inserted_community.id)
       .my_person_id(inserted_person.id)
@@ -531,8 +532,8 @@ mod tests {
       .unwrap();
 
     let read_post_listings_no_person = PostQueryBuilder::create(&conn)
-      .listing_type(&ListingType::Community)
-      .sort(&SortType::New)
+      .listing_type(ListingType::Community)
+      .sort(SortType::New)
       .community_id(inserted_community.id)
       .list()
       .unwrap();
index 5cef7364e9f1e8f0a2be8a5def48c0656b387bae..8fee2fc9bb3012c9009bf919bcb9992f6754fe63 100644 (file)
@@ -46,7 +46,7 @@ impl PrivateMessageView {
 pub struct PrivateMessageQueryBuilder<'a> {
   conn: &'a PgConnection,
   recipient_id: PersonId,
-  unread_only: bool,
+  unread_only: Option<bool>,
   page: Option<i64>,
   limit: Option<i64>,
 }
@@ -56,14 +56,14 @@ impl<'a> PrivateMessageQueryBuilder<'a> {
     PrivateMessageQueryBuilder {
       conn,
       recipient_id,
-      unread_only: false,
+      unread_only: None,
       page: None,
       limit: None,
     }
   }
 
-  pub fn unread_only(mut self, unread_only: bool) -> Self {
-    self.unread_only = unread_only;
+  pub fn unread_only<T: MaybeOptional<bool>>(mut self, unread_only: T) -> Self {
+    self.unread_only = unread_only.get_optional();
     self
   }
 
@@ -89,7 +89,7 @@ impl<'a> PrivateMessageQueryBuilder<'a> {
       .into_boxed();
 
     // If its unread, I only want the ones to me
-    if self.unread_only {
+    if self.unread_only.unwrap_or(false) {
       query = query
         .filter(private_message::read.eq(false))
         .filter(private_message::recipient_id.eq(self.recipient_id));
index 0ee503a710781a3a232fc5f8d88d58593b1155b7..63e52941264b764b025d5c709c926259486db3bc 100644 (file)
@@ -94,10 +94,10 @@ impl CommunityView {
 
 pub struct CommunityQueryBuilder<'a> {
   conn: &'a PgConnection,
-  listing_type: &'a ListingType,
-  sort: &'a SortType,
+  listing_type: Option<ListingType>,
+  sort: Option<SortType>,
   my_person_id: Option<PersonId>,
-  show_nsfw: bool,
+  show_nsfw: Option<bool>,
   search_term: Option<String>,
   page: Option<i64>,
   limit: Option<i64>,
@@ -108,27 +108,27 @@ impl<'a> CommunityQueryBuilder<'a> {
     CommunityQueryBuilder {
       conn,
       my_person_id: None,
-      listing_type: &ListingType::All,
-      sort: &SortType::Hot,
-      show_nsfw: true,
+      listing_type: None,
+      sort: None,
+      show_nsfw: None,
       search_term: None,
       page: None,
       limit: None,
     }
   }
 
-  pub fn listing_type(mut self, listing_type: &'a ListingType) -> Self {
-    self.listing_type = listing_type;
+  pub fn listing_type<T: MaybeOptional<ListingType>>(mut self, listing_type: T) -> Self {
+    self.listing_type = listing_type.get_optional();
     self
   }
 
-  pub fn sort(mut self, sort: &'a SortType) -> Self {
-    self.sort = sort;
+  pub fn sort<T: MaybeOptional<SortType>>(mut self, sort: T) -> Self {
+    self.sort = sort.get_optional();
     self
   }
 
-  pub fn show_nsfw(mut self, show_nsfw: bool) -> Self {
-    self.show_nsfw = show_nsfw;
+  pub fn show_nsfw<T: MaybeOptional<bool>>(mut self, show_nsfw: T) -> Self {
+    self.show_nsfw = show_nsfw.get_optional();
     self
   }
 
@@ -180,7 +180,7 @@ impl<'a> CommunityQueryBuilder<'a> {
         .or_filter(community::description.ilike(searcher));
     };
 
-    match self.sort {
+    match self.sort.unwrap_or(SortType::Hot) {
       SortType::New => query = query.order_by(community::published.desc()),
       SortType::TopAll => query = query.order_by(community_aggregates::subscribers.desc()),
       SortType::TopMonth => query = query.order_by(community_aggregates::users_active_month.desc()),
@@ -198,15 +198,17 @@ impl<'a> CommunityQueryBuilder<'a> {
       }
     };
 
-    if !self.show_nsfw {
+    if !self.show_nsfw.unwrap_or(true) {
       query = query.filter(community::nsfw.eq(false));
     };
 
-    query = match self.listing_type {
-      ListingType::Subscribed => query.filter(community_follower::person_id.is_not_null()), // TODO could be this: and(community_follower::person_id.eq(person_id_join)),
-      ListingType::Local => query.filter(community::local.eq(true)),
-      _ => query,
-    };
+    if let Some(listing_type) = self.listing_type {
+      query = match listing_type {
+        ListingType::Subscribed => query.filter(community_follower::person_id.is_not_null()), // TODO could be this: and(community_follower::person_id.eq(person_id_join)),
+        ListingType::Local => query.filter(community::local.eq(true)),
+        _ => query,
+      };
+    }
 
     let (limit, offset) = limit_and_offset(self.page, self.limit);
     let res = query
index 958d084bea854f5b0035e728b189f375457882a6..b391345ffe6a7f4ce90bbd64f76b1c7e5d777102 100644 (file)
@@ -155,8 +155,8 @@ pub struct PersonMentionQueryBuilder<'a> {
   conn: &'a PgConnection,
   my_person_id: Option<PersonId>,
   recipient_id: Option<PersonId>,
-  sort: &'a SortType,
-  unread_only: bool,
+  sort: Option<SortType>,
+  unread_only: Option<bool>,
   page: Option<i64>,
   limit: Option<i64>,
 }
@@ -167,20 +167,20 @@ impl<'a> PersonMentionQueryBuilder<'a> {
       conn,
       my_person_id: None,
       recipient_id: None,
-      sort: &SortType::New,
-      unread_only: false,
+      sort: None,
+      unread_only: None,
       page: None,
       limit: None,
     }
   }
 
-  pub fn sort(mut self, sort: &'a SortType) -> Self {
-    self.sort = sort;
+  pub fn sort<T: MaybeOptional<SortType>>(mut self, sort: T) -> Self {
+    self.sort = sort.get_optional();
     self
   }
 
-  pub fn unread_only(mut self, unread_only: bool) -> Self {
-    self.unread_only = unread_only;
+  pub fn unread_only<T: MaybeOptional<bool>>(mut self, unread_only: T) -> Self {
+    self.unread_only = unread_only.get_optional();
     self
   }
 
@@ -264,11 +264,11 @@ impl<'a> PersonMentionQueryBuilder<'a> {
       query = query.filter(person_mention::recipient_id.eq(recipient_id));
     }
 
-    if self.unread_only {
+    if self.unread_only.unwrap_or(false) {
       query = query.filter(person_mention::read.eq(false));
     }
 
-    query = match self.sort {
+    query = match self.sort.unwrap_or(SortType::Hot) {
       SortType::Hot | SortType::Active => query
         .order_by(hot_rank(comment_aggregates::score, comment_aggregates::published).desc())
         .then_order_by(comment_aggregates::published.desc()),
index 8e292c3fcaf045ec02c8d69750e2f33a801a0d64..861d333fe83272475f58df9fbba9611a0dff3bd0 100644 (file)
@@ -57,7 +57,7 @@ impl PersonViewSafe {
 
 pub struct PersonQueryBuilder<'a> {
   conn: &'a PgConnection,
-  sort: &'a SortType,
+  sort: Option<SortType>,
   search_term: Option<String>,
   page: Option<i64>,
   limit: Option<i64>,
@@ -68,14 +68,14 @@ impl<'a> PersonQueryBuilder<'a> {
     PersonQueryBuilder {
       conn,
       search_term: None,
-      sort: &SortType::Hot,
+      sort: None,
       page: None,
       limit: None,
     }
   }
 
-  pub fn sort(mut self, sort: &'a SortType) -> Self {
-    self.sort = sort;
+  pub fn sort<T: MaybeOptional<SortType>>(mut self, sort: T) -> Self {
+    self.sort = sort.get_optional();
     self
   }
 
@@ -104,7 +104,7 @@ impl<'a> PersonQueryBuilder<'a> {
       query = query.filter(person::name.ilike(fuzzy_search(&search_term)));
     }
 
-    query = match self.sort {
+    query = match self.sort.unwrap_or(SortType::Hot) {
       SortType::Hot => query
         .order_by(person_aggregates::comment_score.desc())
         .then_order_by(person::published.desc()),
index 21263fd610e1aa69639e7150ba468b571bf6d714..a4f6a45a06c9c60502670094b7c34bb0791e4f63 100644 (file)
@@ -90,11 +90,10 @@ async fn get_feed_data(
 ) -> Result<HttpResponse, LemmyError> {
   let site_view = blocking(context.pool(), move |conn| SiteView::read(&conn)).await??;
 
-  let listing_type_ = listing_type.clone();
   let posts = blocking(context.pool(), move |conn| {
     PostQueryBuilder::create(&conn)
-      .listing_type(&listing_type_)
-      .sort(&sort_type)
+      .listing_type(listing_type)
+      .sort(sort_type)
       .list()
   })
   .await??;
@@ -174,8 +173,8 @@ fn get_feed_user(
   let person = Person::find_by_name(&conn, &user_name)?;
 
   let posts = PostQueryBuilder::create(&conn)
-    .listing_type(&ListingType::All)
-    .sort(sort_type)
+    .listing_type(ListingType::All)
+    .sort(*sort_type)
     .creator_id(person.id)
     .list()?;
 
@@ -200,8 +199,8 @@ fn get_feed_community(
   let community = Community::read_from_name(&conn, &community_name)?;
 
   let posts = PostQueryBuilder::create(&conn)
-    .listing_type(&ListingType::All)
-    .sort(sort_type)
+    .listing_type(ListingType::All)
+    .sort(*sort_type)
     .community_id(community.id)
     .list()?;
 
@@ -233,10 +232,10 @@ fn get_feed_front(
   let show_bot_accounts = local_user.show_bot_accounts;
 
   let posts = PostQueryBuilder::create(&conn)
-    .listing_type(&ListingType::Subscribed)
+    .listing_type(ListingType::Subscribed)
     .my_person_id(person_id)
     .show_bot_accounts(show_bot_accounts)
-    .sort(sort_type)
+    .sort(*sort_type)
     .list()?;
 
   let items = create_post_items(posts)?;
@@ -268,13 +267,13 @@ fn get_feed_inbox(conn: &PgConnection, jwt: String) -> Result<ChannelBuilder, Le
     .recipient_id(person_id)
     .my_person_id(person_id)
     .show_bot_accounts(show_bot_accounts)
-    .sort(&sort)
+    .sort(sort)
     .list()?;
 
   let mentions = PersonMentionQueryBuilder::create(&conn)
     .recipient_id(person_id)
     .my_person_id(person_id)
-    .sort(&sort)
+    .sort(sort)
     .list()?;
 
   let items = create_reply_and_mention_items(replies, mentions)?;