axe-api 0.20.1 → 0.20.3

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 (70) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/build/index.d.ts +8 -0
  3. package/build/index.js +32 -0
  4. package/build/src/Builders/ModelTreeBuilder.d.ts +9 -0
  5. package/build/src/Builders/ModelTreeBuilder.js +64 -0
  6. package/build/src/Builders/RouterBuilder.d.ts +15 -0
  7. package/build/src/Builders/RouterBuilder.js +219 -0
  8. package/build/src/Builders/index.d.ts +3 -0
  9. package/build/src/Builders/index.js +10 -0
  10. package/build/src/Enums.d.ts +77 -0
  11. package/build/src/Enums.js +90 -0
  12. package/build/src/Exceptions/ApiError.d.ts +8 -0
  13. package/build/src/Exceptions/ApiError.js +12 -0
  14. package/build/src/Handlers/AllHandler.d.ts +4 -0
  15. package/build/src/Handlers/AllHandler.js +44 -0
  16. package/build/src/Handlers/DestroyHandler.d.ts +4 -0
  17. package/build/src/Handlers/DestroyHandler.js +37 -0
  18. package/build/src/Handlers/HandlerFactory.d.ts +6 -0
  19. package/build/src/Handlers/HandlerFactory.js +36 -0
  20. package/build/src/Handlers/Helpers.d.ts +14 -0
  21. package/build/src/Handlers/Helpers.js +217 -0
  22. package/build/src/Handlers/PaginateHandler.d.ts +4 -0
  23. package/build/src/Handlers/PaginateHandler.js +48 -0
  24. package/build/src/Handlers/PatchHandler.d.ts +4 -0
  25. package/build/src/Handlers/PatchHandler.js +62 -0
  26. package/build/src/Handlers/ShowHandler.d.ts +4 -0
  27. package/build/src/Handlers/ShowHandler.js +51 -0
  28. package/build/src/Handlers/StoreHandler.d.ts +4 -0
  29. package/build/src/Handlers/StoreHandler.js +59 -0
  30. package/build/src/Handlers/UpdateHandler.d.ts +4 -0
  31. package/build/src/Handlers/UpdateHandler.js +62 -0
  32. package/build/src/Interfaces.d.ts +146 -0
  33. package/build/src/Interfaces.js +3 -0
  34. package/build/src/Model.d.ts +25 -0
  35. package/build/src/Model.js +145 -0
  36. package/build/src/Resolvers/FileResolver.d.ts +5 -0
  37. package/build/src/Resolvers/FileResolver.js +85 -0
  38. package/build/src/Resolvers/FolderResolver.d.ts +5 -0
  39. package/build/src/Resolvers/FolderResolver.js +19 -0
  40. package/build/src/Resolvers/GeneralHookResolver.d.ts +5 -0
  41. package/build/src/Resolvers/GeneralHookResolver.js +35 -0
  42. package/build/src/Resolvers/ModelResolver.d.ts +9 -0
  43. package/build/src/Resolvers/ModelResolver.js +107 -0
  44. package/build/src/Resolvers/TransactionResolver.d.ts +8 -0
  45. package/build/src/Resolvers/TransactionResolver.js +75 -0
  46. package/build/src/Resolvers/WithQueryResolver.d.ts +13 -0
  47. package/build/src/Resolvers/WithQueryResolver.js +116 -0
  48. package/build/src/Resolvers/index.d.ts +7 -0
  49. package/build/src/Resolvers/index.js +18 -0
  50. package/build/src/Server.d.ts +8 -0
  51. package/build/src/Server.js +103 -0
  52. package/build/src/Services/DocumentationService.d.ts +9 -0
  53. package/build/src/Services/DocumentationService.js +22 -0
  54. package/build/src/Services/IoCService.d.ts +9 -0
  55. package/build/src/Services/IoCService.js +51 -0
  56. package/build/src/Services/LogService.d.ts +12 -0
  57. package/build/src/Services/LogService.js +41 -0
  58. package/build/src/Services/ModelListService.d.ts +8 -0
  59. package/build/src/Services/ModelListService.js +18 -0
  60. package/build/src/Services/ModelService.d.ts +20 -0
  61. package/build/src/Services/ModelService.js +38 -0
  62. package/build/src/Services/QueryService.d.ts +34 -0
  63. package/build/src/Services/QueryService.js +377 -0
  64. package/build/src/Services/SchemaValidatorService.d.ts +12 -0
  65. package/build/src/Services/SchemaValidatorService.js +114 -0
  66. package/build/src/Services/index.d.ts +8 -0
  67. package/build/src/Services/index.js +20 -0
  68. package/build/src/constants.d.ts +23 -0
  69. package/build/src/constants.js +62 -0
  70. package/package.json +1 -1
@@ -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;
@@ -0,0 +1,36 @@
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
+ const AllHandler_1 = __importDefault(require("./AllHandler"));
7
+ const DestroyHandler_1 = __importDefault(require("./DestroyHandler"));
8
+ const PaginateHandler_1 = __importDefault(require("./PaginateHandler"));
9
+ const PatchHandler_1 = __importDefault(require("./PatchHandler"));
10
+ const UpdateHandler_1 = __importDefault(require("./UpdateHandler"));
11
+ const ShowHandler_1 = __importDefault(require("./ShowHandler"));
12
+ const StoreHandler_1 = __importDefault(require("./StoreHandler"));
13
+ const Enums_1 = require("../Enums");
14
+ class HandlerFactory {
15
+ get(handleType) {
16
+ switch (handleType) {
17
+ case Enums_1.HandlerTypes.ALL:
18
+ return AllHandler_1.default;
19
+ case Enums_1.HandlerTypes.DELETE:
20
+ return DestroyHandler_1.default;
21
+ case Enums_1.HandlerTypes.INSERT:
22
+ return StoreHandler_1.default;
23
+ case Enums_1.HandlerTypes.PAGINATE:
24
+ return PaginateHandler_1.default;
25
+ case Enums_1.HandlerTypes.PATCH:
26
+ return PatchHandler_1.default;
27
+ case Enums_1.HandlerTypes.SHOW:
28
+ return ShowHandler_1.default;
29
+ case Enums_1.HandlerTypes.UPDATE:
30
+ return UpdateHandler_1.default;
31
+ default:
32
+ throw new Error("Handler type is not defined");
33
+ }
34
+ }
35
+ }
36
+ exports.default = HandlerFactory;
@@ -0,0 +1,14 @@
1
+ import { Request } from "express";
2
+ import { IModelService, IRelation, IHookParameter } from "../Interfaces";
3
+ import { Knex } from "knex";
4
+ import { IWith } from "../Interfaces";
5
+ import { HandlerTypes, HookFunctionTypes, TimestampColumns } from "../Enums";
6
+ import { ModelListService } from "../Services";
7
+ export declare const bindTimestampValues: (formData: Record<string, any>, columnTypes: TimestampColumns[] | undefined, model: IModelService) => void;
8
+ export declare const getMergedFormData: (req: Request, fillables: string[]) => Record<string, any>;
9
+ export declare const callHooks: (model: IModelService, type: HookFunctionTypes, params: IHookParameter) => Promise<void>;
10
+ export declare const getParentColumn: (relation: IRelation | null) => string | null;
11
+ export declare const addForeignKeyQuery: (request: Request, query: Knex.QueryBuilder, relation: IRelation | null, parentModel: IModelService | null) => void;
12
+ export declare const serializeData: (itemArray: any[] | any, modelSerializer: (data: any, request: Request) => void, handler: HandlerTypes, request: Request) => Promise<any[]>;
13
+ export declare const filterHiddenFields: (itemArray: any[], hiddens: string[] | null) => void;
14
+ export declare const getRelatedData: (data: any[], withArray: IWith[], model: IModelService, modelList: ModelListService, database: Knex | Knex.Transaction, handler: HandlerTypes, request: Request) => Promise<void>;
@@ -0,0 +1,217 @@
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
+ exports.getRelatedData = exports.filterHiddenFields = exports.serializeData = exports.addForeignKeyQuery = exports.getParentColumn = exports.callHooks = exports.getMergedFormData = exports.bindTimestampValues = void 0;
16
+ const change_case_1 = require("change-case");
17
+ const Enums_1 = require("../Enums");
18
+ const ApiError_1 = __importDefault(require("../Exceptions/ApiError"));
19
+ const Services_1 = require("../Services");
20
+ const bindTimestampValues = (formData, columnTypes = [], model) => {
21
+ if (columnTypes.includes(Enums_1.TimestampColumns.CREATED_AT) &&
22
+ model.instance.createdAtColumn) {
23
+ formData[model.instance.createdAtColumn] = new Date();
24
+ }
25
+ if (columnTypes.includes(Enums_1.TimestampColumns.UPDATED_AT) &&
26
+ model.instance.updatedAtColumn) {
27
+ formData[model.instance.updatedAtColumn] = new Date();
28
+ }
29
+ };
30
+ exports.bindTimestampValues = bindTimestampValues;
31
+ const getMergedFormData = (req, fillables) => {
32
+ const formData = {};
33
+ Object.keys(req.body).forEach((key) => {
34
+ if (fillables.includes(key)) {
35
+ formData[key] = req.body[key];
36
+ }
37
+ });
38
+ return formData;
39
+ };
40
+ exports.getMergedFormData = getMergedFormData;
41
+ const callHooks = (model, type, params) => __awaiter(void 0, void 0, void 0, function* () {
42
+ if (model.hooks[type]) {
43
+ yield model.hooks[type](params);
44
+ }
45
+ if (model.events[type]) {
46
+ // Developers shouldn't be able to access transaction in events. Because
47
+ // we don't await for the events. If the developer uses the transaction and
48
+ // try to commit something, it would be lost cause the transaction could be
49
+ // already completed.
50
+ const database = (yield Services_1.IoCService.use("Database"));
51
+ params.database = database;
52
+ // Calling the events
53
+ model.events[type](params);
54
+ }
55
+ });
56
+ exports.callHooks = callHooks;
57
+ const getParentColumn = (relation) => {
58
+ if (!relation) {
59
+ return null;
60
+ }
61
+ return (0, change_case_1.camelCase)(relation.foreignKey);
62
+ };
63
+ exports.getParentColumn = getParentColumn;
64
+ const addForeignKeyQuery = (request, query, relation, parentModel) => {
65
+ if (relation && parentModel) {
66
+ const parentColumn = (0, exports.getParentColumn)(relation);
67
+ if (parentColumn) {
68
+ query.where(relation.foreignKey, request.params[parentColumn]);
69
+ }
70
+ }
71
+ };
72
+ exports.addForeignKeyQuery = addForeignKeyQuery;
73
+ const getPrimaryOrForeignKeyByRelation = (relation, dataField) => {
74
+ if (dataField === "primaryKey") {
75
+ return relation.primaryKey;
76
+ }
77
+ return relation.foreignKey;
78
+ };
79
+ const uniqueByMap = (array) => {
80
+ const map = new Map();
81
+ for (const item of array) {
82
+ map.set(item, item);
83
+ }
84
+ return Array.from(map.values());
85
+ };
86
+ const serialize = (data, callback, request) => {
87
+ if (!callback) {
88
+ return data;
89
+ }
90
+ if (Array.isArray(data)) {
91
+ return data.map((item) => callback(item, request));
92
+ }
93
+ return callback(data, request);
94
+ };
95
+ const globalSerializer = (itemArray, handler, request) => __awaiter(void 0, void 0, void 0, function* () {
96
+ const Application = yield Services_1.IoCService.useByType("Config");
97
+ if (!Application.serializers) {
98
+ return itemArray;
99
+ }
100
+ const callbacks = [];
101
+ // Push all runable serializer into callbacks.
102
+ Application.serializers.map((configSerializer) => {
103
+ // Serialize data for all requests types.
104
+ if (typeof configSerializer === "function") {
105
+ callbacks.push(configSerializer);
106
+ return;
107
+ }
108
+ // Serialize data with specific handler like "PAGINATE" or "SHOW".
109
+ if (configSerializer.handler.includes(handler)) {
110
+ callbacks.push(...configSerializer.serializer);
111
+ return;
112
+ }
113
+ });
114
+ callbacks.forEach((callback) => {
115
+ itemArray = serialize(itemArray, callback, request);
116
+ });
117
+ return itemArray;
118
+ });
119
+ const serializeData = (itemArray, modelSerializer, handler, request) => __awaiter(void 0, void 0, void 0, function* () {
120
+ itemArray = serialize(itemArray, modelSerializer, request);
121
+ itemArray = yield globalSerializer(itemArray, handler, request);
122
+ return itemArray;
123
+ });
124
+ exports.serializeData = serializeData;
125
+ const filterHiddenFields = (itemArray, hiddens) => {
126
+ if (hiddens === null) {
127
+ return;
128
+ }
129
+ if (hiddens.length === 0 || itemArray.length === 0) {
130
+ return;
131
+ }
132
+ itemArray.forEach((item) => {
133
+ hiddens.forEach((hidden) => {
134
+ if (item[hidden] !== undefined) {
135
+ delete item[hidden];
136
+ }
137
+ });
138
+ });
139
+ };
140
+ exports.filterHiddenFields = filterHiddenFields;
141
+ const getRelatedData = (data, withArray, model, modelList, database, handler, request) => __awaiter(void 0, void 0, void 0, function* () {
142
+ if (withArray.length === 0) {
143
+ return;
144
+ }
145
+ const models = modelList.get();
146
+ for (const clientQuery of withArray) {
147
+ // Find the relation of the model. If the model doesn't have any relationship like the
148
+ // user wants, we can't show anything.
149
+ const definedRelation = model.relations.find((relation) => relation.name === clientQuery.relationship);
150
+ if (!definedRelation) {
151
+ throw new ApiError_1.default(`Undefined relation: ${clientQuery.relationship}`);
152
+ }
153
+ // Find the foreign model by the relationship
154
+ const foreignModel = models.find((model) => model.name === definedRelation.model);
155
+ if (!foreignModel) {
156
+ continue;
157
+ }
158
+ let dataField = "primaryKey";
159
+ let searchField = "foreignKey";
160
+ if (definedRelation.type !== Enums_1.Relationships.HAS_MANY) {
161
+ dataField = "foreignKey";
162
+ searchField = "primaryKey";
163
+ }
164
+ const dataFieldKey = getPrimaryOrForeignKeyByRelation(definedRelation, dataField);
165
+ const searchFieldKey = getPrimaryOrForeignKeyByRelation(definedRelation, searchField);
166
+ // We should find the parent Primary Key values.
167
+ const parentPrimaryKeyValues = data.map((item) => item[dataFieldKey]);
168
+ // Selecting the special field for the relations
169
+ let selectColumns = ["*"];
170
+ if (clientQuery.fields.length > 0) {
171
+ selectColumns = [...clientQuery.fields, searchFieldKey];
172
+ if (definedRelation.type === Enums_1.Relationships.HAS_MANY) {
173
+ selectColumns.push(dataFieldKey);
174
+ }
175
+ // We should check if any select column is a relationship name. If so,
176
+ // we should remove that column name from the select columns
177
+ const possibleThirthLevelRelations = foreignModel.relations.map((item) => item.name);
178
+ // Removing relationship values from the select column list
179
+ selectColumns = selectColumns.filter((column) => !possibleThirthLevelRelations.includes(column));
180
+ // We should check if the column is defined on the table.
181
+ const undefinedColumns = selectColumns.filter((column) => !foreignModel.columnNames.includes(column));
182
+ if (undefinedColumns.length > 0) {
183
+ throw new ApiError_1.default(`Undefined columns: ${undefinedColumns.join(", ")}`);
184
+ }
185
+ }
186
+ // We should add the HAS_ONE relation's foreignKeys incase the developer
187
+ // wants the related data but didn't set the foreignKey column
188
+ if (selectColumns.length > 0 && selectColumns[0] !== "*") {
189
+ const requiredForeignKeys = foreignModel.relations
190
+ .filter((item) => item.type === Enums_1.Relationships.HAS_ONE)
191
+ .map((item) => item.foreignKey);
192
+ selectColumns.push(...requiredForeignKeys);
193
+ }
194
+ selectColumns = uniqueByMap(selectColumns);
195
+ // Fetching related records by foreignKey and primary key values.
196
+ let relatedRecords = yield database(foreignModel.instance.table)
197
+ .select(selectColumns)
198
+ .whereIn(searchFieldKey, parentPrimaryKeyValues);
199
+ // We should serialize related data if there is any serialization function
200
+ relatedRecords = yield (0, exports.serializeData)(relatedRecords, foreignModel.instance.serialize, handler, request);
201
+ // We should hide hidden fields if there is any
202
+ (0, exports.filterHiddenFields)(relatedRecords, foreignModel.instance.hiddens);
203
+ // We should try to get child data if there is any on the query
204
+ if (clientQuery.children.length > 0) {
205
+ yield (0, exports.getRelatedData)(relatedRecords, clientQuery.children, foreignModel, modelList, database, handler, request);
206
+ }
207
+ // Binding relation data to the parent rows.
208
+ data.forEach((row) => {
209
+ let values = relatedRecords.filter((item) => item[searchFieldKey] === row[dataFieldKey]);
210
+ if (definedRelation.type === Enums_1.Relationships.HAS_ONE) {
211
+ values = values.length > 0 ? values[0] : null;
212
+ }
213
+ row[(0, change_case_1.camelCase)(definedRelation.name)] = values;
214
+ });
215
+ }
216
+ });
217
+ exports.getRelatedData = getRelatedData;
@@ -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,48 @@
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 Enums_1 = require("../Enums");
14
+ const Services_1 = require("../Services");
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, 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
+ yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforePaginate, Object.assign(Object.assign({}, pack), { conditions,
28
+ query }));
29
+ // Users should be able to filter records
30
+ queryParser.applyWheres(query, conditions.q);
31
+ // User should be able to select sorting fields and types
32
+ queryParser.applySorting(query, conditions.sort);
33
+ const result = yield query.paginate({
34
+ perPage: conditions.per_page,
35
+ currentPage: conditions.page,
36
+ isLengthAware: true,
37
+ });
38
+ // We should try to get related data if there is any
39
+ yield (0, Helpers_1.getRelatedData)(result.data, conditions.with, model, modelList, database, Enums_1.HandlerTypes.PAGINATE, req);
40
+ yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onAfterPaginate, Object.assign(Object.assign({}, pack), { conditions,
41
+ result,
42
+ query }));
43
+ // Serializing the data by the model's serialize method
44
+ result.data = yield (0, Helpers_1.serializeData)(result.data, model.instance.serialize, Enums_1.HandlerTypes.PAGINATE, req);
45
+ // Filtering hidden fields from the response data.
46
+ (0, Helpers_1.filterHiddenFields)(result.data, model.instance.hiddens);
47
+ return pack.res.json(result);
48
+ });
@@ -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,62 @@
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 validatorjs_1 = __importDefault(require("validatorjs"));
16
+ const Helpers_1 = require("./Helpers");
17
+ const Enums_1 = require("../Enums");
18
+ const ApiError_1 = __importDefault(require("../Exceptions/ApiError"));
19
+ exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
20
+ const { model, req, res, database, relation, parentModel } = pack;
21
+ const query = database.from(model.instance.table);
22
+ // If there is a relation, we should bind it
23
+ (0, Helpers_1.addForeignKeyQuery)(req, query, relation, parentModel);
24
+ yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforeUpdateQuery, Object.assign(Object.assign({}, pack), { query }));
25
+ let item = yield query
26
+ .where(model.instance.primaryKey, req.params[model.instance.primaryKey])
27
+ .first();
28
+ if (!item) {
29
+ throw new ApiError_1.default(`The item is not found on ${model.name}.`);
30
+ }
31
+ yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onAfterUpdateQuery, Object.assign(Object.assign({}, pack), { item,
32
+ query }));
33
+ const requestMethod = req.method;
34
+ const fillables = model.instance.getFillableFields(requestMethod);
35
+ const formData = Object.assign(Object.assign({}, item), (0, Helpers_1.getMergedFormData)(req, fillables));
36
+ const validationRules = model.instance.getValidationRules(requestMethod);
37
+ if (validationRules) {
38
+ const validation = new validatorjs_1.default(formData, validationRules);
39
+ if (validation.fails()) {
40
+ return res.status(400).json(validation.errors);
41
+ }
42
+ }
43
+ // We should bind the timestamp values
44
+ (0, Helpers_1.bindTimestampValues)(formData, [Enums_1.TimestampColumns.UPDATED_AT], model);
45
+ yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforeUpdate, Object.assign(Object.assign({}, pack), { item,
46
+ formData,
47
+ query }));
48
+ yield query
49
+ .where(model.instance.primaryKey, item[model.instance.primaryKey])
50
+ .update(formData);
51
+ item = yield database(model.instance.table)
52
+ .where(model.instance.primaryKey, item[model.instance.primaryKey])
53
+ .first();
54
+ yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onAfterUpdate, Object.assign(Object.assign({}, pack), { item,
55
+ formData,
56
+ query }));
57
+ // Serializing the data by the model's serialize method
58
+ item = yield (0, Helpers_1.serializeData)(item, model.instance.serialize, Enums_1.HandlerTypes.PATCH, req);
59
+ // Filtering hidden fields from the response data.
60
+ (0, Helpers_1.filterHiddenFields)([item], model.instance.hiddens);
61
+ return res.json(item);
62
+ });
@@ -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,51 @@
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
+ const Services_1 = require("../Services");
19
+ exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
20
+ const modelList = yield Services_1.IoCService.useByType("ModelListService");
21
+ const { model, req, res, database, relation, parentModel } = pack;
22
+ const queryParser = new Services_1.QueryService(model, modelList.get());
23
+ // We should parse URL query string to use as condition in Lucid query
24
+ const conditions = queryParser.get(req.query);
25
+ // Fetching item
26
+ const query = database.from(model.instance.table);
27
+ // Users should be able to select some fields to show.
28
+ queryParser.applyFields(query, conditions.fields);
29
+ // If there is a relation, we should bind it
30
+ (0, Helpers_1.addForeignKeyQuery)(req, query, relation, parentModel);
31
+ // We should add this condition in here because of performance.
32
+ query.where(model.instance.primaryKey, req.params[model.instance.primaryKey]);
33
+ yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforeShow, Object.assign(Object.assign({}, pack), { query,
34
+ conditions }));
35
+ // Users should be able to filter records
36
+ queryParser.applyWheres(query, conditions.q);
37
+ let item = yield query.first();
38
+ if (!item) {
39
+ throw new ApiError_1.default(`The item is not found on ${model.name}.`);
40
+ }
41
+ // We should try to get related data if there is any
42
+ yield (0, Helpers_1.getRelatedData)([item], conditions.with, model, modelList, database, Enums_1.HandlerTypes.ALL, req);
43
+ yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onAfterShow, Object.assign(Object.assign({}, pack), { query,
44
+ conditions,
45
+ item }));
46
+ // Serializing the data by the model's serialize method
47
+ item = yield (0, Helpers_1.serializeData)(item, model.instance.serialize, Enums_1.HandlerTypes.SHOW, req);
48
+ // Filtering hidden fields from the response data.
49
+ (0, Helpers_1.filterHiddenFields)([item], model.instance.hiddens);
50
+ return res.json(item);
51
+ });
@@ -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,59 @@
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 validatorjs_1 = __importDefault(require("validatorjs"));
16
+ const Helpers_1 = require("./Helpers");
17
+ const Enums_1 = require("../Enums");
18
+ exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
19
+ const { model, req, res, database, relation, parentModel } = pack;
20
+ const requestMethod = req.method;
21
+ const fillables = model.instance.getFillableFields(requestMethod);
22
+ const formData = (0, Helpers_1.getMergedFormData)(req, fillables);
23
+ const validationRules = model.instance.getValidationRules(requestMethod);
24
+ if (validationRules) {
25
+ const validation = new validatorjs_1.default(formData, validationRules);
26
+ if (validation.fails()) {
27
+ return res.status(400).json(validation.errors);
28
+ }
29
+ }
30
+ if (relation && parentModel) {
31
+ const parentColumn = (0, Helpers_1.getParentColumn)(relation);
32
+ if (parentColumn) {
33
+ formData[relation.foreignKey] = req.params[parentColumn];
34
+ }
35
+ }
36
+ // We should bind the timestamp values
37
+ (0, Helpers_1.bindTimestampValues)(formData, [Enums_1.TimestampColumns.CREATED_AT, Enums_1.TimestampColumns.UPDATED_AT], model);
38
+ yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforeInsert, Object.assign(Object.assign({}, pack), { formData }));
39
+ const [returningResult] = yield database(model.instance.table)
40
+ .insert(formData)
41
+ .returning(model.instance.primaryKey);
42
+ let insertedPrimaryKeyValue = typeof returningResult === "number"
43
+ ? returningResult
44
+ : returningResult[model.instance.primaryKey];
45
+ // If the user use a special primary key value, we should use that value
46
+ if (insertedPrimaryKeyValue === 0) {
47
+ insertedPrimaryKeyValue = formData[model.instance.primaryKey];
48
+ }
49
+ let item = yield database(model.instance.table)
50
+ .where(model.instance.primaryKey, insertedPrimaryKeyValue)
51
+ .first();
52
+ yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onAfterInsert, Object.assign(Object.assign({}, pack), { formData,
53
+ item }));
54
+ // Serializing the data by the model's serialize method
55
+ item = yield (0, Helpers_1.serializeData)(item, model.instance.serialize, Enums_1.HandlerTypes.INSERT, req);
56
+ // Filtering hidden fields from the response data.
57
+ (0, Helpers_1.filterHiddenFields)([item], model.instance.hiddens);
58
+ return res.json(item);
59
+ });
@@ -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,62 @@
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 validatorjs_1 = __importDefault(require("validatorjs"));
16
+ const Helpers_1 = require("./Helpers");
17
+ const Enums_1 = require("../Enums");
18
+ const ApiError_1 = __importDefault(require("../Exceptions/ApiError"));
19
+ exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
20
+ const { model, req, res, database, relation, parentModel } = pack;
21
+ const query = database.from(model.instance.table);
22
+ // If there is a relation, we should bind it
23
+ (0, Helpers_1.addForeignKeyQuery)(req, query, relation, parentModel);
24
+ yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforeUpdateQuery, Object.assign(Object.assign({}, pack), { query }));
25
+ let item = yield query
26
+ .where(model.instance.primaryKey, req.params[model.instance.primaryKey])
27
+ .first();
28
+ if (!item) {
29
+ throw new ApiError_1.default(`The item is not found on ${model.name}.`);
30
+ }
31
+ yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onAfterUpdateQuery, Object.assign(Object.assign({}, pack), { item,
32
+ query }));
33
+ const requestMethod = req.method;
34
+ const fillables = model.instance.getFillableFields(requestMethod);
35
+ const formData = (0, Helpers_1.getMergedFormData)(req, fillables);
36
+ const validationRules = model.instance.getValidationRules(requestMethod);
37
+ if (validationRules) {
38
+ const validation = new validatorjs_1.default(formData, validationRules);
39
+ if (validation.fails()) {
40
+ return res.status(400).json(validation.errors);
41
+ }
42
+ }
43
+ // We should bind the timestamp values
44
+ (0, Helpers_1.bindTimestampValues)(formData, [Enums_1.TimestampColumns.UPDATED_AT], model);
45
+ yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforeUpdate, Object.assign(Object.assign({}, pack), { item,
46
+ formData,
47
+ query }));
48
+ yield query
49
+ .where(model.instance.primaryKey, item[model.instance.primaryKey])
50
+ .update(formData);
51
+ item = yield database(model.instance.table)
52
+ .where(model.instance.primaryKey, item[model.instance.primaryKey])
53
+ .first();
54
+ yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onAfterUpdate, Object.assign(Object.assign({}, pack), { item,
55
+ formData,
56
+ query }));
57
+ // Serializing the data by the model's serialize method
58
+ item = yield (0, Helpers_1.serializeData)(item, model.instance.serialize, Enums_1.HandlerTypes.UPDATE, req);
59
+ // Filtering hidden fields from the response data.
60
+ (0, Helpers_1.filterHiddenFields)([item], model.instance.hiddens);
61
+ return res.json(item);
62
+ });