Some fixes for all / missing user languages.

This commit is contained in:
Dessalines 2022-08-15 12:51:25 -04:00
parent b8ef402448
commit 763424d61e
5 changed files with 55 additions and 41 deletions

View file

@ -7,7 +7,7 @@ use lemmy_api_common::{
use lemmy_db_schema::{
source::{
local_user::{LocalUser, LocalUserForm},
local_user_language::{LocalUserLanguage, LocalUserLanguageForm},
local_user_language::LocalUserLanguage,
person::{Person, PersonForm},
site::Site,
},
@ -120,15 +120,15 @@ impl Perform for SaveUserSettings {
.map_err(|e| LemmyError::from_error_message(e, "user_already_exists"))?;
if let Some(discussion_languages) = data.discussion_languages.clone() {
let discussion_languages: Vec<LocalUserLanguageForm> = discussion_languages
.into_iter()
.map(|lang| LocalUserLanguageForm {
local_user_id,
language_id: lang,
})
.collect();
// An empty array is a "clear" / set all languages
let languages = if discussion_languages.is_empty() {
None
} else {
Some(discussion_languages)
};
blocking(context.pool(), move |conn| {
LocalUserLanguage::update_user_languages(conn, discussion_languages, local_user_id)
LocalUserLanguage::update_user_languages(conn, languages, local_user_id)
})
.await??;
}

View file

@ -47,16 +47,14 @@ where
{
let pool = pool.clone();
let blocking_span = tracing::info_span!("blocking operation");
let res = actix_web::web::block(move || {
actix_web::web::block(move || {
let entered = blocking_span.enter();
let conn = pool.get()?;
let res = (f)(&conn);
drop(entered);
Ok(res) as Result<T, LemmyError>
})
.await?;
res
.await?
}
#[tracing::instrument(skip_all)]

View file

@ -15,6 +15,7 @@ use lemmy_db_schema::{
aggregates::structs::PersonAggregates,
source::{
local_user::{LocalUser, LocalUserForm},
local_user_language::LocalUserLanguage,
person::{Person, PersonForm},
registration_application::{RegistrationApplication, RegistrationApplicationForm},
site::Site,
@ -167,10 +168,17 @@ impl PerformCrud for Register {
}
};
// Update the users languages to all by default
let local_user_id = inserted_local_user.id;
blocking(context.pool(), move |conn| {
LocalUserLanguage::update_user_languages(conn, None, local_user_id)
})
.await??;
if require_application {
// Create the registration application
let form = RegistrationApplicationForm {
local_user_id: Some(inserted_local_user.id),
local_user_id: Some(local_user_id),
// We already made sure answer was not null above
answer: data.answer.to_owned(),
..RegistrationApplicationForm::default()

View file

@ -1,22 +1,40 @@
use crate::{newtypes::LocalUserId, source::local_user_language::*};
use crate::{
newtypes::{LanguageId, LocalUserId},
source::{language::Language, local_user_language::*},
};
use diesel::{result::Error, PgConnection, RunQueryDsl, *};
impl LocalUserLanguage {
/// Update the user's languages.
///
/// If no language_id vector is given, it will show all languages
pub fn update_user_languages(
conn: &PgConnection,
languages: Vec<LocalUserLanguageForm>,
language_ids: Option<Vec<LanguageId>>,
for_local_user_id: LocalUserId,
) -> Result<(), Error> {
use crate::schema::local_user_language::dsl::*;
conn.build_transaction().read_write().run(|| {
// Clear the current user languages
delete(local_user_language.filter(local_user_id.eq(for_local_user_id))).execute(conn)?;
for l in languages {
// If no language is given, read all languages
let lang_ids = language_ids.unwrap_or(
Language::read_all(conn)?
.into_iter()
.map(|l| l.id)
.collect(),
);
for l in lang_ids {
let form = LocalUserLanguageForm {
local_user_id: for_local_user_id,
language_id: l,
};
insert_into(local_user_language)
.values(l)
.values(form)
.get_result::<Self>(conn)?;
}
Ok(())
})
}
}

View file

@ -525,7 +525,7 @@ mod tests {
community_block::{CommunityBlock, CommunityBlockForm},
language::Language,
local_user::{LocalUser, LocalUserForm},
local_user_language::{LocalUserLanguage, LocalUserLanguageForm},
local_user_language::LocalUserLanguage,
person::*,
person_block::{PersonBlock, PersonBlockForm},
post::*,
@ -897,6 +897,9 @@ mod tests {
let local_user = LocalUserView::read(&conn, local_user.id).unwrap();
let local_user_id = local_user.local_user.id;
// Update the users languages to all
LocalUserLanguage::update_user_languages(&conn, None, local_user_id).unwrap();
let post_listings_all = PostQueryBuilder::create(&conn)
.sort(SortType::New)
.set_params_for_user(&Some(local_user.clone()))
@ -907,16 +910,7 @@ mod tests {
assert_eq!(4, post_listings_all.len());
let french_id = Language::read_id_from_code(&conn, "fr").unwrap();
let language_form_fr = LocalUserLanguageForm {
local_user_id,
language_id: french_id,
};
LocalUserLanguage::update_user_languages(
&conn,
vec![language_form_fr.clone()],
local_user_id,
)
.unwrap();
LocalUserLanguage::update_user_languages(&conn, Some(vec![french_id]), local_user_id).unwrap();
let post_listing_french = PostQueryBuilder::create(&conn)
.sort(SortType::New)
@ -929,13 +923,9 @@ mod tests {
assert_eq!(french_id, post_listing_french[0].post.language_id);
let undetermined_id = Language::read_id_from_code(&conn, "und").unwrap();
let language_form_und = LocalUserLanguageForm {
local_user_id,
language_id: undetermined_id,
};
LocalUserLanguage::update_user_languages(
&conn,
vec![language_form_fr, language_form_und],
Some(vec![french_id, undetermined_id]),
local_user_id,
)
.unwrap();