diff --git a/crates/api_crud/src/comment/create.rs b/crates/api_crud/src/comment/create.rs index 192035c58..7f7a0441a 100644 --- a/crates/api_crud/src/comment/create.rs +++ b/crates/api_crud/src/comment/create.rs @@ -18,7 +18,6 @@ use lemmy_api_common::{ use lemmy_db_schema::{ impls::actor_language::default_post_language, source::{ - actor_language::CommunityLanguage, comment::{Comment, CommentInsertForm, CommentLike, CommentLikeForm}, comment_reply::{CommentReply, CommentReplyUpdateForm}, local_site::LocalSite, @@ -88,7 +87,6 @@ pub async fn create_comment( check_comment_depth(parent)?; } - // attempt to set default language if none was provided let language_id = default_post_language( &mut context.pool(), data.language_id, @@ -97,9 +95,6 @@ pub async fn create_comment( ) .await?; - CommunityLanguage::is_allowed_community_language(&mut context.pool(), language_id, community_id) - .await?; - let comment_form = CommentInsertForm { language_id: Some(language_id), ..CommentInsertForm::new(local_user_view.person.id, data.post_id, content.clone()) diff --git a/crates/api_crud/src/comment/update.rs b/crates/api_crud/src/comment/update.rs index a86b375a0..6e320b2db 100644 --- a/crates/api_crud/src/comment/update.rs +++ b/crates/api_crud/src/comment/update.rs @@ -13,8 +13,8 @@ use lemmy_api_common::{ }, }; use lemmy_db_schema::{ + impls::actor_language::default_post_language, source::{ - actor_language::CommunityLanguage, comment::{Comment, CommentUpdateForm}, local_site::LocalSite, }, @@ -55,19 +55,13 @@ pub async fn update_comment( Err(LemmyErrorType::NoCommentEditAllowed)? } - let language_id = default_post_language( - &mut context.pool(), - data.language_id, - community_id, - local_user_view.local_user.id, - ) - .await?; - CommunityLanguage::is_allowed_community_language( - &mut context.pool(), - language_id, - orig_comment.community.id, - ) - .await?; + let language_id = default_post_language( + &mut context.pool(), + data.language_id, + orig_comment.community.id, + local_user_view.local_user.id, + ) + .await?; let slur_regex = local_site_to_slur_regex(&local_site); let url_blocklist = get_url_blocklist(&context).await?; @@ -79,7 +73,7 @@ pub async fn update_comment( let comment_id = data.comment_id; let form = CommentUpdateForm { content, - language_id: data.language_id, + language_id: Some(language_id), updated: Some(Some(naive_now())), ..Default::default() }; diff --git a/crates/api_crud/src/post/create.rs b/crates/api_crud/src/post/create.rs index 86b20cb5c..f8fdc592e 100644 --- a/crates/api_crud/src/post/create.rs +++ b/crates/api_crud/src/post/create.rs @@ -19,7 +19,6 @@ use lemmy_api_common::{ use lemmy_db_schema::{ impls::actor_language::default_post_language, source::{ - actor_language::CommunityLanguage, community::Community, local_site::LocalSite, post::{Post, PostInsertForm, PostLike, PostLikeForm}, @@ -104,7 +103,6 @@ pub async fn create_post( .await?; } - // attempt to set default language if none was provided let language_id = default_post_language( &mut context.pool(), data.language_id, @@ -113,11 +111,6 @@ pub async fn create_post( ) .await?; - // Only need to check if language is allowed in case user set it explicitly. When using default - // language, it already only returns allowed languages. - CommunityLanguage::is_allowed_community_language(&mut context.pool(), language_id, community_id) - .await?; - let scheduled_publish_time = convert_published_time(data.scheduled_publish_time, &local_user_view, &context).await?; let post_form = PostInsertForm { diff --git a/crates/api_crud/src/post/update.rs b/crates/api_crud/src/post/update.rs index 1c59d73c3..e04712664 100644 --- a/crates/api_crud/src/post/update.rs +++ b/crates/api_crud/src/post/update.rs @@ -15,8 +15,8 @@ use lemmy_api_common::{ }, }; use lemmy_db_schema::{ + impls::actor_language::default_post_language, source::{ - actor_language::CommunityLanguage, community::Community, local_site::LocalSite, post::{Post, PostUpdateForm}, @@ -101,19 +101,13 @@ pub async fn update_post( Err(LemmyErrorType::NoPostEditAllowed)? } - let language_id = default_post_language( - &mut context.pool(), - data.language_id, - community_id, - local_user_view.local_user.id, - ) - .await?; - CommunityLanguage::is_allowed_community_language( - &mut context.pool(), - language_id, - orig_post.community_id, - ) - .await?; + let language_id = default_post_language( + &mut context.pool(), + data.language_id, + orig_post.community_id, + local_user_view.local_user.id, + ) + .await?; // handle changes to scheduled_publish_time let scheduled_publish_time = match ( @@ -136,7 +130,7 @@ pub async fn update_post( body, alt_text, nsfw: data.nsfw, - language_id: data.language_id, + language_id: Some(language_id), updated: Some(Some(naive_now())), scheduled_publish_time, ..Default::default() diff --git a/crates/db_schema/src/impls/actor_language.rs b/crates/db_schema/src/impls/actor_language.rs index 964496122..0302793eb 100644 --- a/crates/db_schema/src/impls/actor_language.rs +++ b/crates/db_schema/src/impls/actor_language.rs @@ -197,7 +197,7 @@ impl SiteLanguage { impl CommunityLanguage { /// Returns true if the given language is one of configured languages for given community - pub async fn is_allowed_community_language( + async fn is_allowed_community_language( pool: &mut DbPool<'_>, for_language_id: LanguageId, for_community_id: CommunityId, @@ -324,10 +324,10 @@ pub async fn default_post_language( language_id: Option, community_id: CommunityId, local_user_id: LocalUserId, -) -> Result { +) -> LemmyResult { use crate::schema::{community_language::dsl as cl, local_user_language::dsl as ul}; let conn = &mut get_conn(pool).await?; - match language_id { + let language_id = match language_id { None | Some(LanguageId(0)) => { let mut intersection = ul::local_user_language .inner_join(cl::community_language.on(ul::language_id.eq(cl::language_id))) @@ -338,16 +338,19 @@ pub async fn default_post_language( .await?; if intersection.len() == 1 { - Ok(intersection.pop().unwrap_or(UNDETERMINED_ID)) + intersection.pop().unwrap_or(UNDETERMINED_ID) } else if intersection.len() == 2 && intersection.contains(&UNDETERMINED_ID) { intersection.retain(|i| i != &UNDETERMINED_ID); - Ok(intersection.pop().unwrap_or(UNDETERMINED_ID)) + intersection.pop().unwrap_or(UNDETERMINED_ID) } else { - Ok(UNDETERMINED_ID) + UNDETERMINED_ID } } - Some(lid) => Ok(lid), - } + Some(lid) => lid, + }; + + CommunityLanguage::is_allowed_community_language(pool, language_id, community_id).await?; + Ok(language_id) } /// If no language is given, set all languages @@ -596,7 +599,7 @@ mod tests { #[tokio::test] #[serial] - async fn test_default_post_language() -> Result<(), Error> { + async fn test_default_post_language() -> LemmyResult<()> { let pool = &build_db_pool_for_tests().await; let pool = &mut pool.into(); let (site, instance) = create_test_site(pool).await?; @@ -619,7 +622,7 @@ mod tests { LocalUserLanguage::update(pool, test_langs2, local_user.id).await?; // no overlap in user/community languages, so defaults to undetermined - let def1 = default_post_language(pool, community.id, local_user.id).await?; + let def1 = default_post_language(pool, None, community.id, local_user.id).await?; assert_eq!(UNDETERMINED_ID, def1); let ru = Language::read_id_from_code(pool, "ru").await?; @@ -632,7 +635,7 @@ mod tests { LocalUserLanguage::update(pool, test_langs3, local_user.id).await?; // this time, both have ru as common lang - let def2 = default_post_language(pool, community.id, local_user.id).await?; + let def2 = default_post_language(pool, None,community.id, local_user.id).await?; assert_eq!(ru, def2); Person::delete(pool, person.id).await?;