use chrono::{DateTime, Utc};
use sqlx::PgPool;
use uuid::Uuid;
use crate::domain::decisions::Decision;
pub struct NewDecision<'a> {
pub title: &'a str,
pub summary: &'a str,
pub status: &'a str,
pub owner: Option<&'a str>,
pub rationale: Option<&'a str>,
pub decided_at: Option<DateTime<Utc>>,
}
pub async fn create(pool: &PgPool, new: NewDecision<'_>) -> Result<Decision, sqlx::Error> {
let id = Uuid::new_v4();
sqlx::query_as::<_, Decision>(
r#"
INSERT INTO decisions (id, title, summary, status, owner, rationale, decided_at)
VALUES ($1, $2, $3, $4, $5, $6, $7)
RETURNING id, title, summary, status, owner, rationale, decided_at, created_at, updated_at
"#,
)
.bind(id)
.bind(new.title)
.bind(new.summary)
.bind(new.status)
.bind(new.owner)
.bind(new.rationale)
.bind(new.decided_at)
.fetch_one(pool)
.await
}
pub async fn get(pool: &PgPool, id: Uuid) -> Result<Option<Decision>, sqlx::Error> {
sqlx::query_as::<_, Decision>(
r#"
SELECT id, title, summary, status, owner, rationale, decided_at, created_at, updated_at
FROM decisions
WHERE id = $1
"#,
)
.bind(id)
.fetch_optional(pool)
.await
}
pub async fn update_status(
pool: &PgPool,
id: Uuid,
status: &str,
) -> Result<Option<Decision>, sqlx::Error> {
sqlx::query_as::<_, Decision>(
r#"
UPDATE decisions
SET status = $2, updated_at = now()
WHERE id = $1
RETURNING id, title, summary, status, owner, rationale, decided_at, created_at, updated_at
"#,
)
.bind(id)
.bind(status)
.fetch_optional(pool)
.await
}
pub async fn list(
pool: &PgPool,
status: Option<&str>,
limit: i64,
) -> Result<Vec<Decision>, sqlx::Error> {
sqlx::query_as::<_, Decision>(
r#"
SELECT id, title, summary, status, owner, rationale, decided_at, created_at, updated_at
FROM decisions
WHERE ($1::text IS NULL OR status = $1)
ORDER BY created_at DESC
LIMIT $2
"#,
)
.bind(status)
.bind(limit)
.fetch_all(pool)
.await
}