@grandlinex/kernel 0.32.0 → 0.32.11

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.
Files changed (35) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/cjs/Kernel.d.ts +4 -1
  3. package/dist/cjs/Kernel.js +4 -0
  4. package/dist/cjs/actions/ApiAuthTestAction.d.ts +2 -6
  5. package/dist/cjs/actions/ApiAuthTestAction.js +26 -7
  6. package/dist/cjs/actions/ApiVersionAction.d.ts +3 -7
  7. package/dist/cjs/actions/ApiVersionAction.js +36 -9
  8. package/dist/cjs/actions/GetTokenAction.d.ts +3 -3
  9. package/dist/cjs/actions/GetTokenAction.js +48 -5
  10. package/dist/cjs/classes/BaseAction.d.ts +2 -4
  11. package/dist/cjs/classes/BaseAction.js +48 -3
  12. package/dist/cjs/classes/BaseAuthProvider.js +3 -1
  13. package/dist/cjs/classes/BaseEndpoint.d.ts +0 -2
  14. package/dist/cjs/classes/BaseEndpoint.js +1 -2
  15. package/dist/cjs/index.d.ts +1 -0
  16. package/dist/cjs/index.js +1 -0
  17. package/dist/cjs/lib/express.d.ts +8 -0
  18. package/dist/cjs/lib/index.d.ts +4 -3
  19. package/dist/mjs/Kernel.d.ts +4 -1
  20. package/dist/mjs/Kernel.js +4 -0
  21. package/dist/mjs/actions/ApiAuthTestAction.d.ts +2 -6
  22. package/dist/mjs/actions/ApiAuthTestAction.js +27 -7
  23. package/dist/mjs/actions/ApiVersionAction.d.ts +3 -7
  24. package/dist/mjs/actions/ApiVersionAction.js +38 -10
  25. package/dist/mjs/actions/GetTokenAction.d.ts +3 -3
  26. package/dist/mjs/actions/GetTokenAction.js +50 -6
  27. package/dist/mjs/classes/BaseAction.d.ts +2 -4
  28. package/dist/mjs/classes/BaseAction.js +48 -3
  29. package/dist/mjs/classes/BaseAuthProvider.js +3 -1
  30. package/dist/mjs/classes/BaseEndpoint.d.ts +0 -2
  31. package/dist/mjs/index.d.ts +1 -0
  32. package/dist/mjs/index.js +1 -0
  33. package/dist/mjs/lib/express.d.ts +8 -0
  34. package/dist/mjs/lib/index.d.ts +4 -3
  35. package/package.json +28 -27
package/CHANGELOG.md CHANGED
@@ -1,6 +1,15 @@
1
1
  # Changelog
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
+ ## [v0.32.11] - 2024-07-13
5
+ ### Changed
6
+ - Update Deps
7
+ - Error Handling for BaseApiAction
8
+
9
+ ## [v0.32.10] - 2023-10-06
10
+ ### Changed
11
+ - Breaking Change: BaseApiAction now use XActionEvent
12
+
4
13
  ## [v0.31.1] - 2023-07-07
5
14
  ### Added
6
15
  - @/token pass the token body to jwt generator function
@@ -1,4 +1,4 @@
1
- import { CoreLogger, CoreKernel } from '@grandlinex/core';
1
+ import { CoreKernel, CoreLogger } from '@grandlinex/core';
2
2
  import { ICClient, IKernel } from './lib/index.js';
3
3
  import { XRequest } from './lib/express.js';
4
4
  /**
@@ -6,6 +6,7 @@ import { XRequest } from './lib/express.js';
6
6
  */
7
7
  export default class Kernel extends CoreKernel<ICClient> implements IKernel {
8
8
  private expressPort;
9
+ private readonly apiVersion;
9
10
  /**
10
11
  * Default Constructor
11
12
  * @param options App Name
@@ -13,6 +14,7 @@ export default class Kernel extends CoreKernel<ICClient> implements IKernel {
13
14
  constructor(options: {
14
15
  appName: string;
15
16
  appCode: string;
17
+ apiVersion?: number;
16
18
  pathOverride?: string;
17
19
  portOverride?: number;
18
20
  envFilePath?: string;
@@ -21,6 +23,7 @@ export default class Kernel extends CoreKernel<ICClient> implements IKernel {
21
23
  });
22
24
  getAppServerPort(): number;
23
25
  setAppServerPort(port: number): void;
26
+ getApiVersion(): number;
24
27
  responseCodeFunction(data: {
25
28
  code: number;
26
29
  req: XRequest;
@@ -16,6 +16,7 @@ class Kernel extends core_1.CoreKernel {
16
16
  */
17
17
  constructor(options) {
18
18
  super({ ...options });
19
+ this.apiVersion = options.apiVersion ?? 1;
19
20
  this.setBaseModule(new KernelModule_js_1.default(this));
20
21
  if (options.portOverride) {
21
22
  this.debug(`use custiom api port @ ${options.portOverride}`);
@@ -35,6 +36,9 @@ class Kernel extends core_1.CoreKernel {
35
36
  setAppServerPort(port) {
36
37
  this.expressPort = port;
37
38
  }
39
+ getApiVersion() {
40
+ return this.apiVersion;
41
+ }
38
42
  responseCodeFunction(data) {
39
43
  const { code } = data;
40
44
  if (code < 200 || code >= 300) {
@@ -1,11 +1,7 @@
1
1
  import { IBaseKernelModule } from '../lib/index.js';
2
2
  import { BaseApiAction, JwtToken } from '../classes/index.js';
3
- import { XRequest, XResponse } from '../lib/express.js';
4
- /**
5
- * @name ApiAuthTestAction
6
- *
7
- */
3
+ import { XActionEvent } from '../lib/express.js';
8
4
  export default class ApiAuthTestAction extends BaseApiAction {
9
5
  constructor(module: IBaseKernelModule<any, any, any, any>);
10
- handler(req: XRequest, res: XResponse, next: () => void, data: JwtToken): Promise<void>;
6
+ handler({ data, res }: XActionEvent<JwtToken>): Promise<void>;
11
7
  }
@@ -1,18 +1,37 @@
1
1
  "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
+ const swagger_mate_1 = require("@grandlinex/swagger-mate");
3
13
  const index_js_1 = require("../classes/index.js");
4
- /**
5
- * @name ApiAuthTestAction
6
- *
7
- */
8
- class ApiAuthTestAction extends index_js_1.BaseApiAction {
14
+ let ApiAuthTestAction = class ApiAuthTestAction extends index_js_1.BaseApiAction {
9
15
  constructor(module) {
10
16
  super('GET', '/test/auth', module);
11
17
  this.handler = this.handler.bind(this);
12
18
  }
13
- async handler(req, res, next, data) {
19
+ async handler({ data, res }) {
14
20
  this.debug(data.userid);
15
21
  res.status(200).send("It work's");
16
22
  }
17
- }
23
+ };
24
+ ApiAuthTestAction = __decorate([
25
+ (0, swagger_mate_1.SPath)({
26
+ '/test/auth': {
27
+ get: {
28
+ operationId: 'testAuth',
29
+ summary: 'Test user auth',
30
+ tags: ['kernel'],
31
+ responses: swagger_mate_1.SPathUtil.defaultResponse('200', '403'),
32
+ },
33
+ },
34
+ }),
35
+ __metadata("design:paramtypes", [Object])
36
+ ], ApiAuthTestAction);
18
37
  exports.default = ApiAuthTestAction;
@@ -1,11 +1,7 @@
1
1
  import { IBaseKernelModule } from '../lib/index.js';
2
- import { BaseApiAction, IExtensionInterface } from '../classes/index.js';
3
- import { XRequest, XResponse } from '../lib/express.js';
4
- /**
5
- * @name ApiVersionAction
6
- *
7
- */
2
+ import { BaseApiAction } from '../classes/index.js';
3
+ import { XActionEvent } from '../lib/express.js';
8
4
  export default class ApiVersionAction extends BaseApiAction {
9
5
  constructor(module: IBaseKernelModule);
10
- handler(req: XRequest, res: XResponse, next: () => void, data: any, ex: IExtensionInterface): Promise<void>;
6
+ handler({ res, extension }: XActionEvent): Promise<void>;
11
7
  }
@@ -1,19 +1,46 @@
1
1
  "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
+ const swagger_mate_1 = require("@grandlinex/swagger-mate");
3
13
  const index_js_1 = require("../classes/index.js");
4
- /**
5
- * @name ApiVersionAction
6
- *
7
- */
8
- class ApiVersionAction extends index_js_1.BaseApiAction {
14
+ let ApiVersionAction = class ApiVersionAction extends index_js_1.BaseApiAction {
9
15
  constructor(module) {
10
16
  super('GET', '/version', module);
11
17
  this.handler = this.handler.bind(this);
12
18
  this.setMode(index_js_1.ActionMode.DMZ);
13
19
  }
14
- async handler(req, res, next, data, ex) {
15
- ex.done();
16
- res.status(200).send({ api: 1 });
20
+ async handler({ res, extension }) {
21
+ extension.done();
22
+ res.status(200).send({ api: this.getKernel().getApiVersion() });
17
23
  }
18
- }
24
+ };
25
+ ApiVersionAction = __decorate([
26
+ (0, swagger_mate_1.SPath)({
27
+ '/version': {
28
+ get: {
29
+ operationId: 'getVersion',
30
+ summary: 'Get API version',
31
+ tags: ['kernel'],
32
+ responses: swagger_mate_1.SPathUtil.jsonResponse('200', {
33
+ type: 'object',
34
+ properties: {
35
+ api: {
36
+ type: 'number',
37
+ },
38
+ },
39
+ required: ['api'],
40
+ }, false, '403'),
41
+ },
42
+ },
43
+ }),
44
+ __metadata("design:paramtypes", [Object])
45
+ ], ApiVersionAction);
19
46
  exports.default = ApiVersionAction;
@@ -1,11 +1,11 @@
1
1
  import { IBaseKernelModule } from '../lib/index.js';
2
- import { BaseApiAction, IExtensionInterface } from '../classes/index.js';
3
- import { XRequest, XResponse } from '../lib/express.js';
2
+ import { BaseApiAction, JwtToken } from '../classes/index.js';
3
+ import { XActionEvent } from '../lib/express.js';
4
4
  export default class GetTokenAction extends BaseApiAction {
5
5
  /**
6
6
  *
7
7
  * @param module Parent Module
8
8
  */
9
9
  constructor(module: IBaseKernelModule<any, any, any, any>);
10
- handler(req: XRequest, res: XResponse, next: () => void, data: any, ex: IExtensionInterface): Promise<void>;
10
+ handler({ req, res, extension, }: XActionEvent<JwtToken>): Promise<void>;
11
11
  }
@@ -1,7 +1,17 @@
1
1
  "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
+ const swagger_mate_1 = require("@grandlinex/swagger-mate");
3
13
  const index_js_1 = require("../classes/index.js");
4
- class GetTokenAction extends index_js_1.BaseApiAction {
14
+ let GetTokenAction = class GetTokenAction extends index_js_1.BaseApiAction {
5
15
  /**
6
16
  *
7
17
  * @param module Parent Module
@@ -11,7 +21,7 @@ class GetTokenAction extends index_js_1.BaseApiAction {
11
21
  this.handler = this.handler.bind(this);
12
22
  this.setMode(index_js_1.ActionMode.DMZ);
13
23
  }
14
- async handler(req, res, next, data, ex) {
24
+ async handler({ req, res, extension, }) {
15
25
  const cc = this.getKernel().getCryptoClient();
16
26
  if (!req.body.token) {
17
27
  res.status(400).send('no token');
@@ -22,18 +32,51 @@ class GetTokenAction extends index_js_1.BaseApiAction {
22
32
  return;
23
33
  }
24
34
  const { username, token } = req.body;
25
- const valid = await ex.timing.startFunc('validation', () => cc.apiTokenValidation(username, token, 'api'));
35
+ const valid = await extension.timing.startFunc('validation', () => cc.apiTokenValidation(username, token, 'api'));
26
36
  if (valid.valid && valid.userId) {
27
37
  const jwt = await cc.jwtGenerateAccessToken({
28
38
  userid: valid.userId,
29
39
  username,
30
40
  }, req.body);
31
- ex.done();
41
+ extension.done();
32
42
  res.status(200).send({ token: jwt });
33
43
  }
34
44
  else {
35
45
  res.status(403).send('no no no ...');
36
46
  }
37
47
  }
38
- }
48
+ };
49
+ GetTokenAction = __decorate([
50
+ (0, swagger_mate_1.SPath)({
51
+ '/token': {
52
+ post: {
53
+ operationId: 'getToken',
54
+ summary: 'Get API token',
55
+ tags: ['kernel'],
56
+ requestBody: swagger_mate_1.SPathUtil.jsonBody({
57
+ type: 'object',
58
+ properties: {
59
+ username: {
60
+ type: 'string',
61
+ },
62
+ token: {
63
+ type: 'string',
64
+ },
65
+ },
66
+ required: ['username', 'token'],
67
+ }),
68
+ responses: swagger_mate_1.SPathUtil.jsonResponse('200', {
69
+ type: 'object',
70
+ properties: {
71
+ token: {
72
+ type: 'string',
73
+ },
74
+ },
75
+ required: ['token'],
76
+ }, false, '403'),
77
+ },
78
+ },
79
+ }),
80
+ __metadata("design:paramtypes", [Object])
81
+ ], GetTokenAction);
39
82
  exports.default = GetTokenAction;
@@ -1,8 +1,6 @@
1
1
  import { CoreAction, IDataBase } from '@grandlinex/core';
2
2
  import { IBaseAction, IBaseCache, IBaseClient, IBaseKernelModule, IBasePresenter, IKernel } from '../lib/index.js';
3
- import { JwtToken } from './BaseAuthProvider.js';
4
- import { IExtensionInterface } from './timing/index.js';
5
- import { XNextFc, XRequest, XResponse } from '../lib/express.js';
3
+ import { XActionEvent, XRequest, XResponse } from '../lib/express.js';
6
4
  export declare enum ActionMode {
7
5
  'DEFAULT' = 0,
8
6
  'DMZ' = 1,
@@ -12,7 +10,7 @@ export default abstract class BaseAction<K extends IKernel = IKernel, T extends
12
10
  mode: ActionMode;
13
11
  forceDebug: boolean;
14
12
  constructor(chanel: string, module: IBaseKernelModule<K, T, P, C, E>);
15
- abstract handler(req: XRequest, res: XResponse, next: XNextFc, data: JwtToken | null, extension: IExtensionInterface): Promise<void>;
13
+ abstract handler(event: XActionEvent): Promise<void>;
16
14
  secureHandler(req: XRequest, res: XResponse, next: () => void): Promise<void>;
17
15
  setMode(mode: ActionMode): void;
18
16
  abstract register(): void;
@@ -32,16 +32,61 @@ class BaseAction extends core_1.CoreAction {
32
32
  }
33
33
  if (this.mode === ActionMode.DMZ) {
34
34
  auth.stop();
35
- await this.handler(req, res, next, null, extension);
35
+ try {
36
+ await this.handler({
37
+ res,
38
+ req,
39
+ next,
40
+ data: null,
41
+ extension,
42
+ });
43
+ }
44
+ catch (e) {
45
+ this.error(e);
46
+ this.error(e?.message);
47
+ if (!res.headersSent) {
48
+ res.sendStatus(500);
49
+ }
50
+ }
36
51
  return;
37
52
  }
38
53
  const dat = await cc.bearerTokenValidation(req);
39
54
  auth.stop();
40
55
  if (dat && typeof dat !== 'number') {
41
- await this.handler(req, res, next, dat, extension);
56
+ try {
57
+ await this.handler({
58
+ res,
59
+ req,
60
+ next,
61
+ data: dat,
62
+ extension,
63
+ });
64
+ }
65
+ catch (e) {
66
+ this.error(e);
67
+ this.error(e?.message);
68
+ if (!res.headersSent) {
69
+ res.sendStatus(500);
70
+ }
71
+ }
42
72
  }
43
73
  else if (this.mode === ActionMode.DMZ_WITH_USER) {
44
- await this.handler(req, res, next, null, extension);
74
+ try {
75
+ await this.handler({
76
+ res,
77
+ req,
78
+ next,
79
+ data: null,
80
+ extension,
81
+ });
82
+ }
83
+ catch (e) {
84
+ this.error(e);
85
+ this.error(e?.message);
86
+ if (!res.headersSent) {
87
+ res.sendStatus(500);
88
+ }
89
+ }
45
90
  }
46
91
  else if (dat) {
47
92
  res.sendStatus(dat);
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  class BaseAuthProvider {
4
- async jwtAddData(token, extend) {
4
+ async jwtAddData(token,
5
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
6
+ extend) {
5
7
  return token;
6
8
  }
7
9
  }
@@ -1,5 +1,3 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
1
  import express, { Express } from 'express';
4
2
  import http from 'http';
5
3
  import { CorePresenter, IDataBase } from '@grandlinex/core';
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.keepRawBody = void 0;
6
+ exports.keepRawBody = keepRawBody;
7
7
  const express_1 = __importDefault(require("express"));
8
8
  const http_1 = __importDefault(require("http"));
9
9
  const body_parser_1 = __importDefault(require("body-parser"));
@@ -20,7 +20,6 @@ function keepRawBody(req, res, buf, encoding) {
20
20
  }
21
21
  }
22
22
  }
23
- exports.keepRawBody = keepRawBody;
24
23
  class BaseEndpoint extends core_1.CorePresenter {
25
24
  constructor(chanel, module, port) {
26
25
  super(`endpoint-${chanel}`, module);
@@ -11,5 +11,6 @@ export * from './modules/crypto/index.js';
11
11
  export * from './lib/index.js';
12
12
  export * from './lib/express.js';
13
13
  export * from '@grandlinex/core';
14
+ export * from '@grandlinex/swagger-mate';
14
15
  export { KernelModule, Kernel };
15
16
  export default Kernel;
package/dist/cjs/index.js CHANGED
@@ -33,4 +33,5 @@ __exportStar(require("./modules/crypto/index.js"), exports);
33
33
  __exportStar(require("./lib/index.js"), exports);
34
34
  __exportStar(require("./lib/express.js"), exports);
35
35
  __exportStar(require("@grandlinex/core"), exports);
36
+ __exportStar(require("@grandlinex/swagger-mate"), exports);
36
37
  exports.default = Kernel_js_1.default;
@@ -1,6 +1,14 @@
1
1
  import express from 'express';
2
+ import { IExtensionInterface, JwtToken } from '../classes/index.js';
2
3
  export type XRequest = express.Request & {
3
4
  rawBody?: string | null;
4
5
  };
5
6
  export type XResponse = express.Response;
6
7
  export type XNextFc = express.NextFunction;
8
+ export type XActionEvent<G = JwtToken | null> = {
9
+ req: XRequest;
10
+ res: XResponse;
11
+ next: XNextFc;
12
+ data: G;
13
+ extension: IExtensionInterface;
14
+ };
@@ -1,8 +1,8 @@
1
1
  import { ICoreAction, ICoreBridge, ICoreCache, ICoreCClient, ICoreClient, ICoreElement, ICoreKernel, ICoreKernelModule, ICorePresenter, ICoreService, IDataBase } from '@grandlinex/core';
2
2
  import express from 'express';
3
3
  import * as jwt from 'jsonwebtoken';
4
- import { IAuthProvider, JwtToken, IExtensionInterface, JwtExtend } from '../classes/index.js';
5
- import { XNextFc, XRequest, XResponse } from './express.js';
4
+ import { IAuthProvider, JwtExtend, JwtToken } from '../classes/index.js';
5
+ import { XActionEvent, XRequest } from './express.js';
6
6
  export type ActionTypes = 'POST' | 'GET' | 'USE' | 'PATCH' | 'DELETE';
7
7
  export interface ICClient<T extends JwtExtend = JwtExtend> extends ICoreCClient {
8
8
  setAuthProvider(provider: IAuthProvider<T>): boolean;
@@ -18,6 +18,7 @@ export interface ICClient<T extends JwtExtend = JwtExtend> extends ICoreCClient
18
18
  }
19
19
  export interface IKernel<T extends JwtExtend = JwtExtend> extends ICoreKernel<ICClient<T>> {
20
20
  getAppServerPort(): number;
21
+ getApiVersion(): number;
21
22
  setAppServerPort(port: number): void;
22
23
  responseCodeFunction(data: {
23
24
  code: number;
@@ -32,5 +33,5 @@ export type IBaseBrige = ICoreBridge;
32
33
  export type IBaseCache<K extends IKernel = IKernel, T extends IDataBase<any, any> | null = any, P extends IBaseClient | null = any, C extends IBaseCache | null = any, E extends IBasePresenter | null = any> = ICoreCache<K, T, P, C, E>;
33
34
  export type IBaseElement<K extends IKernel = IKernel, T extends IDataBase<any, any> | null = any, P extends IBaseClient | null = any, C extends IBaseCache | null = any, E extends IBasePresenter | null = any> = ICoreElement<K, T, P, C, E>;
34
35
  export interface IBaseAction<K extends IKernel = IKernel, T extends IDataBase<any, any> | null = any, P extends IBaseClient | null = any, C extends IBaseCache | null = any, E extends IBasePresenter | null = any> extends ICoreAction<K, T, P, C, E> {
35
- handler(req: XRequest, res: XResponse, next: XNextFc, data: JwtToken | null, extension: IExtensionInterface): Promise<void>;
36
+ handler(event: XActionEvent): Promise<void>;
36
37
  }
@@ -1,4 +1,4 @@
1
- import { CoreLogger, CoreKernel } from '@grandlinex/core';
1
+ import { CoreKernel, CoreLogger } from '@grandlinex/core';
2
2
  import { ICClient, IKernel } from './lib/index.js';
3
3
  import { XRequest } from './lib/express.js';
4
4
  /**
@@ -6,6 +6,7 @@ import { XRequest } from './lib/express.js';
6
6
  */
7
7
  export default class Kernel extends CoreKernel<ICClient> implements IKernel {
8
8
  private expressPort;
9
+ private readonly apiVersion;
9
10
  /**
10
11
  * Default Constructor
11
12
  * @param options App Name
@@ -13,6 +14,7 @@ export default class Kernel extends CoreKernel<ICClient> implements IKernel {
13
14
  constructor(options: {
14
15
  appName: string;
15
16
  appCode: string;
17
+ apiVersion?: number;
16
18
  pathOverride?: string;
17
19
  portOverride?: number;
18
20
  envFilePath?: string;
@@ -21,6 +23,7 @@ export default class Kernel extends CoreKernel<ICClient> implements IKernel {
21
23
  });
22
24
  getAppServerPort(): number;
23
25
  setAppServerPort(port: number): void;
26
+ getApiVersion(): number;
24
27
  responseCodeFunction(data: {
25
28
  code: number;
26
29
  req: XRequest;
@@ -11,6 +11,7 @@ export default class Kernel extends CoreKernel {
11
11
  */
12
12
  constructor(options) {
13
13
  super({ ...options });
14
+ this.apiVersion = options.apiVersion ?? 1;
14
15
  this.setBaseModule(new KernelModule(this));
15
16
  if (options.portOverride) {
16
17
  this.debug(`use custiom api port @ ${options.portOverride}`);
@@ -30,6 +31,9 @@ export default class Kernel extends CoreKernel {
30
31
  setAppServerPort(port) {
31
32
  this.expressPort = port;
32
33
  }
34
+ getApiVersion() {
35
+ return this.apiVersion;
36
+ }
33
37
  responseCodeFunction(data) {
34
38
  const { code } = data;
35
39
  if (code < 200 || code >= 300) {
@@ -1,11 +1,7 @@
1
1
  import { IBaseKernelModule } from '../lib/index.js';
2
2
  import { BaseApiAction, JwtToken } from '../classes/index.js';
3
- import { XRequest, XResponse } from '../lib/express.js';
4
- /**
5
- * @name ApiAuthTestAction
6
- *
7
- */
3
+ import { XActionEvent } from '../lib/express.js';
8
4
  export default class ApiAuthTestAction extends BaseApiAction {
9
5
  constructor(module: IBaseKernelModule<any, any, any, any>);
10
- handler(req: XRequest, res: XResponse, next: () => void, data: JwtToken): Promise<void>;
6
+ handler({ data, res }: XActionEvent<JwtToken>): Promise<void>;
11
7
  }
@@ -1,15 +1,35 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { SPath, SPathUtil } from '@grandlinex/swagger-mate';
1
11
  import { BaseApiAction } from '../classes/index.js';
2
- /**
3
- * @name ApiAuthTestAction
4
- *
5
- */
6
- export default class ApiAuthTestAction extends BaseApiAction {
12
+ let ApiAuthTestAction = class ApiAuthTestAction extends BaseApiAction {
7
13
  constructor(module) {
8
14
  super('GET', '/test/auth', module);
9
15
  this.handler = this.handler.bind(this);
10
16
  }
11
- async handler(req, res, next, data) {
17
+ async handler({ data, res }) {
12
18
  this.debug(data.userid);
13
19
  res.status(200).send("It work's");
14
20
  }
15
- }
21
+ };
22
+ ApiAuthTestAction = __decorate([
23
+ SPath({
24
+ '/test/auth': {
25
+ get: {
26
+ operationId: 'testAuth',
27
+ summary: 'Test user auth',
28
+ tags: ['kernel'],
29
+ responses: SPathUtil.defaultResponse('200', '403'),
30
+ },
31
+ },
32
+ }),
33
+ __metadata("design:paramtypes", [Object])
34
+ ], ApiAuthTestAction);
35
+ export default ApiAuthTestAction;
@@ -1,11 +1,7 @@
1
1
  import { IBaseKernelModule } from '../lib/index.js';
2
- import { BaseApiAction, IExtensionInterface } from '../classes/index.js';
3
- import { XRequest, XResponse } from '../lib/express.js';
4
- /**
5
- * @name ApiVersionAction
6
- *
7
- */
2
+ import { BaseApiAction } from '../classes/index.js';
3
+ import { XActionEvent } from '../lib/express.js';
8
4
  export default class ApiVersionAction extends BaseApiAction {
9
5
  constructor(module: IBaseKernelModule);
10
- handler(req: XRequest, res: XResponse, next: () => void, data: any, ex: IExtensionInterface): Promise<void>;
6
+ handler({ res, extension }: XActionEvent): Promise<void>;
11
7
  }
@@ -1,16 +1,44 @@
1
- import { BaseApiAction, ActionMode, } from '../classes/index.js';
2
- /**
3
- * @name ApiVersionAction
4
- *
5
- */
6
- export default class ApiVersionAction extends BaseApiAction {
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { SPath, SPathUtil } from '@grandlinex/swagger-mate';
11
+ import { ActionMode, BaseApiAction } from '../classes/index.js';
12
+ let ApiVersionAction = class ApiVersionAction extends BaseApiAction {
7
13
  constructor(module) {
8
14
  super('GET', '/version', module);
9
15
  this.handler = this.handler.bind(this);
10
16
  this.setMode(ActionMode.DMZ);
11
17
  }
12
- async handler(req, res, next, data, ex) {
13
- ex.done();
14
- res.status(200).send({ api: 1 });
18
+ async handler({ res, extension }) {
19
+ extension.done();
20
+ res.status(200).send({ api: this.getKernel().getApiVersion() });
15
21
  }
16
- }
22
+ };
23
+ ApiVersionAction = __decorate([
24
+ SPath({
25
+ '/version': {
26
+ get: {
27
+ operationId: 'getVersion',
28
+ summary: 'Get API version',
29
+ tags: ['kernel'],
30
+ responses: SPathUtil.jsonResponse('200', {
31
+ type: 'object',
32
+ properties: {
33
+ api: {
34
+ type: 'number',
35
+ },
36
+ },
37
+ required: ['api'],
38
+ }, false, '403'),
39
+ },
40
+ },
41
+ }),
42
+ __metadata("design:paramtypes", [Object])
43
+ ], ApiVersionAction);
44
+ export default ApiVersionAction;
@@ -1,11 +1,11 @@
1
1
  import { IBaseKernelModule } from '../lib/index.js';
2
- import { BaseApiAction, IExtensionInterface } from '../classes/index.js';
3
- import { XRequest, XResponse } from '../lib/express.js';
2
+ import { BaseApiAction, JwtToken } from '../classes/index.js';
3
+ import { XActionEvent } from '../lib/express.js';
4
4
  export default class GetTokenAction extends BaseApiAction {
5
5
  /**
6
6
  *
7
7
  * @param module Parent Module
8
8
  */
9
9
  constructor(module: IBaseKernelModule<any, any, any, any>);
10
- handler(req: XRequest, res: XResponse, next: () => void, data: any, ex: IExtensionInterface): Promise<void>;
10
+ handler({ req, res, extension, }: XActionEvent<JwtToken>): Promise<void>;
11
11
  }
@@ -1,5 +1,15 @@
1
- import { BaseApiAction, ActionMode, } from '../classes/index.js';
2
- export default class GetTokenAction extends BaseApiAction {
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { SPath, SPathUtil } from '@grandlinex/swagger-mate';
11
+ import { ActionMode, BaseApiAction } from '../classes/index.js';
12
+ let GetTokenAction = class GetTokenAction extends BaseApiAction {
3
13
  /**
4
14
  *
5
15
  * @param module Parent Module
@@ -9,7 +19,7 @@ export default class GetTokenAction extends BaseApiAction {
9
19
  this.handler = this.handler.bind(this);
10
20
  this.setMode(ActionMode.DMZ);
11
21
  }
12
- async handler(req, res, next, data, ex) {
22
+ async handler({ req, res, extension, }) {
13
23
  const cc = this.getKernel().getCryptoClient();
14
24
  if (!req.body.token) {
15
25
  res.status(400).send('no token');
@@ -20,17 +30,51 @@ export default class GetTokenAction extends BaseApiAction {
20
30
  return;
21
31
  }
22
32
  const { username, token } = req.body;
23
- const valid = await ex.timing.startFunc('validation', () => cc.apiTokenValidation(username, token, 'api'));
33
+ const valid = await extension.timing.startFunc('validation', () => cc.apiTokenValidation(username, token, 'api'));
24
34
  if (valid.valid && valid.userId) {
25
35
  const jwt = await cc.jwtGenerateAccessToken({
26
36
  userid: valid.userId,
27
37
  username,
28
38
  }, req.body);
29
- ex.done();
39
+ extension.done();
30
40
  res.status(200).send({ token: jwt });
31
41
  }
32
42
  else {
33
43
  res.status(403).send('no no no ...');
34
44
  }
35
45
  }
36
- }
46
+ };
47
+ GetTokenAction = __decorate([
48
+ SPath({
49
+ '/token': {
50
+ post: {
51
+ operationId: 'getToken',
52
+ summary: 'Get API token',
53
+ tags: ['kernel'],
54
+ requestBody: SPathUtil.jsonBody({
55
+ type: 'object',
56
+ properties: {
57
+ username: {
58
+ type: 'string',
59
+ },
60
+ token: {
61
+ type: 'string',
62
+ },
63
+ },
64
+ required: ['username', 'token'],
65
+ }),
66
+ responses: SPathUtil.jsonResponse('200', {
67
+ type: 'object',
68
+ properties: {
69
+ token: {
70
+ type: 'string',
71
+ },
72
+ },
73
+ required: ['token'],
74
+ }, false, '403'),
75
+ },
76
+ },
77
+ }),
78
+ __metadata("design:paramtypes", [Object])
79
+ ], GetTokenAction);
80
+ export default GetTokenAction;
@@ -1,8 +1,6 @@
1
1
  import { CoreAction, IDataBase } from '@grandlinex/core';
2
2
  import { IBaseAction, IBaseCache, IBaseClient, IBaseKernelModule, IBasePresenter, IKernel } from '../lib/index.js';
3
- import { JwtToken } from './BaseAuthProvider.js';
4
- import { IExtensionInterface } from './timing/index.js';
5
- import { XNextFc, XRequest, XResponse } from '../lib/express.js';
3
+ import { XActionEvent, XRequest, XResponse } from '../lib/express.js';
6
4
  export declare enum ActionMode {
7
5
  'DEFAULT' = 0,
8
6
  'DMZ' = 1,
@@ -12,7 +10,7 @@ export default abstract class BaseAction<K extends IKernel = IKernel, T extends
12
10
  mode: ActionMode;
13
11
  forceDebug: boolean;
14
12
  constructor(chanel: string, module: IBaseKernelModule<K, T, P, C, E>);
15
- abstract handler(req: XRequest, res: XResponse, next: XNextFc, data: JwtToken | null, extension: IExtensionInterface): Promise<void>;
13
+ abstract handler(event: XActionEvent): Promise<void>;
16
14
  secureHandler(req: XRequest, res: XResponse, next: () => void): Promise<void>;
17
15
  setMode(mode: ActionMode): void;
18
16
  abstract register(): void;
@@ -29,16 +29,61 @@ export default class BaseAction extends CoreAction {
29
29
  }
30
30
  if (this.mode === ActionMode.DMZ) {
31
31
  auth.stop();
32
- await this.handler(req, res, next, null, extension);
32
+ try {
33
+ await this.handler({
34
+ res,
35
+ req,
36
+ next,
37
+ data: null,
38
+ extension,
39
+ });
40
+ }
41
+ catch (e) {
42
+ this.error(e);
43
+ this.error(e?.message);
44
+ if (!res.headersSent) {
45
+ res.sendStatus(500);
46
+ }
47
+ }
33
48
  return;
34
49
  }
35
50
  const dat = await cc.bearerTokenValidation(req);
36
51
  auth.stop();
37
52
  if (dat && typeof dat !== 'number') {
38
- await this.handler(req, res, next, dat, extension);
53
+ try {
54
+ await this.handler({
55
+ res,
56
+ req,
57
+ next,
58
+ data: dat,
59
+ extension,
60
+ });
61
+ }
62
+ catch (e) {
63
+ this.error(e);
64
+ this.error(e?.message);
65
+ if (!res.headersSent) {
66
+ res.sendStatus(500);
67
+ }
68
+ }
39
69
  }
40
70
  else if (this.mode === ActionMode.DMZ_WITH_USER) {
41
- await this.handler(req, res, next, null, extension);
71
+ try {
72
+ await this.handler({
73
+ res,
74
+ req,
75
+ next,
76
+ data: null,
77
+ extension,
78
+ });
79
+ }
80
+ catch (e) {
81
+ this.error(e);
82
+ this.error(e?.message);
83
+ if (!res.headersSent) {
84
+ res.sendStatus(500);
85
+ }
86
+ }
42
87
  }
43
88
  else if (dat) {
44
89
  res.sendStatus(dat);
@@ -1,5 +1,7 @@
1
1
  export default class BaseAuthProvider {
2
- async jwtAddData(token, extend) {
2
+ async jwtAddData(token,
3
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
4
+ extend) {
3
5
  return token;
4
6
  }
5
7
  }
@@ -1,5 +1,3 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- /// <reference types="node" resolution-mode="require"/>
3
1
  import express, { Express } from 'express';
4
2
  import http from 'http';
5
3
  import { CorePresenter, IDataBase } from '@grandlinex/core';
@@ -11,5 +11,6 @@ export * from './modules/crypto/index.js';
11
11
  export * from './lib/index.js';
12
12
  export * from './lib/express.js';
13
13
  export * from '@grandlinex/core';
14
+ export * from '@grandlinex/swagger-mate';
14
15
  export { KernelModule, Kernel };
15
16
  export default Kernel;
package/dist/mjs/index.js CHANGED
@@ -11,5 +11,6 @@ export * from './modules/crypto/index.js';
11
11
  export * from './lib/index.js';
12
12
  export * from './lib/express.js';
13
13
  export * from '@grandlinex/core';
14
+ export * from '@grandlinex/swagger-mate';
14
15
  export { KernelModule, Kernel };
15
16
  export default Kernel;
@@ -1,6 +1,14 @@
1
1
  import express from 'express';
2
+ import { IExtensionInterface, JwtToken } from '../classes/index.js';
2
3
  export type XRequest = express.Request & {
3
4
  rawBody?: string | null;
4
5
  };
5
6
  export type XResponse = express.Response;
6
7
  export type XNextFc = express.NextFunction;
8
+ export type XActionEvent<G = JwtToken | null> = {
9
+ req: XRequest;
10
+ res: XResponse;
11
+ next: XNextFc;
12
+ data: G;
13
+ extension: IExtensionInterface;
14
+ };
@@ -1,8 +1,8 @@
1
1
  import { ICoreAction, ICoreBridge, ICoreCache, ICoreCClient, ICoreClient, ICoreElement, ICoreKernel, ICoreKernelModule, ICorePresenter, ICoreService, IDataBase } from '@grandlinex/core';
2
2
  import express from 'express';
3
3
  import * as jwt from 'jsonwebtoken';
4
- import { IAuthProvider, JwtToken, IExtensionInterface, JwtExtend } from '../classes/index.js';
5
- import { XNextFc, XRequest, XResponse } from './express.js';
4
+ import { IAuthProvider, JwtExtend, JwtToken } from '../classes/index.js';
5
+ import { XActionEvent, XRequest } from './express.js';
6
6
  export type ActionTypes = 'POST' | 'GET' | 'USE' | 'PATCH' | 'DELETE';
7
7
  export interface ICClient<T extends JwtExtend = JwtExtend> extends ICoreCClient {
8
8
  setAuthProvider(provider: IAuthProvider<T>): boolean;
@@ -18,6 +18,7 @@ export interface ICClient<T extends JwtExtend = JwtExtend> extends ICoreCClient
18
18
  }
19
19
  export interface IKernel<T extends JwtExtend = JwtExtend> extends ICoreKernel<ICClient<T>> {
20
20
  getAppServerPort(): number;
21
+ getApiVersion(): number;
21
22
  setAppServerPort(port: number): void;
22
23
  responseCodeFunction(data: {
23
24
  code: number;
@@ -32,5 +33,5 @@ export type IBaseBrige = ICoreBridge;
32
33
  export type IBaseCache<K extends IKernel = IKernel, T extends IDataBase<any, any> | null = any, P extends IBaseClient | null = any, C extends IBaseCache | null = any, E extends IBasePresenter | null = any> = ICoreCache<K, T, P, C, E>;
33
34
  export type IBaseElement<K extends IKernel = IKernel, T extends IDataBase<any, any> | null = any, P extends IBaseClient | null = any, C extends IBaseCache | null = any, E extends IBasePresenter | null = any> = ICoreElement<K, T, P, C, E>;
34
35
  export interface IBaseAction<K extends IKernel = IKernel, T extends IDataBase<any, any> | null = any, P extends IBaseClient | null = any, C extends IBaseCache | null = any, E extends IBasePresenter | null = any> extends ICoreAction<K, T, P, C, E> {
35
- handler(req: XRequest, res: XResponse, next: XNextFc, data: JwtToken | null, extension: IExtensionInterface): Promise<void>;
36
+ handler(event: XActionEvent): Promise<void>;
36
37
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grandlinex/kernel",
3
- "version": "0.32.0",
3
+ "version": "0.32.11",
4
4
  "description": "GrandLineX is an out-of-the-box server framework on top of ExpressJs.",
5
5
  "type": "module",
6
6
  "exports": {
@@ -47,35 +47,36 @@
47
47
  "license": "BSD-3-Clause",
48
48
  "dependencies": {
49
49
  "@grandlinex/core": "0.32.0",
50
- "axios": "1.4.0",
50
+ "@grandlinex/swagger-mate": "0.32.1",
51
+ "axios": "1.6.0",
51
52
  "body-parser": "1.20.2",
52
- "express": "4.18.2",
53
- "jsonwebtoken": "9.0.1"
53
+ "express": "4.19.2",
54
+ "jsonwebtoken": "9.0.2",
55
+ "@types/express": "4.17.21",
56
+ "@types/jsonwebtoken": "9.0.6"
54
57
  },
55
58
  "devDependencies": {
56
- "@types/express": "^4.17.17",
57
- "@types/jest": "^29.5.2",
58
- "@types/jsonwebtoken": "^9.0.2",
59
- "@types/node": "^20.4.0",
60
- "@typescript-eslint/eslint-plugin": "^5.61.0",
61
- "@typescript-eslint/parser": "^5.61.0",
62
- "cross-env": "^7.0.3",
63
- "eslint": "^8.44.0",
64
- "eslint-config-airbnb": "^19.0.4",
65
- "eslint-config-airbnb-typescript": "^17.0.0",
66
- "eslint-config-prettier": "^8.8.0",
67
- "eslint-plugin-import": "^2.27.5",
68
- "eslint-plugin-jest": "^27.2.2",
69
- "eslint-plugin-jsx-a11y": "^6.7.1",
70
- "eslint-plugin-prettier": "^4.2.1",
71
- "jest": "^29.6.1",
72
- "jest-junit": "^16.0.0",
73
- "prettier": "2.8.8",
74
- "ts-jest": "^29.1.1",
75
- "ts-loader": "^9.4.4",
76
- "ts-node": "^10.9.1",
77
- "typedoc": "^0.24.8",
78
- "typescript": "^5.1.6"
59
+ "@types/jest": "29.5.12",
60
+ "@types/node": "20.14.10",
61
+ "@typescript-eslint/eslint-plugin": "7.16.0",
62
+ "@typescript-eslint/parser": "7.16.0",
63
+ "cross-env": "7.0.3",
64
+ "eslint": "8.57.0",
65
+ "eslint-config-airbnb": "19.0.4",
66
+ "eslint-config-airbnb-typescript": "18.0.0",
67
+ "eslint-config-prettier": "9.1.0",
68
+ "eslint-plugin-import": "2.29.1",
69
+ "eslint-plugin-jest": "28.6.0",
70
+ "eslint-plugin-jsx-a11y": "6.9.0",
71
+ "eslint-plugin-prettier": "5.1.3",
72
+ "jest": "29.7.0",
73
+ "jest-junit": "16.0.0",
74
+ "prettier": "3.3.2",
75
+ "ts-jest": "29.1.5",
76
+ "ts-loader": "9.5.1",
77
+ "ts-node": "10.9.2",
78
+ "typedoc": "0.26.4",
79
+ "typescript": "5.5.3"
79
80
  },
80
81
  "repository": {
81
82
  "type": "git",