use sqlx::PgPool;
use uuid::Uuid;
use crate::domain::documents::{Document, DocumentSummary};
pub async fn create(
pool: &PgPool,
title: &str,
source_type: &str,
raw_text: &str,
) -> Result<Document, sqlx::Error> {
let id = Uuid::new_v4();
sqlx::query_as::<_, Document>(
r#"
INSERT INTO documents (id, title, source_type, raw_text)
VALUES ($1, $2, $3, $4)
RETURNING id, title, source_type, raw_text, status, created_at
"#,
)
.bind(id)
.bind(title)
.bind(source_type)
.bind(raw_text)
.fetch_one(pool)
.await
}
pub async fn get(pool: &PgPool, id: Uuid) -> Result<Option<Document>, sqlx::Error> {
sqlx::query_as::<_, Document>(
r#"
SELECT id, title, source_type, raw_text, status, created_at
FROM documents
WHERE id = $1
"#,
)
.bind(id)
.fetch_optional(pool)
.await
}
pub async fn list_recent(
pool: &PgPool,
status: Option<&str>,
limit: i64,
) -> Result<Vec<DocumentSummary>, sqlx::Error> {
sqlx::query_as::<_, DocumentSummary>(
r#"
SELECT id, title, source_type, status, created_at
FROM documents
WHERE ($1::text IS NULL OR status = $1)
ORDER BY created_at DESC
LIMIT $2
"#,
)
.bind(status)
.bind(limit)
.fetch_all(pool)
.await
}
pub async fn update_status(
pool: &PgPool,
id: Uuid,
status: &str,
) -> Result<Option<Document>, sqlx::Error> {
sqlx::query_as::<_, Document>(
r#"
UPDATE documents
SET status = $2
WHERE id = $1
RETURNING id, title, source_type, raw_text, status, created_at
"#,
)
.bind(id)
.bind(status)
.fetch_optional(pool)
.await
}