Implement phase 1 completion and phase 2 dynamic QR
This commit is contained in:
27
dist/shared/middleware/idempotency.js
vendored
27
dist/shared/middleware/idempotency.js
vendored
@ -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();
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user