Files
mymoney/src/app/api/bills/route.ts
2026-06-02 04:02:59 +02:00

47 lines
1.5 KiB
TypeScript

import { requireUser } from "@/lib/auth";
import {
createDocument,
databaseConfig,
listDocuments,
query,
updateDocument,
} from "@/lib/database/server";
import { syncBillLedger } from "@/lib/finance/ledger";
import { parseBillInput } from "@/lib/validation/bills";
import { nowFields, parseBody } from "@/lib/validation/common";
import type { Bill } from "@/types/finance";
export async function GET() {
const auth = await requireUser();
if ("response" in auth) return auth.response;
const { collections } = databaseConfig();
const result = await listDocuments<Bill>(collections.bills, [
query.equal("userId", auth.user.id),
query.orderAsc("dueDate"),
query.limit(5000),
]);
return Response.json(result.documents);
}
export async function POST(request: Request) {
const auth = await requireUser();
if ("response" in auth) return auth.response;
const parsed = await parseBody(request, parseBillInput);
if (!parsed.ok)
return Response.json({ error: parsed.error }, { status: 400 });
const { collections } = databaseConfig();
let bill = await createDocument<Bill>(collections.bills, {
...parsed.data,
userId: auth.user.id,
...nowFields(),
});
const ledger = await syncBillLedger(bill);
if (ledger && bill.linkedPaymentId !== ledger.$id) {
bill = await updateDocument<Bill>(collections.bills, bill.$id, {
linkedPaymentId: ledger.$id,
updatedAt: new Date().toISOString(),
});
}
return Response.json(bill, { status: 201 });
}