@@ -38,4 +38,68 @@ async function getHandler(request: NextRequest) {
3838
3939
4040export const GET = compose ( withAuth ) ( getHandler ) ;
41- export const POST = compose ( withAuth ) ( addBillHandler ) ;
41+ export const POST = compose ( withAuth ) ( addBillHandler ) ;
42+ import { NextRequest , NextResponse } from 'next/server' ;
43+ import { withAuth } from '@/lib/auth' ;
44+ import { getAllBills , getBill } from '@/lib/contracts/bill-payments' ;
45+ import { jsonSuccess , jsonError } from '@/lib/api/types' ;
46+
47+ async function getHandler ( request : NextRequest , session : string ) {
48+ try {
49+ const { searchParams } = new URL ( request . url ) ;
50+ const id = searchParams . get ( 'id' ) ;
51+ const unpaidOnly = searchParams . get ( 'unpaid' ) === 'true' ;
52+ const owner = searchParams . get ( 'owner' ) ?? session ;
53+
54+ // GET /api/bills?id=1 — return single bill
55+ if ( id ) {
56+ try {
57+ const bill = await getBill ( id , owner ) ;
58+ return jsonSuccess ( { bill } ) ;
59+ } catch ( err : unknown ) {
60+ if ( err instanceof Error && err . message === 'not-found' ) {
61+ return jsonError ( 'NOT_FOUND' , 'Bill not found' ) ;
62+ }
63+ throw err ;
64+ }
65+ }
66+
67+ // GET /api/bills — return all or unpaid bills
68+ const bills = await getAllBills ( owner ) ;
69+ const result = unpaidOnly ? bills . filter ( ( b ) => b . status !== 'paid' ) : bills ;
70+ return jsonSuccess ( { bills : result } ) ;
71+ } catch ( err ) {
72+ console . error ( '[GET /api/bills]' , err ) ;
73+ return jsonError ( 'INTERNAL_ERROR' , 'Failed to fetch bills' ) ;
74+ }
75+ }
76+
77+ async function postHandler ( request : NextRequest , session : string ) {
78+ try {
79+ const body = await request . json ( ) ;
80+ const { name, amount, dueDate, recurring, frequencyDays } = body ;
81+
82+ if ( ! name || typeof name !== 'string' ) {
83+ return jsonError ( 'VALIDATION_ERROR' , 'name is required' ) ;
84+ }
85+ if ( ! ( amount > 0 ) ) {
86+ return jsonError ( 'VALIDATION_ERROR' , 'amount must be greater than 0' ) ;
87+ }
88+ if ( ! dueDate || Number . isNaN ( Date . parse ( dueDate ) ) ) {
89+ return jsonError ( 'VALIDATION_ERROR' , 'dueDate must be a valid ISO date string' ) ;
90+ }
91+ if ( recurring && ! ( frequencyDays > 0 ) ) {
92+ return jsonError ( 'VALIDATION_ERROR' , 'frequencyDays must be greater than 0 when recurring is true' ) ;
93+ }
94+
95+ return jsonSuccess ( {
96+ message : 'Validation passed. Use POST /api/bills with owner public key to build XDR.' ,
97+ } ) ;
98+ } catch ( err ) {
99+ console . error ( '[POST /api/bills]' , err ) ;
100+ return jsonError ( 'INTERNAL_ERROR' , 'Failed to process bill creation' ) ;
101+ }
102+ }
103+
104+ export const GET = withAuth ( getHandler ) ;
105+ export const POST = withAuth ( postHandler ) ;
0 commit comments