namirasoft-node 1.0.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.
Files changed (70) hide show
  1. package/dist/AnomalyDetector.d.ts +26 -0
  2. package/dist/AnomalyDetector.js +74 -0
  3. package/dist/AnomalyDetector.js.map +1 -0
  4. package/dist/BaseApplication.d.ts +22 -0
  5. package/dist/BaseApplication.js +104 -0
  6. package/dist/BaseApplication.js.map +1 -0
  7. package/dist/BaseController.d.ts +15 -0
  8. package/dist/BaseController.js +11 -0
  9. package/dist/BaseController.js.map +1 -0
  10. package/dist/BaseDatabase.d.ts +4 -0
  11. package/dist/BaseDatabase.js +7 -0
  12. package/dist/BaseDatabase.js.map +1 -0
  13. package/dist/BaseMiddleware.d.ts +14 -0
  14. package/dist/BaseMiddleware.js +108 -0
  15. package/dist/BaseMiddleware.js.map +1 -0
  16. package/dist/BaseMySqlDatabase.d.ts +4 -0
  17. package/dist/BaseMySqlDatabase.js +11 -0
  18. package/dist/BaseMySqlDatabase.js.map +1 -0
  19. package/dist/BaseSequelizeDatabase.d.ts +15 -0
  20. package/dist/BaseSequelizeDatabase.js +120 -0
  21. package/dist/BaseSequelizeDatabase.js.map +1 -0
  22. package/dist/BaseSequelizeModel.d.ts +3 -0
  23. package/dist/BaseSequelizeModel.js +8 -0
  24. package/dist/BaseSequelizeModel.js.map +1 -0
  25. package/dist/BaseSequelizeTable.d.ts +8 -0
  26. package/dist/BaseSequelizeTable.js +11 -0
  27. package/dist/BaseSequelizeTable.js.map +1 -0
  28. package/dist/BaseTable.d.ts +5 -0
  29. package/dist/BaseTable.js +10 -0
  30. package/dist/BaseTable.js.map +1 -0
  31. package/dist/EmailService.d.ts +16 -0
  32. package/dist/EmailService.js +81 -0
  33. package/dist/EmailService.js.map +1 -0
  34. package/dist/EnvService.d.ts +6 -0
  35. package/dist/EnvService.js +18 -0
  36. package/dist/EnvService.js.map +1 -0
  37. package/dist/IPOperation.d.ts +7 -0
  38. package/dist/IPOperation.js +39 -0
  39. package/dist/IPOperation.js.map +1 -0
  40. package/dist/Meta.d.ts +19 -0
  41. package/dist/Meta.js +29 -0
  42. package/dist/Meta.js.map +1 -0
  43. package/dist/RequestHeaderService.d.ts +8 -0
  44. package/dist/RequestHeaderService.js +17 -0
  45. package/dist/RequestHeaderService.js.map +1 -0
  46. package/dist/ServerToServerOperation.d.ts +5 -0
  47. package/dist/ServerToServerOperation.js +24 -0
  48. package/dist/ServerToServerOperation.js.map +1 -0
  49. package/dist/index.d.ts +15 -0
  50. package/dist/index.js +32 -0
  51. package/dist/index.js.map +1 -0
  52. package/package.json +33 -0
  53. package/src/AnomalyDetector.ts +85 -0
  54. package/src/BaseApplication.ts +112 -0
  55. package/src/BaseController.ts +16 -0
  56. package/src/BaseDatabase.ts +5 -0
  57. package/src/BaseMiddleware.ts +121 -0
  58. package/src/BaseMySqlDatabase.ts +8 -0
  59. package/src/BaseSequelizeDatabase.ts +132 -0
  60. package/src/BaseSequelizeModel.ts +7 -0
  61. package/src/BaseSequelizeTable.ts +13 -0
  62. package/src/BaseTable.ts +10 -0
  63. package/src/EmailService.ts +97 -0
  64. package/src/EnvService.ts +18 -0
  65. package/src/IPOperation.ts +39 -0
  66. package/src/Meta.ts +35 -0
  67. package/src/RequestHeaderService.ts +19 -0
  68. package/src/ServerToServerOperation.ts +24 -0
  69. package/src/index.ts +15 -0
  70. package/tsconfig.json +30 -0
@@ -0,0 +1,26 @@
1
+ export declare class AnomalyDetector {
2
+ static Main: AnomalyDetector;
3
+ MAX_STORAGE_SIZE: number;
4
+ MAX_STORAGE_PER_IP: number;
5
+ MIN_AVG_TIME: number;
6
+ MIN_DATA_REQUIRE_FOR_AVG: number;
7
+ MIN_AVG_TIME_PER_URL: number;
8
+ MIN_DATA_REQUIRE_FOR_AVG_PER_URL: number;
9
+ TIME_FADE_RATE: number;
10
+ Storage: {
11
+ [ip: string]: {
12
+ url: string;
13
+ time: number;
14
+ }[];
15
+ };
16
+ Storageـurl: {
17
+ [ip: string]: {
18
+ [url: string]: {
19
+ time: number;
20
+ }[];
21
+ };
22
+ };
23
+ Orders: string[];
24
+ private weightedAverage;
25
+ isAnomaly(ip: string, url: string): boolean;
26
+ }
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AnomalyDetector = void 0;
4
+ class AnomalyDetector {
5
+ constructor() {
6
+ // configuration
7
+ this.MAX_STORAGE_SIZE = 10000;
8
+ this.MAX_STORAGE_PER_IP = 25;
9
+ this.MIN_AVG_TIME = 200;
10
+ this.MIN_DATA_REQUIRE_FOR_AVG = 4;
11
+ this.MIN_AVG_TIME_PER_URL = 400;
12
+ this.MIN_DATA_REQUIRE_FOR_AVG_PER_URL = 3;
13
+ this.TIME_FADE_RATE = 0.9;
14
+ this.Storage = {};
15
+ this.Storageـurl = {};
16
+ this.Orders = [];
17
+ }
18
+ weightedAverage(array, fade_rate) {
19
+ let sum = 0;
20
+ let sum_coef = 0;
21
+ for (let i = 1; i < array.length; i++) {
22
+ let diff = array[i].time - array[i - 1].time;
23
+ let coef = Math.pow(fade_rate, (array.length - (i + 1)));
24
+ sum += diff * coef;
25
+ sum_coef += coef;
26
+ }
27
+ return sum / sum_coef;
28
+ }
29
+ isAnomaly(ip, url) {
30
+ if (!this.Storage[ip]) {
31
+ this.Storage[ip] = [];
32
+ this.Storageـurl[ip] = {};
33
+ this.Orders.push(ip);
34
+ }
35
+ if (this.Orders.length > this.MAX_STORAGE_SIZE) {
36
+ let index = this.Orders.shift();
37
+ if (index) {
38
+ delete this.Storage[index];
39
+ delete this.Storageـurl[index];
40
+ }
41
+ }
42
+ if (this.Storage[ip].length >= this.MAX_STORAGE_PER_IP) {
43
+ let record = this.Storage[ip].shift(); // remove first element
44
+ if (record)
45
+ this.Storageـurl[ip][record.url].shift(); // remove first element of url array
46
+ }
47
+ this.Storage[ip].push({
48
+ url: url,
49
+ time: +new Date()
50
+ });
51
+ if (!this.Storageـurl[ip][url])
52
+ this.Storageـurl[ip][url] = [];
53
+ this.Storageـurl[ip][url].push({
54
+ time: +new Date()
55
+ });
56
+ // check conditions
57
+ // simple
58
+ if (this.Storage[ip].length >= this.MIN_DATA_REQUIRE_FOR_AVG) {
59
+ let avg = this.weightedAverage(this.Storage[ip], this.TIME_FADE_RATE);
60
+ if (avg < this.MIN_AVG_TIME)
61
+ return true;
62
+ }
63
+ // by requst url
64
+ if (this.Storageـurl[ip][url].length >= this.MIN_DATA_REQUIRE_FOR_AVG_PER_URL) {
65
+ let avg = this.weightedAverage(this.Storageـurl[ip][url], this.TIME_FADE_RATE);
66
+ if (avg < this.MIN_AVG_TIME_PER_URL)
67
+ return true;
68
+ }
69
+ return false;
70
+ }
71
+ }
72
+ exports.AnomalyDetector = AnomalyDetector;
73
+ AnomalyDetector.Main = new AnomalyDetector();
74
+ //# sourceMappingURL=AnomalyDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnomalyDetector.js","sourceRoot":"","sources":["../src/AnomalyDetector.ts"],"names":[],"mappings":";;;AAAA,MAAa,eAAe;IAA5B;QAGI,gBAAgB;QAChB,qBAAgB,GAAG,KAAK,CAAC;QACzB,uBAAkB,GAAG,EAAE,CAAC;QACxB,iBAAY,GAAG,GAAG,CAAC;QACnB,6BAAwB,GAAG,CAAC,CAAC;QAC7B,yBAAoB,GAAG,GAAG,CAAC;QAC3B,qCAAgC,GAAG,CAAC,CAAC;QACrC,mBAAc,GAAG,GAAG,CAAC;QAErB,YAAO,GAAsD,EAAE,CAAC;QAChE,gBAAW,GAA4D,EAAE,CAAC;QAC1E,WAAM,GAAa,EAAE,CAAC;IAsE1B,CAAC;IApEW,eAAe,CAAC,KAAyB,EAAE,SAAiB;QAEhE,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EACrC;YACI,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7C,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC;YACnB,QAAQ,IAAI,IAAI,CAAC;SACpB;QACD,OAAO,GAAG,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED,SAAS,CAAC,EAAU,EAAE,GAAW;QAE7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EACrB;YACI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACxB;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAC9C;YACI,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,KAAK,EACT;gBACI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC3B,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;aAClC;SACJ;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,kBAAkB,EACtD;YACI,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAE,mDAAmD;YAC3F,IAAI,MAAM;gBACN,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,oCAAoC;SACrF;QAED,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC;YAClB,GAAG,EAAE,GAAG;YACR,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE;SACpB,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;YAC1B,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACnC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YAC3B,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE;SACpB,CAAC,CAAC;QAEH,mCAAmC;QACnC,SAAS;QACT,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,wBAAwB,EAC5D;YACI,IAAI,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YACtE,IAAI,GAAG,GAAG,IAAI,CAAC,YAAY;gBACvB,OAAO,IAAI,CAAC;SACnB;QACD,gBAAgB;QAChB,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,gCAAgC,EAC7E;YACI,IAAI,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YAC/E,IAAI,GAAG,GAAG,IAAI,CAAC,oBAAoB;gBAC/B,OAAO,IAAI,CAAC;SACnB;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;;AAnFL,0CAoFC;AAlFU,oBAAI,GAAoB,IAAI,eAAe,EAAE,AAAzC,CAA0C"}
@@ -0,0 +1,22 @@
1
+ import express, { Router } from 'express';
2
+ import { BaseDatabase } from './BaseDatabase';
3
+ import { ILogger } from "namirasoft-log";
4
+ export declare abstract class BaseApplication<D extends BaseDatabase> {
5
+ private title;
6
+ private description;
7
+ private version;
8
+ private swaggerPath;
9
+ app: express.Express;
10
+ database: D;
11
+ logger: ILogger;
12
+ protected abstract getDatabase(): D;
13
+ protected abstract getLogger(): ILogger;
14
+ protected abstract getRouter(): Router;
15
+ protected abstract getPort(): number;
16
+ constructor(title: string, description: string, version: string, swaggerPath: string);
17
+ start(): void;
18
+ protected startCrashHandler(): void;
19
+ protected startDatabase(): void;
20
+ protected startServer(): void;
21
+ protected startSwagger(): void;
22
+ }
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.BaseApplication = void 0;
16
+ const express_1 = __importDefault(require("express"));
17
+ const cors_1 = __importDefault(require("cors"));
18
+ const swagger_ui_express_1 = __importDefault(require("swagger-ui-express"));
19
+ const swagger_jsdoc_1 = __importDefault(require("swagger-jsdoc"));
20
+ class BaseApplication {
21
+ constructor(title, description, version, swaggerPath) {
22
+ this.title = title;
23
+ this.description = description;
24
+ this.version = version;
25
+ this.swaggerPath = swaggerPath;
26
+ this.logger = this.getLogger();
27
+ }
28
+ start() {
29
+ this.startCrashHandler();
30
+ this.startDatabase();
31
+ this.startServer();
32
+ this.startSwagger();
33
+ }
34
+ startCrashHandler() {
35
+ process.on('unhandledRejection', (reason) => {
36
+ if (reason instanceof Error)
37
+ this.logger.onCatchCritical(reason);
38
+ else
39
+ this.logger.critical(reason + "");
40
+ });
41
+ process.on('uncaughtException', (error) => {
42
+ this.logger.onCatchFatal(error);
43
+ });
44
+ }
45
+ startDatabase() {
46
+ this.database = this.getDatabase();
47
+ this.database.init().then(() => this.database.sync(false));
48
+ }
49
+ startServer() {
50
+ this.app = (0, express_1.default)();
51
+ this.app.use((req, res, next) => {
52
+ let excludes = [];
53
+ if (excludes.includes(req.path))
54
+ next();
55
+ else
56
+ express_1.default.json({ limit: '100kb' })(req, res, next);
57
+ });
58
+ // Express
59
+ this.app.use(express_1.default.static('static'));
60
+ // Cors
61
+ this.app.use((0, cors_1.default)({ exposedHeaders: '*', }));
62
+ // api routes
63
+ this.app.use('/', this.getRouter());
64
+ // start server
65
+ const port = this.getPort();
66
+ this.app.listen(port, () => __awaiter(this, void 0, void 0, function* () {
67
+ this.logger.info(`Server listening on port ${port}`);
68
+ }));
69
+ }
70
+ startSwagger() {
71
+ const joptions = {
72
+ definition: {
73
+ openapi: "3.0.1",
74
+ info: {
75
+ title: this.title,
76
+ description: this.description,
77
+ version: this.version,
78
+ // license: {
79
+ // name: "MIT",
80
+ // url: "https://spdx.org/licenses/MIT.html",
81
+ // },
82
+ // contact: {
83
+ // name: "Amir Abolhasani",
84
+ // url: "https://namirasoft.com",
85
+ // email: "accounts@namirasoft.com",
86
+ // },
87
+ },
88
+ // servers: [
89
+ // {
90
+ // url: "http://localhost:3000",
91
+ // },
92
+ // ],
93
+ },
94
+ apis: ['./src/route/*.ts'],
95
+ };
96
+ const swaggerSpec = (0, swagger_jsdoc_1.default)(joptions);
97
+ var options = {
98
+ explorer: true
99
+ };
100
+ this.app.use(this.swaggerPath, swagger_ui_express_1.default.serve, swagger_ui_express_1.default.setup(swaggerSpec, options));
101
+ }
102
+ }
103
+ exports.BaseApplication = BaseApplication;
104
+ //# sourceMappingURL=BaseApplication.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseApplication.js","sourceRoot":"","sources":["../src/BaseApplication.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import * as express from 'express';
2
+ import { BaseDatabase } from './BaseDatabase';
3
+ import { SchemaLike } from 'joi';
4
+ import { AnomalyDetector } from './AnomalyDetector';
5
+ export declare abstract class BaseController<D extends BaseDatabase, State, Props> {
6
+ showLogAtTheBeginning: boolean;
7
+ showLogAtTheEnd: boolean;
8
+ abstract getAnomaly(): AnomalyDetector | null;
9
+ abstract getBodySchema(): SchemaLike | null;
10
+ abstract getQuerySchema(): SchemaLike | null;
11
+ abstract getState(): State;
12
+ abstract preHandle(req: express.Request, res: express.Response, database: D, props: Props): Promise<void>;
13
+ abstract handle(req: express.Request, res: express.Response, database: D, props: Props): Promise<any>;
14
+ abstract postHandle(req: express.Request, res: express.Response, database: D, props: Props): Promise<void>;
15
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseController = void 0;
4
+ class BaseController {
5
+ constructor() {
6
+ this.showLogAtTheBeginning = false;
7
+ this.showLogAtTheEnd = true;
8
+ }
9
+ }
10
+ exports.BaseController = BaseController;
11
+ //# sourceMappingURL=BaseController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseController.js","sourceRoot":"","sources":["../src/BaseController.ts"],"names":[],"mappings":";;;AAIA,MAAsB,cAAc;IAApC;QAEI,0BAAqB,GAAY,KAAK,CAAC;QACvC,oBAAe,GAAY,IAAI,CAAC;IAQpC,CAAC;CAAA;AAXD,wCAWC"}
@@ -0,0 +1,4 @@
1
+ export declare abstract class BaseDatabase {
2
+ abstract init(): Promise<void>;
3
+ abstract sync(force: boolean): void;
4
+ }
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseDatabase = void 0;
4
+ class BaseDatabase {
5
+ }
6
+ exports.BaseDatabase = BaseDatabase;
7
+ //# sourceMappingURL=BaseDatabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseDatabase.js","sourceRoot":"","sources":["../src/BaseDatabase.ts"],"names":[],"mappings":";;;AAAA,MAAsB,YAAY;CAIjC;AAJD,oCAIC"}
@@ -0,0 +1,14 @@
1
+ import * as express from 'express';
2
+ import { BaseDatabase } from './BaseDatabase';
3
+ import { BaseController } from './BaseController';
4
+ import { ILogger } from "namirasoft-log";
5
+ export declare abstract class BaseMiddleware<D extends BaseDatabase, State, Props> {
6
+ protected logger: ILogger;
7
+ abstract getDatabase(): Promise<D>;
8
+ abstract getLogger(): ILogger;
9
+ abstract preHandle(req: express.Request, res: express.Response, database: D, props: Props): Promise<void>;
10
+ abstract postHandle(req: express.Request, res: express.Response, database: D, props: Props): Promise<void>;
11
+ abstract getProps(req: express.Request, res: express.Response, database: D, state: State): Promise<Props>;
12
+ constructor();
13
+ getHandler(controller: BaseController<D, State, Props>): (req: express.Request, res: express.Response) => Promise<express.Response<any, Record<string, any>>>;
14
+ }
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.BaseMiddleware = void 0;
16
+ const Meta_1 = require("./Meta");
17
+ const joi_1 = __importDefault(require("joi"));
18
+ const namirasoft_core_1 = require("namirasoft-core");
19
+ class BaseMiddleware {
20
+ constructor() {
21
+ this.logger = this.getLogger();
22
+ }
23
+ getHandler(controller) {
24
+ return (req, res) => __awaiter(this, void 0, void 0, function* () {
25
+ // meta
26
+ let meta = new Meta_1.Meta(req);
27
+ // result
28
+ let result = {};
29
+ try {
30
+ // meta
31
+ meta.onStart();
32
+ if (controller.showLogAtTheBeginning)
33
+ this.logger.info(JSON.stringify(meta));
34
+ // init controller
35
+ let database = yield this.getDatabase();
36
+ let state = controller.getState();
37
+ let props = yield this.getProps(req, res, database, state);
38
+ // preHandle
39
+ yield this.preHandle(req, res, database, props);
40
+ yield controller.preHandle(req, res, database, props);
41
+ // check for anomaly
42
+ let anomaly = controller.getAnomaly();
43
+ if (anomaly != null)
44
+ if (anomaly.isAnomaly(meta.ip, meta.url))
45
+ namirasoft_core_1.ErrorOperation.throwHTTP(403, 'Suspicious activity detected.');
46
+ // check body validation
47
+ let bodySchema = controller.getBodySchema();
48
+ if (bodySchema != null) {
49
+ const validation = yield joi_1.default.compile(bodySchema)
50
+ .prefs({ errors: { label: 'key' } })
51
+ .validate(req.body);
52
+ if (validation.error) {
53
+ let message = validation.error.details.map((details) => details.message).join(', ');
54
+ namirasoft_core_1.ErrorOperation.throwHTTP(400, message);
55
+ }
56
+ }
57
+ // check query validation
58
+ let querySchema = controller.getQuerySchema();
59
+ if (querySchema != null) {
60
+ const validation = yield joi_1.default.compile(querySchema)
61
+ .prefs({ errors: { label: 'key' } })
62
+ .validate(req.query);
63
+ if (validation.error) {
64
+ let message = validation.error.details.map((details) => details.message).join(', ');
65
+ namirasoft_core_1.ErrorOperation.throwHTTP(400, message);
66
+ }
67
+ }
68
+ // call controller
69
+ if (controller.handle)
70
+ result = yield controller.handle(req, res, database, props);
71
+ if (result == null)
72
+ result = "Success";
73
+ // postHandle
74
+ yield controller.postHandle(req, res, database, props);
75
+ yield this.postHandle(req, res, database, props);
76
+ }
77
+ catch (error) {
78
+ let message;
79
+ if (error instanceof Error) {
80
+ meta.error = error;
81
+ message = error.message;
82
+ }
83
+ else
84
+ message = error + "";
85
+ if (error instanceof namirasoft_core_1.HTTPError) {
86
+ meta.code = error.code;
87
+ this.logger.error(error.message + "\n" + JSON.stringify(meta), undefined, error.stack);
88
+ }
89
+ else {
90
+ meta.code = 500;
91
+ if (error instanceof Error)
92
+ this.logger.critical(error.message + "\n" + JSON.stringify(meta), undefined, error.stack);
93
+ }
94
+ meta.message = message;
95
+ if (error instanceof namirasoft_core_1.HTTPError)
96
+ result = meta.message;
97
+ else
98
+ result = "Sorry, internl server error.";
99
+ }
100
+ meta.onFinish();
101
+ if (controller.showLogAtTheEnd)
102
+ this.logger.info(JSON.stringify(meta));
103
+ return res.status(meta.code).send(result);
104
+ });
105
+ }
106
+ }
107
+ exports.BaseMiddleware = BaseMiddleware;
108
+ //# sourceMappingURL=BaseMiddleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseMiddleware.js","sourceRoot":"","sources":["../src/BaseMiddleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { BaseSequelizeDatabase } from "./BaseSequelizeDatabase";
2
+ export declare abstract class BaseMySqlDatabase extends BaseSequelizeDatabase {
3
+ constructor(name: string, user: string, pass: string, host: string, port: number, logging?: boolean);
4
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseMySqlDatabase = void 0;
4
+ const BaseSequelizeDatabase_1 = require("./BaseSequelizeDatabase");
5
+ class BaseMySqlDatabase extends BaseSequelizeDatabase_1.BaseSequelizeDatabase {
6
+ constructor(name, user, pass, host, port, logging = false) {
7
+ super('mysql', name, user, pass, host, port, logging);
8
+ }
9
+ }
10
+ exports.BaseMySqlDatabase = BaseMySqlDatabase;
11
+ //# sourceMappingURL=BaseMySqlDatabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseMySqlDatabase.js","sourceRoot":"","sources":["../src/BaseMySqlDatabase.ts"],"names":[],"mappings":";;;AAAA,mEAAgE;AAChE,MAAsB,iBAAkB,SAAQ,6CAAqB;IAEjE,YAAY,IAAY,EAAE,IAAY,EAAE,IAAY,EAAE,IAAY,EAAE,IAAY,EAAE,UAAmB,KAAK;QAEtG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;CACJ;AAND,8CAMC"}
@@ -0,0 +1,15 @@
1
+ import { Sequelize, Dialect } from "sequelize";
2
+ import { Model, ModelCtor, FindOptions, Transaction, ModelAttributes, Attributes, ModelOptions } from 'sequelize';
3
+ import { BaseDatabase } from "./BaseDatabase";
4
+ import { BaseSequelizeModel } from "./BaseSequelizeModel";
5
+ import { Where } from "sequelize/types/utils";
6
+ export declare abstract class BaseSequelizeDatabase extends BaseDatabase {
7
+ protected sequelize: Sequelize;
8
+ constructor(dialect: Dialect, name: string, user: string, pass: string, host: string, port: number, logging?: boolean);
9
+ define<M extends Model, TAttributes = Attributes<M>>(modelName: string, attributes: ModelAttributes<M, TAttributes>, options?: ModelOptions<M>): ModelCtor<M>;
10
+ startTransaction<T>(handler: (trx: Transaction) => Promise<T>, trx: Transaction | null): Promise<T>;
11
+ getModel<M extends BaseSequelizeModel>(modelName: string, options: FindOptions<Attributes<M>>, trx: Transaction | null): Promise<M>;
12
+ getModelOrNull<M extends BaseSequelizeModel>(modelName: string, options: FindOptions<Attributes<M>>, trx: Transaction | null): Promise<M | null>;
13
+ getGoogleSearchConditions(columns: string[], search: string, conditions: Where[]): Where[];
14
+ paginate<T extends BaseSequelizeModel>(options: FindOptions<Attributes<T>>, page_number: number, page_size: number, page_size_default?: number): void;
15
+ }
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.BaseSequelizeDatabase = void 0;
13
+ const sequelize_1 = require("sequelize");
14
+ const BaseDatabase_1 = require("./BaseDatabase");
15
+ const namirasoft_core_1 = require("namirasoft-core");
16
+ class BaseSequelizeDatabase extends BaseDatabase_1.BaseDatabase {
17
+ constructor(dialect, name, user, pass, host, port, logging = false) {
18
+ super();
19
+ this.sequelize = new sequelize_1.Sequelize(name, user, pass, {
20
+ dialect,
21
+ host,
22
+ port,
23
+ logging
24
+ });
25
+ }
26
+ define(modelName, attributes, options) {
27
+ if (!options)
28
+ options = {};
29
+ if (options.name == undefined)
30
+ options.name = {
31
+ plural: modelName,
32
+ singular: modelName
33
+ };
34
+ if (options.paranoid == undefined)
35
+ options.paranoid = true;
36
+ if (options.freezeTableName == undefined)
37
+ options.freezeTableName = true;
38
+ if (options.tableName == undefined)
39
+ options.tableName = modelName;
40
+ if (options.underscored == undefined)
41
+ options.underscored = true;
42
+ if (options.timestamps == undefined)
43
+ options.timestamps = true;
44
+ if (options.paranoid == undefined)
45
+ options.paranoid = true;
46
+ if (options.createdAt == undefined)
47
+ options.createdAt = true;
48
+ if (options.updatedAt == undefined)
49
+ options.updatedAt = true;
50
+ return this.sequelize.define(modelName, attributes, options);
51
+ }
52
+ startTransaction(handler, trx) {
53
+ return __awaiter(this, void 0, void 0, function* () {
54
+ if (trx)
55
+ return yield handler(trx);
56
+ trx = yield this.sequelize.transaction();
57
+ try {
58
+ let result = yield handler(trx);
59
+ yield trx.commit();
60
+ return result;
61
+ }
62
+ catch (error) {
63
+ yield trx.rollback();
64
+ throw error;
65
+ }
66
+ });
67
+ }
68
+ getModel(modelName, options, trx) {
69
+ return __awaiter(this, void 0, void 0, function* () {
70
+ let value = yield this.getModelOrNull(modelName, options, trx);
71
+ if (value != null)
72
+ return value;
73
+ throw namirasoft_core_1.ErrorOperation.getHTTP(404, "Could not found " + modelName);
74
+ });
75
+ }
76
+ getModelOrNull(modelName, options, trx) {
77
+ return __awaiter(this, void 0, void 0, function* () {
78
+ if (!options)
79
+ options = {};
80
+ options.transaction = trx;
81
+ let model = this.sequelize.models[modelName];
82
+ return yield model.findOne(options);
83
+ });
84
+ }
85
+ getGoogleSearchConditions(columns, search, conditions) {
86
+ if (!conditions)
87
+ conditions = [];
88
+ if (search)
89
+ if (search.split) {
90
+ let toks = search.split(' ');
91
+ if (toks.length > 0) {
92
+ for (let i = 0; i < toks.length; i++) {
93
+ let rOpr = { [sequelize_1.Op.like]: '%' + toks[i].trim() + '%' };
94
+ let lOpr;
95
+ let cs = columns.map(column => sequelize_1.Sequelize.col(column));
96
+ lOpr = sequelize_1.Sequelize.fn("concat", ...cs);
97
+ let condition = sequelize_1.Sequelize.where(lOpr, rOpr);
98
+ conditions.push(condition);
99
+ }
100
+ }
101
+ }
102
+ return conditions;
103
+ }
104
+ paginate(options, page_number, page_size, page_size_default) {
105
+ // page_number
106
+ if (isNaN(page_number))
107
+ page_number = 1;
108
+ // page_size
109
+ if (isNaN(page_size))
110
+ if (page_size_default)
111
+ page_size = page_size_default;
112
+ if (isNaN(page_size))
113
+ page_size = 20;
114
+ //
115
+ options.offset = (page_number - 1) * page_size;
116
+ options.limit = page_size;
117
+ }
118
+ }
119
+ exports.BaseSequelizeDatabase = BaseSequelizeDatabase;
120
+ //# sourceMappingURL=BaseSequelizeDatabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseSequelizeDatabase.js","sourceRoot":"","sources":["../src/BaseSequelizeDatabase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Model } from 'sequelize';
2
+ export declare abstract class BaseSequelizeModel extends Model {
3
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseSequelizeModel = void 0;
4
+ const sequelize_1 = require("sequelize");
5
+ class BaseSequelizeModel extends sequelize_1.Model {
6
+ }
7
+ exports.BaseSequelizeModel = BaseSequelizeModel;
8
+ //# sourceMappingURL=BaseSequelizeModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseSequelizeModel.js","sourceRoot":"","sources":["../src/BaseSequelizeModel.ts"],"names":[],"mappings":";;;AACA,yCAAkC;AAElC,MAAsB,kBAAmB,SAAQ,iBAAK;CAGrD;AAHD,gDAGC"}
@@ -0,0 +1,8 @@
1
+ import { ModelCtor } from "sequelize";
2
+ import { BaseSequelizeDatabase } from "./BaseSequelizeDatabase";
3
+ import { BaseSequelizeModel } from "./BaseSequelizeModel";
4
+ import { BaseTable } from "./BaseTable";
5
+ export declare class BaseSequelizeTable<D extends BaseSequelizeDatabase, M extends BaseSequelizeModel> extends BaseTable<D> {
6
+ model: ModelCtor<M>;
7
+ constructor(database: D);
8
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseSequelizeTable = void 0;
4
+ const BaseTable_1 = require("./BaseTable");
5
+ class BaseSequelizeTable extends BaseTable_1.BaseTable {
6
+ constructor(database) {
7
+ super(database);
8
+ }
9
+ }
10
+ exports.BaseSequelizeTable = BaseSequelizeTable;
11
+ //# sourceMappingURL=BaseSequelizeTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseSequelizeTable.js","sourceRoot":"","sources":["../src/BaseSequelizeTable.ts"],"names":[],"mappings":";;;AAGA,2CAAwC;AAExC,MAAa,kBAAkF,SAAQ,qBAAY;IAG/G,YAAY,QAAW;QAEnB,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;CACJ;AAPD,gDAOC"}
@@ -0,0 +1,5 @@
1
+ import { BaseDatabase } from "./BaseDatabase";
2
+ export declare class BaseTable<D extends BaseDatabase> {
3
+ database: D;
4
+ constructor(database: D);
5
+ }