use axum::extract::{Path, Query, State};
use axum::Json;
use serde::Deserialize;
use uuid::Uuid;
use crate::domain::documents::{Document, DocumentSummary};
use crate::error::AppResult;
use crate::services::documents as svc;
use crate::state::AppState;
#[derive(Debug, Deserialize)]
pub struct CreateDocumentBody {
pub title: String,
pub source_type: String,
pub raw_text: String,
}
#[derive(Debug, Deserialize)]
pub struct ListQuery {
pub status: Option<String>,
pub limit: Option<i64>,
}
#[derive(Debug, Deserialize)]
pub struct SetStatusBody {
pub status: String,
}
pub async fn create(
State(state): State<AppState>,
Json(body): Json<CreateDocumentBody>,
) -> AppResult<Json<Document>> {
let doc =
svc::create_document(&state.pool, &body.title, &body.source_type, &body.raw_text).await?;
Ok(Json(doc))
}
pub async fn list(
State(state): State<AppState>,
Query(q): Query<ListQuery>,
) -> AppResult<Json<Vec<DocumentSummary>>> {
let docs = svc::list_recent_documents(&state.pool, q.status.as_deref(), q.limit).await?;
Ok(Json(docs))
}
pub async fn get_one(
State(state): State<AppState>,
Path(id): Path<Uuid>,
) -> AppResult<Json<Document>> {
let doc = svc::get_document(&state.pool, id).await?;
Ok(Json(doc))
}
pub async fn set_status(
State(state): State<AppState>,
Path(id): Path<Uuid>,
Json(body): Json<SetStatusBody>,
) -> AppResult<Json<Document>> {
let doc = svc::set_document_status(&state.pool, id, &body.status).await?;
Ok(Json(doc))
}