axe-api 0.20.1 → 0.20.2
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/build/index.d.ts +8 -0
- package/build/index.js +32 -0
- package/build/src/Builders/ModelTreeBuilder.d.ts +9 -0
- package/build/src/Builders/ModelTreeBuilder.js +64 -0
- package/build/src/Builders/RouterBuilder.d.ts +15 -0
- package/build/src/Builders/RouterBuilder.js +219 -0
- package/build/src/Builders/index.d.ts +3 -0
- package/build/src/Builders/index.js +10 -0
- package/build/src/Enums.d.ts +77 -0
- package/build/src/Enums.js +90 -0
- package/build/src/Exceptions/ApiError.d.ts +8 -0
- package/build/src/Exceptions/ApiError.js +12 -0
- package/build/src/Handlers/AllHandler.d.ts +4 -0
- package/build/src/Handlers/AllHandler.js +44 -0
- package/build/src/Handlers/DestroyHandler.d.ts +4 -0
- package/build/src/Handlers/DestroyHandler.js +37 -0
- package/build/src/Handlers/HandlerFactory.d.ts +6 -0
- package/build/src/Handlers/HandlerFactory.js +36 -0
- package/build/src/Handlers/Helpers.d.ts +14 -0
- package/build/src/Handlers/Helpers.js +217 -0
- package/build/src/Handlers/PaginateHandler.d.ts +4 -0
- package/build/src/Handlers/PaginateHandler.js +48 -0
- package/build/src/Handlers/PatchHandler.d.ts +4 -0
- package/build/src/Handlers/PatchHandler.js +62 -0
- package/build/src/Handlers/ShowHandler.d.ts +4 -0
- package/build/src/Handlers/ShowHandler.js +51 -0
- package/build/src/Handlers/StoreHandler.d.ts +4 -0
- package/build/src/Handlers/StoreHandler.js +59 -0
- package/build/src/Handlers/UpdateHandler.d.ts +4 -0
- package/build/src/Handlers/UpdateHandler.js +62 -0
- package/build/src/Interfaces.d.ts +146 -0
- package/build/src/Interfaces.js +3 -0
- package/build/src/Model.d.ts +25 -0
- package/build/src/Model.js +145 -0
- package/build/src/Resolvers/FileResolver.d.ts +5 -0
- package/build/src/Resolvers/FileResolver.js +85 -0
- package/build/src/Resolvers/FolderResolver.d.ts +5 -0
- package/build/src/Resolvers/FolderResolver.js +19 -0
- package/build/src/Resolvers/GeneralHookResolver.d.ts +5 -0
- package/build/src/Resolvers/GeneralHookResolver.js +35 -0
- package/build/src/Resolvers/ModelResolver.d.ts +9 -0
- package/build/src/Resolvers/ModelResolver.js +107 -0
- package/build/src/Resolvers/TransactionResolver.d.ts +8 -0
- package/build/src/Resolvers/TransactionResolver.js +75 -0
- package/build/src/Resolvers/WithQueryResolver.d.ts +13 -0
- package/build/src/Resolvers/WithQueryResolver.js +116 -0
- package/build/src/Resolvers/index.d.ts +7 -0
- package/build/src/Resolvers/index.js +18 -0
- package/build/src/Server.d.ts +8 -0
- package/build/src/Server.js +103 -0
- package/build/src/Services/DocumentationService.d.ts +9 -0
- package/build/src/Services/DocumentationService.js +22 -0
- package/build/src/Services/IoCService.d.ts +9 -0
- package/build/src/Services/IoCService.js +51 -0
- package/build/src/Services/LogService.d.ts +12 -0
- package/build/src/Services/LogService.js +41 -0
- package/build/src/Services/ModelListService.d.ts +8 -0
- package/build/src/Services/ModelListService.js +18 -0
- package/build/src/Services/ModelService.d.ts +20 -0
- package/build/src/Services/ModelService.js +38 -0
- package/build/src/Services/QueryService.d.ts +34 -0
- package/build/src/Services/QueryService.js +377 -0
- package/build/src/Services/SchemaValidatorService.d.ts +12 -0
- package/build/src/Services/SchemaValidatorService.js +114 -0
- package/build/src/Services/index.d.ts +8 -0
- package/build/src/Services/index.js +20 -0
- package/build/src/constants.d.ts +23 -0
- package/build/src/constants.js +62 -0
- package/package.json +1 -1
package/build/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import Server from "./src/Server";
|
|
2
|
+
import Model from "./src/Model";
|
|
3
|
+
import ApiError from "./src/Exceptions/ApiError";
|
|
4
|
+
import { DEFAULT_HANDLERS } from "./src/constants";
|
|
5
|
+
import { IoCService } from "./src/Services";
|
|
6
|
+
export * from "./src/Enums";
|
|
7
|
+
export * from "./src/Interfaces";
|
|
8
|
+
export { Server, Model, ApiError, DEFAULT_HANDLERS, IoCService };
|
package/build/index.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.IoCService = exports.DEFAULT_HANDLERS = exports.ApiError = exports.Model = exports.Server = void 0;
|
|
21
|
+
const Server_1 = __importDefault(require("./src/Server"));
|
|
22
|
+
exports.Server = Server_1.default;
|
|
23
|
+
const Model_1 = __importDefault(require("./src/Model"));
|
|
24
|
+
exports.Model = Model_1.default;
|
|
25
|
+
const ApiError_1 = __importDefault(require("./src/Exceptions/ApiError"));
|
|
26
|
+
exports.ApiError = ApiError_1.default;
|
|
27
|
+
const constants_1 = require("./src/constants");
|
|
28
|
+
Object.defineProperty(exports, "DEFAULT_HANDLERS", { enumerable: true, get: function () { return constants_1.DEFAULT_HANDLERS; } });
|
|
29
|
+
const Services_1 = require("./src/Services");
|
|
30
|
+
Object.defineProperty(exports, "IoCService", { enumerable: true, get: function () { return Services_1.IoCService; } });
|
|
31
|
+
__exportStar(require("./src/Enums"), exports);
|
|
32
|
+
__exportStar(require("./src/Interfaces"), exports);
|
|
@@ -0,0 +1,64 @@
|
|
|
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
|
+
const Enums_1 = require("../Enums");
|
|
13
|
+
const Services_1 = require("../Services");
|
|
14
|
+
class ModelTreeBuilder {
|
|
15
|
+
build() {
|
|
16
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
17
|
+
const logger = yield Services_1.IoCService.useByType("LogService");
|
|
18
|
+
const modelList = yield Services_1.IoCService.useByType("ModelListService");
|
|
19
|
+
const tree = this.getRootLevelOfTree(modelList);
|
|
20
|
+
this.createRecursiveTree(tree, modelList);
|
|
21
|
+
this.addNestedRoutes(tree, modelList);
|
|
22
|
+
Services_1.IoCService.singleton("ModelTree", () => tree);
|
|
23
|
+
logger.info("Model tree has been created.");
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
getRootLevelOfTree(modelList) {
|
|
27
|
+
const childModels = [];
|
|
28
|
+
modelList.get().forEach((model) => {
|
|
29
|
+
childModels.push(...model.relations
|
|
30
|
+
.filter((relation) => relation.type === Enums_1.Relationships.HAS_MANY)
|
|
31
|
+
.map((relation) => relation.model));
|
|
32
|
+
});
|
|
33
|
+
return modelList.get().filter((model) => !childModels.includes(model.name));
|
|
34
|
+
}
|
|
35
|
+
createRecursiveTree(tree, modelList) {
|
|
36
|
+
for (const model of tree) {
|
|
37
|
+
this.setChildrens(model, modelList);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
setChildrens(model, modelList) {
|
|
41
|
+
const childModelNames = this.getChildModelNames(model);
|
|
42
|
+
model.children = modelList
|
|
43
|
+
.get()
|
|
44
|
+
.filter((item) => childModelNames.includes(item.name));
|
|
45
|
+
for (const child of model.children) {
|
|
46
|
+
this.setChildrens(child, modelList);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
getChildModelNames(model) {
|
|
50
|
+
return model.relations
|
|
51
|
+
.filter((item) => item.type === Enums_1.Relationships.HAS_MANY)
|
|
52
|
+
.map((item) => item.model);
|
|
53
|
+
}
|
|
54
|
+
addNestedRoutes(tree, modelList) {
|
|
55
|
+
// We should add recursive models
|
|
56
|
+
modelList.get().forEach((model) => {
|
|
57
|
+
const recursiveRelations = model.relations.filter((relation) => relation.model === model.name);
|
|
58
|
+
if (recursiveRelations.length === 2) {
|
|
59
|
+
tree.push(Object.assign(Object.assign({}, model), { isRecursive: true, children: [] }));
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.default = ModelTreeBuilder;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
declare class RouterBuilder {
|
|
2
|
+
build(): Promise<void>;
|
|
3
|
+
private createRoutesByModelTree;
|
|
4
|
+
private createRouteByModel;
|
|
5
|
+
private createNestedRoutes;
|
|
6
|
+
private createChildRoutes;
|
|
7
|
+
private getPrimaryKeyName;
|
|
8
|
+
private ucFirst;
|
|
9
|
+
private addExpressRoute;
|
|
10
|
+
private requestHandler;
|
|
11
|
+
private sendErrorAsResponse;
|
|
12
|
+
private getResourcePath;
|
|
13
|
+
private getRootPrefix;
|
|
14
|
+
}
|
|
15
|
+
export default RouterBuilder;
|
|
@@ -0,0 +1,219 @@
|
|
|
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
|
+
const pluralize_1 = __importDefault(require("pluralize"));
|
|
16
|
+
const http_status_codes_1 = require("http-status-codes");
|
|
17
|
+
const change_case_1 = require("change-case");
|
|
18
|
+
const Resolvers_1 = require("../Resolvers");
|
|
19
|
+
const constants_1 = require("../constants");
|
|
20
|
+
const Enums_1 = require("../Enums");
|
|
21
|
+
const Services_1 = require("../Services");
|
|
22
|
+
class RouterBuilder {
|
|
23
|
+
constructor() {
|
|
24
|
+
this.getPrimaryKeyName = (model) => {
|
|
25
|
+
return (pluralize_1.default.singular(model.name).toLowerCase() +
|
|
26
|
+
this.ucFirst(model.instance.primaryKey));
|
|
27
|
+
};
|
|
28
|
+
this.ucFirst = (value) => {
|
|
29
|
+
return value.charAt(0).toUpperCase() + value.slice(1);
|
|
30
|
+
};
|
|
31
|
+
this.getRootPrefix = () => __awaiter(this, void 0, void 0, function* () {
|
|
32
|
+
var _a;
|
|
33
|
+
const config = yield Services_1.IoCService.use("Config");
|
|
34
|
+
let prefix = ((_a = config === null || config === void 0 ? void 0 : config.Application) === null || _a === void 0 ? void 0 : _a.prefix) || "api";
|
|
35
|
+
if (prefix.substr(0, 1) === "/") {
|
|
36
|
+
prefix = prefix.substr(1);
|
|
37
|
+
}
|
|
38
|
+
if (prefix.substr(prefix.length - 1) === "/") {
|
|
39
|
+
prefix = prefix.substr(0, prefix.length - 1);
|
|
40
|
+
}
|
|
41
|
+
return prefix;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
build() {
|
|
45
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
46
|
+
const app = yield Services_1.IoCService.useByType("App");
|
|
47
|
+
const logger = yield Services_1.IoCService.useByType("LogService");
|
|
48
|
+
const modelTree = yield Services_1.IoCService.useByType("ModelTree");
|
|
49
|
+
const modelList = yield Services_1.IoCService.useByType("ModelListService");
|
|
50
|
+
const generalHooks = yield Resolvers_1.GeneralHookResolver.resolve();
|
|
51
|
+
if (generalHooks.onBeforeInit) {
|
|
52
|
+
generalHooks.onBeforeInit(app);
|
|
53
|
+
}
|
|
54
|
+
yield this.createRoutesByModelTree(modelTree, modelList);
|
|
55
|
+
if (generalHooks.onAfterInit) {
|
|
56
|
+
generalHooks.onAfterInit(app);
|
|
57
|
+
}
|
|
58
|
+
logger.info("Express routes have been created.");
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
createRoutesByModelTree(modelTree, modelList) {
|
|
62
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
63
|
+
for (const model of modelTree) {
|
|
64
|
+
yield this.createRouteByModel(model, modelList);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
createRouteByModel(model, modelList, urlPrefix = "", parentModel = null, relation = null, allowRecursive = true) {
|
|
69
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
70
|
+
if (model.instance.ignore) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const resource = this.getResourcePath(model, relation);
|
|
74
|
+
// We create and handle routes by not duplicate so many lines.
|
|
75
|
+
for (const handler of Object.keys(constants_1.API_ROUTE_TEMPLATES)) {
|
|
76
|
+
const handlerType = handler;
|
|
77
|
+
if (!model.instance.handlers.includes(handlerType)) {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const urlCreator = constants_1.API_ROUTE_TEMPLATES[handlerType];
|
|
81
|
+
const url = urlCreator(yield this.getRootPrefix(), urlPrefix, resource, model.instance.primaryKey);
|
|
82
|
+
// Detecting filters
|
|
83
|
+
const middlewares = model.instance.getMiddlewares(handlerType);
|
|
84
|
+
// Adding the route to the express
|
|
85
|
+
yield this.addExpressRoute(handlerType, url, middlewares, model, parentModel, relation);
|
|
86
|
+
}
|
|
87
|
+
yield this.createChildRoutes(model, modelList, resource, urlPrefix);
|
|
88
|
+
yield this.createNestedRoutes(model, modelList, allowRecursive, urlPrefix, resource);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
createNestedRoutes(model, modelList, allowRecursive, urlPrefix, resource) {
|
|
92
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
93
|
+
if (!model.isRecursive || !allowRecursive) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// We should different parameter name for child routes
|
|
97
|
+
const relation = model.relations.find((relation) => relation.model === model.name &&
|
|
98
|
+
relation.type === Enums_1.Relationships.HAS_MANY);
|
|
99
|
+
if (relation) {
|
|
100
|
+
yield this.createRouteByModel(model, modelList, `${urlPrefix}${resource}/:${(0, change_case_1.camelCase)(relation.foreignKey)}/`, model, relation, false);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
createChildRoutes(model, modelList, resource, urlPrefix) {
|
|
105
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
106
|
+
if (model.children.length === 0) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// We should different parameter name for child routes
|
|
110
|
+
const primaryKey = this.getPrimaryKeyName(model);
|
|
111
|
+
const subRelations = model.relations.filter((item) => item.type === Enums_1.Relationships.HAS_MANY);
|
|
112
|
+
for (const relation of subRelations) {
|
|
113
|
+
const child = model.children.find((item) => item.name === relation.model);
|
|
114
|
+
// It should be recursive
|
|
115
|
+
if (child) {
|
|
116
|
+
yield this.createRouteByModel(child, modelList, `${urlPrefix}${resource}/:${primaryKey}/`, model, relation);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
addExpressRoute(handlerType, url, middlewares, model, parentModel, relation) {
|
|
122
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
123
|
+
const docs = yield Services_1.IoCService.useByType("DocumentationService");
|
|
124
|
+
const app = yield Services_1.IoCService.useByType("App");
|
|
125
|
+
const handler = (req, res) => {
|
|
126
|
+
this.requestHandler(handlerType, req, res, model, parentModel, relation);
|
|
127
|
+
};
|
|
128
|
+
switch (handlerType) {
|
|
129
|
+
case Enums_1.HandlerTypes.ALL:
|
|
130
|
+
app.get(url, middlewares, handler);
|
|
131
|
+
docs.push(Enums_1.HttpMethods.GET, url, model);
|
|
132
|
+
break;
|
|
133
|
+
case Enums_1.HandlerTypes.DELETE:
|
|
134
|
+
app.delete(url, middlewares, handler);
|
|
135
|
+
docs.push(Enums_1.HttpMethods.DELETE, url, model);
|
|
136
|
+
break;
|
|
137
|
+
case Enums_1.HandlerTypes.INSERT:
|
|
138
|
+
app.post(url, middlewares, handler);
|
|
139
|
+
docs.push(Enums_1.HttpMethods.POST, url, model);
|
|
140
|
+
break;
|
|
141
|
+
case Enums_1.HandlerTypes.PAGINATE:
|
|
142
|
+
app.get(url, middlewares, handler);
|
|
143
|
+
docs.push(Enums_1.HttpMethods.GET, url, model);
|
|
144
|
+
break;
|
|
145
|
+
case Enums_1.HandlerTypes.PATCH:
|
|
146
|
+
app.patch(url, middlewares, handler);
|
|
147
|
+
docs.push(Enums_1.HttpMethods.PATCH, url, model);
|
|
148
|
+
break;
|
|
149
|
+
case Enums_1.HandlerTypes.SHOW:
|
|
150
|
+
app.get(url, middlewares, handler);
|
|
151
|
+
docs.push(Enums_1.HttpMethods.GET, url, model);
|
|
152
|
+
break;
|
|
153
|
+
case Enums_1.HandlerTypes.UPDATE:
|
|
154
|
+
app.put(url, middlewares, handler);
|
|
155
|
+
docs.push(Enums_1.HttpMethods.PUT, url, model);
|
|
156
|
+
break;
|
|
157
|
+
default:
|
|
158
|
+
throw new Error("Undefined handler type");
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
requestHandler(handlerType, req, res, model, parentModel, relation) {
|
|
163
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
164
|
+
let trx = null;
|
|
165
|
+
let hasTransaction = false;
|
|
166
|
+
try {
|
|
167
|
+
const factory = yield Services_1.IoCService.useByType("HandlerFactory");
|
|
168
|
+
const database = (yield Services_1.IoCService.use("Database"));
|
|
169
|
+
hasTransaction = yield Resolvers_1.TransactionResolver.resolve(model, handlerType);
|
|
170
|
+
if (hasTransaction) {
|
|
171
|
+
trx = yield database.transaction();
|
|
172
|
+
}
|
|
173
|
+
const handler = factory.get(handlerType);
|
|
174
|
+
const pack = {
|
|
175
|
+
req,
|
|
176
|
+
res,
|
|
177
|
+
handlerType,
|
|
178
|
+
model,
|
|
179
|
+
parentModel,
|
|
180
|
+
relation,
|
|
181
|
+
database: hasTransaction && trx ? trx : database,
|
|
182
|
+
};
|
|
183
|
+
yield handler(pack);
|
|
184
|
+
if (hasTransaction && trx) {
|
|
185
|
+
trx.commit();
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
if (hasTransaction && trx) {
|
|
190
|
+
trx.rollback();
|
|
191
|
+
}
|
|
192
|
+
this.sendErrorAsResponse(res, error);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
sendErrorAsResponse(res, error) {
|
|
197
|
+
const type = error.type;
|
|
198
|
+
switch (type) {
|
|
199
|
+
case "ApiError":
|
|
200
|
+
// eslint-disable-next-line no-case-declarations
|
|
201
|
+
const apiError = error;
|
|
202
|
+
res.status(apiError.status).json({
|
|
203
|
+
error: apiError.message,
|
|
204
|
+
});
|
|
205
|
+
break;
|
|
206
|
+
default:
|
|
207
|
+
res.status(http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
208
|
+
error: "An error occurred.",
|
|
209
|
+
});
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
getResourcePath(model, relation) {
|
|
214
|
+
return relation
|
|
215
|
+
? (0, change_case_1.paramCase)(relation.name)
|
|
216
|
+
: (0, change_case_1.paramCase)(pluralize_1.default.plural(model.name)).toLowerCase();
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
exports.default = RouterBuilder;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.RouterBuilder = exports.ModelTreeBuilder = void 0;
|
|
7
|
+
const ModelTreeBuilder_1 = __importDefault(require("./ModelTreeBuilder"));
|
|
8
|
+
exports.ModelTreeBuilder = ModelTreeBuilder_1.default;
|
|
9
|
+
const RouterBuilder_1 = __importDefault(require("./RouterBuilder"));
|
|
10
|
+
exports.RouterBuilder = RouterBuilder_1.default;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export declare enum ConditionTypes {
|
|
2
|
+
NotNull = "NotNull",
|
|
3
|
+
Null = "Null",
|
|
4
|
+
"=" = "=",
|
|
5
|
+
"<>" = "<>",
|
|
6
|
+
">" = ">",
|
|
7
|
+
">=" = ">=",
|
|
8
|
+
"<" = "<",
|
|
9
|
+
"<=" = "<=",
|
|
10
|
+
"LIKE" = "LIKE",
|
|
11
|
+
"NOT LIKE" = "NOT LIKE",
|
|
12
|
+
"In" = "In",
|
|
13
|
+
"NotIn" = "NotIn",
|
|
14
|
+
"Between" = "Between",
|
|
15
|
+
"NotBetween" = "NotBetween"
|
|
16
|
+
}
|
|
17
|
+
export declare enum DependencyTypes {
|
|
18
|
+
BIND = "BIND",
|
|
19
|
+
SINGLETON = "SINGLETON"
|
|
20
|
+
}
|
|
21
|
+
export declare enum HandlerTypes {
|
|
22
|
+
INSERT = "store",
|
|
23
|
+
PAGINATE = "paginate",
|
|
24
|
+
SHOW = "show",
|
|
25
|
+
UPDATE = "update",
|
|
26
|
+
DELETE = "destroy",
|
|
27
|
+
PATCH = "patch",
|
|
28
|
+
ALL = "all"
|
|
29
|
+
}
|
|
30
|
+
export declare enum HookFunctionTypes {
|
|
31
|
+
onBeforeInsert = "onBeforeInsert",
|
|
32
|
+
onBeforeUpdateQuery = "onBeforeUpdateQuery",
|
|
33
|
+
onBeforeUpdate = "onBeforeUpdate",
|
|
34
|
+
onBeforeDeleteQuery = "onBeforeDeleteQuery",
|
|
35
|
+
onBeforeDelete = "onBeforeDelete",
|
|
36
|
+
onBeforePaginate = "onBeforePaginate",
|
|
37
|
+
onBeforeAll = "onBeforeAll",
|
|
38
|
+
onBeforeShow = "onBeforeShow",
|
|
39
|
+
onAfterInsert = "onAfterInsert",
|
|
40
|
+
onAfterUpdateQuery = "onAfterUpdateQuery",
|
|
41
|
+
onAfterUpdate = "onAfterUpdate",
|
|
42
|
+
onAfterDeleteQuery = "onAfterDeleteQuery",
|
|
43
|
+
onAfterDelete = "onAfterDelete",
|
|
44
|
+
onAfterPaginate = "onAfterPaginate",
|
|
45
|
+
onAfterAll = "onAfterAll",
|
|
46
|
+
onAfterShow = "onAfterShow"
|
|
47
|
+
}
|
|
48
|
+
export declare enum Extensions {
|
|
49
|
+
Hooks = "Hooks",
|
|
50
|
+
Events = "Events"
|
|
51
|
+
}
|
|
52
|
+
export declare enum HttpMethods {
|
|
53
|
+
POST = "POST",
|
|
54
|
+
PUT = "PUT",
|
|
55
|
+
PATCH = "PATCH",
|
|
56
|
+
GET = "GET",
|
|
57
|
+
DELETE = "DELETE"
|
|
58
|
+
}
|
|
59
|
+
export declare enum LogLevels {
|
|
60
|
+
NONE = 0,
|
|
61
|
+
ERROR = 1,
|
|
62
|
+
WARNING = 2,
|
|
63
|
+
INFO = 3,
|
|
64
|
+
ALL = 4
|
|
65
|
+
}
|
|
66
|
+
export declare enum Relationships {
|
|
67
|
+
HAS_ONE = "HAS_ONE",
|
|
68
|
+
HAS_MANY = "HAS_MANY"
|
|
69
|
+
}
|
|
70
|
+
export declare enum SortTypes {
|
|
71
|
+
ASC = "ASC",
|
|
72
|
+
DESC = "DESC"
|
|
73
|
+
}
|
|
74
|
+
export declare enum TimestampColumns {
|
|
75
|
+
CREATED_AT = "createdAtColumn",
|
|
76
|
+
UPDATED_AT = "updatedAtColumn"
|
|
77
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TimestampColumns = exports.SortTypes = exports.Relationships = exports.LogLevels = exports.HttpMethods = exports.Extensions = exports.HookFunctionTypes = exports.HandlerTypes = exports.DependencyTypes = exports.ConditionTypes = void 0;
|
|
4
|
+
var ConditionTypes;
|
|
5
|
+
(function (ConditionTypes) {
|
|
6
|
+
ConditionTypes["NotNull"] = "NotNull";
|
|
7
|
+
ConditionTypes["Null"] = "Null";
|
|
8
|
+
ConditionTypes["="] = "=";
|
|
9
|
+
ConditionTypes["<>"] = "<>";
|
|
10
|
+
ConditionTypes[">"] = ">";
|
|
11
|
+
ConditionTypes[">="] = ">=";
|
|
12
|
+
ConditionTypes["<"] = "<";
|
|
13
|
+
ConditionTypes["<="] = "<=";
|
|
14
|
+
ConditionTypes["LIKE"] = "LIKE";
|
|
15
|
+
ConditionTypes["NOT LIKE"] = "NOT LIKE";
|
|
16
|
+
ConditionTypes["In"] = "In";
|
|
17
|
+
ConditionTypes["NotIn"] = "NotIn";
|
|
18
|
+
ConditionTypes["Between"] = "Between";
|
|
19
|
+
ConditionTypes["NotBetween"] = "NotBetween";
|
|
20
|
+
})(ConditionTypes = exports.ConditionTypes || (exports.ConditionTypes = {}));
|
|
21
|
+
var DependencyTypes;
|
|
22
|
+
(function (DependencyTypes) {
|
|
23
|
+
DependencyTypes["BIND"] = "BIND";
|
|
24
|
+
DependencyTypes["SINGLETON"] = "SINGLETON";
|
|
25
|
+
})(DependencyTypes = exports.DependencyTypes || (exports.DependencyTypes = {}));
|
|
26
|
+
var HandlerTypes;
|
|
27
|
+
(function (HandlerTypes) {
|
|
28
|
+
HandlerTypes["INSERT"] = "store";
|
|
29
|
+
HandlerTypes["PAGINATE"] = "paginate";
|
|
30
|
+
HandlerTypes["SHOW"] = "show";
|
|
31
|
+
HandlerTypes["UPDATE"] = "update";
|
|
32
|
+
HandlerTypes["DELETE"] = "destroy";
|
|
33
|
+
HandlerTypes["PATCH"] = "patch";
|
|
34
|
+
HandlerTypes["ALL"] = "all";
|
|
35
|
+
})(HandlerTypes = exports.HandlerTypes || (exports.HandlerTypes = {}));
|
|
36
|
+
var HookFunctionTypes;
|
|
37
|
+
(function (HookFunctionTypes) {
|
|
38
|
+
HookFunctionTypes["onBeforeInsert"] = "onBeforeInsert";
|
|
39
|
+
HookFunctionTypes["onBeforeUpdateQuery"] = "onBeforeUpdateQuery";
|
|
40
|
+
HookFunctionTypes["onBeforeUpdate"] = "onBeforeUpdate";
|
|
41
|
+
HookFunctionTypes["onBeforeDeleteQuery"] = "onBeforeDeleteQuery";
|
|
42
|
+
HookFunctionTypes["onBeforeDelete"] = "onBeforeDelete";
|
|
43
|
+
HookFunctionTypes["onBeforePaginate"] = "onBeforePaginate";
|
|
44
|
+
HookFunctionTypes["onBeforeAll"] = "onBeforeAll";
|
|
45
|
+
HookFunctionTypes["onBeforeShow"] = "onBeforeShow";
|
|
46
|
+
HookFunctionTypes["onAfterInsert"] = "onAfterInsert";
|
|
47
|
+
HookFunctionTypes["onAfterUpdateQuery"] = "onAfterUpdateQuery";
|
|
48
|
+
HookFunctionTypes["onAfterUpdate"] = "onAfterUpdate";
|
|
49
|
+
HookFunctionTypes["onAfterDeleteQuery"] = "onAfterDeleteQuery";
|
|
50
|
+
HookFunctionTypes["onAfterDelete"] = "onAfterDelete";
|
|
51
|
+
HookFunctionTypes["onAfterPaginate"] = "onAfterPaginate";
|
|
52
|
+
HookFunctionTypes["onAfterAll"] = "onAfterAll";
|
|
53
|
+
HookFunctionTypes["onAfterShow"] = "onAfterShow";
|
|
54
|
+
})(HookFunctionTypes = exports.HookFunctionTypes || (exports.HookFunctionTypes = {}));
|
|
55
|
+
var Extensions;
|
|
56
|
+
(function (Extensions) {
|
|
57
|
+
Extensions["Hooks"] = "Hooks";
|
|
58
|
+
Extensions["Events"] = "Events";
|
|
59
|
+
})(Extensions = exports.Extensions || (exports.Extensions = {}));
|
|
60
|
+
var HttpMethods;
|
|
61
|
+
(function (HttpMethods) {
|
|
62
|
+
HttpMethods["POST"] = "POST";
|
|
63
|
+
HttpMethods["PUT"] = "PUT";
|
|
64
|
+
HttpMethods["PATCH"] = "PATCH";
|
|
65
|
+
HttpMethods["GET"] = "GET";
|
|
66
|
+
HttpMethods["DELETE"] = "DELETE";
|
|
67
|
+
})(HttpMethods = exports.HttpMethods || (exports.HttpMethods = {}));
|
|
68
|
+
var LogLevels;
|
|
69
|
+
(function (LogLevels) {
|
|
70
|
+
LogLevels[LogLevels["NONE"] = 0] = "NONE";
|
|
71
|
+
LogLevels[LogLevels["ERROR"] = 1] = "ERROR";
|
|
72
|
+
LogLevels[LogLevels["WARNING"] = 2] = "WARNING";
|
|
73
|
+
LogLevels[LogLevels["INFO"] = 3] = "INFO";
|
|
74
|
+
LogLevels[LogLevels["ALL"] = 4] = "ALL";
|
|
75
|
+
})(LogLevels = exports.LogLevels || (exports.LogLevels = {}));
|
|
76
|
+
var Relationships;
|
|
77
|
+
(function (Relationships) {
|
|
78
|
+
Relationships["HAS_ONE"] = "HAS_ONE";
|
|
79
|
+
Relationships["HAS_MANY"] = "HAS_MANY";
|
|
80
|
+
})(Relationships = exports.Relationships || (exports.Relationships = {}));
|
|
81
|
+
var SortTypes;
|
|
82
|
+
(function (SortTypes) {
|
|
83
|
+
SortTypes["ASC"] = "ASC";
|
|
84
|
+
SortTypes["DESC"] = "DESC";
|
|
85
|
+
})(SortTypes = exports.SortTypes || (exports.SortTypes = {}));
|
|
86
|
+
var TimestampColumns;
|
|
87
|
+
(function (TimestampColumns) {
|
|
88
|
+
TimestampColumns["CREATED_AT"] = "createdAtColumn";
|
|
89
|
+
TimestampColumns["UPDATED_AT"] = "updatedAtColumn";
|
|
90
|
+
})(TimestampColumns = exports.TimestampColumns || (exports.TimestampColumns = {}));
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const http_status_codes_1 = require("http-status-codes");
|
|
4
|
+
class ApiError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.type = "ApiError";
|
|
8
|
+
this.status = http_status_codes_1.StatusCodes.BAD_REQUEST;
|
|
9
|
+
this.message = message;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.default = ApiError;
|
|
@@ -0,0 +1,44 @@
|
|
|
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
|
+
const Helpers_1 = require("./Helpers");
|
|
13
|
+
const Services_1 = require("../Services");
|
|
14
|
+
const Enums_1 = require("../Enums");
|
|
15
|
+
exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
|
|
16
|
+
const modelList = yield Services_1.IoCService.useByType("ModelListService");
|
|
17
|
+
const { model, req, res, database, relation, parentModel } = pack;
|
|
18
|
+
const queryParser = new Services_1.QueryService(model, modelList.get());
|
|
19
|
+
// We should parse URL query string to use as condition in Lucid query
|
|
20
|
+
const conditions = queryParser.get(req.query);
|
|
21
|
+
// Creating a new database query
|
|
22
|
+
const query = database.from(model.instance.table);
|
|
23
|
+
// Users should be able to select some fields to show.
|
|
24
|
+
queryParser.applyFields(query, conditions.fields);
|
|
25
|
+
// Binding parent id if there is.
|
|
26
|
+
(0, Helpers_1.addForeignKeyQuery)(req, query, relation, parentModel);
|
|
27
|
+
// Users should be able to filter records
|
|
28
|
+
queryParser.applyWheres(query, conditions.q);
|
|
29
|
+
yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforeAll, Object.assign(Object.assign({}, pack), { conditions,
|
|
30
|
+
query }));
|
|
31
|
+
// User should be able to select sorting fields and types
|
|
32
|
+
queryParser.applySorting(query, conditions.sort);
|
|
33
|
+
let result = yield query;
|
|
34
|
+
// We should try to get related data if there is any
|
|
35
|
+
yield (0, Helpers_1.getRelatedData)(result, conditions.with, model, modelList, database, Enums_1.HandlerTypes.ALL, req);
|
|
36
|
+
yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onAfterAll, Object.assign(Object.assign({}, pack), { result,
|
|
37
|
+
conditions,
|
|
38
|
+
query }));
|
|
39
|
+
// Serializing the data by the model's serialize method
|
|
40
|
+
result = yield (0, Helpers_1.serializeData)(result, model.instance.serialize, Enums_1.HandlerTypes.ALL, req);
|
|
41
|
+
// Filtering hidden fields from the response data.
|
|
42
|
+
(0, Helpers_1.filterHiddenFields)(result, model.instance.hiddens);
|
|
43
|
+
return res.json(result);
|
|
44
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
const Helpers_1 = require("./Helpers");
|
|
16
|
+
const Enums_1 = require("../Enums");
|
|
17
|
+
const ApiError_1 = __importDefault(require("../Exceptions/ApiError"));
|
|
18
|
+
exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
|
|
19
|
+
const { model, req, res, database, relation, parentModel } = pack;
|
|
20
|
+
const query = database
|
|
21
|
+
.from(model.instance.table)
|
|
22
|
+
.where(model.instance.primaryKey, req.params[model.instance.primaryKey]);
|
|
23
|
+
// If there is a relation, we should bind it
|
|
24
|
+
(0, Helpers_1.addForeignKeyQuery)(req, query, relation, parentModel);
|
|
25
|
+
yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforeDeleteQuery, Object.assign(Object.assign({}, pack), { query }));
|
|
26
|
+
const item = yield query.first();
|
|
27
|
+
if (!item) {
|
|
28
|
+
throw new ApiError_1.default(`The item is not found on ${model.name}.`);
|
|
29
|
+
}
|
|
30
|
+
yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onAfterDeleteQuery, Object.assign(Object.assign({}, pack), { query,
|
|
31
|
+
item }));
|
|
32
|
+
yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforeDelete, Object.assign(Object.assign({}, pack), { query,
|
|
33
|
+
item }));
|
|
34
|
+
yield query.delete();
|
|
35
|
+
yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onAfterDelete, Object.assign(Object.assign({}, pack), { item }));
|
|
36
|
+
return res.json();
|
|
37
|
+
});
|