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.
Files changed (69) hide show
  1. package/build/index.d.ts +8 -0
  2. package/build/index.js +32 -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 +15 -0
  6. package/build/src/Builders/RouterBuilder.js +219 -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 +217 -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 +146 -0
  32. package/build/src/Interfaces.js +3 -0
  33. package/build/src/Model.d.ts +25 -0
  34. package/build/src/Model.js +145 -0
  35. package/build/src/Resolvers/FileResolver.d.ts +5 -0
  36. package/build/src/Resolvers/FileResolver.js +85 -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/GeneralHookResolver.d.ts +5 -0
  40. package/build/src/Resolvers/GeneralHookResolver.js +35 -0
  41. package/build/src/Resolvers/ModelResolver.d.ts +9 -0
  42. package/build/src/Resolvers/ModelResolver.js +107 -0
  43. package/build/src/Resolvers/TransactionResolver.d.ts +8 -0
  44. package/build/src/Resolvers/TransactionResolver.js +75 -0
  45. package/build/src/Resolvers/WithQueryResolver.d.ts +13 -0
  46. package/build/src/Resolvers/WithQueryResolver.js +116 -0
  47. package/build/src/Resolvers/index.d.ts +7 -0
  48. package/build/src/Resolvers/index.js +18 -0
  49. package/build/src/Server.d.ts +8 -0
  50. package/build/src/Server.js +103 -0
  51. package/build/src/Services/DocumentationService.d.ts +9 -0
  52. package/build/src/Services/DocumentationService.js +22 -0
  53. package/build/src/Services/IoCService.d.ts +9 -0
  54. package/build/src/Services/IoCService.js +51 -0
  55. package/build/src/Services/LogService.d.ts +12 -0
  56. package/build/src/Services/LogService.js +41 -0
  57. package/build/src/Services/ModelListService.d.ts +8 -0
  58. package/build/src/Services/ModelListService.js +18 -0
  59. package/build/src/Services/ModelService.d.ts +20 -0
  60. package/build/src/Services/ModelService.js +38 -0
  61. package/build/src/Services/QueryService.d.ts +34 -0
  62. package/build/src/Services/QueryService.js +377 -0
  63. package/build/src/Services/SchemaValidatorService.d.ts +12 -0
  64. package/build/src/Services/SchemaValidatorService.js +114 -0
  65. package/build/src/Services/index.d.ts +8 -0
  66. package/build/src/Services/index.js +20 -0
  67. package/build/src/constants.d.ts +23 -0
  68. package/build/src/constants.js +62 -0
  69. package/package.json +1 -1
@@ -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,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,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,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 = "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,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;
@@ -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
+ });
@@ -0,0 +1,6 @@
1
+ import { IRequestPack } from "../Interfaces";
2
+ import { HandlerTypes } from "../Enums";
3
+ declare class HandlerFactory {
4
+ get(handleType: HandlerTypes): (pack: IRequestPack) => void;
5
+ }
6
+ export default HandlerFactory;