Implement phase 1 completion and phase 2 dynamic QR

This commit is contained in:
2026-05-26 08:06:48 +07:00
parent a152c99cce
commit 5624b92872
36 changed files with 3104 additions and 71 deletions

View File

@ -1,6 +1,7 @@
import { ApiError } from "../errors";
import { readIdempotency, writeIdempotency } from "../idempotency/idempotencyStore";
import { env } from "../../config/env";
import { successResponse } from "./errorMiddleware";
export function idempotency(options) {
return function idempotencyMiddleware(req, _res, next) {
const idempotencyKey = req.header("idempotency-key");
@ -14,7 +15,20 @@ export function idempotency(options) {
if (cached) {
const cachedPayload = cached.response ?? cached;
const cachedStatus = cached.statusCode || 200;
return _res.status(cachedStatus).json(cachedPayload);
const payload = (() => {
if (cachedPayload &&
typeof cachedPayload === "object" &&
"data" in cachedPayload &&
"request_id" in cachedPayload &&
"timestamp" in cachedPayload) {
const typed = cachedPayload;
typed.request_id = req.requestId;
typed.timestamp = new Date().toISOString();
return typed;
}
return cachedPayload;
})();
return _res.status(cachedStatus).json(payload);
}
req.body = { ...(req.body || {}), __idempotencyKey: idempotencyKey };
const originalJson = _res.json.bind(_res);
@ -25,12 +39,19 @@ export function idempotency(options) {
return originalStatus(code);
};
_res.json = function jsonWithStore(payload) {
const responsePayload = payload &&
typeof payload === "object" &&
"data" in payload &&
"request_id" in payload &&
"timestamp" in payload
? successResponse(req, payload.data)
: payload;
writeIdempotency(options.scope, idempotencyKey, {
response: payload,
response: responsePayload,
statusCode,
at: Date.now()
}, options.ttlMs || env.IDEMPOTENCY_TTL_MS);
return originalJson(payload);
return originalJson(responsePayload);
};
next();
};