use crate::{ newtypes::LocalSiteId, schema::tagline::dsl::{local_site_id, tagline}, source::tagline::{Tagline, TaglineForm}, utils::{get_conn, DbPool}, }; use diesel::{insert_into, result::Error, ExpressionMethods, QueryDsl}; use diesel_async::{AsyncPgConnection, RunQueryDsl}; impl Tagline { pub async fn replace( pool: &DbPool, for_local_site_id: LocalSiteId, list_content: Option>, ) -> Result, Error> { let conn = &mut get_conn(pool).await?; if let Some(list) = list_content { conn .build_transaction() .run(|conn| { Box::pin(async move { Self::clear(conn).await?; for item in list { let form = TaglineForm { local_site_id: for_local_site_id, content: item, updated: None, }; insert_into(tagline) .values(form) .get_result::(conn) .await?; } Self::get_all_conn(conn, for_local_site_id).await }) as _ }) .await } else { Self::get_all_conn(conn, for_local_site_id).await } } async fn clear(conn: &mut AsyncPgConnection) -> Result { diesel::delete(tagline).execute(conn).await } async fn get_all_conn( conn: &mut AsyncPgConnection, for_local_site_id: LocalSiteId, ) -> Result, Error> { tagline .filter(local_site_id.eq(for_local_site_id)) .get_results::(conn) .await } pub async fn get_all(pool: &DbPool, for_local_site_id: LocalSiteId) -> Result, Error> { let conn = &mut get_conn(pool).await?; Self::get_all_conn(conn, for_local_site_id).await } }