Skip to content

Commit 4dfa03d

Browse files
cursoragentkubo6472
andcommitted
fix(api): add CORS-safe error handling for legacy admin orders GET
Rebased onto main (getDb binding fix landed in #422). This PR now adds only the try/catch around the admin GET handler so DB failures return JSON 500 with CORS headers instead of an opaque worker crash. - Remove duplicate getDb import after rebase onto main - Return generic 'Internal server error' to clients; log details server-side Co-authored-by: Jakub Doboš <[email protected]>
1 parent 67e9e42 commit 4dfa03d

1 file changed

Lines changed: 37 additions & 32 deletions

File tree

packages/api/src/legacyPayments.ts

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -452,39 +452,44 @@ export async function handleAdminLegacyPaymentSettings(request: Request, env: an
452452

453453
if (request.method === 'GET') {
454454
const url = new URL(request.url)
455-
if (url.searchParams.get('orders') === '1') {
456-
const limitRaw = Number.parseInt(String(url.searchParams.get('limit') ?? '25'), 10)
457-
const limit = Number.isFinite(limitRaw) && limitRaw > 0 ? Math.min(limitRaw, 100) : 25
458-
const db = getDb(env)
459-
const rows = await db.prepare(`
460-
SELECT pcs.id, pcs.user_id, pcs.plan_type, pcs.provider_checkout_id, pcs.status,
461-
pcs.created_at, pcs.completed_at, u.email
462-
FROM payment_checkout_sessions pcs
463-
LEFT JOIN users u ON u.id = pcs.user_id
464-
WHERE pcs.provider = 'legacy'
465-
ORDER BY datetime(COALESCE(pcs.updated_at, pcs.created_at)) DESC
466-
LIMIT ?
467-
`).bind(limit).all()
468-
const orders = (rows.results ?? []).map((row: any) => ({
469-
id: row.id,
470-
userId: row.user_id,
471-
email: row.email ? maskEmail(String(row.email)) : null,
472-
planType: row.plan_type,
473-
orderId: row.provider_checkout_id,
474-
status: row.status,
475-
createdAt: row.created_at,
476-
completedAt: row.completed_at,
477-
}))
478-
return jsonResponse({ orders }, 200, corsHeaders)
455+
try {
456+
if (url.searchParams.get('orders') === '1') {
457+
const limitRaw = Number.parseInt(String(url.searchParams.get('limit') ?? '25'), 10)
458+
const limit = Number.isFinite(limitRaw) && limitRaw > 0 ? Math.min(limitRaw, 100) : 25
459+
const db = getDb(env)
460+
const rows = await db.prepare(`
461+
SELECT pcs.id, pcs.user_id, pcs.plan_type, pcs.provider_checkout_id, pcs.status,
462+
pcs.created_at, pcs.completed_at, u.email
463+
FROM payment_checkout_sessions pcs
464+
LEFT JOIN users u ON u.id = pcs.user_id
465+
WHERE pcs.provider = 'legacy'
466+
ORDER BY datetime(COALESCE(pcs.updated_at, pcs.created_at)) DESC
467+
LIMIT ?
468+
`).bind(limit).all()
469+
const orders = (rows.results ?? []).map((row: any) => ({
470+
id: row.id,
471+
userId: row.user_id,
472+
email: row.email ? maskEmail(String(row.email)) : null,
473+
planType: row.plan_type,
474+
orderId: row.provider_checkout_id,
475+
status: row.status,
476+
createdAt: row.created_at,
477+
completedAt: row.completed_at,
478+
}))
479+
return jsonResponse({ orders }, 200, corsHeaders)
480+
}
481+
482+
return jsonResponse({
483+
configured: isLegacyProviderConfigured(env, 'production'),
484+
sandboxConfigured: isLegacyProviderConfigured(env, 'sandbox'),
485+
merchantId: String(env.LEGACY_ESHOP_MERCHANT_ID ?? '').trim() || null,
486+
hasApiKey: Boolean(String(env.LEGACY_ESHOP_API_KEY ?? '').trim()),
487+
hasWebhookSecret: Boolean(String(env.LEGACY_ESHOP_WEBHOOK_SECRET ?? '').trim()),
488+
}, 200, corsHeaders)
489+
} catch (err) {
490+
console.error('[admin legacy payments] GET failed', err)
491+
return jsonResponse({ error: 'Internal server error' }, 500, corsHeaders)
479492
}
480-
481-
return jsonResponse({
482-
configured: isLegacyProviderConfigured(env, 'production'),
483-
sandboxConfigured: isLegacyProviderConfigured(env, 'sandbox'),
484-
merchantId: String(env.LEGACY_ESHOP_MERCHANT_ID ?? '').trim() || null,
485-
hasApiKey: Boolean(String(env.LEGACY_ESHOP_API_KEY ?? '').trim()),
486-
hasWebhookSecret: Boolean(String(env.LEGACY_ESHOP_WEBHOOK_SECRET ?? '').trim()),
487-
}, 200, corsHeaders)
488493
}
489494

490495
return jsonResponse({ error: 'Method not allowed' }, 405, corsHeaders)

0 commit comments

Comments
 (0)