chyz 2.0.0-rc.8 → 2.0.1-rc.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.
Files changed (153) hide show
  1. package/BaseChyz.d.ts +73 -56
  2. package/BaseChyz.d.ts.map +1 -1
  3. package/BaseChyz.js +569 -404
  4. package/README.md +1 -1
  5. package/base/ActionFilter.d.ts +32 -32
  6. package/base/ActionFilter.d.ts.map +1 -1
  7. package/base/ActionFilter.js +82 -82
  8. package/base/BadRequestHttpException.d.ts +6 -0
  9. package/base/BadRequestHttpException.d.ts.map +1 -0
  10. package/base/BadRequestHttpException.js +17 -0
  11. package/base/BaseError.d.ts +43 -10
  12. package/base/BaseError.d.ts.map +1 -1
  13. package/base/BaseError.js +58 -26
  14. package/base/Behavior.d.ts +3 -3
  15. package/base/Behavior.js +7 -7
  16. package/base/CBaseObject.d.ts +4 -4
  17. package/base/CBaseObject.d.ts.map +1 -1
  18. package/base/CBaseObject.js +16 -16
  19. package/base/CEvents.d.ts +13 -0
  20. package/base/CEvents.d.ts.map +1 -0
  21. package/base/CEvents.js +24 -0
  22. package/base/CRequest.d.ts +1 -1
  23. package/base/CRequest.js +10 -10
  24. package/base/CWebController.d.ts +43 -43
  25. package/base/CWebController.d.ts.map +1 -1
  26. package/base/CWebController.js +81 -74
  27. package/base/Component.d.ts +20 -20
  28. package/base/Component.d.ts.map +1 -1
  29. package/base/Component.js +57 -57
  30. package/base/Configurable.d.ts +2 -2
  31. package/base/Configurable.js +8 -8
  32. package/base/DataErrorDbException.d.ts +5 -5
  33. package/base/DataErrorDbException.d.ts.map +1 -1
  34. package/base/DataErrorDbException.js +17 -17
  35. package/base/DbConnection.d.ts +12 -12
  36. package/base/DbConnection.js +53 -53
  37. package/base/ForbiddenHttpException.d.ts +4 -4
  38. package/base/ForbiddenHttpException.d.ts.map +1 -1
  39. package/base/ForbiddenHttpException.js +16 -16
  40. package/base/InvalidArgumentException.d.ts +5 -5
  41. package/base/InvalidArgumentException.d.ts.map +1 -1
  42. package/base/InvalidArgumentException.js +17 -17
  43. package/base/InvalidConfigException.d.ts +5 -5
  44. package/base/InvalidConfigException.d.ts.map +1 -1
  45. package/base/InvalidConfigException.js +17 -17
  46. package/base/Logs.d.ts +21 -21
  47. package/base/Logs.d.ts.map +1 -1
  48. package/base/Logs.js +57 -57
  49. package/base/Model.d.ts +301 -298
  50. package/base/Model.d.ts.map +1 -1
  51. package/base/Model.js +545 -507
  52. package/base/ModelManager.d.ts +1 -1
  53. package/base/ModelManager.js +19 -19
  54. package/base/NotFoundHttpException.d.ts +5 -5
  55. package/base/NotFoundHttpException.d.ts.map +1 -1
  56. package/base/NotFoundHttpException.js +17 -17
  57. package/base/RestClient.d.ts +6 -6
  58. package/base/RestClient.d.ts.map +1 -1
  59. package/base/RestClient.js +25 -25
  60. package/base/UnauthorizedHttpException.d.ts +5 -5
  61. package/base/UnauthorizedHttpException.d.ts.map +1 -1
  62. package/base/UnauthorizedHttpException.js +17 -17
  63. package/base/ValidationHttpException.d.ts +5 -5
  64. package/base/ValidationHttpException.d.ts.map +1 -1
  65. package/base/ValidationHttpException.js +17 -17
  66. package/base/db/Exception.d.ts +6 -6
  67. package/base/db/Exception.js +15 -15
  68. package/base/index.d.ts +19 -18
  69. package/base/index.d.ts.map +1 -1
  70. package/base/index.js +41 -39
  71. package/decorator/Middleware.d.ts +3 -3
  72. package/decorator/Middleware.js +11 -11
  73. package/decorator/controller.d.ts +2 -2
  74. package/decorator/controller.js +24 -24
  75. package/decorator/delete.d.ts +3 -0
  76. package/decorator/delete.d.ts.map +1 -0
  77. package/decorator/delete.js +36 -0
  78. package/decorator/enums/ControllerDecoratorParams.d.ts +5 -5
  79. package/decorator/enums/ControllerDecoratorParams.js +9 -9
  80. package/decorator/get.d.ts +2 -2
  81. package/decorator/get.js +36 -36
  82. package/decorator/index.d.ts +5 -3
  83. package/decorator/index.d.ts.map +1 -1
  84. package/decorator/index.js +13 -9
  85. package/decorator/post.d.ts +2 -2
  86. package/decorator/post.js +36 -36
  87. package/decorator/put.d.ts +3 -0
  88. package/decorator/put.d.ts.map +1 -0
  89. package/decorator/put.js +36 -0
  90. package/filters/AccessControl.d.ts +12 -12
  91. package/filters/AccessControl.d.ts.map +1 -1
  92. package/filters/AccessControl.js +83 -83
  93. package/filters/AccessRule.d.ts +82 -82
  94. package/filters/AccessRule.d.ts.map +1 -1
  95. package/filters/AccessRule.js +136 -137
  96. package/filters/auth/AuthInterface.d.ts +25 -25
  97. package/filters/auth/AuthInterface.js +2 -2
  98. package/filters/auth/AuthMethod.d.ts +37 -37
  99. package/filters/auth/AuthMethod.d.ts.map +1 -1
  100. package/filters/auth/AuthMethod.js +82 -82
  101. package/filters/auth/HttpBasicAuth.d.ts +23 -22
  102. package/filters/auth/HttpBasicAuth.d.ts.map +1 -1
  103. package/filters/auth/HttpBasicAuth.js +78 -72
  104. package/filters/auth/HttpBearerAuth.d.ts +17 -17
  105. package/filters/auth/HttpBearerAuth.d.ts.map +1 -1
  106. package/filters/auth/HttpBearerAuth.js +33 -32
  107. package/filters/auth/HttpHeaderAuth.d.ts +18 -14
  108. package/filters/auth/HttpHeaderAuth.d.ts.map +1 -1
  109. package/filters/auth/HttpHeaderAuth.js +64 -57
  110. package/filters/auth/JwtHttpBearerAuth.d.ts +20 -20
  111. package/filters/auth/JwtHttpBearerAuth.d.ts.map +1 -1
  112. package/filters/auth/JwtHttpBearerAuth.js +87 -81
  113. package/filters/auth/KeyCloakHttpBearerAuth.d.ts +22 -22
  114. package/filters/auth/KeyCloakHttpBearerAuth.js +116 -116
  115. package/filters/auth/index.d.ts +4 -4
  116. package/filters/auth/index.js +11 -11
  117. package/filters/index.d.ts +2 -2
  118. package/filters/index.js +7 -7
  119. package/index.d.ts +28 -21
  120. package/index.d.ts.map +1 -1
  121. package/index.js +71 -60
  122. package/model/RouteDefinition.d.ts +6 -6
  123. package/model/RouteDefinition.js +8 -8
  124. package/package.json +22 -24
  125. package/rbac/AuthAssignment.d.ts +18 -18
  126. package/rbac/AuthAssignment.js +44 -44
  127. package/rbac/AuthItem.d.ts +26 -26
  128. package/rbac/AuthItem.js +51 -51
  129. package/rbac/AuthItemChild.d.ts +18 -18
  130. package/rbac/AuthItemChild.js +43 -43
  131. package/rbac/AuthManager.d.ts +111 -111
  132. package/rbac/AuthManager.d.ts.map +1 -1
  133. package/rbac/AuthManager.js +356 -355
  134. package/rbac/index.d.ts +5 -0
  135. package/rbac/index.d.ts.map +1 -0
  136. package/rbac/index.js +28 -0
  137. package/requiments/Glob.d.ts +2 -2
  138. package/requiments/Glob.js +10 -10
  139. package/requiments/ReflectUtil.js +24 -24
  140. package/requiments/Utils.d.ts +1 -8
  141. package/requiments/Utils.d.ts.map +1 -1
  142. package/requiments/Utils.js +115 -112
  143. package/validators/BooleanValidator.js +1 -1
  144. package/validators/CompareValidator.js +1 -1
  145. package/validators/DateValidator.js +1 -1
  146. package/validators/EmailValidator.js +1 -1
  147. package/validators/Validator.d.ts +17 -17
  148. package/validators/Validator.js +27 -27
  149. package/web/IdentityInterface.d.ts +55 -54
  150. package/web/IdentityInterface.d.ts.map +1 -1
  151. package/web/IdentityInterface.js +8 -8
  152. package/web/WebUser.d.ts +71 -71
  153. package/web/WebUser.js +165 -165
package/BaseChyz.js CHANGED
@@ -1,404 +1,569 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
- return new (P || (P = Promise))(function (resolve, reject) {
28
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
- step((generator = generator.apply(thisArg, _arguments || [])).next());
32
- });
33
- };
34
- Object.defineProperty(exports, "__esModule", { value: true });
35
- const base_1 = require("./base");
36
- const Utils_1 = __importStar(require("./requiments/Utils"));
37
- const Logs_1 = require("./base/Logs");
38
- const https = require('https');
39
- const express = require("express");
40
- const compression = require('compression');
41
- const fs = require('fs');
42
- const validate = require('validate.js');
43
- /**
44
- * Use
45
- * selectedBox: {
46
- * array: {
47
- * id: {
48
- * numericality: {
49
- * onlyInteger: true,
50
- * greaterThan: 0
51
- * }
52
- * }
53
- * }
54
- * },
55
- * @param arrayItems
56
- * @param itemConstraints
57
- */
58
- validate.validators.array = (arrayItems, itemConstraints) => {
59
- const arrayItemErrors = arrayItems.reduce((errors, item, index) => {
60
- const error = validate(item, itemConstraints);
61
- if (error)
62
- errors[index] = { error: error };
63
- return errors;
64
- }, {});
65
- return Utils_1.Utils.isEmpty(arrayItemErrors) ? null : { errors: arrayItemErrors };
66
- };
67
- validate.validators.tokenString = (items, itemConstraints) => {
68
- let arrayItems = items.split(",");
69
- const arrayItemErrors = arrayItems.reduce((errors, item, index) => {
70
- const error = validate(item, itemConstraints);
71
- if (error)
72
- errors[index] = { error: error };
73
- return errors;
74
- }, {});
75
- return Utils_1.Utils.isEmpty(arrayItemErrors) ? null : { errors: arrayItemErrors };
76
- };
77
- const ip = require('ip');
78
- const bodyParser = require('body-parser');
79
- const methodOverride = require('method-override');
80
- const Server = express();
81
- /**
82
- * set request id
83
- */
84
- Object.defineProperty(Server.request, 'reqId', {
85
- configurable: true,
86
- enumerable: true,
87
- writable: true
88
- });
89
- Object.defineProperty(Server.request, 'user', {
90
- configurable: true,
91
- enumerable: true,
92
- writable: true
93
- });
94
- Object.defineProperty(Server.request, 'identity', {
95
- configurable: true,
96
- enumerable: true,
97
- writable: true
98
- });
99
- class BaseChyz {
100
- constructor() {
101
- this._port = 3001;
102
- this._controllerpath = "Controllers";
103
- }
104
- get controllerpath() {
105
- return this._controllerpath;
106
- }
107
- set controllerpath(value) {
108
- this._controllerpath = value;
109
- }
110
- init() {
111
- /**
112
- * server port setting
113
- */
114
- if (this.config.hasOwnProperty("port"))
115
- this.port = this.config.port;
116
- /**
117
- * controller path
118
- */
119
- if (this.config.controllerpath) {
120
- this.controllerpath = this.config.controllerpath;
121
- }
122
- /**
123
- * Model Register
124
- */
125
- this.loadModels();
126
- /**
127
- * Express Server
128
- */
129
- this.middleware();
130
- /**
131
- * Load Controller
132
- */
133
- this.loadController();
134
- }
135
- /**
136
- * Listen port number
137
- * Server port number get
138
- */
139
- get port() {
140
- return this._port;
141
- }
142
- /**
143
- * Listen port number
144
- * Server port number setting
145
- * @param value
146
- */
147
- set port(value) {
148
- this._port = value;
149
- }
150
- static get validate() {
151
- return this._validate;
152
- }
153
- static set validate(value) {
154
- this._validate = value;
155
- }
156
- app(config = {}) {
157
- var _a;
158
- /**
159
- * Config set
160
- */
161
- this.config = config;
162
- /**
163
- * log setting
164
- */
165
- if (this.config.logs instanceof Logs_1.Logs) {
166
- BaseChyz.logs = this.config.logs;
167
- }
168
- // logger setting
169
- // this.logProvider().level = log4js.levels.ALL;
170
- // this.logProvider().configure(this._logConfig);
171
- let components = Utils_1.Utils.findKeyValue(config, "components");
172
- if (components) {
173
- for (const componentsKey in components) {
174
- let comp = components[componentsKey];
175
- BaseChyz.debug("Create Component ", componentsKey);
176
- try {
177
- BaseChyz.components[componentsKey] = Utils_1.Utils.createObject(new comp.class, comp);
178
- (_a = BaseChyz.components[componentsKey]) === null || _a === void 0 ? void 0 : _a.init();
179
- }
180
- catch (e) {
181
- BaseChyz.error("Create Component Error", e);
182
- }
183
- }
184
- }
185
- let middlewares = Utils_1.Utils.findKeyValue(config, "middlewares");
186
- if (middlewares) {
187
- for (const middlewareKey in middlewares) {
188
- let middleware1 = middlewares[middlewareKey];
189
- BaseChyz.debug("Create middlewares ", middlewareKey);
190
- BaseChyz.middlewares[middlewareKey] = middleware1;
191
- // BaseChyz.middlewares[middlewareKey] = Utils.createObject(new middleware1.class, middleware1);
192
- }
193
- }
194
- this.init();
195
- return this;
196
- }
197
- static trace(...args) {
198
- BaseChyz.logs.fatal(...arguments);
199
- }
200
- static debug(...args) {
201
- BaseChyz.logs.debug(...arguments);
202
- }
203
- static info(...args) {
204
- BaseChyz.logs.info(...arguments);
205
- }
206
- static warn(...args) {
207
- BaseChyz.logs.warn(...arguments);
208
- }
209
- static error(...args) {
210
- BaseChyz.logs.error(...arguments);
211
- }
212
- static fatal(...args) {
213
- BaseChyz.logs.fatal(...arguments);
214
- }
215
- static warning(...args) {
216
- BaseChyz.logs.warn(...arguments);
217
- }
218
- static t(text) {
219
- return text;
220
- }
221
- errorLogger(error, req, res, next) {
222
- BaseChyz.error(error);
223
- next(error); // forward to next middleware
224
- }
225
- errorResponder(error, req, res, next) {
226
- if (error.type == 'redirect')
227
- res.redirect('/error');
228
- else if (error.type == 'time-out') // arbitrary condition check
229
- res.status(408).json(error);
230
- else
231
- next(error); // forwarding exceptional case to fail-safe middleware
232
- }
233
- errorHandler(err, req, res, next) {
234
- if (res.headersSent) {
235
- return next(err);
236
- }
237
- res.status(500).json({ error: err });
238
- }
239
- static getComponent(key) {
240
- var _a;
241
- return (_a = BaseChyz.components[key]) !== null && _a !== void 0 ? _a : null;
242
- }
243
- static getMiddlewares(key) {
244
- var _a;
245
- return (_a = BaseChyz.middlewares[key]) !== null && _a !== void 0 ? _a : null;
246
- }
247
- /**
248
- * load model
249
- */
250
- loadModels() {
251
- return __awaiter(this, void 0, void 0, function* () {
252
- let models = {};
253
- let path = `${this._controllerpath}/../Models`;
254
- fs.readdirSync(path).forEach((file) => {
255
- if (file !== "index.ts") {
256
- let model = require(`${path}/${file}`);
257
- // @ts-ignore
258
- let className = file.split(".")[0] + "Class";
259
- if (model[className])
260
- models[className.replace("Class", "")] = new model[className];
261
- }
262
- });
263
- /**
264
- *
265
- */
266
- base_1.ModelManager._register(models);
267
- for (const key of Object.keys(base_1.ModelManager)) {
268
- if (key != "_register") {
269
- base_1.ModelManager[key].init();
270
- }
271
- }
272
- });
273
- }
274
- /**
275
- * load contoller
276
- */
277
- loadController() {
278
- return __awaiter(this, void 0, void 0, function* () {
279
- // let articlesEndpoints: string[] = [];
280
- for (const file of fs.readdirSync(`${this._controllerpath}/`)) {
281
- // let controller = require(`${this._controllerpath}/${file}`);
282
- let controller = (yield Promise.resolve().then(() => __importStar(require(`${this._controllerpath}/${file}`))));
283
- if (controller[file.replace(".ts", "")]) {
284
- controller = controller[file.replace(".ts", "")];
285
- }
286
- else if (controller.default) {
287
- controller = controller.default;
288
- }
289
- else {
290
- throw new base_1.InvalidConfigException((0, Utils_1.default)("Invalid Controller"));
291
- }
292
- // This is our instantiated class
293
- const instance = new controller();
294
- BaseChyz.controllers.push(instance);
295
- // The prefix saved to our controller
296
- // @ts-ignore
297
- const prefix = Reflect.getMetadata('prefix', controller);
298
- // Our `routes` array containing all our routes for this controller
299
- // @ts-ignore
300
- const routes = Reflect.getMetadata('routes', controller);
301
- BaseChyz.debug("Controller load ", controller.name, `(${prefix})`);
302
- if (routes) {
303
- routes.forEach(route => {
304
- let actionId = route.path == "/" || route.path == "" ? instance.defaultAction : route.path;
305
- route.id = actionId;
306
- BaseChyz.debug("Controller route Path", prefix + (route.path.startsWith("/") ? route.path : `/${route.path}`));
307
- BaseChyz.express[route.requestMethod](prefix + (route.path.startsWith("/") ? route.path : `/${route.path}`), (req, res, next) => __awaiter(this, void 0, void 0, function* () {
308
- try {
309
- BaseChyz.debug(`Call Request id ${instance.id}`);
310
- yield instance.beforeAction(route, req, res);
311
- next();
312
- }
313
- catch (e) {
314
- BaseChyz.error(e);
315
- res.status(e.statusCode || 500);
316
- res.json({ error: { code: e.statusCode || 500, name: e.name, message: e.message } });
317
- // next(e)
318
- }
319
- }), (req, res, next) => __awaiter(this, void 0, void 0, function* () {
320
- try {
321
- // @ts-ignore
322
- BaseChyz.debug("Request ID ", req.reqId);
323
- // @ts-ignore
324
- yield instance[route.methodName](req, res, next);
325
- instance.afterAction(route, req, res);
326
- }
327
- catch (e) {
328
- if (e instanceof Error) {
329
- BaseChyz.error(e);
330
- // @ts-ignore
331
- res.status(e.statusCode || 500);
332
- // @ts-ignore
333
- res.json({ error: { code: e.statusCode || 500, name: e.name, message: e.message } });
334
- }
335
- else {
336
- res.json(e);
337
- }
338
- }
339
- }));
340
- });
341
- }
342
- }
343
- });
344
- }
345
- middleware() {
346
- BaseChyz.express.use(bodyParser.json({ limit: '1mb' }));
347
- BaseChyz.express.use(bodyParser.urlencoded({ limit: '1mb', extended: true })); // support encoded bodies
348
- BaseChyz.express.use(methodOverride());
349
- // CORS
350
- BaseChyz.express.use(function (req, res, next) {
351
- // @ts-ignore
352
- req.reqId = Utils_1.Utils.uniqueId("chyzzzz_");
353
- res.setHeader('Content-Type', 'application/json');
354
- res.setHeader("Access-Control-Allow-Origin", "*");
355
- res.setHeader("Access-Control-Allow-Credentials", "true");
356
- res.setHeader("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
357
- res.setHeader("Access-Control-Allow-Headers", "Access-Control-Allow-Origin,Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers,Authorization");
358
- next();
359
- });
360
- // compress all responses
361
- BaseChyz.express.use(compression());
362
- //Middlewares
363
- for (const middleware1 of Object.keys(BaseChyz.middlewares)) {
364
- if (!Utils_1.Utils.isFunction(middleware1)) {
365
- let keycloak = BaseChyz.middlewares[middleware1].keycloak;
366
- BaseChyz.express.use(keycloak.middleware(BaseChyz.middlewares[middleware1].config));
367
- }
368
- else {
369
- BaseChyz.express.use(BaseChyz.middlewares[middleware1]);
370
- }
371
- }
372
- BaseChyz.express.use(this.errorResponder);
373
- BaseChyz.express.use(this.errorHandler);
374
- }
375
- Start() {
376
- var _a, _b;
377
- BaseChyz.info("Express Server Starting");
378
- if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.ssl) {
379
- BaseChyz.httpServer = https.createServer((_b = this.config) === null || _b === void 0 ? void 0 : _b.ssl, BaseChyz.express);
380
- BaseChyz.httpServer.listen(this._port, () => {
381
- BaseChyz.info("Express Server Start ");
382
- BaseChyz.info(`Liten Port ${this._port}`);
383
- BaseChyz.info(`https://localhost:${this._port}`);
384
- BaseChyz.info(`https://${ip.address()}:${this._port}`);
385
- });
386
- }
387
- else {
388
- BaseChyz.httpServer = BaseChyz.express.listen(this._port, () => {
389
- BaseChyz.info("Express Server Start ");
390
- BaseChyz.info(`Liten Port ${this._port}`);
391
- BaseChyz.info(`http://localhost:${this._port}`);
392
- BaseChyz.info(`http://${ip.address()}:${this._port}`);
393
- });
394
- }
395
- return this;
396
- }
397
- }
398
- exports.default = BaseChyz;
399
- BaseChyz.express = Server;
400
- BaseChyz.logs = new Logs_1.Logs();
401
- BaseChyz._validate = validate;
402
- BaseChyz.controllers = [];
403
- BaseChyz.components = {};
404
- BaseChyz.middlewares = {};
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ /**
39
+ * https server
40
+ */
41
+ const express_1 = __importDefault(require("express"));
42
+ const https_1 = require("https");
43
+ const http_1 = require("http");
44
+ /**
45
+ * Freamwork
46
+ */
47
+ const base_1 = require("./base");
48
+ const Utils_1 = require("./requiments/Utils");
49
+ const calendar_1 = __importDefault(require("dayjs/plugin/calendar"));
50
+ const weekOfYear_1 = __importDefault(require("dayjs/plugin/weekOfYear"));
51
+ const isTomorrow_1 = __importDefault(require("dayjs/plugin/isTomorrow"));
52
+ const bodyParser = require("body-parser");
53
+ const fs = require("fs");
54
+ const http_request = require('debug')('http:request');
55
+ const http_request_body = http_request.extend('body');
56
+ const http_request_headers = http_request.extend('headers');
57
+ const compression = require('compression');
58
+ // const fs = require('fs');
59
+ const ip = require('ip');
60
+ const methodOverride = require('method-override');
61
+ const Server = (0, express_1.default)();
62
+ const cors = require('cors');
63
+ const emitter = require('events').EventEmitter;
64
+ const em = new emitter();
65
+ /**
66
+ * set request id
67
+ */
68
+ Object.defineProperty(Server.request, 'reqId', {
69
+ configurable: true,
70
+ enumerable: true,
71
+ writable: true
72
+ });
73
+ Object.defineProperty(Server.request, 'user', {
74
+ configurable: true,
75
+ enumerable: true,
76
+ writable: true
77
+ });
78
+ Object.defineProperty(Server.request, 'identity', {
79
+ configurable: true,
80
+ enumerable: true,
81
+ writable: true
82
+ });
83
+ const validate = require('validate.js');
84
+ const dayjs = require('dayjs');
85
+ const utc = require('dayjs/plugin/utc');
86
+ const relative = require('dayjs/plugin/relativeTime');
87
+ dayjs.extend(utc);
88
+ dayjs.extend(relative);
89
+ dayjs.extend(isTomorrow_1.default);
90
+ dayjs.extend(calendar_1.default);
91
+ dayjs.extend(weekOfYear_1.default);
92
+ /**
93
+ * Use
94
+ * selectedBox: {
95
+ * array: {
96
+ * id: {
97
+ * numericality: {
98
+ * onlyInteger: true,
99
+ * greaterThan: 0
100
+ * }
101
+ * }
102
+ * }
103
+ * },
104
+ * @param arrayItems
105
+ * @param itemConstraints
106
+ */
107
+ validate.validators.array = (arrayItems, itemConstraints) => {
108
+ if (!Utils_1.Utils.isArray(arrayItems))
109
+ return { errors: [{ error: 'in not array' }] };
110
+ const arrayItemErrors = arrayItems.reduce((errors, item, index) => {
111
+ const error = validate(item, itemConstraints);
112
+ if (error)
113
+ errors[index] = { error: error };
114
+ return errors;
115
+ }, {});
116
+ return Utils_1.Utils.isEmpty(arrayItemErrors) ? null : { errors: arrayItemErrors };
117
+ };
118
+ validate.validators.tokenString = (items, itemConstraints) => {
119
+ let arrayItems = items.split(",");
120
+ const arrayItemErrors = arrayItems.reduce((errors, item, index) => {
121
+ const error = validate(item, itemConstraints);
122
+ if (error)
123
+ errors[index] = { error: error };
124
+ return errors;
125
+ }, {});
126
+ return Utils_1.Utils.isEmpty(arrayItemErrors) ? null : { errors: arrayItemErrors };
127
+ };
128
+ validate.extend(validate.validators.datetime, {
129
+ // The value is guaranteed not to be null or undefined but otherwise it
130
+ // could be anything.
131
+ parse: function (value, options) {
132
+ return +dayjs().utc(value);
133
+ },
134
+ // Input is a unix timestamp
135
+ format: function (value, options) {
136
+ const format = options.dateOnly ? "YYYY-MM-DD" : "YYYY-MM-DD hh:mm:ss";
137
+ return dayjs().utc(value).format(format);
138
+ }
139
+ });
140
+ class BaseChyz {
141
+ constructor() {
142
+ this._port = 3001;
143
+ this._controllerpath = "Controllers";
144
+ }
145
+ static get EventEmitter() {
146
+ return this._EventEmitter;
147
+ }
148
+ static set EventEmitter(value) {
149
+ this._EventEmitter = value;
150
+ }
151
+ get controllerpath() {
152
+ return this._controllerpath;
153
+ }
154
+ set controllerpath(value) {
155
+ this._controllerpath = value;
156
+ }
157
+ /**
158
+ *
159
+ */
160
+ init() {
161
+ return __awaiter(this, void 0, void 0, function* () {
162
+ /**
163
+ * server port setting
164
+ */
165
+ if (this.config.hasOwnProperty("port"))
166
+ this.port = this.config.port;
167
+ /**
168
+ * controller path
169
+ */
170
+ if (this.config.controllerpath) {
171
+ this.controllerpath = this.config.controllerpath;
172
+ }
173
+ /**
174
+ * Model Register
175
+ */
176
+ this.loadModels();
177
+ /**
178
+ * Express Server
179
+ */
180
+ this.middleware();
181
+ /**
182
+ * Load Controller
183
+ */
184
+ yield this.loadController();
185
+ });
186
+ }
187
+ /**
188
+ * Listen port number
189
+ * Server port number get
190
+ */
191
+ get port() {
192
+ return this._port;
193
+ }
194
+ /**
195
+ * Listen port number
196
+ * Server port number setting
197
+ * @param value
198
+ */
199
+ set port(value) {
200
+ this._port = value;
201
+ }
202
+ static get validate() {
203
+ return this._validate;
204
+ }
205
+ static set validate(value) {
206
+ this._validate = value;
207
+ }
208
+ app(config = {}) {
209
+ var _a, _b;
210
+ return __awaiter(this, void 0, void 0, function* () {
211
+ BaseChyz.EventEmitter.emit(base_1.CEvents.ON_INIT_BEFORE, this, config);
212
+ /**
213
+ * Config set
214
+ */
215
+ this.config = config;
216
+ /**
217
+ * log setting
218
+ */
219
+ if (this.config.logs instanceof base_1.Logs) {
220
+ BaseChyz.logs = this.config.logs;
221
+ }
222
+ else if (!this.config.hasOwnProperty('logs')) {
223
+ BaseChyz.logs = new base_1.Logs();
224
+ }
225
+ let components = Utils_1.Utils.findKeyValue(config, "components");
226
+ if (components) {
227
+ /**
228
+ * first initial database component
229
+ */
230
+ if (components.db) {
231
+ let comp = components['db'];
232
+ BaseChyz.debug("First initial database component ", "db");
233
+ try {
234
+ BaseChyz.components["db"] = Utils_1.Utils.createObject(new comp.class, comp);
235
+ (_a = BaseChyz.components["db"]) === null || _a === void 0 ? void 0 : _a.init();
236
+ delete components.db;
237
+ }
238
+ catch (e) {
239
+ BaseChyz.error("Create Component Error", e);
240
+ }
241
+ }
242
+ for (const componentsKey in components) {
243
+ let comp = components[componentsKey];
244
+ BaseChyz.debug("Create Component ", componentsKey);
245
+ try {
246
+ BaseChyz.components[componentsKey] = Utils_1.Utils.createObject(new comp.class, comp);
247
+ (_b = BaseChyz.components[componentsKey]) === null || _b === void 0 ? void 0 : _b.init();
248
+ }
249
+ catch (e) {
250
+ BaseChyz.error("Create Component Error", e);
251
+ }
252
+ }
253
+ }
254
+ let middlewares = Utils_1.Utils.findKeyValue(config, "middlewares");
255
+ if (middlewares) {
256
+ for (const middlewareKey in middlewares) {
257
+ let middleware1 = middlewares[middlewareKey];
258
+ BaseChyz.debug("Create middlewares ", middlewareKey);
259
+ BaseChyz.middlewares[middlewareKey] = middleware1;
260
+ // BaseChyz.middlewares[middlewareKey] = Utils.createObject(new middleware1.class, middleware1);
261
+ }
262
+ }
263
+ yield this.init();
264
+ BaseChyz.EventEmitter.emit(base_1.CEvents.ON_INIT_AFTER, this, config);
265
+ return this;
266
+ });
267
+ }
268
+ static trace(...args) {
269
+ BaseChyz.logs.fatal(...arguments);
270
+ }
271
+ static debug(...args) {
272
+ BaseChyz.logs.debug(...args);
273
+ }
274
+ static info(...args) {
275
+ BaseChyz.logs.info(...args);
276
+ }
277
+ static warn(...args) {
278
+ BaseChyz.logs.warn(...args);
279
+ }
280
+ static error(...args) {
281
+ BaseChyz.logs.error(...args);
282
+ }
283
+ static fatal(...args) {
284
+ BaseChyz.logs.fatal(...args);
285
+ }
286
+ static warning(...args) {
287
+ BaseChyz.logs.warn(...args);
288
+ }
289
+ static t(text, params) {
290
+ if (text == "")
291
+ return;
292
+ // let lang = require("@root/locales/tr/translation.json");
293
+ let lang = {};
294
+ if (lang.hasOwnProperty(text)) {
295
+ text = lang[text];
296
+ }
297
+ return text.tokenReplace(params);
298
+ }
299
+ errorLogger(error, req, res, next) {
300
+ BaseChyz.error(error);
301
+ next(error); // forward to next middleware
302
+ }
303
+ errorResponder(error, req, res, next) {
304
+ if (error.type == 'redirect')
305
+ res.redirect('/error');
306
+ else if (error.type == 'time-out') // arbitrary condition check
307
+ res.status(408).json(error);
308
+ else
309
+ next(error); // forwarding exceptional case to fail-safe middleware
310
+ }
311
+ errorHandler(err, req, res, next) {
312
+ if (res.headersSent) {
313
+ return next(err);
314
+ }
315
+ res.status(500).json({ error: err });
316
+ }
317
+ static getComponent(key) {
318
+ var _a;
319
+ return (_a = BaseChyz.components[key]) !== null && _a !== void 0 ? _a : null;
320
+ }
321
+ static getMiddlewares(key) {
322
+ var _a;
323
+ return (_a = BaseChyz.middlewares[key]) !== null && _a !== void 0 ? _a : null;
324
+ }
325
+ /**
326
+ * load model
327
+ */
328
+ loadModels() {
329
+ let models = {};
330
+ let path = `${this._controllerpath}/../Models`;
331
+ fs.readdirSync(path).forEach((file) => {
332
+ if (file !== "index.ts") {
333
+ let model = require(`${path}/${file}`);
334
+ // @ts-ignore
335
+ let className = file.split(".")[0] + "Class";
336
+ if (model[className])
337
+ models[className.replace("Class", "")] = new model[className];
338
+ }
339
+ });
340
+ /**
341
+ *
342
+ */
343
+ base_1.ModelManager._register(models);
344
+ for (const key of Object.keys(base_1.ModelManager)) {
345
+ if (key != "_register") {
346
+ base_1.ModelManager[key].init();
347
+ }
348
+ }
349
+ }
350
+ beforeMiddleware(req, res, next, instance, route) {
351
+ return __awaiter(this, void 0, void 0, function* () {
352
+ BaseChyz.debug(`${instance.id}/${route.path}->beforeMiddleware trigger`);
353
+ http_request_body("Request body " + JSON.stringify(req.body));
354
+ http_request_headers("Request header " + JSON.stringify(req.headers));
355
+ try {
356
+ yield instance.beforeAction(route, req, res);
357
+ next();
358
+ }
359
+ catch (e) {
360
+ BaseChyz.error(e);
361
+ if (e instanceof base_1.BaseError) {
362
+ res.status((e === null || e === void 0 ? void 0 : e.statusCode) || 500);
363
+ res.json(e.toJSON());
364
+ }
365
+ else {
366
+ res.json(e);
367
+ }
368
+ }
369
+ });
370
+ }
371
+ responseHandler(req, res, next, instance, route) {
372
+ return __awaiter(this, void 0, void 0, function* () {
373
+ BaseChyz.debug(`${instance.id}/${route.path}->responseHandler trigger`);
374
+ try {
375
+ // @ts-ignore
376
+ yield instance[route.methodName](req, res, next);
377
+ next();
378
+ }
379
+ catch (e) {
380
+ BaseChyz.error(e);
381
+ if (e instanceof base_1.BaseError) {
382
+ res.status((e === null || e === void 0 ? void 0 : e.statusCode) || 500);
383
+ res.json(e.toJSON());
384
+ }
385
+ else {
386
+ res.json(e);
387
+ }
388
+ }
389
+ });
390
+ }
391
+ afterMiddleware(req, res, next, instance, route) {
392
+ return __awaiter(this, void 0, void 0, function* () {
393
+ BaseChyz.debug(`${instance.id}/${route.path}->afterMiddleware trigger`);
394
+ try {
395
+ yield instance.afterAction(route, req, res);
396
+ }
397
+ catch (e) {
398
+ BaseChyz.error(e);
399
+ if (e instanceof base_1.BaseError) {
400
+ res.status((e === null || e === void 0 ? void 0 : e.statusCode) || 500);
401
+ res.json(e.toJSON());
402
+ }
403
+ else {
404
+ res.json(e);
405
+ }
406
+ }
407
+ });
408
+ }
409
+ /**
410
+ * load contoller
411
+ */
412
+ loadController() {
413
+ return __awaiter(this, void 0, void 0, function* () {
414
+ // let articlesEndpoints: string[] = [];
415
+ for (const file of fs.readdirSync(`${this._controllerpath}/`)) {
416
+ // let controller = require(`${this._controllerpath}/${file}`);
417
+ let controller = (yield Promise.resolve(`${`${this._controllerpath}/${file}`}`).then(s => __importStar(require(s))));
418
+ if (controller[file.replace(".ts", "")]) {
419
+ controller = controller[file.replace(".ts", "")];
420
+ }
421
+ else if (controller.default) {
422
+ controller = controller.default;
423
+ }
424
+ else {
425
+ throw new base_1.InvalidConfigException(BaseChyz.t(`Invalid Controller ${file}`));
426
+ }
427
+ // This is our instantiated class
428
+ const instance = new controller();
429
+ BaseChyz.controllers.push(instance);
430
+ // The prefix saved to our controller
431
+ const prefix = Reflect.getMetadata('prefix', controller);
432
+ // Our `routes` array containing all our routes for this controller
433
+ const routes = Reflect.getMetadata('routes', controller);
434
+ BaseChyz.debug("Controller load ", controller.name, `(${prefix})`);
435
+ if (routes) {
436
+ routes.forEach(route => {
437
+ route.id = (route.path == "/" || route.path == "") ? instance.defaultAction : route.path;
438
+ BaseChyz.debug("Controller route Path", prefix + (route.path.startsWith("/") ? route.path : `/${route.path}`));
439
+ BaseChyz.propvider[route.requestMethod](prefix + (route.path.startsWith("/") ? route.path : `/${route.path}`), (req, res, next) => this.beforeMiddleware(req, res, next, instance, route), (req, res, next) => this.responseHandler(req, res, next, instance, route), (req, res, next) => this.afterMiddleware(req, res, next, instance, route));
440
+ // BaseChyz.propvider[route.requestMethod](prefix + (route.path.startsWith("/") ? route.path : `/${route.path}`),
441
+ // async (req: Request, res: Response, next: NextFunction) => {
442
+ // try {
443
+ // BaseChyz.debug(`Call Request id ${actionId}`)
444
+ // http_request_body("Request body " + JSON.stringify(req.body))
445
+ // http_request_headers("Request header " + JSON.stringify(req.headers))
446
+ // await instance.beforeAction(route, req, res);
447
+ // next()
448
+ // } catch (e: any) {
449
+ //
450
+ // BaseChyz.error(e)
451
+ // if (e instanceof BaseError) {
452
+ // res.status(e?.statusCode || 500)
453
+ // res.json(e.toJSON())
454
+ // } else {
455
+ // res.json(e)
456
+ // }
457
+ //
458
+ // // / next(e)
459
+ // }
460
+ //
461
+ // },
462
+ // async (req: Request, res: Response, next: NextFunction) => {
463
+ // try {
464
+ // // @ts-ignore
465
+ // BaseChyz.debug("Request ID ", req.reqId)
466
+ // // @ts-ignore
467
+ // await instance[route.methodName](req, res, next);
468
+ // instance.afterAction(route, req, res);
469
+ // } catch (e) {
470
+ // BaseChyz.error(e)
471
+ // if (e instanceof BaseError) {
472
+ // res.status(e.statusCode || 500)
473
+ // res.json(e.toJSON())
474
+ // } else {
475
+ // res.json(e)
476
+ // }
477
+ // }
478
+ // })
479
+ });
480
+ }
481
+ }
482
+ });
483
+ }
484
+ middleware() {
485
+ var _a;
486
+ BaseChyz.propvider.use(bodyParser.json({ limit: '1mb' }));
487
+ BaseChyz.propvider.use(bodyParser.urlencoded({ limit: '1mb', extended: true })); // support encoded bodies
488
+ BaseChyz.propvider.use(methodOverride());
489
+ BaseChyz.propvider.use(cors());
490
+ //
491
+ // // CORS
492
+ // BaseChyz.express.use(function (req: any, res: Response, next: any) {
493
+ // // @ts-ignore
494
+ // req.reqId = Utils.uniqueId("chyzzzz_")
495
+ // res.setHeader('Content-Type', 'application/json');
496
+ // res.setHeader("Access-Control-Allow-Origin", "*");
497
+ // res.setHeader("Access-Control-Allow-Credentials", "true");
498
+ // res.setHeader("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
499
+ // res.setHeader("Access-Control-Allow-Headers", "Access-Control-Allow-Origin,Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers,Authorization");
500
+ // next();
501
+ // });
502
+ //
503
+ // compress all responses
504
+ const shouldCompress = (req, res) => {
505
+ // don't compress responses explicitly asking not
506
+ if (req.headers["x-no-compression"] || res.getHeader('Content-Type') === 'text/event-stream') {
507
+ return false;
508
+ }
509
+ // use compression filter function
510
+ return compression.filter(req, res);
511
+ };
512
+ BaseChyz.propvider.use(compression({ filter: shouldCompress }));
513
+ //
514
+ // //static file path
515
+ if (this.config.staticFilePath) {
516
+ BaseChyz.info('Static file path', this.config.staticFilePath);
517
+ BaseChyz.propvider.use(express_1.default.static(this.config.staticFilePath));
518
+ }
519
+ //Middlewares
520
+ for (const middleware1 of Object.keys(BaseChyz.middlewares)) {
521
+ if ((_a = BaseChyz.middlewares[middleware1]) === null || _a === void 0 ? void 0 : _a.keycloak) {
522
+ let keycloak = BaseChyz.middlewares[middleware1].keycloak;
523
+ //@ts-ignore
524
+ BaseChyz.propvider.use(keycloak.middleware(BaseChyz.middlewares[middleware1].config));
525
+ }
526
+ else {
527
+ BaseChyz.propvider.use(BaseChyz.middlewares[middleware1]);
528
+ }
529
+ }
530
+ BaseChyz.propvider.use(this.errorResponder);
531
+ BaseChyz.propvider.use(this.errorHandler);
532
+ BaseChyz.EventEmitter.emit(base_1.CEvents.ON_MIDDLEWARE, this);
533
+ }
534
+ Start() {
535
+ var _a, _b;
536
+ BaseChyz.info("Express Server Starting");
537
+ BaseChyz.EventEmitter.emit(base_1.CEvents.ON_BEFORE_START, this);
538
+ if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.ssl) {
539
+ BaseChyz.httpServer = (0, https_1.createServer)((_b = this.config) === null || _b === void 0 ? void 0 : _b.ssl, BaseChyz.propvider);
540
+ BaseChyz.httpServer.listen(this._port, () => {
541
+ BaseChyz.info("Express Server Start ");
542
+ BaseChyz.info(`Liten Port ${this._port}`);
543
+ BaseChyz.info(`https://localhost:${this._port}`);
544
+ BaseChyz.info(`https://${ip.address()}:${this._port}`);
545
+ BaseChyz.EventEmitter.emit(base_1.CEvents.ON_START, this);
546
+ });
547
+ }
548
+ else {
549
+ BaseChyz.httpServer = (0, http_1.createServer)(BaseChyz.propvider);
550
+ BaseChyz.propvider.listen(this._port, () => {
551
+ BaseChyz.info("Express Server Start ");
552
+ BaseChyz.info(`Liten Port ${this._port}`);
553
+ BaseChyz.info(`http://localhost:${this._port}`);
554
+ BaseChyz.info(`http://${ip.address()}:${this._port}`);
555
+ BaseChyz.EventEmitter.emit(base_1.CEvents.ON_START, this);
556
+ });
557
+ }
558
+ return this;
559
+ }
560
+ }
561
+ BaseChyz.propvider = Server;
562
+ BaseChyz.date = dayjs;
563
+ BaseChyz.logs = new base_1.Logs();
564
+ BaseChyz._validate = validate;
565
+ BaseChyz.controllers = [];
566
+ BaseChyz.components = {};
567
+ BaseChyz.middlewares = {};
568
+ BaseChyz._EventEmitter = em;
569
+ exports.default = BaseChyz;