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.
- package/dist/AnomalyDetector.d.ts +26 -0
- package/dist/AnomalyDetector.js +74 -0
- package/dist/AnomalyDetector.js.map +1 -0
- package/dist/BaseApplication.d.ts +22 -0
- package/dist/BaseApplication.js +104 -0
- package/dist/BaseApplication.js.map +1 -0
- package/dist/BaseController.d.ts +15 -0
- package/dist/BaseController.js +11 -0
- package/dist/BaseController.js.map +1 -0
- package/dist/BaseDatabase.d.ts +4 -0
- package/dist/BaseDatabase.js +7 -0
- package/dist/BaseDatabase.js.map +1 -0
- package/dist/BaseMiddleware.d.ts +14 -0
- package/dist/BaseMiddleware.js +108 -0
- package/dist/BaseMiddleware.js.map +1 -0
- package/dist/BaseMySqlDatabase.d.ts +4 -0
- package/dist/BaseMySqlDatabase.js +11 -0
- package/dist/BaseMySqlDatabase.js.map +1 -0
- package/dist/BaseSequelizeDatabase.d.ts +15 -0
- package/dist/BaseSequelizeDatabase.js +120 -0
- package/dist/BaseSequelizeDatabase.js.map +1 -0
- package/dist/BaseSequelizeModel.d.ts +3 -0
- package/dist/BaseSequelizeModel.js +8 -0
- package/dist/BaseSequelizeModel.js.map +1 -0
- package/dist/BaseSequelizeTable.d.ts +8 -0
- package/dist/BaseSequelizeTable.js +11 -0
- package/dist/BaseSequelizeTable.js.map +1 -0
- package/dist/BaseTable.d.ts +5 -0
- package/dist/BaseTable.js +10 -0
- package/dist/BaseTable.js.map +1 -0
- package/dist/EmailService.d.ts +16 -0
- package/dist/EmailService.js +81 -0
- package/dist/EmailService.js.map +1 -0
- package/dist/EnvService.d.ts +6 -0
- package/dist/EnvService.js +18 -0
- package/dist/EnvService.js.map +1 -0
- package/dist/IPOperation.d.ts +7 -0
- package/dist/IPOperation.js +39 -0
- package/dist/IPOperation.js.map +1 -0
- package/dist/Meta.d.ts +19 -0
- package/dist/Meta.js +29 -0
- package/dist/Meta.js.map +1 -0
- package/dist/RequestHeaderService.d.ts +8 -0
- package/dist/RequestHeaderService.js +17 -0
- package/dist/RequestHeaderService.js.map +1 -0
- package/dist/ServerToServerOperation.d.ts +5 -0
- package/dist/ServerToServerOperation.js +24 -0
- package/dist/ServerToServerOperation.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/package.json +33 -0
- package/src/AnomalyDetector.ts +85 -0
- package/src/BaseApplication.ts +112 -0
- package/src/BaseController.ts +16 -0
- package/src/BaseDatabase.ts +5 -0
- package/src/BaseMiddleware.ts +121 -0
- package/src/BaseMySqlDatabase.ts +8 -0
- package/src/BaseSequelizeDatabase.ts +132 -0
- package/src/BaseSequelizeModel.ts +7 -0
- package/src/BaseSequelizeTable.ts +13 -0
- package/src/BaseTable.ts +10 -0
- package/src/EmailService.ts +97 -0
- package/src/EnvService.ts +18 -0
- package/src/IPOperation.ts +39 -0
- package/src/Meta.ts +35 -0
- package/src/RequestHeaderService.ts +19 -0
- package/src/ServerToServerOperation.ts +24 -0
- package/src/index.ts +15 -0
- 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":"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"}
|
|
@@ -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 @@
|
|
|
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,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,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"}
|