41 lines
1.7 KiB
TypeScript
41 lines
1.7 KiB
TypeScript
import { json, isHttpError } from '@sveltejs/kit';
|
|
import { authenticateBank } from '$lib/server/auth/bank.js';
|
|
import { bankRequest, type BankAction } from '$lib/server/fleet/bank.js';
|
|
import { jsonBody } from '$lib/server/request-body.js';
|
|
|
|
export async function POST({ request, params }: { request: Request; params: { action: string } }) {
|
|
const headers = { 'Cache-Control': 'no-store' };
|
|
const authentication = authenticateBank(request);
|
|
if (!authentication.ok)
|
|
return json(
|
|
{ ok: false, code: authentication.code },
|
|
{ status: authentication.status, headers }
|
|
);
|
|
if (!['balance', 'deposit', 'withdraw', 'commit', 'cancel'].includes(params.action))
|
|
return json({ ok: false, code: 'invalid_action' }, { status: 404, headers });
|
|
if (
|
|
request.headers.get('content-type')?.split(';')[0].trim().toLowerCase() !==
|
|
'application/json'
|
|
)
|
|
return json({ ok: false, code: 'invalid_content_type' }, { status: 415, headers });
|
|
let value: unknown;
|
|
try {
|
|
value = await jsonBody(request, 4096);
|
|
} catch (cause) {
|
|
if (isHttpError(cause, 413)) throw cause;
|
|
return json({ ok: false, code: 'invalid_request' }, { status: 400, headers });
|
|
}
|
|
try {
|
|
const { body, status } = bankRequest(
|
|
params.action as BankAction,
|
|
value,
|
|
authentication.server,
|
|
authentication.instanceId
|
|
);
|
|
return json(body, { status, headers });
|
|
} catch {
|
|
console.error('Bank transaction failed; request may be retried with the same identity.');
|
|
return json({ ok: false, code: 'unavailable' }, { status: 503, headers });
|
|
}
|
|
}
|