feedsignal/crates/db/src/reading_events.rs

31 lines
1.1 KiB
Rust
Raw Normal View History

use crate::schema;
use crate::Db;
use anyhow::Result;
use diesel::prelude::*;
use diesel_async::RunQueryDsl;
use feedsignal_core::{ReadingEvent, ReadingOutcome};
impl Db {
pub async fn record_event(&self, event: &ReadingEvent) -> Result<()> {
use schema::reading_events::dsl;
let mut conn = self.pool.get().await?;
let (outcome, dwell) = match &event.outcome {
ReadingOutcome::Impression => ("impression", None),
ReadingOutcome::Opened { dwell_seconds } => ("opened", dwell_seconds.map(|v| v as i32)),
ReadingOutcome::Starred => ("starred", None),
ReadingOutcome::Dismissed => ("dismissed", None),
};
diesel::insert_into(dsl::reading_events)
.values((
dsl::id.eq(event.id.to_string()),
dsl::article_id.eq(event.article_id.to_string()),
dsl::occurred_at.eq(event.occurred_at.to_rfc3339()),
dsl::outcome.eq(outcome),
dsl::dwell_seconds.eq(dwell),
))
.execute(&mut conn)
.await?;
Ok(())
}
}