import type Database from "bun:sqlite"; import type { RuntimeMode } from "../../../shared/api"; import type { Logger } from "../../logger"; import { listMaterials } from "../../db/materials"; import { createApiError, jsonResponse, parseIdFromUrl } from "../../helpers"; import { validateIdParam, validatePagination } from "../../middleware"; export function handleListMaterials(req: Request, db: Database, mode: RuntimeMode, _logger: Logger): Response { const url = new URL(req.url); const projectIdStr = parseIdFromUrl(url); const validated = validateIdParam(projectIdStr ?? "", mode); if (validated instanceof Response) return validated; const pageParam = url.searchParams.get("page"); const pageSizeParam = url.searchParams.get("pageSize"); const statusParam = url.searchParams.get("status"); const pagination = validatePagination(pageParam, pageSizeParam, mode); if (pagination instanceof Response) return pagination; const ALLOWED_STATUSES = ["pending", "processing", "review", "approved", "discarded", "failed"] as const; if (statusParam && !(ALLOWED_STATUSES as readonly string[]).includes(statusParam)) { return jsonResponse(createApiError("Invalid status parameter", 400), { mode, status: 400 }); } const result = listMaterials(db, validated.id, { page: pagination.page, pageSize: pagination.pageSize, status: (statusParam as (typeof ALLOWED_STATUSES)[number]) ?? undefined, }); return jsonResponse(result, { mode }); }