|
Expand Up
|
@@ -293,25 +293,37 @@ impl CommunityLanguage { |
|
|
return Ok(()); |
|
|
} |
|
|
|
|
|
let form = lang_ids |
|
|
.into_iter() |
|
|
.map(|language_id| CommunityLanguageForm { |
|
|
community_id: for_community_id, |
|
|
language_id, |
|
|
}) |
|
|
.collect::<Vec<_>>(); |
|
|
|
|
|
conn |
|
|
.build_transaction() |
|
|
.run(|conn| { |
|
|
Box::pin(async move { |
|
|
use crate::schema::community_language::dsl::{community_id, community_language}; |
|
|
use diesel::result::DatabaseErrorKind::UniqueViolation; |
|
|
// Clear the current languages |
|
|
delete(community_language.filter(community_id.eq(for_community_id))) |
|
|
.execute(conn) |
|
|
.await?; |
|
|
|
|
|
for l in lang_ids { |
|
|
let form = CommunityLanguageForm { |
|
|
community_id: for_community_id, |
|
|
language_id: l, |
|
|
}; |
|
|
insert_into(community_language) |
|
|
.values(form) |
|
|
.get_result::<Self>(conn) |
|
|
.await?; |
|
|
let insert_res = insert_into(community_language) |
|
|
.values(form) |
|
|
.get_result::<Self>(conn) |
|
|
.await; |
|
|
|
|
|
if let Err(Error::DatabaseError(UniqueViolation, _info)) = insert_res { |
|
|
// race condition: this function was probably called simultaneously from another caller. ignore error |
|
|
// tracing::warn!("unique error: {_info:#?}"); |
|
|
// _info.constraint_name() should be = "community_language_community_id_language_id_key" |
|
|
return Ok(()); |
|
|
} else { |
|
|
insert_res?; |
|
|
|
|
} |
|
|
Ok(()) |
|
|
}) as _ |
|
Expand Down
|
|