Overview
The unversioned mount applies idempotency and the transaction limiter:
app.use('/api/transactions', idempotency(), transactionLimiter, transactionRoutes)
but the versioned mount only applies the limiter:
app.use('/api/v1/transactions', transactionLimiter, transactionRoutes)
The whole point of the idempotency key is to prevent duplicate payment/transaction submissions on retry — a client that retries a timed-out request against /api/v1/transactions can create duplicate transactions.
Evidence
backend/src/index.ts — the two /transactions mounts
Acceptance Criteria
Files to Modify
Priority: Medium
Overview
The unversioned mount applies idempotency and the transaction limiter:
app.use('/api/transactions', idempotency(), transactionLimiter, transactionRoutes)but the versioned mount only applies the limiter:
app.use('/api/v1/transactions', transactionLimiter, transactionRoutes)The whole point of the idempotency key is to prevent duplicate payment/transaction submissions on retry — a client that retries a timed-out request against
/api/v1/transactionscan create duplicate transactions.Evidence
backend/src/index.ts— the two/transactionsmountsAcceptance Criteria
idempotency()to the versioned mount as well/api/transactionsand/api/v1/transactionsFiles to Modify
backend/src/index.tsPriority: Medium