@thisisagile/easy-express 7.0.2 → 7.2.0

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.
@@ -20,6 +20,7 @@ const toBody = ({ origin, options }) => {
20
20
  };
21
21
  const error = (e, req, res, _next) => {
22
22
  const { status, body } = toBody(easy_1.toOriginatedError(e));
23
+ easy_1.ctx.request.lastError = status.isServerError ? body.error?.errors[0]?.message : undefined;
23
24
  res.status(status.status).json(body);
24
25
  };
25
26
  exports.error = error;
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorHandler.js","sourceRoot":"","sources":["../../src/express/ErrorHandler.ts"],"names":[],"mappings":";;;AACA,2CAA0C;AAC1C,4CAkB2B;AAE3B,MAAM,UAAU,GAAG,CAAC,MAAkB,EAAE,SAAmB,EAAE,EAAY,EAAE,CAAC,CAAC;IAC3E,MAAM;IACN,IAAI,EAAE,WAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC;CACnC,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,EAAmB,EAAY,EAAE;IAChE,OAAO,aAAM,CAAgB,MAAM,CAAC;SACjC,IAAI,CACH,CAAC,CAAC,EAAE,CAAC,uBAAW,CAAC,CAAC,CAAC,EACnB,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,mBAAY,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,eAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAC/D;SACA,IAAI,CACH,CAAC,CAAC,EAAE,CAAC,gBAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EACrC,CAAC,CAAY,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,IAAI,iBAAU,CAAC,QAAQ,EAAE,CAAC,eAAQ,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAC5G;SACA,IAAI,CAEH,CAAC,CAAC,EAAE,CAAC,cAAO,CAAC,CAAC,CAAC,EACf,CAAC,CAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,iBAAU,CAAC,mBAAmB,EAAE,CAAC,eAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAChF;SACA,IAAI,CAEH,CAAC,CAAC,EAAE,CAAC,gBAAS,CAAC,CAAC,CAAC,EACjB,CAAC,CAAU,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,IAAI,iBAAU,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,CACjF;SACA,IAAI,CAEH,CAAC,CAAC,EAAE,CAAC,iBAAU,CAAC,CAAC,CAAC,EAClB,CAAC,CAAW,EAAE,EAAE,CAAC,UAAU,CAAC,iBAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAClF;SACA,IAAI,CACH,CAAC,CAAC,EAAE,CAAC,kBAAW,CAAC,CAAC,CAAC,EACnB,CAAC,CAAY,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,IAAI,iBAAU,CAAC,UAAU,EAAE,CAAC,eAAQ,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAC3G;SACA,IAAI,CAEH,CAAC,CAAC,EAAE,CAAC,aAAM,CAAC,CAAC,CAAC,EACd,CAAC,CAAW,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,IAAI,iBAAU,CAAC,UAAU,EAAE,CAAC,eAAQ,CAAC,eAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAChG;SACA,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,iBAAU,CAAC,mBAAmB,EAAE,CAAC,eAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AACzF,CAAC,CAAC;AAEK,MAAM,KAAK,GAAG,CAAC,CAAQ,EAAE,GAAoB,EAAE,GAAqB,EAAE,KAA2B,EAAQ,EAAE;IAChH,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,wBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC,CAAC;AAHW,QAAA,KAAK,SAGhB"}
1
+ {"version":3,"file":"ErrorHandler.js","sourceRoot":"","sources":["../../src/express/ErrorHandler.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ export declare class ExpressProvider implements AppProvider {
6
6
  constructor(app?: Express);
7
7
  use: (handler: Handler) => void;
8
8
  route: (service: Service, resource: Resource) => void;
9
+ private addSecurityMiddleware;
9
10
  listen: (port: number, message?: string) => void;
10
11
  protected handle: (endpoint: Endpoint, options?: VerbOptions | undefined) => RequestHandler;
11
12
  protected toResponse(res: Response, result: unknown, options: Required<VerbOptions>): void;
@@ -18,14 +18,7 @@ class ExpressProvider {
18
18
  const router = express_1.default.Router({ mergeParams: true });
19
19
  endpoints.forEach(({ endpoint, verb, requires }) => {
20
20
  console.log(verb.verb.code, route.route(service.name));
21
- const middleware = [];
22
- if (requires.token)
23
- middleware.push(SecurityHandler_1.checkToken());
24
- if (requires.scope)
25
- middleware.push(SecurityHandler_1.checkScope(requires.scope));
26
- if (requires.uc)
27
- middleware.push(SecurityHandler_1.checkUseCase(requires.uc));
28
- router[verb.verb.toString()](route.route(service.name), ...middleware, this.handle(endpoint, verb.options));
21
+ router[verb.verb.toString()](route.route(service.name), ...this.addSecurityMiddleware(requires), this.handle(endpoint, verb.options));
29
22
  });
30
23
  this.app.use(router);
31
24
  };
@@ -39,6 +32,16 @@ class ExpressProvider {
39
32
  .catch(error => next(easy_1.toOriginatedError(error, options)));
40
33
  this.app.set('trust proxy', ['loopback', 'linklocal', 'uniquelocal']);
41
34
  }
35
+ addSecurityMiddleware(requires) {
36
+ const middleware = [];
37
+ if (requires.token)
38
+ middleware.push(SecurityHandler_1.checkToken());
39
+ if (requires.scope)
40
+ middleware.push(SecurityHandler_1.checkScope(requires.scope));
41
+ if (requires.uc)
42
+ middleware.push(SecurityHandler_1.checkUseCase(requires.uc));
43
+ return middleware;
44
+ }
42
45
  toResponse(res, result, options) {
43
46
  res.status(options.onOk.status);
44
47
  res.type(options.type.code);
@@ -1 +1 @@
1
- {"version":3,"file":"ExpressProvider.js","sourceRoot":"","sources":["../../src/express/ExpressProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ExpressProvider.js","sourceRoot":"","sources":["../../src/express/ExpressProvider.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,8 @@ export declare class NamespaceContext implements RequestContext {
8
8
  set jwt(jwt: string);
9
9
  get correlationId(): Uuid;
10
10
  set correlationId(id: Uuid);
11
+ get lastError(): string | undefined;
12
+ set lastError(error: string | undefined);
11
13
  get(key: string): any;
12
14
  set<T>(key: string, value: T): T;
13
15
  readonly create: (f: () => void) => void;
@@ -28,6 +28,12 @@ class NamespaceContext {
28
28
  set correlationId(id) {
29
29
  this.namespace.set('correlationId', id);
30
30
  }
31
+ get lastError() {
32
+ return this.namespace.get('lastError');
33
+ }
34
+ set lastError(error) {
35
+ this.namespace.set('lastError', error);
36
+ }
31
37
  get(key) {
32
38
  return this.namespace.get(key);
33
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NamespaceContext.js","sourceRoot":"","sources":["../../src/types/NamespaceContext.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAG7C,MAAa,gBAAgB;IAA7B;QACmB,cAAS,GAAG,4BAAe,CAAC,SAAS,CAAC,CAAC;QAsCxC,WAAM,GAAG,CAAC,CAAa,EAAQ,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IArCC,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,KAAK,CAAC,KAAc;QACtB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,KAAiB,CAAC;IAChC,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,GAAG,CAAC,GAAW;QACjB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,aAAa,CAAC,EAAQ;QACxB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC;IAEM,GAAG,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAEM,GAAG,CAAI,GAAW,EAAE,KAAQ;QACjC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;CAGF;AAxCD,4CAwCC"}
1
+ {"version":3,"file":"NamespaceContext.js","sourceRoot":"","sources":["../../src/types/NamespaceContext.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAG7C,MAAa,gBAAgB;IAA7B;QACmB,cAAS,GAAG,4BAAe,CAAC,SAAS,CAAC,CAAC;QA8CxC,WAAM,GAAG,CAAC,CAAa,EAAQ,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IA7CC,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,KAAK,CAAC,KAAc;QACtB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,KAAiB,CAAC;IAChC,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,GAAG,CAAC,GAAW;QACjB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,aAAa,CAAC,EAAQ;QACxB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,SAAS,CAAC,KAAyB;QACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAEM,GAAG,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAEM,GAAG,CAAI,GAAW,EAAE,KAAQ;QACjC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;CAGF;AAhDD,4CAgDC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thisisagile/easy-express",
3
- "version": "7.0.2",
3
+ "version": "7.2.0",
4
4
  "description": "Straightforward library for building domain-driven microservice architectures",
5
5
  "author": "Sander Hoogendoorn",
6
6
  "license": "MIT",
@@ -31,7 +31,7 @@
31
31
  "access": "public"
32
32
  },
33
33
  "devDependencies": {
34
- "@thisisagile/easy-test": "7.0.2",
34
+ "@thisisagile/easy-test": "7.2.0",
35
35
  "@types/cls-hooked": "^4.3.3",
36
36
  "@types/form-urlencoded": "^4.4.0",
37
37
  "@types/jsonwebtoken": "^8.5.2",
@@ -41,7 +41,7 @@
41
41
  "@types/validator": "^13.1.4"
42
42
  },
43
43
  "dependencies": {
44
- "@thisisagile/easy": "7.0.2",
44
+ "@thisisagile/easy": "7.2.0",
45
45
  "@types/express": "^4.17.12",
46
46
  "cls-hooked": "^4.2.2",
47
47
  "express": "^4.17.1",
@@ -3,6 +3,7 @@ import { isAuthError } from './AuthError';
3
3
  import {
4
4
  asString,
5
5
  choose,
6
+ ctx,
6
7
  Exception,
7
8
  HttpStatus,
8
9
  isError,
@@ -64,5 +65,6 @@ const toBody = ({ origin, options }: OriginatedError): Response => {
64
65
 
65
66
  export const error = (e: Error, req: express.Request, res: express.Response, _next: express.NextFunction): void => {
66
67
  const { status, body } = toBody(toOriginatedError(e));
68
+ ctx.request.lastError = status.isServerError ? body.error?.errors[0]?.message : undefined;
67
69
  res.status(status.status).json(body);
68
70
  };
@@ -7,7 +7,7 @@ import {
7
7
  HttpStatus,
8
8
  Resource,
9
9
  rest,
10
- Route,
10
+ Route, RouteRequires,
11
11
  routes,
12
12
  Service,
13
13
  toList,
@@ -35,17 +35,20 @@ export class ExpressProvider implements AppProvider {
35
35
  endpoints.forEach(({ endpoint, verb, requires }: Route) => {
36
36
  console.log(verb.verb.code, route.route(service.name));
37
37
 
38
- const middleware: RequestHandler[] = [];
39
- if (requires.token) middleware.push(checkToken());
40
- if (requires.scope) middleware.push(checkScope(requires.scope));
41
- if (requires.uc) middleware.push(checkUseCase(requires.uc));
42
-
43
- router[verb.verb.toString() as ExpressVerb](route.route(service.name), ...middleware, this.handle(endpoint, verb.options));
38
+ router[verb.verb.toString() as ExpressVerb](route.route(service.name), ...this.addSecurityMiddleware(requires), this.handle(endpoint, verb.options));
44
39
  });
45
40
 
46
41
  this.app.use(router);
47
42
  };
48
43
 
44
+ private addSecurityMiddleware(requires: RouteRequires): RequestHandler[] {
45
+ const middleware: RequestHandler[] = [];
46
+ if (requires.token) middleware.push(checkToken());
47
+ if (requires.scope) middleware.push(checkScope(requires.scope));
48
+ if (requires.uc) middleware.push(checkUseCase(requires.uc));
49
+ return middleware;
50
+ }
51
+
49
52
  listen = (port: number, message = `Service is listening on port ${port}.`): void => {
50
53
  this.app.listen(port, () => {
51
54
  console.log(message);
@@ -32,6 +32,14 @@ export class NamespaceContext implements RequestContext {
32
32
  this.namespace.set('correlationId', id);
33
33
  }
34
34
 
35
+ get lastError(): string | undefined {
36
+ return this.namespace.get('lastError');
37
+ }
38
+
39
+ set lastError(error: string | undefined) {
40
+ this.namespace.set('lastError', error);
41
+ }
42
+
35
43
  public get(key: string): any {
36
44
  return this.namespace.get(key);
37
45
  }