44 lines
1.4 KiB
Rust
44 lines
1.4 KiB
Rust
|
|
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<TopicAffinities> {
|
||
|
|
use schema::topic_affinities::dsl;
|
||
|
|
let mut conn = self.pool.get().await?;
|
||
|
|
let row: Option<String> = 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(())
|
||
|
|
}
|
||
|
|
}
|