use sqlx::PgExecutor;
use crate::error::{validate_schema, Result};
pub async fn once<'c, E>(executor: E, schema: &str, consumer: &str, event_id: uuid::Uuid) -> Result<bool>
where
E: PgExecutor<'c>,
{
validate_schema(schema)?;
let done = sqlx::query(&format!(
r#"INSERT INTO {schema}.inbox_consumed (consumer, event_id)
VALUES ($1,$2) ON CONFLICT (consumer, event_id) DO NOTHING"#
))
.bind(consumer)
.bind(event_id)
.execute(executor)
.await?;
Ok(done.rows_affected() == 1)
}
pub async fn was_consumed(
pool: &sqlx::PgPool,
schema: &str,
consumer: &str,
event_id: uuid::Uuid,
) -> Result<bool> {
validate_schema(schema)?;
let n: i64 = sqlx::query_scalar(&format!(
"SELECT count(*) FROM {schema}.inbox_consumed WHERE consumer=$1 AND event_id=$2"
))
.bind(consumer)
.bind(event_id)
.fetch_one(pool)
.await?;
Ok(n > 0)
}