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(()) } }