]> Untitled Git - lemmy.git/commitdiff
Fix a few form options for diesel. Fixes #2287 (#2376)
authorDessalines <dessalines@users.noreply.github.com>
Fri, 29 Jul 2022 13:04:21 +0000 (09:04 -0400)
committerGitHub <noreply@github.com>
Fri, 29 Jul 2022 13:04:21 +0000 (15:04 +0200)
* Fix a few form options for diesel. Fixes #2287

* Adding TODO comment.

13 files changed:
crates/api/src/community/hide.rs
crates/api_crud/src/community/create.rs
crates/api_crud/src/community/update.rs
crates/api_crud/src/post/create.rs
crates/api_crud/src/post/update.rs
crates/api_crud/src/site/update.rs
crates/apub/src/objects/post.rs
crates/apub/src/protocol/objects/group.rs
crates/db_schema/src/source/community.rs
crates/db_schema/src/source/post.rs
crates/db_schema/src/source/site.rs
crates/utils/src/utils.rs
src/code_migrations.rs

index 6a562f1c0a2b4dbf1c4613b3d2f18105e387bde6..a038e63106d2d3de0da0fde21a4dbaa6114d90b4 100644 (file)
@@ -42,7 +42,7 @@ impl Perform for HideCommunity {
     let community_form = CommunityForm {
       name: read_community.name,
       title: read_community.title,
-      description: read_community.description.to_owned(),
+      description: Some(read_community.description.to_owned()),
       hidden: Some(data.hidden),
       updated: Some(naive_now()),
       ..CommunityForm::default()
index 2767750dcf9c06b2582b93a22bd948a209cb9328..e12e3965c309b4f4daaeb109e3e3dcea88355d01 100644 (file)
@@ -26,7 +26,7 @@ use lemmy_db_schema::{
     site::Site,
   },
   traits::{Crud, Followable, Joinable},
-  utils::diesel_option_overwrite_to_url,
+  utils::{diesel_option_overwrite, diesel_option_overwrite_to_url},
 };
 use lemmy_db_views_actor::structs::CommunityView;
 use lemmy_utils::{
@@ -60,6 +60,7 @@ impl PerformCrud for CreateCommunity {
     // Check to make sure the icon and banners are urls
     let icon = diesel_option_overwrite_to_url(&data.icon)?;
     let banner = diesel_option_overwrite_to_url(&data.banner)?;
+    let description = diesel_option_overwrite(&data.description);
 
     check_slurs(&data.name, &context.settings().slur_regex())?;
     check_slurs(&data.title, &context.settings().slur_regex())?;
@@ -87,7 +88,7 @@ impl PerformCrud for CreateCommunity {
     let community_form = CommunityForm {
       name: data.name.to_owned(),
       title: data.title.to_owned(),
-      description: data.description.to_owned(),
+      description,
       icon,
       banner,
       nsfw: data.nsfw,
index d8aaef0e50443ae3d9dcc2eb47f5c331c536219f..c572c9c5a5636bab46d8eae80b74d74f60d5cb29 100644 (file)
@@ -9,7 +9,7 @@ use lemmy_db_schema::{
   newtypes::PersonId,
   source::community::{Community, CommunityForm},
   traits::Crud,
-  utils::{diesel_option_overwrite_to_url, naive_now},
+  utils::{diesel_option_overwrite, diesel_option_overwrite_to_url, naive_now},
 };
 use lemmy_db_views_actor::structs::CommunityModeratorView;
 use lemmy_utils::{error::LemmyError, utils::check_slurs_opt, ConnectionId};
@@ -31,6 +31,7 @@ impl PerformCrud for EditCommunity {
 
     let icon = diesel_option_overwrite_to_url(&data.icon)?;
     let banner = diesel_option_overwrite_to_url(&data.banner)?;
+    let description = diesel_option_overwrite(&data.description);
 
     check_slurs_opt(&data.title, &context.settings().slur_regex())?;
     check_slurs_opt(&data.description, &context.settings().slur_regex())?;
@@ -55,7 +56,7 @@ impl PerformCrud for EditCommunity {
     let community_form = CommunityForm {
       name: read_community.name,
       title: data.title.to_owned().unwrap_or(read_community.title),
-      description: data.description.to_owned(),
+      description,
       icon,
       banner,
       nsfw: data.nsfw,
index 191951ed26ae3be013b78e197c0920aa7e3f335f..1a6c100db4bb92f4e900931142dff37aec363419 100644 (file)
@@ -24,17 +24,12 @@ use lemmy_db_schema::{
     post::{Post, PostForm, PostLike, PostLikeForm},
   },
   traits::{Crud, Likeable},
+  utils::diesel_option_overwrite,
 };
 use lemmy_db_views_actor::structs::CommunityView;
 use lemmy_utils::{
   error::LemmyError,
-  utils::{
-    check_slurs,
-    check_slurs_opt,
-    clean_optional_text,
-    clean_url_params,
-    is_valid_post_title,
-  },
+  utils::{check_slurs, check_slurs_opt, clean_url_params, is_valid_post_title},
   ConnectionId,
 };
 use lemmy_websocket::{send::send_post_ws_message, LemmyContext, UserOperationCrud};
@@ -61,6 +56,10 @@ impl PerformCrud for CreatePost {
     check_slurs_opt(&data.body, slur_regex)?;
     honeypot_check(&data.honeypot)?;
 
+    let data_url = data.url.as_ref();
+    let url = Some(data_url.map(clean_url_params).map(Into::into)); // TODO no good way to handle a "clear"
+    let body = diesel_option_overwrite(&data.body);
+
     if !is_valid_post_title(&data.name) {
       return Err(LemmyError::from_message("invalid_post_title"));
     }
@@ -85,24 +84,23 @@ impl PerformCrud for CreatePost {
     }
 
     // Fetch post links and pictrs cached image
-    let data_url = data.url.as_ref();
     let (metadata_res, thumbnail_url) =
       fetch_site_data(context.client(), context.settings(), data_url).await;
     let (embed_title, embed_description, embed_video_url) = metadata_res
-      .map(|u| (u.title, u.description, u.embed_video_url))
+      .map(|u| (Some(u.title), Some(u.description), Some(u.embed_video_url)))
       .unwrap_or_default();
 
     let post_form = PostForm {
       name: data.name.trim().to_owned(),
-      url: data_url.map(|u| clean_url_params(u.to_owned()).into()),
-      body: clean_optional_text(&data.body),
+      url,
+      body,
       community_id: data.community_id,
       creator_id: local_user_view.person.id,
       nsfw: data.nsfw,
       embed_title,
       embed_description,
       embed_video_url,
-      thumbnail_url,
+      thumbnail_url: Some(thumbnail_url),
       ..PostForm::default()
     };
 
index ac4910cd81adaad50ab4f7ca75ff326c74e0ccc2..fdb41186a0370e2ab7c54640a85339e5c93f9b12 100644 (file)
@@ -16,11 +16,11 @@ use lemmy_apub::protocol::activities::{
 use lemmy_db_schema::{
   source::post::{Post, PostForm},
   traits::Crud,
-  utils::naive_now,
+  utils::{diesel_option_overwrite, naive_now},
 };
 use lemmy_utils::{
   error::LemmyError,
-  utils::{check_slurs_opt, clean_optional_text, clean_url_params, is_valid_post_title},
+  utils::{check_slurs_opt, clean_url_params, is_valid_post_title},
   ConnectionId,
 };
 use lemmy_websocket::{send::send_post_ws_message, LemmyContext, UserOperationCrud};
@@ -41,6 +41,13 @@ impl PerformCrud for EditPost {
     let local_user_view =
       get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
 
+    let data_url = data.url.as_ref();
+
+    // TODO No good way to handle a clear.
+    // Issue link: https://github.com/LemmyNet/lemmy/issues/2287
+    let url = Some(data_url.map(clean_url_params).map(Into::into));
+    let body = diesel_option_overwrite(&data.body);
+
     let slur_regex = &context.settings().slur_regex();
     check_slurs_opt(&data.name, slur_regex)?;
     check_slurs_opt(&data.body, slur_regex)?;
@@ -72,21 +79,21 @@ impl PerformCrud for EditPost {
     let (metadata_res, thumbnail_url) =
       fetch_site_data(context.client(), context.settings(), data_url).await;
     let (embed_title, embed_description, embed_video_url) = metadata_res
-      .map(|u| (u.title, u.description, u.embed_video_url))
+      .map(|u| (Some(u.title), Some(u.description), Some(u.embed_video_url)))
       .unwrap_or_default();
 
     let post_form = PostForm {
       creator_id: orig_post.creator_id.to_owned(),
       community_id: orig_post.community_id,
       name: data.name.to_owned().unwrap_or(orig_post.name),
-      url: data_url.map(|u| clean_url_params(u.to_owned()).into()),
-      body: clean_optional_text(&data.body),
+      url,
+      body,
       nsfw: data.nsfw,
       updated: Some(naive_now()),
       embed_title,
       embed_description,
       embed_video_url,
-      thumbnail_url,
+      thumbnail_url: Some(thumbnail_url),
       ..PostForm::default()
     };
 
index 6e88e42ec9d6c0d43a996530716205d2df9241c0..dabd118c5777cea5ef38eb6eaeede73b979cd976 100644 (file)
@@ -40,6 +40,7 @@ impl PerformCrud for EditSite {
     let sidebar = diesel_option_overwrite(&data.sidebar);
     let description = diesel_option_overwrite(&data.description);
     let application_question = diesel_option_overwrite(&data.application_question);
+    let legal_information = diesel_option_overwrite(&data.legal_information);
     let icon = diesel_option_overwrite_to_url(&data.icon)?;
     let banner = diesel_option_overwrite_to_url(&data.banner)?;
 
@@ -84,7 +85,7 @@ impl PerformCrud for EditSite {
       private_instance: data.private_instance,
       default_theme: data.default_theme.clone(),
       default_post_listing_type: data.default_post_listing_type.clone(),
-      legal_information: data.legal_information.clone(),
+      legal_information,
       ..SiteForm::default()
     };
 
index 08219872551903134960622acf0157db6ec2007f..67be5c568b58e7934647dae3f7805a2ff07aa4dd 100644 (file)
@@ -173,15 +173,15 @@ impl ApubObject for ApubPost {
         (None, page.image.map(|i| i.url.into()))
       };
       let (embed_title, embed_description, embed_video_url) = metadata_res
-        .map(|u| (u.title, u.description, u.embed_video_url))
+        .map(|u| (Some(u.title), Some(u.description), Some(u.embed_video_url)))
         .unwrap_or_default();
       let body_slurs_removed =
         read_from_string_or_source_opt(&page.content, &page.media_type, &page.source)
-          .map(|s| remove_slurs(&s, &context.settings().slur_regex()));
+          .map(|s| Some(remove_slurs(&s, &context.settings().slur_regex())));
 
       PostForm {
         name: page.name.clone(),
-        url: url.map(Into::into),
+        url: Some(url.map(Into::into)),
         body: body_slurs_removed,
         creator_id: creator.id,
         community_id: community.id,
@@ -195,7 +195,7 @@ impl ApubObject for ApubPost {
         embed_title,
         embed_description,
         embed_video_url,
-        thumbnail_url,
+        thumbnail_url: Some(thumbnail_url),
         ap_id: Some(page.id.clone().into()),
         local: Some(false),
       }
index 12c94a198826e0602dcbdc4a2c9631207025db84..d5ebe789eded13db7c69b415c73b63466bf0cafb 100644 (file)
@@ -78,7 +78,11 @@ impl Group {
     CommunityForm {
       name: self.preferred_username.clone(),
       title: self.name.unwrap_or(self.preferred_username),
-      description: read_from_string_or_source_opt(&self.summary, &None, &self.source),
+      description: Some(read_from_string_or_source_opt(
+        &self.summary,
+        &None,
+        &self.source,
+      )),
       removed: None,
       published: self.published.map(|u| u.naive_local()),
       updated: self.updated.map(|u| u.naive_local()),
index a82a7a82bb75d9d10ac1d9fc42654bfcbec3183e..498869e960efb76aeefd00e11f3cbb4137828ba0 100644 (file)
@@ -59,7 +59,7 @@ pub struct CommunitySafe {
 pub struct CommunityForm {
   pub name: String,
   pub title: String,
-  pub description: Option<String>,
+  pub description: Option<Option<String>>,
   pub removed: Option<bool>,
   pub published: Option<chrono::NaiveDateTime>,
   pub updated: Option<chrono::NaiveDateTime>,
index f8e7dc36c36ce0992817c90d3e9f186724e75b97..a69e6a2caea19c2852b580754189b4d7875a3788 100644 (file)
@@ -37,18 +37,18 @@ pub struct PostForm {
   pub creator_id: PersonId,
   pub community_id: CommunityId,
   pub nsfw: Option<bool>,
-  pub url: Option<DbUrl>,
-  pub body: Option<String>,
+  pub url: Option<Option<DbUrl>>,
+  pub body: Option<Option<String>>,
   pub removed: Option<bool>,
   pub locked: Option<bool>,
   pub published: Option<chrono::NaiveDateTime>,
   pub updated: Option<chrono::NaiveDateTime>,
   pub deleted: Option<bool>,
   pub stickied: Option<bool>,
-  pub embed_title: Option<String>,
-  pub embed_description: Option<String>,
-  pub embed_video_url: Option<DbUrl>,
-  pub thumbnail_url: Option<DbUrl>,
+  pub embed_title: Option<Option<String>>,
+  pub embed_description: Option<Option<String>>,
+  pub embed_video_url: Option<Option<DbUrl>>,
+  pub thumbnail_url: Option<Option<DbUrl>>,
   pub ap_id: Option<DbUrl>,
   pub local: Option<bool>,
 }
index 9ba8697527f2393a628ec773a81bcd74de5a179b..cc5b75054729f16d7699f736c0ed284c15986324 100644 (file)
@@ -60,5 +60,5 @@ pub struct SiteForm {
   pub public_key: Option<String>,
   pub default_theme: Option<String>,
   pub default_post_listing_type: Option<String>,
-  pub legal_information: Option<String>,
+  pub legal_information: Option<Option<String>>,
 }
index a7c42cca81c0bf3f62c9e89bd815c7efeda4c4e5..99dd21c8fd3bedae8ecbaf6a30eaa23689cf79f0 100644 (file)
@@ -165,29 +165,17 @@ pub fn get_ip(conn_info: &ConnectionInfo) -> IpAddr {
   )
 }
 
-pub fn clean_url_params(mut url: Url) -> Url {
+pub fn clean_url_params(url: &Url) -> Url {
+  let mut url_out = url.to_owned();
   if url.query().is_some() {
     let new_query = url
       .query_pairs()
       .filter(|q| !CLEAN_URL_PARAMS_REGEX.is_match(&q.0))
       .map(|q| format!("{}={}", q.0, q.1))
       .join("&");
-    url.set_query(Some(&new_query));
-  }
-  url
-}
-
-pub fn clean_optional_text(text: &Option<String>) -> Option<String> {
-  if let Some(text) = text {
-    let trimmed = text.trim();
-    if trimmed.is_empty() {
-      None
-    } else {
-      Some(trimmed.to_owned())
-    }
-  } else {
-    None
+    url_out.set_query(Some(&new_query));
   }
+  url_out
 }
 
 #[cfg(test)]
@@ -198,12 +186,12 @@ mod tests {
   #[test]
   fn test_clean_url_params() {
     let url = Url::parse("https://example.com/path/123?utm_content=buffercf3b2&utm_medium=social&username=randomuser&id=123").unwrap();
-    let cleaned = clean_url_params(url);
+    let cleaned = clean_url_params(&url);
     let expected = Url::parse("https://example.com/path/123?username=randomuser&id=123").unwrap();
     assert_eq!(expected.to_string(), cleaned.to_string());
 
     let url = Url::parse("https://example.com/path/123").unwrap();
-    let cleaned = clean_url_params(url.clone());
+    let cleaned = clean_url_params(&url);
     assert_eq!(url.to_string(), cleaned.to_string());
   }
 
index ff8c715268a2915fe320440e35a727a58cc4afa0..a41f46943b67303e9c65dbc591b6a8bfdce0792d 100644 (file)
@@ -109,7 +109,7 @@ fn community_updates_2020_04_02(
     let form = CommunityForm {
       name: ccommunity.name.to_owned(),
       title: ccommunity.title.to_owned(),
-      description: ccommunity.description.to_owned(),
+      description: Some(ccommunity.description.to_owned()),
       hidden: Some(false),
       actor_id: Some(community_actor_id.to_owned()),
       local: Some(ccommunity.local),