@alanszp/express 7.0.1 → 7.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/middlewares/createContext.js +3 -3
- package/dist/middlewares/createContext.js.map +1 -1
- package/dist/middlewares/createContext.test.d.ts +1 -0
- package/dist/middlewares/createContext.test.js +50 -0
- package/dist/middlewares/createContext.test.js.map +1 -0
- package/dist/middlewares/returnInternalServerError.d.ts +3 -1
- package/dist/middlewares/returnInternalServerError.js +2 -3
- package/dist/middlewares/returnInternalServerError.js.map +1 -1
- package/dist/test/mocks/expressMocks.d.ts +2 -1
- package/dist/test/mocks/expressMocks.js +9 -3
- package/dist/test/mocks/expressMocks.js.map +1 -1
- package/package.json +2 -2
- package/src/middlewares/createContext.test.ts +85 -0
- package/src/middlewares/createContext.ts +4 -2
- package/src/middlewares/returnInternalServerError.ts +11 -9
- package/src/test/mocks/expressMocks.ts +18 -2
|
@@ -9,11 +9,11 @@ const appIdentifier_1 = require("../helpers/appIdentifier");
|
|
|
9
9
|
const lodash_1 = require("lodash");
|
|
10
10
|
function createContext(sharedContext, baseLogger, audit) {
|
|
11
11
|
return (req, _res, next) => {
|
|
12
|
-
var _a;
|
|
12
|
+
var _a, _b, _c, _d;
|
|
13
13
|
req.context = req.context || {};
|
|
14
|
-
const receivedChain = req.header("x-lifecycle-chain");
|
|
14
|
+
const receivedChain = req.header("x-lifecycle-chain") || ((_b = (_a = req.body) === null || _a === void 0 ? void 0 : _a.detail) === null || _b === void 0 ? void 0 : _b.lch);
|
|
15
15
|
const lifecycleChain = (0, lodash_1.compact)([receivedChain, (0, appIdentifier_1.appIdentifier)()]).join(",");
|
|
16
|
-
const lifecycleId =
|
|
16
|
+
const lifecycleId = req.header("x-lifecycle-id") || ((_d = (_c = req.body) === null || _c === void 0 ? void 0 : _c.detail) === null || _d === void 0 ? void 0 : _d.lid) || (0, cuid_1.default)();
|
|
17
17
|
const contextId = (0, cuid_1.default)();
|
|
18
18
|
sharedContext.run((context) => {
|
|
19
19
|
req.context.authenticated = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createContext.js","sourceRoot":"","sources":["../../src/middlewares/createContext.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAIxB,4DAAyD;AAGzD,mCAAiC;AAEjC,SAAgB,aAAa,CAC3B,aAA4B,EAC5B,UAAmB,EACnB,KAAY;IAEZ,OAAO,CAAC,GAAmB,EAAE,IAAc,EAAE,IAAkB,EAAQ,EAAE;;QACvE,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;QAEhC,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"createContext.js","sourceRoot":"","sources":["../../src/middlewares/createContext.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAIxB,4DAAyD;AAGzD,mCAAiC;AAEjC,SAAgB,aAAa,CAC3B,aAA4B,EAC5B,UAAmB,EACnB,KAAY;IAEZ,OAAO,CAAC,GAAmB,EAAE,IAAc,EAAE,IAAkB,EAAQ,EAAE;;QACvE,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;QAEhC,MAAM,aAAa,GACjB,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,KAAI,MAAA,MAAA,GAAG,CAAC,IAAI,0CAAE,MAAM,0CAAE,GAAG,CAAA,CAAC;QAC3D,MAAM,cAAc,GAAG,IAAA,gBAAO,EAAC,CAAC,aAAa,EAAE,IAAA,6BAAa,GAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE3E,MAAM,WAAW,GACf,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAI,MAAA,MAAA,GAAG,CAAC,IAAI,0CAAE,MAAM,0CAAE,GAAG,CAAA,IAAI,IAAA,cAAI,GAAE,CAAC;QAElE,MAAM,SAAS,GAAG,IAAA,cAAI,GAAE,CAAC;QAEzB,aAAa,CAAC,GAAG,CACf,CAAC,OAAO,EAAE,EAAE;YACV,GAAG,CAAC,OAAO,CAAC,aAAa,GAAG,EAAE,CAAC;YAC/B,GAAG,CAAC,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;YAC9C,GAAG,CAAC,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;YACpD,GAAG,CAAC,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YAC1C,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;YACjC,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YAClC,IAAI,EAAE,CAAC;QACT,CAAC,EACD;YACE,MAAM,EAAE,UAAU;YAClB,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE;YACxB,WAAW;YACX,cAAc;YACd,SAAS;SACV,CACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AApCD,sCAoCC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const createContext_1 = require("./createContext");
|
|
4
|
+
const shared_context_1 = require("@alanszp/shared-context");
|
|
5
|
+
const logger_1 = require("@alanszp/logger");
|
|
6
|
+
const audit_1 = require("@alanszp/audit");
|
|
7
|
+
const expressMocks_1 = require("../test/mocks/expressMocks");
|
|
8
|
+
const appIdentifier_1 = require("../helpers/appIdentifier");
|
|
9
|
+
jest.mock("@alanszp/shared-context");
|
|
10
|
+
const logger = (0, logger_1.createMockLogger)({});
|
|
11
|
+
const sharedContext = new shared_context_1.SharedContext();
|
|
12
|
+
const lifecycleId = "123";
|
|
13
|
+
const lifecycleChain = "node:test";
|
|
14
|
+
describe("CreateContext", () => {
|
|
15
|
+
describe("when has lifecycle headers", () => {
|
|
16
|
+
beforeAll(() => {
|
|
17
|
+
shared_context_1.SharedContext.mockClear();
|
|
18
|
+
});
|
|
19
|
+
it("should get lifecycle identifiers from there", () => {
|
|
20
|
+
const middleware = (0, createContext_1.createContext)(sharedContext, logger, (0, audit_1.createAuditLogger)(logger));
|
|
21
|
+
middleware((0, expressMocks_1.mockRequest)("authToken", {
|
|
22
|
+
"x-lifecycle-chain": lifecycleChain,
|
|
23
|
+
"x-lifecycle-id": lifecycleId,
|
|
24
|
+
}), (0, expressMocks_1.mockResponse)(), (0, expressMocks_1.mockNext)());
|
|
25
|
+
expect(sharedContext.run).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({
|
|
26
|
+
lifecycleId,
|
|
27
|
+
lifecycleChain: `${lifecycleChain},${(0, appIdentifier_1.appIdentifier)()}`,
|
|
28
|
+
}));
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe("when doesn't have lifecycle headers", () => {
|
|
32
|
+
beforeAll(() => {
|
|
33
|
+
shared_context_1.SharedContext.mockClear();
|
|
34
|
+
});
|
|
35
|
+
it("should get lifecycle identifiers from body.detail", () => {
|
|
36
|
+
const middleware = (0, createContext_1.createContext)(sharedContext, logger, (0, audit_1.createAuditLogger)(logger));
|
|
37
|
+
middleware((0, expressMocks_1.mockRequestWithBody)("authToken", {}, {
|
|
38
|
+
detail: {
|
|
39
|
+
lch: lifecycleChain,
|
|
40
|
+
lid: lifecycleId,
|
|
41
|
+
},
|
|
42
|
+
}), (0, expressMocks_1.mockResponse)(), (0, expressMocks_1.mockNext)());
|
|
43
|
+
expect(sharedContext.run).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({
|
|
44
|
+
lifecycleId,
|
|
45
|
+
lifecycleChain: `${lifecycleChain},${(0, appIdentifier_1.appIdentifier)()}`,
|
|
46
|
+
}));
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=createContext.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createContext.test.js","sourceRoot":"","sources":["../../src/middlewares/createContext.test.ts"],"names":[],"mappings":";;AAAA,mDAAgD;AAChD,4DAAwD;AACxD,4CAAmD;AACnD,0CAAmD;AACnD,6DAKoC;AACpC,4DAAyD;AACzD,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;AAErC,MAAM,MAAM,GAAG,IAAA,yBAAgB,EAAC,EAAE,CAAC,CAAC;AACpC,MAAM,aAAa,GAAG,IAAI,8BAAa,EAAE,CAAC;AAC1C,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,cAAc,GAAG,WAAW,CAAC;AAEnC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,SAAS,CAAC,GAAG,EAAE;YACZ,8BAA2B,CAAC,SAAS,EAAE,CAAC;QAC3C,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,UAAU,GAAG,IAAA,6BAAa,EAC9B,aAAa,EACb,MAAM,EACN,IAAA,yBAAiB,EAAC,MAAM,CAAC,CAC1B,CAAC;YAEF,UAAU,CACR,IAAA,0BAAW,EAAC,WAAW,EAAE;gBACvB,mBAAmB,EAAE,cAAc;gBACnC,gBAAgB,EAAE,WAAW;aAC9B,CAAC,EACF,IAAA,2BAAY,GAAE,EACd,IAAA,uBAAQ,GAAE,CACX,CAAC;YAEF,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC5C,MAAM,CAAC,QAAQ,EAAE,EACjB,MAAM,CAAC,gBAAgB,CAAC;gBACtB,WAAW;gBACX,cAAc,EAAE,GAAG,cAAc,IAAI,IAAA,6BAAa,GAAE,EAAE;aACvD,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;QACnD,SAAS,CAAC,GAAG,EAAE;YACZ,8BAA2B,CAAC,SAAS,EAAE,CAAC;QAC3C,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,UAAU,GAAG,IAAA,6BAAa,EAC9B,aAAa,EACb,MAAM,EACN,IAAA,yBAAiB,EAAC,MAAM,CAAC,CAC1B,CAAC;YAEF,UAAU,CACR,IAAA,kCAAmB,EACjB,WAAW,EACX,EAAE,EACF;gBACE,MAAM,EAAE;oBACN,GAAG,EAAE,cAAc;oBACnB,GAAG,EAAE,WAAW;iBACjB;aACF,CACF,EACD,IAAA,2BAAY,GAAE,EACd,IAAA,uBAAQ,GAAE,CACX,CAAC;YAEF,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC5C,MAAM,CAAC,QAAQ,EAAE,EACjB,MAAM,CAAC,gBAAgB,CAAC;gBACtB,WAAW;gBACX,cAAc,EAAE,GAAG,cAAc,IAAI,IAAA,6BAAa,GAAE,EAAE;aACvD,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
import { ErrorRequestHandler } from "express";
|
|
2
|
-
|
|
2
|
+
import { ILogger } from "@alanszp/logger";
|
|
3
|
+
export declare type GetInternalServerErrorMiddleware = (getLogger: () => ILogger) => ErrorRequestHandler;
|
|
4
|
+
export declare const returnInternalServerError: GetInternalServerErrorMiddleware;
|
|
@@ -3,10 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.returnInternalServerError = void 0;
|
|
4
4
|
const errors_1 = require("@alanszp/errors");
|
|
5
5
|
const errorView_1 = require("../views/errorView");
|
|
6
|
-
const returnInternalServerError = (error, req, res, _next) => {
|
|
7
|
-
var _a;
|
|
6
|
+
const returnInternalServerError = (getLogger) => (error, req, res, _next) => {
|
|
8
7
|
res.status(500).json((0, errorView_1.errorView)(new errors_1.InternalServerError(error)));
|
|
9
|
-
(
|
|
8
|
+
getLogger().error("error_to_client", { error });
|
|
10
9
|
};
|
|
11
10
|
exports.returnInternalServerError = returnInternalServerError;
|
|
12
11
|
//# sourceMappingURL=returnInternalServerError.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"returnInternalServerError.js","sourceRoot":"","sources":["../../src/middlewares/returnInternalServerError.ts"],"names":[],"mappings":";;;AACA,4CAAsD;AACtD,kDAA+C;
|
|
1
|
+
{"version":3,"file":"returnInternalServerError.js","sourceRoot":"","sources":["../../src/middlewares/returnInternalServerError.ts"],"names":[],"mappings":";;;AACA,4CAAsD;AACtD,kDAA+C;AAQxC,MAAM,yBAAyB,GACpC,CAAC,SAAwB,EAAE,EAAE,CAC7B,CAAC,KAAc,EAAE,GAAmB,EAAE,GAAa,EAAE,KAAmB,EAAE,EAAE;IAC1E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAA,qBAAS,EAAC,IAAI,4BAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChE,SAAS,EAAE,CAAC,KAAK,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AAClD,CAAC,CAAC;AALS,QAAA,yBAAyB,6BAKlC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference types="jest" />
|
|
2
2
|
import { GenericRequest } from "../../types/GenericRequest";
|
|
3
|
-
export declare const mockRequest: (authorization: string) => GenericRequest;
|
|
3
|
+
export declare const mockRequest: (authorization: string, otherHeaders?: Record<string, unknown> | undefined) => GenericRequest;
|
|
4
|
+
export declare const mockRequestWithBody: (authorization: string, otherHeaders?: Record<string, unknown> | undefined, body?: Record<string, unknown>) => GenericRequest;
|
|
4
5
|
export declare const mockResponse: () => any;
|
|
5
6
|
export declare const mockNext: () => jest.Mock<any, any>;
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.mockNext = exports.mockResponse = exports.mockRequest = void 0;
|
|
4
|
-
const mockRequest = (authorization) => {
|
|
3
|
+
exports.mockNext = exports.mockResponse = exports.mockRequestWithBody = exports.mockRequest = void 0;
|
|
4
|
+
const mockRequest = (authorization, otherHeaders) => {
|
|
5
|
+
const headers = Object.assign({ authorization }, otherHeaders);
|
|
5
6
|
return {
|
|
6
|
-
headers
|
|
7
|
+
headers,
|
|
7
8
|
context: { jwtUser: undefined, authenticated: [] },
|
|
9
|
+
header: (name) => headers[name],
|
|
8
10
|
};
|
|
9
11
|
};
|
|
10
12
|
exports.mockRequest = mockRequest;
|
|
13
|
+
const mockRequestWithBody = (authorization, otherHeaders, body = {}) => {
|
|
14
|
+
return Object.assign(Object.assign({}, (0, exports.mockRequest)(authorization, otherHeaders)), { body });
|
|
15
|
+
};
|
|
16
|
+
exports.mockRequestWithBody = mockRequestWithBody;
|
|
11
17
|
const mockResponse = () => {
|
|
12
18
|
const res = {};
|
|
13
19
|
res.status = jest.fn().mockReturnValue(res);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expressMocks.js","sourceRoot":"","sources":["../../../src/test/mocks/expressMocks.ts"],"names":[],"mappings":";;;AAEO,MAAM,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"expressMocks.js","sourceRoot":"","sources":["../../../src/test/mocks/expressMocks.ts"],"names":[],"mappings":";;;AAEO,MAAM,WAAW,GAAG,CACzB,aAAqB,EACrB,YAAsC,EACtB,EAAE;IAClB,MAAM,OAAO,mBAAK,aAAa,IAAK,YAAY,CAAE,CAAC;IACnD,OAAO;QACL,OAAO;QACP,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,EAAE;QAClD,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;KACf,CAAC;AAC7B,CAAC,CAAC;AAVW,QAAA,WAAW,eAUtB;AAEK,MAAM,mBAAmB,GAAG,CACjC,aAAqB,EACrB,YAAsC,EACtC,OAAgC,EAAE,EAClB,EAAE;IAClB,OAAO,gCACF,IAAA,mBAAW,EAAC,aAAa,EAAE,YAAY,CAAC,KAC3C,IAAI,GACoB,CAAC;AAC7B,CAAC,CAAC;AATW,QAAA,mBAAmB,uBAS9B;AAEK,MAAM,YAAY,GAAG,GAAG,EAAE;IAC/B,MAAM,GAAG,GAAG,EAAS,CAAC;IACtB,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC5C,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC1C,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AALW,QAAA,YAAY,gBAKvB;AAEK,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;AAA3B,QAAA,QAAQ,YAAmB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alanszp/express",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.4.1",
|
|
4
4
|
"description": "Alan's express utils and middlewares.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"typings": "dist/index.d.ts",
|
|
@@ -45,5 +45,5 @@
|
|
|
45
45
|
"cuid": "^2.1.8",
|
|
46
46
|
"lodash": "^4.17.21"
|
|
47
47
|
},
|
|
48
|
-
"gitHead": "
|
|
48
|
+
"gitHead": "84e3f67bf87c2e574df3899a8f9a95303739d423"
|
|
49
49
|
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { createContext } from "./createContext";
|
|
2
|
+
import { SharedContext } from "@alanszp/shared-context";
|
|
3
|
+
import { createMockLogger } from "@alanszp/logger";
|
|
4
|
+
import { createAuditLogger } from "@alanszp/audit";
|
|
5
|
+
import {
|
|
6
|
+
mockNext,
|
|
7
|
+
mockRequest,
|
|
8
|
+
mockRequestWithBody,
|
|
9
|
+
mockResponse,
|
|
10
|
+
} from "../test/mocks/expressMocks";
|
|
11
|
+
import { appIdentifier } from "../helpers/appIdentifier";
|
|
12
|
+
jest.mock("@alanszp/shared-context");
|
|
13
|
+
|
|
14
|
+
const logger = createMockLogger({});
|
|
15
|
+
const sharedContext = new SharedContext();
|
|
16
|
+
const lifecycleId = "123";
|
|
17
|
+
const lifecycleChain = "node:test";
|
|
18
|
+
|
|
19
|
+
describe("CreateContext", () => {
|
|
20
|
+
describe("when has lifecycle headers", () => {
|
|
21
|
+
beforeAll(() => {
|
|
22
|
+
(SharedContext as jest.Mock).mockClear();
|
|
23
|
+
});
|
|
24
|
+
it("should get lifecycle identifiers from there", () => {
|
|
25
|
+
const middleware = createContext(
|
|
26
|
+
sharedContext,
|
|
27
|
+
logger,
|
|
28
|
+
createAuditLogger(logger)
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
middleware(
|
|
32
|
+
mockRequest("authToken", {
|
|
33
|
+
"x-lifecycle-chain": lifecycleChain,
|
|
34
|
+
"x-lifecycle-id": lifecycleId,
|
|
35
|
+
}),
|
|
36
|
+
mockResponse(),
|
|
37
|
+
mockNext()
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
expect(sharedContext.run).toHaveBeenCalledWith(
|
|
41
|
+
expect.anything(),
|
|
42
|
+
expect.objectContaining({
|
|
43
|
+
lifecycleId,
|
|
44
|
+
lifecycleChain: `${lifecycleChain},${appIdentifier()}`,
|
|
45
|
+
})
|
|
46
|
+
);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
describe("when doesn't have lifecycle headers", () => {
|
|
51
|
+
beforeAll(() => {
|
|
52
|
+
(SharedContext as jest.Mock).mockClear();
|
|
53
|
+
});
|
|
54
|
+
it("should get lifecycle identifiers from body.detail", () => {
|
|
55
|
+
const middleware = createContext(
|
|
56
|
+
sharedContext,
|
|
57
|
+
logger,
|
|
58
|
+
createAuditLogger(logger)
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
middleware(
|
|
62
|
+
mockRequestWithBody(
|
|
63
|
+
"authToken",
|
|
64
|
+
{},
|
|
65
|
+
{
|
|
66
|
+
detail: {
|
|
67
|
+
lch: lifecycleChain,
|
|
68
|
+
lid: lifecycleId,
|
|
69
|
+
},
|
|
70
|
+
}
|
|
71
|
+
),
|
|
72
|
+
mockResponse(),
|
|
73
|
+
mockNext()
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
expect(sharedContext.run).toHaveBeenCalledWith(
|
|
77
|
+
expect.anything(),
|
|
78
|
+
expect.objectContaining({
|
|
79
|
+
lifecycleId,
|
|
80
|
+
lifecycleChain: `${lifecycleChain},${appIdentifier()}`,
|
|
81
|
+
})
|
|
82
|
+
);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
});
|
|
@@ -15,10 +15,12 @@ export function createContext(
|
|
|
15
15
|
return (req: GenericRequest, _res: Response, next: NextFunction): void => {
|
|
16
16
|
req.context = req.context || {};
|
|
17
17
|
|
|
18
|
-
const receivedChain =
|
|
18
|
+
const receivedChain =
|
|
19
|
+
req.header("x-lifecycle-chain") || req.body?.detail?.lch;
|
|
19
20
|
const lifecycleChain = compact([receivedChain, appIdentifier()]).join(",");
|
|
20
21
|
|
|
21
|
-
const lifecycleId =
|
|
22
|
+
const lifecycleId =
|
|
23
|
+
req.header("x-lifecycle-id") || req.body?.detail?.lid || cuid();
|
|
22
24
|
|
|
23
25
|
const contextId = cuid();
|
|
24
26
|
|
|
@@ -2,13 +2,15 @@ import { ErrorRequestHandler, NextFunction, Response } from "express";
|
|
|
2
2
|
import { InternalServerError } from "@alanszp/errors";
|
|
3
3
|
import { errorView } from "../views/errorView";
|
|
4
4
|
import { GenericRequest } from "../types/GenericRequest";
|
|
5
|
+
import { ILogger } from "@alanszp/logger";
|
|
5
6
|
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
) =>
|
|
12
|
-
res
|
|
13
|
-
|
|
14
|
-
};
|
|
7
|
+
export type GetInternalServerErrorMiddleware = (
|
|
8
|
+
getLogger: () => ILogger
|
|
9
|
+
) => ErrorRequestHandler;
|
|
10
|
+
|
|
11
|
+
export const returnInternalServerError: GetInternalServerErrorMiddleware =
|
|
12
|
+
(getLogger: () => ILogger) =>
|
|
13
|
+
(error: unknown, req: GenericRequest, res: Response, _next: NextFunction) => {
|
|
14
|
+
res.status(500).json(errorView(new InternalServerError(error)));
|
|
15
|
+
getLogger().error("error_to_client", { error });
|
|
16
|
+
};
|
|
@@ -1,9 +1,25 @@
|
|
|
1
1
|
import { GenericRequest } from "../../types/GenericRequest";
|
|
2
2
|
|
|
3
|
-
export const mockRequest = (
|
|
3
|
+
export const mockRequest = (
|
|
4
|
+
authorization: string,
|
|
5
|
+
otherHeaders?: Record<string, unknown>
|
|
6
|
+
): GenericRequest => {
|
|
7
|
+
const headers = { authorization, ...otherHeaders };
|
|
4
8
|
return {
|
|
5
|
-
headers
|
|
9
|
+
headers,
|
|
6
10
|
context: { jwtUser: undefined, authenticated: [] },
|
|
11
|
+
header: (name: string) => headers[name],
|
|
12
|
+
} as any as GenericRequest;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export const mockRequestWithBody = (
|
|
16
|
+
authorization: string,
|
|
17
|
+
otherHeaders?: Record<string, unknown>,
|
|
18
|
+
body: Record<string, unknown> = {}
|
|
19
|
+
): GenericRequest => {
|
|
20
|
+
return {
|
|
21
|
+
...mockRequest(authorization, otherHeaders),
|
|
22
|
+
body,
|
|
7
23
|
} as any as GenericRequest;
|
|
8
24
|
};
|
|
9
25
|
|