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::assumptions::Assumption;

pub struct NewAssumption<'a> {
    pub statement: &'a str,
    pub status: &'a str,
    pub confidence: &'a str,
}

pub async fn create(pool: &PgPool, new: NewAssumption<'_>) -> Result<Assumption, sqlx::Error> {
    let id = Uuid::new_v4();
    sqlx::query_as::<_, Assumption>(
        r#"
        INSERT INTO assumptions (id, statement, status, confidence)
        VALUES ($1, $2, $3, $4)
        RETURNING id, statement, status, confidence, last_validated_at, created_at, updated_at
        "#,
    )
    .bind(id)
    .bind(new.statement)
    .bind(new.status)
    .bind(new.confidence)
    .fetch_one(pool)
    .await
}

pub async fn get(pool: &PgPool, id: Uuid) -> Result<Option<Assumption>, sqlx::Error> {
    sqlx::query_as::<_, Assumption>(
        r#"
        SELECT id, statement, status, confidence, last_validated_at, created_at, updated_at
        FROM assumptions
        WHERE id = $1
        "#,
    )
    .bind(id)
    .fetch_optional(pool)
    .await
}

pub async fn list(pool: &PgPool, limit: i64) -> Result<Vec<Assumption>, sqlx::Error> {
    sqlx::query_as::<_, Assumption>(
        r#"
        SELECT id, statement, status, confidence, last_validated_at, created_at, updated_at
        FROM assumptions
        ORDER BY created_at DESC
        LIMIT $1
        "#,
    )
    .bind(limit)
    .fetch_all(pool)
    .await
}