axe-api 0.19.1 → 0.20.0-rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/build/index.d.ts +7 -0
  2. package/build/index.js +30 -0
  3. package/build/src/Builders/ModelTreeBuilder.d.ts +9 -0
  4. package/build/src/Builders/ModelTreeBuilder.js +64 -0
  5. package/build/src/Builders/RouterBuilder.d.ts +17 -0
  6. package/build/src/Builders/RouterBuilder.js +247 -0
  7. package/build/src/Builders/index.d.ts +3 -0
  8. package/build/src/Builders/index.js +10 -0
  9. package/build/src/Enums.d.ts +77 -0
  10. package/build/src/Enums.js +90 -0
  11. package/build/src/Exceptions/ApiError.d.ts +8 -0
  12. package/build/src/Exceptions/ApiError.js +12 -0
  13. package/build/src/Handlers/AllHandler.d.ts +4 -0
  14. package/build/src/Handlers/AllHandler.js +44 -0
  15. package/build/src/Handlers/DestroyHandler.d.ts +4 -0
  16. package/build/src/Handlers/DestroyHandler.js +37 -0
  17. package/build/src/Handlers/HandlerFactory.d.ts +6 -0
  18. package/build/src/Handlers/HandlerFactory.js +36 -0
  19. package/build/src/Handlers/Helpers.d.ts +14 -0
  20. package/build/src/Handlers/Helpers.js +234 -0
  21. package/build/src/Handlers/PaginateHandler.d.ts +4 -0
  22. package/build/src/Handlers/PaginateHandler.js +48 -0
  23. package/build/src/Handlers/PatchHandler.d.ts +4 -0
  24. package/build/src/Handlers/PatchHandler.js +62 -0
  25. package/build/src/Handlers/ShowHandler.d.ts +4 -0
  26. package/build/src/Handlers/ShowHandler.js +51 -0
  27. package/build/src/Handlers/StoreHandler.d.ts +4 -0
  28. package/build/src/Handlers/StoreHandler.js +59 -0
  29. package/build/src/Handlers/UpdateHandler.d.ts +4 -0
  30. package/build/src/Handlers/UpdateHandler.js +62 -0
  31. package/build/src/Interfaces.d.ts +164 -0
  32. package/build/src/Interfaces.js +3 -0
  33. package/build/src/Model.d.ts +24 -0
  34. package/build/src/Model.js +108 -0
  35. package/build/src/Resolvers/FileResolver.d.ts +5 -0
  36. package/build/src/Resolvers/FileResolver.js +53 -0
  37. package/build/src/Resolvers/FolderResolver.d.ts +5 -0
  38. package/build/src/Resolvers/FolderResolver.js +19 -0
  39. package/build/src/Resolvers/ModelResolver.d.ts +9 -0
  40. package/build/src/Resolvers/ModelResolver.js +101 -0
  41. package/build/src/Resolvers/index.d.ts +4 -0
  42. package/build/src/Resolvers/index.js +12 -0
  43. package/build/src/Server.d.ts +8 -0
  44. package/build/src/Server.js +101 -0
  45. package/build/src/Services/DocumentationService.d.ts +9 -0
  46. package/build/src/Services/DocumentationService.js +22 -0
  47. package/build/src/Services/IoCService.d.ts +9 -0
  48. package/build/src/Services/IoCService.js +51 -0
  49. package/build/src/Services/LogService.d.ts +12 -0
  50. package/build/src/Services/LogService.js +41 -0
  51. package/build/src/Services/ModelListService.d.ts +8 -0
  52. package/build/src/Services/ModelListService.js +18 -0
  53. package/build/src/Services/ModelService.d.ts +20 -0
  54. package/build/src/Services/ModelService.js +38 -0
  55. package/build/src/Services/QueryService.d.ts +39 -0
  56. package/build/src/Services/QueryService.js +447 -0
  57. package/build/src/Services/SchemaValidatorService.d.ts +12 -0
  58. package/build/src/Services/SchemaValidatorService.js +114 -0
  59. package/build/src/Services/index.d.ts +8 -0
  60. package/build/src/Services/index.js +20 -0
  61. package/build/src/constants.d.ts +23 -0
  62. package/build/src/constants.js +62 -0
  63. package/package.json +62 -56
  64. package/readme.md +152 -145
  65. package/.eslintrc.cjs +0 -24
  66. package/.github/PULL_REQUEST_TEMPLATE.md +0 -32
  67. package/.github/workflows/auto-tag.yml +0 -15
  68. package/.github/workflows/npm-publish.yml +0 -18
  69. package/.github/workflows/test-integration.yml +0 -29
  70. package/.github/workflows/test-unit.yml +0 -23
  71. package/CHANGELOG.md +0 -144
  72. package/babel.config.cjs +0 -12
  73. package/index.js +0 -21
  74. package/jest.config.js +0 -4
  75. package/src/Server.js +0 -118
  76. package/src/constants.js +0 -148
  77. package/src/core/Config.js +0 -38
  78. package/src/core/Docs.js +0 -43
  79. package/src/core/HttpResponse.js +0 -10
  80. package/src/core/IoC.js +0 -41
  81. package/src/core/Logger.js +0 -46
  82. package/src/core/Model.js +0 -86
  83. package/src/core/QueryParser.js +0 -544
  84. package/src/handlers/all.js +0 -73
  85. package/src/handlers/destroy.js +0 -50
  86. package/src/handlers/helpers.js +0 -320
  87. package/src/handlers/index.js +0 -9
  88. package/src/handlers/paginate.js +0 -77
  89. package/src/handlers/patch.js +0 -95
  90. package/src/handlers/show.js +0 -81
  91. package/src/handlers/store.js +0 -82
  92. package/src/handlers/update.js +0 -92
  93. package/src/resolvers/checkModelColumns.js +0 -113
  94. package/src/resolvers/detectDbColumns.js +0 -42
  95. package/src/resolvers/getModelInstanceArray.js +0 -27
  96. package/src/resolvers/getModelTree.js +0 -63
  97. package/src/resolvers/index.js +0 -17
  98. package/src/resolvers/setExpressRoutes.js +0 -286
  99. package/src/resolvers/setModelHooks.js +0 -25
  100. package/src/resolvers/setModelRelations.js +0 -41
@@ -0,0 +1,7 @@
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
+ export * from "./src/Enums";
6
+ export * from "./src/Interfaces";
7
+ export { Server, Model, ApiError, DEFAULT_HANDLERS };
package/build/index.js ADDED
@@ -0,0 +1,30 @@
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.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
+ __exportStar(require("./src/Enums"), exports);
30
+ __exportStar(require("./src/Interfaces"), exports);
@@ -0,0 +1,9 @@
1
+ declare class ModelTreeBuilder {
2
+ build(): Promise<void>;
3
+ private getRootLevelOfTree;
4
+ private createRecursiveTree;
5
+ private setChildrens;
6
+ private getChildModelNames;
7
+ private addNestedRoutes;
8
+ }
9
+ export default ModelTreeBuilder;
@@ -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,17 @@
1
+ declare class RouterBuilder {
2
+ build(): Promise<void>;
3
+ private getGeneralHooks;
4
+ private createRoutesByModelTree;
5
+ private createRouteByModel;
6
+ private createNestedRoutes;
7
+ private createChildRoutes;
8
+ private getPrimaryKeyName;
9
+ private ucFirst;
10
+ private addExpressRoute;
11
+ private requestHandler;
12
+ private sendErrorAsResponse;
13
+ private getResourcePath;
14
+ private getRootPrefix;
15
+ private getModelMiddlewares;
16
+ }
17
+ export default RouterBuilder;
@@ -0,0 +1,247 @@
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 path_1 = __importDefault(require("path"));
16
+ const pluralize_1 = __importDefault(require("pluralize"));
17
+ const http_status_codes_1 = require("http-status-codes");
18
+ const change_case_1 = require("change-case");
19
+ const Resolvers_1 = require("../Resolvers");
20
+ const constants_1 = require("../constants");
21
+ const Enums_1 = require("../Enums");
22
+ const Services_1 = require("../Services");
23
+ class RouterBuilder {
24
+ constructor() {
25
+ this.getPrimaryKeyName = (model) => {
26
+ return (pluralize_1.default.singular(model.name).toLowerCase() +
27
+ this.ucFirst(model.instance.primaryKey));
28
+ };
29
+ this.ucFirst = (value) => {
30
+ return value.charAt(0).toUpperCase() + value.slice(1);
31
+ };
32
+ this.getRootPrefix = () => __awaiter(this, void 0, void 0, function* () {
33
+ var _a;
34
+ const config = yield Services_1.IoCService.use("Config");
35
+ let prefix = ((_a = config === null || config === void 0 ? void 0 : config.Application) === null || _a === void 0 ? void 0 : _a.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
+ });
44
+ }
45
+ build() {
46
+ return __awaiter(this, void 0, void 0, function* () {
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 this.getGeneralHooks();
51
+ if (generalHooks.onBeforeInit) {
52
+ generalHooks.onBeforeInit();
53
+ }
54
+ yield this.createRoutesByModelTree(modelTree, modelList);
55
+ if (generalHooks.onAfterInit) {
56
+ generalHooks.onAfterInit();
57
+ }
58
+ logger.info("Express routes have been created.");
59
+ });
60
+ }
61
+ getGeneralHooks() {
62
+ return __awaiter(this, void 0, void 0, function* () {
63
+ const folders = (yield Services_1.IoCService.use("Folders"));
64
+ const fileResolver = new Resolvers_1.FileResolver();
65
+ const content = yield fileResolver.resolveContent(path_1.default.join(folders.App, "app"));
66
+ if (content && content.init) {
67
+ const { onBeforeInit = null, onAfterInit = null } = content.init;
68
+ return { onBeforeInit, onAfterInit };
69
+ }
70
+ return {
71
+ onBeforeInit: null,
72
+ onAfterInit: null,
73
+ };
74
+ });
75
+ }
76
+ createRoutesByModelTree(modelTree, modelList) {
77
+ return __awaiter(this, void 0, void 0, function* () {
78
+ for (const model of modelTree) {
79
+ yield this.createRouteByModel(model, modelList);
80
+ }
81
+ });
82
+ }
83
+ createRouteByModel(model, modelList, urlPrefix = "", parentModel = null, relation = null, allowRecursive = true) {
84
+ return __awaiter(this, void 0, void 0, function* () {
85
+ if (model.instance.ignore) {
86
+ return;
87
+ }
88
+ const resource = this.getResourcePath(model, relation);
89
+ // We create and handle routes by not duplicate so many lines.
90
+ for (const handler of Object.keys(constants_1.API_ROUTE_TEMPLATES)) {
91
+ const handlerType = handler;
92
+ if (!model.instance.handlers.includes(handlerType)) {
93
+ continue;
94
+ }
95
+ const urlCreator = constants_1.API_ROUTE_TEMPLATES[handlerType];
96
+ const url = urlCreator(yield this.getRootPrefix(), urlPrefix, resource, model.instance.primaryKey);
97
+ // Detecting filters
98
+ const middlewares = this.getModelMiddlewares(model, handlerType);
99
+ // Adding the route to the express
100
+ yield this.addExpressRoute(handlerType, url, middlewares, model, parentModel, relation);
101
+ }
102
+ yield this.createChildRoutes(model, modelList, resource, urlPrefix);
103
+ yield this.createNestedRoutes(model, modelList, allowRecursive, urlPrefix, resource);
104
+ });
105
+ }
106
+ createNestedRoutes(model, modelList, allowRecursive, urlPrefix, resource) {
107
+ return __awaiter(this, void 0, void 0, function* () {
108
+ if (!model.isRecursive || !allowRecursive) {
109
+ return;
110
+ }
111
+ // We should different parameter name for child routes
112
+ const relation = model.relations.find((relation) => relation.model === model.name &&
113
+ relation.type === Enums_1.Relationships.HAS_MANY);
114
+ if (relation) {
115
+ yield this.createRouteByModel(model, modelList, `${urlPrefix}${resource}/:${(0, change_case_1.camelCase)(relation.foreignKey)}/`, model, relation, false);
116
+ }
117
+ });
118
+ }
119
+ createChildRoutes(model, modelList, resource, urlPrefix) {
120
+ return __awaiter(this, void 0, void 0, function* () {
121
+ if (model.children.length === 0) {
122
+ return;
123
+ }
124
+ // We should different parameter name for child routes
125
+ const primaryKey = this.getPrimaryKeyName(model);
126
+ const subRelations = model.relations.filter((item) => item.type === Enums_1.Relationships.HAS_MANY);
127
+ for (const relation of subRelations) {
128
+ const child = model.children.find((item) => item.name === relation.model);
129
+ // It should be recursive
130
+ if (child) {
131
+ yield this.createRouteByModel(child, modelList, `${urlPrefix}${resource}/:${primaryKey}/`, model, relation);
132
+ }
133
+ }
134
+ });
135
+ }
136
+ addExpressRoute(handlerType, url, middlewares, model, parentModel, relation) {
137
+ return __awaiter(this, void 0, void 0, function* () {
138
+ const docs = yield Services_1.IoCService.useByType("DocumentationService");
139
+ const app = yield Services_1.IoCService.useByType("App");
140
+ const handler = (req, res) => {
141
+ this.requestHandler(handlerType, req, res, model, parentModel, relation);
142
+ };
143
+ switch (handlerType) {
144
+ case Enums_1.HandlerTypes.ALL:
145
+ app.get(url, middlewares, handler);
146
+ docs.push(Enums_1.HttpMethods.GET, url, model);
147
+ break;
148
+ case Enums_1.HandlerTypes.DELETE:
149
+ app.delete(url, middlewares, handler);
150
+ docs.push(Enums_1.HttpMethods.DELETE, url, model);
151
+ break;
152
+ case Enums_1.HandlerTypes.INSERT:
153
+ app.post(url, middlewares, handler);
154
+ docs.push(Enums_1.HttpMethods.POST, url, model);
155
+ break;
156
+ case Enums_1.HandlerTypes.PAGINATE:
157
+ app.get(url, middlewares, handler);
158
+ docs.push(Enums_1.HttpMethods.GET, url, model);
159
+ break;
160
+ case Enums_1.HandlerTypes.PATCH:
161
+ app.patch(url, middlewares, handler);
162
+ docs.push(Enums_1.HttpMethods.PATCH, url, model);
163
+ break;
164
+ case Enums_1.HandlerTypes.SHOW:
165
+ app.get(url, middlewares, handler);
166
+ docs.push(Enums_1.HttpMethods.GET, url, model);
167
+ break;
168
+ case Enums_1.HandlerTypes.UPDATE:
169
+ app.put(url, middlewares, handler);
170
+ docs.push(Enums_1.HttpMethods.PUT, url, model);
171
+ break;
172
+ default:
173
+ throw new Error("Undefined handler type");
174
+ }
175
+ });
176
+ }
177
+ requestHandler(handlerType, req, res, model, parentModel, relation) {
178
+ return __awaiter(this, void 0, void 0, function* () {
179
+ try {
180
+ const factory = yield Services_1.IoCService.useByType("HandlerFactory");
181
+ const database = (yield Services_1.IoCService.use("Database"));
182
+ const handler = factory.get(handlerType);
183
+ const pack = {
184
+ req,
185
+ res,
186
+ handlerType,
187
+ model,
188
+ parentModel,
189
+ relation,
190
+ database,
191
+ };
192
+ yield handler(pack);
193
+ }
194
+ catch (error) {
195
+ this.sendErrorAsResponse(res, error);
196
+ }
197
+ });
198
+ }
199
+ sendErrorAsResponse(res, error) {
200
+ const type = error.type;
201
+ switch (type) {
202
+ case "ApiError":
203
+ const apiError = error;
204
+ res.status(apiError.status).json({
205
+ error: apiError.message,
206
+ });
207
+ break;
208
+ default:
209
+ res.status(http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR).json({
210
+ error: "An error occurred.",
211
+ });
212
+ break;
213
+ }
214
+ }
215
+ getResourcePath(model, relation) {
216
+ // TODO: Fixe
217
+ return (0, change_case_1.paramCase)(pluralize_1.default.plural(model.name)).toLowerCase();
218
+ // return relation
219
+ // ? relation.resource
220
+ // : paramCase(pluralize.plural(model.name)).toLowerCase();
221
+ }
222
+ getModelMiddlewares(model, handlerType) {
223
+ const results = [];
224
+ const middlewares = model.instance.middlewares;
225
+ if (Array.isArray(middlewares)) {
226
+ middlewares.forEach((item) => {
227
+ if (item === null || item === void 0 ? void 0 : item.handler) {
228
+ const methodBasedMiddlewares = item;
229
+ if (methodBasedMiddlewares.handler.includes(handlerType)) {
230
+ results.push(methodBasedMiddlewares.middleware);
231
+ }
232
+ }
233
+ else {
234
+ results.push(item);
235
+ }
236
+ });
237
+ }
238
+ else {
239
+ const methodBasedMiddlewares = middlewares;
240
+ if (methodBasedMiddlewares.handler.includes(handlerType)) {
241
+ results.push(methodBasedMiddlewares.middleware);
242
+ }
243
+ }
244
+ return results;
245
+ }
246
+ }
247
+ exports.default = RouterBuilder;
@@ -0,0 +1,3 @@
1
+ import ModelTreeBuilder from "./ModelTreeBuilder";
2
+ import RouterBuilder from "./RouterBuilder";
3
+ export { ModelTreeBuilder, 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 = "NotNull",
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"] = "NotNull";
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,8 @@
1
+ import { StatusCodes } from "http-status-codes";
2
+ declare class ApiError extends Error {
3
+ type: string;
4
+ status: StatusCodes;
5
+ message: string;
6
+ constructor(message: string);
7
+ }
8
+ export default ApiError;
@@ -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,4 @@
1
+ /// <reference types="express" />
2
+ import { IRequestPack } from "../Interfaces";
3
+ declare const _default: (pack: IRequestPack) => Promise<import("express").Response<any, Record<string, any>>>;
4
+ export default _default;
@@ -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,4 @@
1
+ /// <reference types="express" />
2
+ import { IRequestPack } from "../Interfaces";
3
+ declare const _default: (pack: IRequestPack) => Promise<import("express").Response<any, Record<string, any>>>;
4
+ export default _default;