decision_cockpit 0.1.0

Layer — product decision memory with MCP tools and an embedded review dashboard
Documentation
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
}