]> Untitled Git - lemmy.git/blob - crates/db_schema/src/impls/local_user_language.rs
4ed2b4990f5c36aa5517ccc26e29176f3f483b66
[lemmy.git] / crates / db_schema / src / impls / local_user_language.rs
1 use crate::{
2   newtypes::{LanguageId, LocalUserId},
3   source::{language::Language, local_user_language::*},
4 };
5 use diesel::{result::Error, PgConnection, RunQueryDsl, *};
6
7 impl LocalUserLanguage {
8   /// Update the user's languages.
9   ///
10   /// If no language_id vector is given, it will show all languages
11   pub fn update_user_languages(
12     conn: &mut PgConnection,
13     language_ids: Option<Vec<LanguageId>>,
14     for_local_user_id: LocalUserId,
15   ) -> Result<(), Error> {
16     use crate::schema::local_user_language::dsl::*;
17
18     // If no language is given, read all languages
19     let lang_ids = language_ids.unwrap_or(
20       Language::read_all(conn)?
21         .into_iter()
22         .map(|l| l.id)
23         .collect(),
24     );
25
26     conn.build_transaction().read_write().run(|conn| {
27       // Clear the current user languages
28       delete(local_user_language.filter(local_user_id.eq(for_local_user_id))).execute(conn)?;
29
30       for l in lang_ids {
31         let form = LocalUserLanguageForm {
32           local_user_id: for_local_user_id,
33           language_id: l,
34         };
35         insert_into(local_user_language)
36           .values(form)
37           .get_result::<Self>(conn)?;
38       }
39       Ok(())
40     })
41   }
42 }