Add bd exec bridge and mutation API routes with tests
This commit is contained in:
parent
0e3815ac3c
commit
2c80265258
15 changed files with 904 additions and 5 deletions
51
src/app/api/beads/_shared.ts
Normal file
51
src/app/api/beads/_shared.ts
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
import { NextResponse } from 'next/server';
|
||||
|
||||
import { executeMutation, MutationValidationError, validateMutationPayload, type MutationOperation } from '../../../lib/mutations';
|
||||
|
||||
function badRequest(message: string, operation: MutationOperation) {
|
||||
return NextResponse.json(
|
||||
{
|
||||
ok: false,
|
||||
operation,
|
||||
error: {
|
||||
classification: 'bad_args',
|
||||
message,
|
||||
},
|
||||
},
|
||||
{ status: 400 },
|
||||
);
|
||||
}
|
||||
|
||||
export async function handleMutationRequest(request: Request, operation: MutationOperation): Promise<Response> {
|
||||
let body: unknown;
|
||||
|
||||
try {
|
||||
body = await request.json();
|
||||
} catch {
|
||||
return badRequest('Invalid JSON body.', operation);
|
||||
}
|
||||
|
||||
try {
|
||||
const payload = validateMutationPayload(operation, body);
|
||||
const result = await executeMutation(operation, payload);
|
||||
|
||||
const status = result.ok ? 200 : result.error?.classification === 'not_found' ? 404 : 400;
|
||||
return NextResponse.json(result, { status });
|
||||
} catch (error) {
|
||||
if (error instanceof MutationValidationError) {
|
||||
return badRequest(error.message, operation);
|
||||
}
|
||||
|
||||
return NextResponse.json(
|
||||
{
|
||||
ok: false,
|
||||
operation,
|
||||
error: {
|
||||
classification: 'unknown',
|
||||
message: error instanceof Error ? error.message : 'Unknown mutation error.',
|
||||
},
|
||||
},
|
||||
{ status: 500 },
|
||||
);
|
||||
}
|
||||
}
|
||||
5
src/app/api/beads/close/route.ts
Normal file
5
src/app/api/beads/close/route.ts
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
import { handleMutationRequest } from '../_shared';
|
||||
|
||||
export async function POST(request: Request): Promise<Response> {
|
||||
return handleMutationRequest(request, 'close');
|
||||
}
|
||||
5
src/app/api/beads/comment/route.ts
Normal file
5
src/app/api/beads/comment/route.ts
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
import { handleMutationRequest } from '../_shared';
|
||||
|
||||
export async function POST(request: Request): Promise<Response> {
|
||||
return handleMutationRequest(request, 'comment');
|
||||
}
|
||||
5
src/app/api/beads/create/route.ts
Normal file
5
src/app/api/beads/create/route.ts
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
import { handleMutationRequest } from '../_shared';
|
||||
|
||||
export async function POST(request: Request): Promise<Response> {
|
||||
return handleMutationRequest(request, 'create');
|
||||
}
|
||||
5
src/app/api/beads/reopen/route.ts
Normal file
5
src/app/api/beads/reopen/route.ts
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
import { handleMutationRequest } from '../_shared';
|
||||
|
||||
export async function POST(request: Request): Promise<Response> {
|
||||
return handleMutationRequest(request, 'reopen');
|
||||
}
|
||||
5
src/app/api/beads/update/route.ts
Normal file
5
src/app/api/beads/update/route.ts
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
import { handleMutationRequest } from '../_shared';
|
||||
|
||||
export async function POST(request: Request): Promise<Response> {
|
||||
return handleMutationRequest(request, 'update');
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue