use sqlx::PgPool;
use uuid::Uuid;
use crate::domain::evidence::Evidence;
pub struct NewEvidence<'a> {
pub source_document_id: Option<Uuid>,
pub text: &'a str,
pub source_label: Option<&'a str>,
pub evidence_type: &'a str,
}
pub async fn create(pool: &PgPool, new: NewEvidence<'_>) -> Result<Evidence, sqlx::Error> {
let id = Uuid::new_v4();
sqlx::query_as::<_, Evidence>(
r#"
INSERT INTO evidence (id, source_document_id, text, source_label, evidence_type)
VALUES ($1, $2, $3, $4, $5)
RETURNING id, source_document_id, text, source_label, evidence_type, created_at
"#,
)
.bind(id)
.bind(new.source_document_id)
.bind(new.text)
.bind(new.source_label)
.bind(new.evidence_type)
.fetch_one(pool)
.await
}
pub async fn get(pool: &PgPool, id: Uuid) -> Result<Option<Evidence>, sqlx::Error> {
sqlx::query_as::<_, Evidence>(
r#"
SELECT id, source_document_id, text, source_label, evidence_type, created_at
FROM evidence
WHERE id = $1
"#,
)
.bind(id)
.fetch_optional(pool)
.await
}
pub async fn list(pool: &PgPool, limit: i64) -> Result<Vec<Evidence>, sqlx::Error> {
sqlx::query_as::<_, Evidence>(
r#"
SELECT id, source_document_id, text, source_label, evidence_type, created_at
FROM evidence
ORDER BY created_at DESC
LIMIT $1
"#,
)
.bind(limit)
.fetch_all(pool)
.await
}