axe-api 0.30.0-rc7 → 0.30.0-rc9
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/src/Builders/ModelTreeBuilder.js +19 -13
- package/build/src/Builders/RouterBuilder.js +177 -156
- package/build/src/Enums.d.ts +58 -0
- package/build/src/Enums.js +60 -1
- package/build/src/Exceptions/ApiError.d.ts +1 -1
- package/build/src/Exceptions/ApiError.js +2 -5
- package/build/src/Exceptions/AxeError.js +0 -3
- package/build/src/Handlers/AllHandler.js +18 -15
- package/build/src/Handlers/DestroyHandler.js +20 -23
- package/build/src/Handlers/DocsHandler.js +12 -12
- package/build/src/Handlers/ForceDestroyHandler.js +19 -22
- package/build/src/Handlers/Helpers.js +25 -16
- package/build/src/Handlers/PaginateHandler.js +18 -15
- package/build/src/Handlers/PatchHandler.js +23 -29
- package/build/src/Handlers/RoutesHandler.js +11 -2
- package/build/src/Handlers/ShowHandler.js +18 -15
- package/build/src/Handlers/StoreHandler.js +17 -14
- package/build/src/Handlers/UpdateHandler.js +22 -25
- package/build/src/Helpers.js +11 -2
- package/build/src/Middlewares/acceptLanguageMiddleware.js +12 -3
- package/build/src/Model.js +1 -1
- package/build/src/Resolvers/FileResolver.js +46 -35
- package/build/src/Resolvers/GeneralHookResolver.js +22 -12
- package/build/src/Resolvers/ModelResolver.js +148 -125
- package/build/src/Resolvers/TransactionResolver.js +46 -36
- package/build/src/Resolvers/VersionConfigResolver.js +19 -10
- package/build/src/Resolvers/VersionResolver.js +35 -20
- package/build/src/Resolvers/WithQueryResolver.js +14 -16
- package/build/src/Server.js +77 -57
- package/build/src/Services/APIService.js +0 -2
- package/build/src/Services/DocumentationService.js +0 -2
- package/build/src/Services/IoCService.js +29 -16
- package/build/src/Services/LimitService.js +2 -2
- package/build/src/Services/LogService.js +0 -2
- package/build/src/Services/ModelListService.js +0 -1
- package/build/src/Services/ModelService.js +2 -11
- package/build/src/Services/QueryService.js +14 -18
- package/build/src/Services/SchemaValidatorService.js +99 -89
- package/package.json +21 -22
- package/build/package.json +0 -67
- package/build/src/Resolvers/FolderResolver.d.ts +0 -5
- package/build/src/Resolvers/FolderResolver.js +0 -20
|
@@ -1,19 +1,29 @@
|
|
|
1
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
|
+
};
|
|
2
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
12
|
const Enums_1 = require("../Enums");
|
|
4
13
|
const Services_1 = require("../Services");
|
|
5
14
|
class ModelTreeBuilder {
|
|
6
|
-
version;
|
|
7
15
|
constructor(version) {
|
|
8
16
|
this.version = version;
|
|
9
17
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
18
|
+
build() {
|
|
19
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
20
|
+
const logger = Services_1.LogService.getInstance();
|
|
21
|
+
const tree = this.getRootLevelOfTree();
|
|
22
|
+
this.createRecursiveTree(tree);
|
|
23
|
+
this.addNestedRoutes(tree);
|
|
24
|
+
this.version.modelTree = tree;
|
|
25
|
+
logger.info(`[${this.version.name}] Model tree has been created.`);
|
|
26
|
+
});
|
|
17
27
|
}
|
|
18
28
|
getRootLevelOfTree() {
|
|
19
29
|
const childModels = [];
|
|
@@ -50,11 +60,7 @@ class ModelTreeBuilder {
|
|
|
50
60
|
this.version.modelList.get().forEach((model) => {
|
|
51
61
|
const recursiveRelations = model.relations.filter((relation) => relation.model === model.name);
|
|
52
62
|
if (recursiveRelations.length === 2) {
|
|
53
|
-
tree.push({
|
|
54
|
-
...model,
|
|
55
|
-
isRecursive: true,
|
|
56
|
-
children: [],
|
|
57
|
-
});
|
|
63
|
+
tree.push(Object.assign(Object.assign({}, model), { isRecursive: true, children: [] }));
|
|
58
64
|
}
|
|
59
65
|
});
|
|
60
66
|
}
|
|
@@ -1,11 +1,19 @@
|
|
|
1
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
|
+
};
|
|
2
11
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
13
|
};
|
|
5
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
15
|
const pluralize_1 = __importDefault(require("pluralize"));
|
|
7
16
|
const path_1 = __importDefault(require("path"));
|
|
8
|
-
const http_status_codes_1 = require("http-status-codes");
|
|
9
17
|
const change_case_1 = require("change-case");
|
|
10
18
|
const Resolvers_1 = require("../Resolvers");
|
|
11
19
|
const constants_1 = require("../constants");
|
|
@@ -14,162 +22,186 @@ const HandlerFactory_1 = __importDefault(require("../Handlers/HandlerFactory"));
|
|
|
14
22
|
const Services_1 = require("../Services");
|
|
15
23
|
const Middlewares_1 = require("../Middlewares");
|
|
16
24
|
class RouterBuilder {
|
|
17
|
-
version;
|
|
18
25
|
constructor(version) {
|
|
26
|
+
this.getPrimaryKeyName = (model) => {
|
|
27
|
+
return (pluralize_1.default.singular(model.name).toLowerCase() +
|
|
28
|
+
this.ucFirst(model.instance.primaryKey));
|
|
29
|
+
};
|
|
30
|
+
this.ucFirst = (value) => {
|
|
31
|
+
return value.charAt(0).toUpperCase() + value.slice(1);
|
|
32
|
+
};
|
|
33
|
+
this.getRootPrefix = () => __awaiter(this, void 0, void 0, function* () {
|
|
34
|
+
const api = Services_1.APIService.getInstance();
|
|
35
|
+
let prefix = api.config.prefix || "api";
|
|
36
|
+
if (prefix.substr(0, 1) === "/") {
|
|
37
|
+
prefix = prefix.substr(1);
|
|
38
|
+
}
|
|
39
|
+
if (prefix.substr(prefix.length - 1) === "/") {
|
|
40
|
+
prefix = prefix.substr(0, prefix.length - 1);
|
|
41
|
+
}
|
|
42
|
+
return prefix;
|
|
43
|
+
});
|
|
19
44
|
this.version = version;
|
|
20
45
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
generalHooks.onBeforeInit
|
|
27
|
-
|
|
28
|
-
await this.createRoutesByModelTree();
|
|
29
|
-
logger.info(`[${this.version.name}] Express routes have been created.`);
|
|
30
|
-
if (generalHooks.onAfterInit) {
|
|
31
|
-
generalHooks.onAfterInit(app);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
async createRoutesByModelTree() {
|
|
35
|
-
for (const model of this.version.modelTree) {
|
|
36
|
-
await this.createRouteByModel(model);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
async createRouteByModel(model, urlPrefix = "", parentModel = null, relation = null, allowRecursive = true) {
|
|
40
|
-
if (model.instance.ignore) {
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
const resource = this.getResourcePath(model, relation);
|
|
44
|
-
// We create and handle routes by not duplicate so many lines.
|
|
45
|
-
for (const handler of Object.keys(constants_1.API_ROUTE_TEMPLATES)) {
|
|
46
|
-
const handlerType = handler;
|
|
47
|
-
if (!model.instance.handlers.includes(handlerType)) {
|
|
48
|
-
continue;
|
|
46
|
+
build() {
|
|
47
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
48
|
+
const app = yield Services_1.IoCService.useByType("App");
|
|
49
|
+
const logger = Services_1.LogService.getInstance();
|
|
50
|
+
const generalHooks = yield new Resolvers_1.GeneralHookResolver(this.version).resolve();
|
|
51
|
+
if (generalHooks.onBeforeInit) {
|
|
52
|
+
generalHooks.onBeforeInit(app);
|
|
49
53
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
Middlewares_1.acceptLanguageMiddleware,
|
|
57
|
-
...model.instance.getMiddlewares(handlerType),
|
|
58
|
-
];
|
|
59
|
-
// Adding the route to the express
|
|
60
|
-
await this.addExpressRoute(handlerType, url, middlewares, model, parentModel, relation);
|
|
61
|
-
}
|
|
62
|
-
await this.createChildRoutes(model, resource, urlPrefix);
|
|
63
|
-
await this.createNestedRoutes(model, allowRecursive, urlPrefix, resource);
|
|
54
|
+
yield this.createRoutesByModelTree();
|
|
55
|
+
logger.info(`[${this.version.name}] Express routes have been created.`);
|
|
56
|
+
if (generalHooks.onAfterInit) {
|
|
57
|
+
generalHooks.onAfterInit(app);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
64
60
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
relation.type === Enums_1.Relationships.HAS_MANY);
|
|
72
|
-
if (relation) {
|
|
73
|
-
await this.createRouteByModel(model, `${urlPrefix}${resource}/:${(0, change_case_1.camelCase)(relation.foreignKey)}/`, model, relation, false);
|
|
74
|
-
}
|
|
61
|
+
createRoutesByModelTree() {
|
|
62
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
63
|
+
for (const model of this.version.modelTree) {
|
|
64
|
+
yield this.createRouteByModel(model);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
75
67
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
// We should different parameter name for child routes
|
|
81
|
-
const subRelations = model.relations.filter((item) => item.type === Enums_1.Relationships.HAS_MANY);
|
|
82
|
-
for (const relation of subRelations) {
|
|
83
|
-
const child = model.children.find((item) => item.name === relation.model);
|
|
84
|
-
// It should be recursive
|
|
85
|
-
if (child) {
|
|
86
|
-
await this.createRouteByModel(child, `${urlPrefix}${resource}/:${(0, change_case_1.camelCase)(relation.foreignKey)}/`, model, relation);
|
|
68
|
+
createRouteByModel(model, urlPrefix = "", parentModel = null, relation = null, allowRecursive = true) {
|
|
69
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
70
|
+
if (model.instance.ignore) {
|
|
71
|
+
return;
|
|
87
72
|
}
|
|
88
|
-
|
|
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(path_1.default.join(yield this.getRootPrefix(), this.version.name), urlPrefix, resource, model.instance.primaryKey);
|
|
82
|
+
// Creating the middleware list for the route. As default, we support some
|
|
83
|
+
// internal middlewares such as `Accept Language Middleware` which parse
|
|
84
|
+
// the "accept-language" header to use in the application general.
|
|
85
|
+
const middlewares = [
|
|
86
|
+
Middlewares_1.acceptLanguageMiddleware,
|
|
87
|
+
...model.instance.getMiddlewares(handlerType),
|
|
88
|
+
];
|
|
89
|
+
// Adding the route to the express
|
|
90
|
+
yield this.addExpressRoute(handlerType, url, middlewares, model, parentModel, relation);
|
|
91
|
+
}
|
|
92
|
+
yield this.createChildRoutes(model, resource, urlPrefix);
|
|
93
|
+
yield this.createNestedRoutes(model, allowRecursive, urlPrefix, resource);
|
|
94
|
+
});
|
|
89
95
|
}
|
|
90
|
-
|
|
91
|
-
return (
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
};
|
|
103
|
-
switch (handlerType) {
|
|
104
|
-
case Enums_1.HandlerTypes.ALL:
|
|
105
|
-
app.get(url, middlewares, handler);
|
|
106
|
-
docs.push(Enums_1.HttpMethods.GET, url, model);
|
|
107
|
-
break;
|
|
108
|
-
case Enums_1.HandlerTypes.DELETE:
|
|
109
|
-
app.delete(url, middlewares, handler);
|
|
110
|
-
docs.push(Enums_1.HttpMethods.DELETE, url, model);
|
|
111
|
-
break;
|
|
112
|
-
case Enums_1.HandlerTypes.FORCE_DELETE:
|
|
113
|
-
app.delete(url, middlewares, handler);
|
|
114
|
-
docs.push(Enums_1.HttpMethods.DELETE, url, model);
|
|
115
|
-
break;
|
|
116
|
-
case Enums_1.HandlerTypes.INSERT:
|
|
117
|
-
app.post(url, middlewares, handler);
|
|
118
|
-
docs.push(Enums_1.HttpMethods.POST, url, model);
|
|
119
|
-
break;
|
|
120
|
-
case Enums_1.HandlerTypes.PAGINATE:
|
|
121
|
-
app.get(url, middlewares, handler);
|
|
122
|
-
docs.push(Enums_1.HttpMethods.GET, url, model);
|
|
123
|
-
break;
|
|
124
|
-
case Enums_1.HandlerTypes.PATCH:
|
|
125
|
-
app.patch(url, middlewares, handler);
|
|
126
|
-
docs.push(Enums_1.HttpMethods.PATCH, url, model);
|
|
127
|
-
break;
|
|
128
|
-
case Enums_1.HandlerTypes.SHOW:
|
|
129
|
-
app.get(url, middlewares, handler);
|
|
130
|
-
docs.push(Enums_1.HttpMethods.GET, url, model);
|
|
131
|
-
break;
|
|
132
|
-
case Enums_1.HandlerTypes.UPDATE:
|
|
133
|
-
app.put(url, middlewares, handler);
|
|
134
|
-
docs.push(Enums_1.HttpMethods.PUT, url, model);
|
|
135
|
-
break;
|
|
136
|
-
default:
|
|
137
|
-
throw new Error("Undefined handler type");
|
|
138
|
-
}
|
|
96
|
+
createNestedRoutes(model, allowRecursive, urlPrefix, resource) {
|
|
97
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
98
|
+
if (!model.isRecursive || !allowRecursive) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// We should different parameter name for child routes
|
|
102
|
+
const relation = model.relations.find((relation) => relation.model === model.name &&
|
|
103
|
+
relation.type === Enums_1.Relationships.HAS_MANY);
|
|
104
|
+
if (relation) {
|
|
105
|
+
yield this.createRouteByModel(model, `${urlPrefix}${resource}/:${(0, change_case_1.camelCase)(relation.foreignKey)}/`, model, relation, false);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
139
108
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const database = (await Services_1.IoCService.use("Database"));
|
|
145
|
-
const api = Services_1.APIService.getInstance();
|
|
146
|
-
hasTransaction = await new Resolvers_1.TransactionResolver(this.version).resolve(model, handlerType);
|
|
147
|
-
if (hasTransaction) {
|
|
148
|
-
trx = await database.transaction();
|
|
109
|
+
createChildRoutes(model, resource, urlPrefix) {
|
|
110
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
111
|
+
if (model.children.length === 0) {
|
|
112
|
+
return;
|
|
149
113
|
}
|
|
150
|
-
|
|
151
|
-
const
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
114
|
+
// We should different parameter name for child routes
|
|
115
|
+
const subRelations = model.relations.filter((item) => item.type === Enums_1.Relationships.HAS_MANY);
|
|
116
|
+
for (const relation of subRelations) {
|
|
117
|
+
const child = model.children.find((item) => item.name === relation.model);
|
|
118
|
+
// It should be recursive
|
|
119
|
+
if (child) {
|
|
120
|
+
yield this.createRouteByModel(child, `${urlPrefix}${resource}/:${(0, change_case_1.camelCase)(relation.foreignKey)}/`, model, relation);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
addExpressRoute(handlerType, url, middlewares, model, parentModel, relation) {
|
|
126
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
127
|
+
const docs = Services_1.DocumentationService.getInstance();
|
|
128
|
+
const app = yield Services_1.IoCService.useByType("App");
|
|
129
|
+
const handler = (req, res) => {
|
|
130
|
+
this.requestHandler(handlerType, req, res, model, parentModel, relation);
|
|
161
131
|
};
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
132
|
+
switch (handlerType) {
|
|
133
|
+
case Enums_1.HandlerTypes.ALL:
|
|
134
|
+
app.get(url, middlewares, handler);
|
|
135
|
+
docs.push(Enums_1.HttpMethods.GET, url, model);
|
|
136
|
+
break;
|
|
137
|
+
case Enums_1.HandlerTypes.DELETE:
|
|
138
|
+
app.delete(url, middlewares, handler);
|
|
139
|
+
docs.push(Enums_1.HttpMethods.DELETE, url, model);
|
|
140
|
+
break;
|
|
141
|
+
case Enums_1.HandlerTypes.FORCE_DELETE:
|
|
142
|
+
app.delete(url, middlewares, handler);
|
|
143
|
+
docs.push(Enums_1.HttpMethods.DELETE, url, model);
|
|
144
|
+
break;
|
|
145
|
+
case Enums_1.HandlerTypes.INSERT:
|
|
146
|
+
app.post(url, middlewares, handler);
|
|
147
|
+
docs.push(Enums_1.HttpMethods.POST, url, model);
|
|
148
|
+
break;
|
|
149
|
+
case Enums_1.HandlerTypes.PAGINATE:
|
|
150
|
+
app.get(url, middlewares, handler);
|
|
151
|
+
docs.push(Enums_1.HttpMethods.GET, url, model);
|
|
152
|
+
break;
|
|
153
|
+
case Enums_1.HandlerTypes.PATCH:
|
|
154
|
+
app.patch(url, middlewares, handler);
|
|
155
|
+
docs.push(Enums_1.HttpMethods.PATCH, url, model);
|
|
156
|
+
break;
|
|
157
|
+
case Enums_1.HandlerTypes.SHOW:
|
|
158
|
+
app.get(url, middlewares, handler);
|
|
159
|
+
docs.push(Enums_1.HttpMethods.GET, url, model);
|
|
160
|
+
break;
|
|
161
|
+
case Enums_1.HandlerTypes.UPDATE:
|
|
162
|
+
app.put(url, middlewares, handler);
|
|
163
|
+
docs.push(Enums_1.HttpMethods.PUT, url, model);
|
|
164
|
+
break;
|
|
165
|
+
default:
|
|
166
|
+
throw new Error("Undefined handler type");
|
|
165
167
|
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
requestHandler(handlerType, req, res, model, parentModel, relation) {
|
|
171
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
172
|
+
let trx = null;
|
|
173
|
+
let hasTransaction = false;
|
|
174
|
+
try {
|
|
175
|
+
const database = (yield Services_1.IoCService.use("Database"));
|
|
176
|
+
const api = Services_1.APIService.getInstance();
|
|
177
|
+
hasTransaction = yield new Resolvers_1.TransactionResolver(this.version).resolve(model, handlerType);
|
|
178
|
+
if (hasTransaction) {
|
|
179
|
+
trx = yield database.transaction();
|
|
180
|
+
}
|
|
181
|
+
const handler = HandlerFactory_1.default.get(handlerType);
|
|
182
|
+
const pack = {
|
|
183
|
+
api,
|
|
184
|
+
version: this.version,
|
|
185
|
+
req,
|
|
186
|
+
res,
|
|
187
|
+
handlerType,
|
|
188
|
+
model,
|
|
189
|
+
parentModel,
|
|
190
|
+
relation,
|
|
191
|
+
database: hasTransaction && trx ? trx : database,
|
|
192
|
+
};
|
|
193
|
+
yield handler(pack);
|
|
194
|
+
if (hasTransaction && trx) {
|
|
195
|
+
trx.commit();
|
|
196
|
+
}
|
|
170
197
|
}
|
|
171
|
-
|
|
172
|
-
|
|
198
|
+
catch (error) {
|
|
199
|
+
if (hasTransaction && trx) {
|
|
200
|
+
trx.rollback();
|
|
201
|
+
}
|
|
202
|
+
this.sendErrorAsResponse(res, error);
|
|
203
|
+
}
|
|
204
|
+
});
|
|
173
205
|
}
|
|
174
206
|
sendErrorAsResponse(res, error) {
|
|
175
207
|
const type = error.type;
|
|
@@ -184,7 +216,7 @@ class RouterBuilder {
|
|
|
184
216
|
default:
|
|
185
217
|
// We should not show the real errors on production
|
|
186
218
|
if (process.env.NODE_ENV === "production") {
|
|
187
|
-
res.status(
|
|
219
|
+
res.status(Enums_1.StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
188
220
|
error: "An error occurredxx.",
|
|
189
221
|
});
|
|
190
222
|
}
|
|
@@ -196,16 +228,5 @@ class RouterBuilder {
|
|
|
196
228
|
? (0, change_case_1.paramCase)(relation.name)
|
|
197
229
|
: (0, change_case_1.paramCase)(pluralize_1.default.plural(model.name)).toLowerCase();
|
|
198
230
|
}
|
|
199
|
-
getRootPrefix = async () => {
|
|
200
|
-
const api = Services_1.APIService.getInstance();
|
|
201
|
-
let prefix = api.config.prefix || "api";
|
|
202
|
-
if (prefix.substr(0, 1) === "/") {
|
|
203
|
-
prefix = prefix.substr(1);
|
|
204
|
-
}
|
|
205
|
-
if (prefix.substr(prefix.length - 1) === "/") {
|
|
206
|
-
prefix = prefix.substr(0, prefix.length - 1);
|
|
207
|
-
}
|
|
208
|
-
return prefix;
|
|
209
|
-
};
|
|
210
231
|
}
|
|
211
232
|
exports.default = RouterBuilder;
|
package/build/src/Enums.d.ts
CHANGED
|
@@ -120,3 +120,61 @@ export declare enum QueryFeature {
|
|
|
120
120
|
WithHasOne = "with.hasOne",
|
|
121
121
|
WithHasMany = "with.hasMany"
|
|
122
122
|
}
|
|
123
|
+
export declare enum StatusCodes {
|
|
124
|
+
ACCEPTED = 202,
|
|
125
|
+
BAD_GATEWAY = 502,
|
|
126
|
+
BAD_REQUEST = 400,
|
|
127
|
+
CONFLICT = 409,
|
|
128
|
+
CONTINUE = 100,
|
|
129
|
+
CREATED = 201,
|
|
130
|
+
EXPECTATION_FAILED = 417,
|
|
131
|
+
FAILED_DEPENDENCY = 424,
|
|
132
|
+
FORBIDDEN = 403,
|
|
133
|
+
GATEWAY_TIMEOUT = 504,
|
|
134
|
+
GONE = 410,
|
|
135
|
+
HTTP_VERSION_NOT_SUPPORTED = 505,
|
|
136
|
+
IM_A_TEAPOT = 418,
|
|
137
|
+
INSUFFICIENT_SPACE_ON_RESOURCE = 419,
|
|
138
|
+
INSUFFICIENT_STORAGE = 507,
|
|
139
|
+
INTERNAL_SERVER_ERROR = 500,
|
|
140
|
+
LENGTH_REQUIRED = 411,
|
|
141
|
+
LOCKED = 423,
|
|
142
|
+
METHOD_FAILURE = 420,
|
|
143
|
+
METHOD_NOT_ALLOWED = 405,
|
|
144
|
+
MOVED_PERMANENTLY = 301,
|
|
145
|
+
MOVED_TEMPORARILY = 302,
|
|
146
|
+
MULTI_STATUS = 207,
|
|
147
|
+
MULTIPLE_CHOICES = 300,
|
|
148
|
+
NETWORK_AUTHENTICATION_REQUIRED = 511,
|
|
149
|
+
NO_CONTENT = 204,
|
|
150
|
+
NON_AUTHORITATIVE_INFORMATION = 203,
|
|
151
|
+
NOT_ACCEPTABLE = 406,
|
|
152
|
+
NOT_FOUND = 404,
|
|
153
|
+
NOT_IMPLEMENTED = 501,
|
|
154
|
+
NOT_MODIFIED = 304,
|
|
155
|
+
OK = 200,
|
|
156
|
+
PARTIAL_CONTENT = 206,
|
|
157
|
+
PAYMENT_REQUIRED = 402,
|
|
158
|
+
PERMANENT_REDIRECT = 308,
|
|
159
|
+
PRECONDITION_FAILED = 412,
|
|
160
|
+
PRECONDITION_REQUIRED = 428,
|
|
161
|
+
PROCESSING = 102,
|
|
162
|
+
PROXY_AUTHENTICATION_REQUIRED = 407,
|
|
163
|
+
REQUEST_HEADER_FIELDS_TOO_LARGE = 431,
|
|
164
|
+
REQUEST_TIMEOUT = 408,
|
|
165
|
+
REQUEST_TOO_LONG = 413,
|
|
166
|
+
REQUEST_URI_TOO_LONG = 414,
|
|
167
|
+
REQUESTED_RANGE_NOT_SATISFIABLE = 416,
|
|
168
|
+
RESET_CONTENT = 205,
|
|
169
|
+
SEE_OTHER = 303,
|
|
170
|
+
SERVICE_UNAVAILABLE = 503,
|
|
171
|
+
SWITCHING_PROTOCOLS = 101,
|
|
172
|
+
TEMPORARY_REDIRECT = 307,
|
|
173
|
+
TOO_MANY_REQUESTS = 429,
|
|
174
|
+
UNAUTHORIZED = 401,
|
|
175
|
+
UNAVAILABLE_FOR_LEGAL_REASONS = 451,
|
|
176
|
+
UNPROCESSABLE_ENTITY = 422,
|
|
177
|
+
UNSUPPORTED_MEDIA_TYPE = 415,
|
|
178
|
+
USE_PROXY = 305,
|
|
179
|
+
MISDIRECTED_REQUEST = 421
|
|
180
|
+
}
|
package/build/src/Enums.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.QueryFeature = exports.QueryFeatureType = exports.AxeErrorCode = exports.TimestampColumns = exports.SortTypes = exports.Relationships = exports.LogLevels = exports.HttpMethods = exports.Extensions = exports.HookFunctionTypes = exports.HandlerTypes = exports.DependencyTypes = exports.ConditionTypes = void 0;
|
|
3
|
+
exports.StatusCodes = exports.QueryFeature = exports.QueryFeatureType = exports.AxeErrorCode = exports.TimestampColumns = exports.SortTypes = exports.Relationships = exports.LogLevels = exports.HttpMethods = exports.Extensions = exports.HookFunctionTypes = exports.HandlerTypes = exports.DependencyTypes = exports.ConditionTypes = void 0;
|
|
4
4
|
var ConditionTypes;
|
|
5
5
|
(function (ConditionTypes) {
|
|
6
6
|
ConditionTypes["NotNull"] = "NotNull";
|
|
@@ -136,3 +136,62 @@ var QueryFeature;
|
|
|
136
136
|
QueryFeature["WithHasOne"] = "with.hasOne";
|
|
137
137
|
QueryFeature["WithHasMany"] = "with.hasMany";
|
|
138
138
|
})(QueryFeature = exports.QueryFeature || (exports.QueryFeature = {}));
|
|
139
|
+
var StatusCodes;
|
|
140
|
+
(function (StatusCodes) {
|
|
141
|
+
StatusCodes[StatusCodes["ACCEPTED"] = 202] = "ACCEPTED";
|
|
142
|
+
StatusCodes[StatusCodes["BAD_GATEWAY"] = 502] = "BAD_GATEWAY";
|
|
143
|
+
StatusCodes[StatusCodes["BAD_REQUEST"] = 400] = "BAD_REQUEST";
|
|
144
|
+
StatusCodes[StatusCodes["CONFLICT"] = 409] = "CONFLICT";
|
|
145
|
+
StatusCodes[StatusCodes["CONTINUE"] = 100] = "CONTINUE";
|
|
146
|
+
StatusCodes[StatusCodes["CREATED"] = 201] = "CREATED";
|
|
147
|
+
StatusCodes[StatusCodes["EXPECTATION_FAILED"] = 417] = "EXPECTATION_FAILED";
|
|
148
|
+
StatusCodes[StatusCodes["FAILED_DEPENDENCY"] = 424] = "FAILED_DEPENDENCY";
|
|
149
|
+
StatusCodes[StatusCodes["FORBIDDEN"] = 403] = "FORBIDDEN";
|
|
150
|
+
StatusCodes[StatusCodes["GATEWAY_TIMEOUT"] = 504] = "GATEWAY_TIMEOUT";
|
|
151
|
+
StatusCodes[StatusCodes["GONE"] = 410] = "GONE";
|
|
152
|
+
StatusCodes[StatusCodes["HTTP_VERSION_NOT_SUPPORTED"] = 505] = "HTTP_VERSION_NOT_SUPPORTED";
|
|
153
|
+
StatusCodes[StatusCodes["IM_A_TEAPOT"] = 418] = "IM_A_TEAPOT";
|
|
154
|
+
StatusCodes[StatusCodes["INSUFFICIENT_SPACE_ON_RESOURCE"] = 419] = "INSUFFICIENT_SPACE_ON_RESOURCE";
|
|
155
|
+
StatusCodes[StatusCodes["INSUFFICIENT_STORAGE"] = 507] = "INSUFFICIENT_STORAGE";
|
|
156
|
+
StatusCodes[StatusCodes["INTERNAL_SERVER_ERROR"] = 500] = "INTERNAL_SERVER_ERROR";
|
|
157
|
+
StatusCodes[StatusCodes["LENGTH_REQUIRED"] = 411] = "LENGTH_REQUIRED";
|
|
158
|
+
StatusCodes[StatusCodes["LOCKED"] = 423] = "LOCKED";
|
|
159
|
+
StatusCodes[StatusCodes["METHOD_FAILURE"] = 420] = "METHOD_FAILURE";
|
|
160
|
+
StatusCodes[StatusCodes["METHOD_NOT_ALLOWED"] = 405] = "METHOD_NOT_ALLOWED";
|
|
161
|
+
StatusCodes[StatusCodes["MOVED_PERMANENTLY"] = 301] = "MOVED_PERMANENTLY";
|
|
162
|
+
StatusCodes[StatusCodes["MOVED_TEMPORARILY"] = 302] = "MOVED_TEMPORARILY";
|
|
163
|
+
StatusCodes[StatusCodes["MULTI_STATUS"] = 207] = "MULTI_STATUS";
|
|
164
|
+
StatusCodes[StatusCodes["MULTIPLE_CHOICES"] = 300] = "MULTIPLE_CHOICES";
|
|
165
|
+
StatusCodes[StatusCodes["NETWORK_AUTHENTICATION_REQUIRED"] = 511] = "NETWORK_AUTHENTICATION_REQUIRED";
|
|
166
|
+
StatusCodes[StatusCodes["NO_CONTENT"] = 204] = "NO_CONTENT";
|
|
167
|
+
StatusCodes[StatusCodes["NON_AUTHORITATIVE_INFORMATION"] = 203] = "NON_AUTHORITATIVE_INFORMATION";
|
|
168
|
+
StatusCodes[StatusCodes["NOT_ACCEPTABLE"] = 406] = "NOT_ACCEPTABLE";
|
|
169
|
+
StatusCodes[StatusCodes["NOT_FOUND"] = 404] = "NOT_FOUND";
|
|
170
|
+
StatusCodes[StatusCodes["NOT_IMPLEMENTED"] = 501] = "NOT_IMPLEMENTED";
|
|
171
|
+
StatusCodes[StatusCodes["NOT_MODIFIED"] = 304] = "NOT_MODIFIED";
|
|
172
|
+
StatusCodes[StatusCodes["OK"] = 200] = "OK";
|
|
173
|
+
StatusCodes[StatusCodes["PARTIAL_CONTENT"] = 206] = "PARTIAL_CONTENT";
|
|
174
|
+
StatusCodes[StatusCodes["PAYMENT_REQUIRED"] = 402] = "PAYMENT_REQUIRED";
|
|
175
|
+
StatusCodes[StatusCodes["PERMANENT_REDIRECT"] = 308] = "PERMANENT_REDIRECT";
|
|
176
|
+
StatusCodes[StatusCodes["PRECONDITION_FAILED"] = 412] = "PRECONDITION_FAILED";
|
|
177
|
+
StatusCodes[StatusCodes["PRECONDITION_REQUIRED"] = 428] = "PRECONDITION_REQUIRED";
|
|
178
|
+
StatusCodes[StatusCodes["PROCESSING"] = 102] = "PROCESSING";
|
|
179
|
+
StatusCodes[StatusCodes["PROXY_AUTHENTICATION_REQUIRED"] = 407] = "PROXY_AUTHENTICATION_REQUIRED";
|
|
180
|
+
StatusCodes[StatusCodes["REQUEST_HEADER_FIELDS_TOO_LARGE"] = 431] = "REQUEST_HEADER_FIELDS_TOO_LARGE";
|
|
181
|
+
StatusCodes[StatusCodes["REQUEST_TIMEOUT"] = 408] = "REQUEST_TIMEOUT";
|
|
182
|
+
StatusCodes[StatusCodes["REQUEST_TOO_LONG"] = 413] = "REQUEST_TOO_LONG";
|
|
183
|
+
StatusCodes[StatusCodes["REQUEST_URI_TOO_LONG"] = 414] = "REQUEST_URI_TOO_LONG";
|
|
184
|
+
StatusCodes[StatusCodes["REQUESTED_RANGE_NOT_SATISFIABLE"] = 416] = "REQUESTED_RANGE_NOT_SATISFIABLE";
|
|
185
|
+
StatusCodes[StatusCodes["RESET_CONTENT"] = 205] = "RESET_CONTENT";
|
|
186
|
+
StatusCodes[StatusCodes["SEE_OTHER"] = 303] = "SEE_OTHER";
|
|
187
|
+
StatusCodes[StatusCodes["SERVICE_UNAVAILABLE"] = 503] = "SERVICE_UNAVAILABLE";
|
|
188
|
+
StatusCodes[StatusCodes["SWITCHING_PROTOCOLS"] = 101] = "SWITCHING_PROTOCOLS";
|
|
189
|
+
StatusCodes[StatusCodes["TEMPORARY_REDIRECT"] = 307] = "TEMPORARY_REDIRECT";
|
|
190
|
+
StatusCodes[StatusCodes["TOO_MANY_REQUESTS"] = 429] = "TOO_MANY_REQUESTS";
|
|
191
|
+
StatusCodes[StatusCodes["UNAUTHORIZED"] = 401] = "UNAUTHORIZED";
|
|
192
|
+
StatusCodes[StatusCodes["UNAVAILABLE_FOR_LEGAL_REASONS"] = 451] = "UNAVAILABLE_FOR_LEGAL_REASONS";
|
|
193
|
+
StatusCodes[StatusCodes["UNPROCESSABLE_ENTITY"] = 422] = "UNPROCESSABLE_ENTITY";
|
|
194
|
+
StatusCodes[StatusCodes["UNSUPPORTED_MEDIA_TYPE"] = 415] = "UNSUPPORTED_MEDIA_TYPE";
|
|
195
|
+
StatusCodes[StatusCodes["USE_PROXY"] = 305] = "USE_PROXY";
|
|
196
|
+
StatusCodes[StatusCodes["MISDIRECTED_REQUEST"] = 421] = "MISDIRECTED_REQUEST";
|
|
197
|
+
})(StatusCodes = exports.StatusCodes || (exports.StatusCodes = {}));
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
3
|
+
const Enums_1 = require("../Enums");
|
|
4
4
|
class ApiError extends Error {
|
|
5
|
-
type;
|
|
6
|
-
status;
|
|
7
|
-
message;
|
|
8
5
|
constructor(message) {
|
|
9
6
|
super(message);
|
|
10
7
|
this.type = "ApiError";
|
|
11
|
-
this.status =
|
|
8
|
+
this.status = Enums_1.StatusCodes.BAD_REQUEST;
|
|
12
9
|
this.message = message;
|
|
13
10
|
}
|
|
14
11
|
}
|
|
@@ -1,9 +1,18 @@
|
|
|
1
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
|
+
};
|
|
2
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
12
|
const Helpers_1 = require("./Helpers");
|
|
4
13
|
const Services_1 = require("../Services");
|
|
5
14
|
const Enums_1 = require("../Enums");
|
|
6
|
-
exports.default =
|
|
15
|
+
exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
|
|
7
16
|
const { version, model, req, res, database, relation, parentModel } = pack;
|
|
8
17
|
const queryParser = new Services_1.QueryService(model, version.modelList.get(), version.config);
|
|
9
18
|
// We should parse URL query string to use as condition in Lucid query
|
|
@@ -18,25 +27,19 @@ exports.default = async (pack) => {
|
|
|
18
27
|
(0, Helpers_1.addForeignKeyQuery)(req, query, relation, parentModel);
|
|
19
28
|
// Users should be able to filter records
|
|
20
29
|
queryParser.applyWheres(query, conditions.q);
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
conditions,
|
|
24
|
-
query,
|
|
25
|
-
});
|
|
30
|
+
yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforeAll, Object.assign(Object.assign({}, pack), { conditions,
|
|
31
|
+
query }));
|
|
26
32
|
// User should be able to select sorting fields and types
|
|
27
33
|
queryParser.applySorting(query, conditions.sort);
|
|
28
|
-
let result =
|
|
34
|
+
let result = yield query;
|
|
29
35
|
// We should try to get related data if there is any
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
...pack,
|
|
33
|
-
result,
|
|
36
|
+
yield (0, Helpers_1.getRelatedData)(version, result, conditions.with, model, version.modelList, database, Enums_1.HandlerTypes.ALL, req);
|
|
37
|
+
yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onAfterAll, Object.assign(Object.assign({}, pack), { result,
|
|
34
38
|
conditions,
|
|
35
|
-
query
|
|
36
|
-
});
|
|
39
|
+
query }));
|
|
37
40
|
// Serializing the data by the model's serialize method
|
|
38
|
-
result =
|
|
41
|
+
result = yield (0, Helpers_1.serializeData)(version, result, model.serialize, Enums_1.HandlerTypes.ALL, req);
|
|
39
42
|
// Filtering hidden fields from the response data.
|
|
40
43
|
(0, Helpers_1.filterHiddenFields)(result, model.instance.hiddens);
|
|
41
44
|
return res.json(result);
|
|
42
|
-
};
|
|
45
|
+
});
|