axe-api 0.30.3 → 0.31.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/build/src/Builders/RouterBuilder.js +19 -17
- package/build/src/Exceptions/ApiError.d.ts +1 -1
- package/build/src/Exceptions/ApiError.js +2 -2
- package/build/src/Handlers/DestroyHandler.js +7 -2
- package/build/src/Handlers/DocsHTMLHandler.js +24 -0
- package/build/src/Handlers/ForceDestroyHandler.js +7 -2
- package/build/src/Handlers/Helpers.d.ts +1 -0
- package/build/src/Handlers/Helpers.js +9 -1
- package/build/src/Handlers/MetadataHandler.d.ts +3 -0
- package/build/src/Handlers/PatchHandler.js +7 -4
- package/build/src/Handlers/ShowHandler.js +7 -3
- package/build/src/Handlers/UpdateHandler.js +7 -4
- package/build/src/Interfaces.d.ts +6 -0
- package/build/src/Server.js +4 -2
- package/build/src/Services/DocumentationService.d.ts +3 -3
- package/build/src/Services/DocumentationService.js +8 -1
- package/build/src/Services/QueryService.js +3 -5
- package/package.json +1 -1
- /package/build/src/Handlers/{DocsHandler.d.ts → DocsHTMLHandler.d.ts} +0 -0
- /package/build/src/Handlers/{DocsHandler.js → MetadataHandler.js} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Release Notes
|
|
2
2
|
|
|
3
|
+
## [0.31.1 (2023-05-08)](https://github.com/axe-api/axe-api/compare/0.31.1...0.31.0)
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- The app crashes on database errors [#155](https://github.com/axe-api/axe-api/issues/155)
|
|
8
|
+
- We should return 404 if the record is not found [#169](https://github.com/axe-api/axe-api/issues/169)
|
|
9
|
+
- An error should be thrown if the per_page value is not acceptable [#172](https://github.com/axe-api/axe-api/issues/172)
|
|
10
|
+
|
|
11
|
+
## [0.31.0 (2023-05-05)](https://github.com/axe-api/axe-api/compare/0.31.0...0.30.3)
|
|
12
|
+
|
|
13
|
+
### Features
|
|
14
|
+
|
|
15
|
+
- Added new auto-created documentation values [#179](https://github.com/axe-api/axe-api/issues/179)
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
|
|
19
|
+
- Fixed PostgreSQL-related issues [#204](https://github.com/axe-api/axe-api/issues/204)
|
|
20
|
+
|
|
3
21
|
## [0.30.3 (2023-05-05)](https://github.com/axe-api/axe-api/compare/0.30.3...0.30.2)
|
|
4
22
|
|
|
5
23
|
### Fixed
|
|
@@ -125,41 +125,47 @@ class RouterBuilder {
|
|
|
125
125
|
return __awaiter(this, void 0, void 0, function* () {
|
|
126
126
|
const docs = Services_1.DocumentationService.getInstance();
|
|
127
127
|
const app = yield Services_1.IoCService.useByType("App");
|
|
128
|
-
const handler = (req, res) => {
|
|
129
|
-
|
|
130
|
-
|
|
128
|
+
const handler = (req, res, next) => __awaiter(this, void 0, void 0, function* () {
|
|
129
|
+
try {
|
|
130
|
+
yield this.requestHandler(handlerType, req, res, model, parentModel, relation);
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
// Catch error then pass it to the express error handler
|
|
134
|
+
next(error);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
131
137
|
switch (handlerType) {
|
|
132
138
|
case Enums_1.HandlerTypes.ALL:
|
|
133
139
|
app.get(url, middlewares, handler);
|
|
134
|
-
docs.push(Enums_1.HttpMethods.GET, url, model);
|
|
140
|
+
docs.push(this.version, Enums_1.HandlerTypes.ALL, Enums_1.HttpMethods.GET, url, model);
|
|
135
141
|
break;
|
|
136
142
|
case Enums_1.HandlerTypes.DELETE:
|
|
137
143
|
app.delete(url, middlewares, handler);
|
|
138
|
-
docs.push(Enums_1.HttpMethods.DELETE, url, model);
|
|
144
|
+
docs.push(this.version, Enums_1.HandlerTypes.DELETE, Enums_1.HttpMethods.DELETE, url, model);
|
|
139
145
|
break;
|
|
140
146
|
case Enums_1.HandlerTypes.FORCE_DELETE:
|
|
141
147
|
app.delete(url, middlewares, handler);
|
|
142
|
-
docs.push(Enums_1.HttpMethods.DELETE, url, model);
|
|
148
|
+
docs.push(this.version, Enums_1.HandlerTypes.FORCE_DELETE, Enums_1.HttpMethods.DELETE, url, model);
|
|
143
149
|
break;
|
|
144
150
|
case Enums_1.HandlerTypes.INSERT:
|
|
145
151
|
app.post(url, middlewares, handler);
|
|
146
|
-
docs.push(Enums_1.HttpMethods.POST, url, model);
|
|
152
|
+
docs.push(this.version, Enums_1.HandlerTypes.INSERT, Enums_1.HttpMethods.POST, url, model);
|
|
147
153
|
break;
|
|
148
154
|
case Enums_1.HandlerTypes.PAGINATE:
|
|
149
155
|
app.get(url, middlewares, handler);
|
|
150
|
-
docs.push(Enums_1.HttpMethods.GET, url, model);
|
|
156
|
+
docs.push(this.version, Enums_1.HandlerTypes.PAGINATE, Enums_1.HttpMethods.GET, url, model);
|
|
151
157
|
break;
|
|
152
158
|
case Enums_1.HandlerTypes.PATCH:
|
|
153
159
|
app.patch(url, middlewares, handler);
|
|
154
|
-
docs.push(Enums_1.HttpMethods.PATCH, url, model);
|
|
160
|
+
docs.push(this.version, Enums_1.HandlerTypes.PATCH, Enums_1.HttpMethods.PATCH, url, model);
|
|
155
161
|
break;
|
|
156
162
|
case Enums_1.HandlerTypes.SHOW:
|
|
157
163
|
app.get(url, middlewares, handler);
|
|
158
|
-
docs.push(Enums_1.HttpMethods.GET, url, model);
|
|
164
|
+
docs.push(this.version, Enums_1.HandlerTypes.SHOW, Enums_1.HttpMethods.GET, url, model);
|
|
159
165
|
break;
|
|
160
166
|
case Enums_1.HandlerTypes.UPDATE:
|
|
161
167
|
app.put(url, middlewares, handler);
|
|
162
|
-
docs.push(Enums_1.HttpMethods.PUT, url, model);
|
|
168
|
+
docs.push(this.version, Enums_1.HandlerTypes.UPDATE, Enums_1.HttpMethods.PUT, url, model);
|
|
163
169
|
break;
|
|
164
170
|
default:
|
|
165
171
|
throw new Error("Undefined handler type");
|
|
@@ -213,12 +219,8 @@ class RouterBuilder {
|
|
|
213
219
|
});
|
|
214
220
|
break;
|
|
215
221
|
default:
|
|
216
|
-
// We should
|
|
217
|
-
|
|
218
|
-
res.status(Enums_1.StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
219
|
-
error: "An error occurredxx.",
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
+
// We should log error and send general error response
|
|
223
|
+
Services_1.LogService.getInstance().error(`SERVER ERROR: ${JSON.stringify(Object.assign(Object.assign({}, error), { message: error.message }), null, " ")}`);
|
|
222
224
|
throw error;
|
|
223
225
|
}
|
|
224
226
|
}
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const Enums_1 = require("../Enums");
|
|
4
4
|
class ApiError extends Error {
|
|
5
|
-
constructor(message) {
|
|
5
|
+
constructor(message, status = Enums_1.StatusCodes.BAD_REQUEST) {
|
|
6
6
|
super(message);
|
|
7
7
|
this.type = "ApiError";
|
|
8
|
-
this.status =
|
|
8
|
+
this.status = status;
|
|
9
9
|
this.message = message;
|
|
10
10
|
}
|
|
11
11
|
}
|
|
@@ -15,11 +15,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
const Helpers_1 = require("./Helpers");
|
|
16
16
|
const Enums_1 = require("../Enums");
|
|
17
17
|
const ApiError_1 = __importDefault(require("../Exceptions/ApiError"));
|
|
18
|
+
const Enums_2 = require("../Enums");
|
|
18
19
|
exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
|
|
19
20
|
const { model, req, res, database, relation, parentModel } = pack;
|
|
21
|
+
// We should check the parameter type
|
|
22
|
+
const value = req.params[model.instance.primaryKey];
|
|
23
|
+
(0, Helpers_1.checkPrimaryKeyValueType)(model, value);
|
|
24
|
+
// Adding the main query
|
|
20
25
|
const query = database
|
|
21
26
|
.from(model.instance.table)
|
|
22
|
-
.where(model.instance.primaryKey,
|
|
27
|
+
.where(model.instance.primaryKey, value);
|
|
23
28
|
// If there is a deletedAtColumn, it means that this table support soft-delete
|
|
24
29
|
(0, Helpers_1.addSoftDeleteQuery)(model, null, query);
|
|
25
30
|
// If there is a relation, we should bind it
|
|
@@ -27,7 +32,7 @@ exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
27
32
|
yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforeDeleteQuery, Object.assign(Object.assign({}, pack), { query }));
|
|
28
33
|
const item = yield query.first();
|
|
29
34
|
if (!item) {
|
|
30
|
-
throw new ApiError_1.default(`The item is not found on ${model.name}
|
|
35
|
+
throw new ApiError_1.default(`The item is not found on ${model.name}.`, Enums_2.StatusCodes.NOT_FOUND);
|
|
31
36
|
}
|
|
32
37
|
yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onAfterDeleteQuery, Object.assign(Object.assign({}, pack), { query,
|
|
33
38
|
item }));
|
|
@@ -0,0 +1,24 @@
|
|
|
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 CLOUD_FRONT_DOMAIN = "https://dw7lgbuj348m4.cloudfront.net/v1";
|
|
13
|
+
exports.default = (req, res) => __awaiter(void 0, void 0, void 0, function* () {
|
|
14
|
+
try {
|
|
15
|
+
const result = yield fetch(`${CLOUD_FRONT_DOMAIN}/index.html`);
|
|
16
|
+
const content = (yield result.text())
|
|
17
|
+
.replaceAll(`src="`, `src="${CLOUD_FRONT_DOMAIN}`)
|
|
18
|
+
.replaceAll(`href="`, `href="${CLOUD_FRONT_DOMAIN}`);
|
|
19
|
+
res.send(content);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
res.send("404");
|
|
23
|
+
}
|
|
24
|
+
});
|
|
@@ -15,14 +15,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
const Helpers_1 = require("./Helpers");
|
|
16
16
|
const Enums_1 = require("../Enums");
|
|
17
17
|
const ApiError_1 = __importDefault(require("../Exceptions/ApiError"));
|
|
18
|
+
const Enums_2 = require("../Enums");
|
|
18
19
|
exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
|
|
19
20
|
const { model, req, res, database, relation, parentModel } = pack;
|
|
21
|
+
// We should check the parameter type
|
|
22
|
+
const value = req.params[model.instance.primaryKey];
|
|
23
|
+
(0, Helpers_1.checkPrimaryKeyValueType)(model, value);
|
|
24
|
+
// Adding the main query
|
|
20
25
|
const query = database
|
|
21
26
|
.from(model.instance.table)
|
|
22
|
-
.where(model.instance.primaryKey,
|
|
27
|
+
.where(model.instance.primaryKey, value);
|
|
23
28
|
// If there is a deletedAtColumn, it means that this table support soft-delete
|
|
24
29
|
if (model.instance.deletedAtColumn === null) {
|
|
25
|
-
throw new ApiError_1.default("You can use force delete only soft-delete supported models.");
|
|
30
|
+
throw new ApiError_1.default("You can use force delete only soft-delete supported models.", Enums_2.StatusCodes.NOT_FOUND);
|
|
26
31
|
}
|
|
27
32
|
// If there is a relation, we should bind it
|
|
28
33
|
(0, Helpers_1.addForeignKeyQuery)(req, query, relation, parentModel);
|
|
@@ -9,6 +9,7 @@ export declare const bindTimestampValues: (formData: Record<string, any>, column
|
|
|
9
9
|
export declare const getMergedFormData: (req: Request, fillables: string[]) => Record<string, any>;
|
|
10
10
|
export declare const callHooks: (model: IModelService, type: HookFunctionTypes, params: IHookParameter) => Promise<void>;
|
|
11
11
|
export declare const getParentColumn: (relation: IRelation | null) => string | null;
|
|
12
|
+
export declare const checkPrimaryKeyValueType: (model: IModelService, value: any) => void;
|
|
12
13
|
export declare const addForeignKeyQuery: (request: Request, query: Knex.QueryBuilder, relation: IRelation | null, parentModel: IModelService | null) => void;
|
|
13
14
|
export declare const serializeData: (version: IVersion, itemArray: any[] | any, modelSerializer: SerializationFunction | null, handler: HandlerTypes, request: Request) => Promise<any[]>;
|
|
14
15
|
export declare const filterHiddenFields: (itemArray: any[], hiddens: string[] | null) => void;
|
|
@@ -12,7 +12,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.isBoolean = exports.getRelatedData = exports.addSoftDeleteQuery = exports.filterHiddenFields = exports.serializeData = exports.addForeignKeyQuery = exports.getParentColumn = exports.callHooks = exports.getMergedFormData = exports.bindTimestampValues = void 0;
|
|
15
|
+
exports.isBoolean = exports.getRelatedData = exports.addSoftDeleteQuery = exports.filterHiddenFields = exports.serializeData = exports.addForeignKeyQuery = exports.checkPrimaryKeyValueType = exports.getParentColumn = exports.callHooks = exports.getMergedFormData = exports.bindTimestampValues = void 0;
|
|
16
16
|
const change_case_1 = require("change-case");
|
|
17
17
|
const Enums_1 = require("../Enums");
|
|
18
18
|
const ApiError_1 = __importDefault(require("../Exceptions/ApiError"));
|
|
@@ -63,6 +63,14 @@ const getParentColumn = (relation) => {
|
|
|
63
63
|
return (0, change_case_1.camelCase)(relation.foreignKey);
|
|
64
64
|
};
|
|
65
65
|
exports.getParentColumn = getParentColumn;
|
|
66
|
+
const checkPrimaryKeyValueType = (model, value) => {
|
|
67
|
+
// We should check the parameter type
|
|
68
|
+
const primaryColumn = model.columns.find((column) => column.name === model.instance.primaryKey);
|
|
69
|
+
if ((primaryColumn === null || primaryColumn === void 0 ? void 0 : primaryColumn.data_type) === "integer" && isNaN(parseInt(value))) {
|
|
70
|
+
throw new ApiError_1.default(`Unacceptable parameter: ${value}`);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
exports.checkPrimaryKeyValueType = checkPrimaryKeyValueType;
|
|
66
74
|
const addForeignKeyQuery = (request, query, relation, parentModel) => {
|
|
67
75
|
if (relation && parentModel) {
|
|
68
76
|
const parentColumn = (0, exports.getParentColumn)(relation);
|
|
@@ -16,6 +16,7 @@ const validatorjs_1 = __importDefault(require("validatorjs"));
|
|
|
16
16
|
const Helpers_1 = require("./Helpers");
|
|
17
17
|
const Enums_1 = require("../Enums");
|
|
18
18
|
const ApiError_1 = __importDefault(require("../Exceptions/ApiError"));
|
|
19
|
+
const Enums_2 = require("../Enums");
|
|
19
20
|
exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
21
|
const { version, model, req, res, database, relation, parentModel } = pack;
|
|
21
22
|
const query = database.from(model.instance.table);
|
|
@@ -24,11 +25,13 @@ exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
24
25
|
// If there is a deletedAtColumn, it means that this table support soft-delete
|
|
25
26
|
(0, Helpers_1.addSoftDeleteQuery)(model, null, query);
|
|
26
27
|
yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforeUpdateQuery, Object.assign(Object.assign({}, pack), { query }));
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
// We should check the parameter type
|
|
29
|
+
const value = req.params[model.instance.primaryKey];
|
|
30
|
+
(0, Helpers_1.checkPrimaryKeyValueType)(model, value);
|
|
31
|
+
// Adding the main query
|
|
32
|
+
let item = yield query.where(model.instance.primaryKey, value).first();
|
|
30
33
|
if (!item) {
|
|
31
|
-
throw new ApiError_1.default(`The item is not found on ${model.name}
|
|
34
|
+
throw new ApiError_1.default(`The item is not found on ${model.name}.`, Enums_2.StatusCodes.NOT_FOUND);
|
|
32
35
|
}
|
|
33
36
|
yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onAfterUpdateQuery, Object.assign(Object.assign({}, pack), { item,
|
|
34
37
|
query }));
|
|
@@ -16,6 +16,7 @@ const Helpers_1 = require("./Helpers");
|
|
|
16
16
|
const Enums_1 = require("../Enums");
|
|
17
17
|
const ApiError_1 = __importDefault(require("../Exceptions/ApiError"));
|
|
18
18
|
const Services_1 = require("../Services");
|
|
19
|
+
const Enums_2 = require("../Enums");
|
|
19
20
|
exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
21
|
const { version, model, req, res, database, relation, parentModel } = pack;
|
|
21
22
|
const queryParser = new Services_1.QueryService(model, version.modelList.get(), version.config);
|
|
@@ -29,15 +30,18 @@ exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
29
30
|
queryParser.applyFields(query, conditions.fields);
|
|
30
31
|
// If there is a relation, we should bind it
|
|
31
32
|
(0, Helpers_1.addForeignKeyQuery)(req, query, relation, parentModel);
|
|
32
|
-
// We should
|
|
33
|
-
|
|
33
|
+
// We should check the parameter type
|
|
34
|
+
const value = req.params[model.instance.primaryKey];
|
|
35
|
+
(0, Helpers_1.checkPrimaryKeyValueType)(model, value);
|
|
36
|
+
// Adding the main query
|
|
37
|
+
query.where(model.instance.primaryKey, value);
|
|
34
38
|
yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforeShow, Object.assign(Object.assign({}, pack), { query,
|
|
35
39
|
conditions }));
|
|
36
40
|
// Users should be able to filter records
|
|
37
41
|
queryParser.applyWheres(query, conditions.q);
|
|
38
42
|
let item = yield query.first();
|
|
39
43
|
if (!item) {
|
|
40
|
-
throw new ApiError_1.default(`The item is not found on ${model.name}
|
|
44
|
+
throw new ApiError_1.default(`The item is not found on ${model.name}.`, Enums_2.StatusCodes.NOT_FOUND);
|
|
41
45
|
}
|
|
42
46
|
// We should try to get related data if there is any
|
|
43
47
|
yield (0, Helpers_1.getRelatedData)(version, [item], conditions.with, model, version.modelList, database, Enums_1.HandlerTypes.ALL, req);
|
|
@@ -16,6 +16,7 @@ const validatorjs_1 = __importDefault(require("validatorjs"));
|
|
|
16
16
|
const Helpers_1 = require("./Helpers");
|
|
17
17
|
const Enums_1 = require("../Enums");
|
|
18
18
|
const ApiError_1 = __importDefault(require("../Exceptions/ApiError"));
|
|
19
|
+
const Enums_2 = require("../Enums");
|
|
19
20
|
exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
21
|
const { version, model, req, res, database, relation, parentModel } = pack;
|
|
21
22
|
const query = database.from(model.instance.table);
|
|
@@ -24,11 +25,13 @@ exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
24
25
|
// If there is a deletedAtColumn, it means that this table support soft-delete
|
|
25
26
|
(0, Helpers_1.addSoftDeleteQuery)(model, null, query);
|
|
26
27
|
yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforeUpdateQuery, Object.assign(Object.assign({}, pack), { query }));
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
// We should check the parameter type
|
|
29
|
+
const value = req.params[model.instance.primaryKey];
|
|
30
|
+
(0, Helpers_1.checkPrimaryKeyValueType)(model, value);
|
|
31
|
+
// Adding the main query
|
|
32
|
+
let item = yield query.where(model.instance.primaryKey, value).first();
|
|
30
33
|
if (!item) {
|
|
31
|
-
throw new ApiError_1.default(`The item is not found on ${model.name}
|
|
34
|
+
throw new ApiError_1.default(`The item is not found on ${model.name}.`, Enums_2.StatusCodes.NOT_FOUND);
|
|
32
35
|
}
|
|
33
36
|
yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onAfterUpdateQuery, Object.assign(Object.assign({}, pack), { item,
|
|
34
37
|
query }));
|
|
@@ -145,13 +145,19 @@ export interface IRequestPack {
|
|
|
145
145
|
database: Knex | Knex.Transaction;
|
|
146
146
|
}
|
|
147
147
|
export interface IRouteDocumentation {
|
|
148
|
+
version: string;
|
|
149
|
+
handler: string;
|
|
148
150
|
model: string;
|
|
149
151
|
table: string;
|
|
150
152
|
columns: IColumn[];
|
|
153
|
+
hiddens: string[];
|
|
154
|
+
relations: IRelation[];
|
|
151
155
|
method: HttpMethods;
|
|
152
156
|
url: string;
|
|
153
157
|
fillables: string[];
|
|
154
158
|
validations: Record<string, string> | null;
|
|
159
|
+
queryLimits: IQueryLimitConfig[];
|
|
160
|
+
queryDefaults: IQueryDefaultConfig;
|
|
155
161
|
}
|
|
156
162
|
export interface IRawQuery {
|
|
157
163
|
q: string | null;
|
package/build/src/Server.js
CHANGED
|
@@ -44,7 +44,8 @@ const knex_schema_inspector_1 = __importDefault(require("knex-schema-inspector")
|
|
|
44
44
|
const knex_paginate_1 = require("knex-paginate");
|
|
45
45
|
const Builders_1 = require("./Builders");
|
|
46
46
|
const Services_1 = require("./Services");
|
|
47
|
-
const
|
|
47
|
+
const MetadataHandler_1 = __importDefault(require("./Handlers/MetadataHandler"));
|
|
48
|
+
const DocsHTMLHandler_1 = __importDefault(require("./Handlers/DocsHTMLHandler"));
|
|
48
49
|
const RoutesHandler_1 = __importDefault(require("./Handlers/RoutesHandler"));
|
|
49
50
|
const Helpers_1 = require("./Helpers");
|
|
50
51
|
class Server {
|
|
@@ -118,7 +119,8 @@ class Server {
|
|
|
118
119
|
const logger = Services_1.LogService.getInstance();
|
|
119
120
|
const api = Services_1.APIService.getInstance();
|
|
120
121
|
if (api.config.env === "development") {
|
|
121
|
-
app.get("/
|
|
122
|
+
app.get("/metadata", MetadataHandler_1.default);
|
|
123
|
+
app.get("/docs", DocsHTMLHandler_1.default);
|
|
122
124
|
app.get("/routes", RoutesHandler_1.default);
|
|
123
125
|
}
|
|
124
126
|
app.listen(api.config.port, () => {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { IModelService, IRouteDocumentation } from "../Interfaces";
|
|
2
|
-
import { HttpMethods } from "../Enums";
|
|
1
|
+
import { IModelService, IRouteDocumentation, IVersion } from "../Interfaces";
|
|
2
|
+
import { HandlerTypes, HttpMethods } from "../Enums";
|
|
3
3
|
declare class DocumentationService {
|
|
4
4
|
private static instance;
|
|
5
5
|
private routes;
|
|
6
6
|
constructor();
|
|
7
7
|
static getInstance(): DocumentationService;
|
|
8
|
-
push(method: HttpMethods, url: string, model: IModelService): void;
|
|
8
|
+
push(version: IVersion, handler: HandlerTypes, method: HttpMethods, url: string, model: IModelService): void;
|
|
9
9
|
get(): IRouteDocumentation[];
|
|
10
10
|
}
|
|
11
11
|
export default DocumentationService;
|
|
@@ -10,15 +10,22 @@ class DocumentationService {
|
|
|
10
10
|
}
|
|
11
11
|
return DocumentationService.instance;
|
|
12
12
|
}
|
|
13
|
-
push(method, url, model) {
|
|
13
|
+
push(version, handler, method, url, model) {
|
|
14
|
+
var _a, _b;
|
|
14
15
|
this.routes.push({
|
|
16
|
+
version: version.name,
|
|
17
|
+
handler,
|
|
15
18
|
model: model.name,
|
|
16
19
|
table: model.instance.table,
|
|
17
20
|
columns: model.columns,
|
|
21
|
+
hiddens: model.instance.hiddens,
|
|
22
|
+
relations: model.relations,
|
|
18
23
|
method,
|
|
19
24
|
url,
|
|
20
25
|
fillables: model.instance.getFillableFields(method),
|
|
21
26
|
validations: model.instance.getValidationRules(method),
|
|
27
|
+
queryLimits: model.queryLimits,
|
|
28
|
+
queryDefaults: ((_b = (_a = version.config) === null || _a === void 0 ? void 0 : _a.query) === null || _b === void 0 ? void 0 : _b.defaults) || {},
|
|
22
29
|
});
|
|
23
30
|
}
|
|
24
31
|
get() {
|
|
@@ -205,7 +205,7 @@ class QueryService {
|
|
|
205
205
|
return value;
|
|
206
206
|
}
|
|
207
207
|
parsePerPage(content) {
|
|
208
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j
|
|
208
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
209
209
|
const value = parseInt(content ||
|
|
210
210
|
((_b = (_a = this.config.query) === null || _a === void 0 ? void 0 : _a.defaults) === null || _b === void 0 ? void 0 : _b.perPage) ||
|
|
211
211
|
((_c = constants_1.DEFAULT_VERSION_CONFIG.query.defaults) === null || _c === void 0 ? void 0 : _c.perPage) ||
|
|
@@ -216,10 +216,8 @@ class QueryService {
|
|
|
216
216
|
const maxPerPage = ((_h = (_g = this.config.query) === null || _g === void 0 ? void 0 : _g.defaults) === null || _h === void 0 ? void 0 : _h.maxPerPage) ||
|
|
217
217
|
((_j = constants_1.DEFAULT_VERSION_CONFIG.query.defaults) === null || _j === void 0 ? void 0 : _j.maxPerPage) ||
|
|
218
218
|
100;
|
|
219
|
-
if (isNaN(value) || value
|
|
220
|
-
|
|
221
|
-
((_m = constants_1.DEFAULT_VERSION_CONFIG.query.defaults) === null || _m === void 0 ? void 0 : _m.perPage) ||
|
|
222
|
-
10);
|
|
219
|
+
if (isNaN(value) || value < minPerPage || value > maxPerPage) {
|
|
220
|
+
throw new ApiError_1.default(`Unacceptable 'per_page' value! Current value is '${value}'. It should be between ${minPerPage}-${maxPerPage}`);
|
|
223
221
|
}
|
|
224
222
|
return value;
|
|
225
223
|
}
|
package/package.json
CHANGED
|
File without changes
|
|
File without changes
|