use crate::schema; use crate::Db; use anyhow::Result; use chrono::Utc; use diesel::prelude::*; use diesel_async::RunQueryDsl; use feedsignal_core::TopicAffinities; impl Db { pub async fn load_affinities(&self) -> Result { use schema::topic_affinities::dsl; let mut conn = self.pool.get().await?; let row: Option = dsl::topic_affinities .filter(dsl::user_id.eq("default")) .select(dsl::affinities) .first(&mut conn) .await .optional()?; Ok(match row { Some(json) => serde_json::from_str(&json)?, None => TopicAffinities::default(), }) } pub async fn save_affinities(&self, affinities: &TopicAffinities) -> Result<()> { use schema::topic_affinities::dsl; let mut conn = self.pool.get().await?; let json = serde_json::to_string(affinities)?; let updated_at = Utc::now().to_rfc3339(); diesel::insert_into(dsl::topic_affinities) .values(( dsl::user_id.eq("default"), dsl::affinities.eq(&json), dsl::updated_at.eq(&updated_at), )) .on_conflict(dsl::user_id) .do_update() .set((dsl::affinities.eq(&json), dsl::updated_at.eq(&updated_at))) .execute(&mut conn) .await?; Ok(()) } }