axe-api 0.21.0 → 0.30.0-rc1

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 (151) hide show
  1. package/build/dev-kit/app/Config/Application.d.ts +3 -0
  2. package/build/dev-kit/app/Config/Application.js +14 -0
  3. package/build/dev-kit/app/Config/Database.d.ts +3 -0
  4. package/build/dev-kit/app/Config/Database.js +24 -0
  5. package/build/dev-kit/app/Events/UserEvent.d.ts +3 -0
  6. package/build/dev-kit/app/Events/UserEvent.js +16 -0
  7. package/build/dev-kit/app/Hooks/CustomerHook.d.ts +3 -0
  8. package/build/dev-kit/app/Hooks/CustomerHook.js +16 -0
  9. package/build/dev-kit/app/Hooks/EmployeeHook.d.ts +2 -0
  10. package/build/dev-kit/app/Hooks/EmployeeHook.js +16 -0
  11. package/build/dev-kit/app/Hooks/UserHook.d.ts +3 -0
  12. package/build/dev-kit/app/Hooks/UserHook.js +17 -0
  13. package/build/dev-kit/app/Models/Customer.d.ts +7 -0
  14. package/build/dev-kit/app/Models/Customer.js +15 -0
  15. package/build/dev-kit/app/Models/Employee.d.ts +9 -0
  16. package/build/dev-kit/app/Models/Employee.js +21 -0
  17. package/build/dev-kit/app/Models/EmployeeAddress.d.ts +8 -0
  18. package/build/dev-kit/app/Models/EmployeeAddress.js +18 -0
  19. package/build/dev-kit/app/Models/Post.d.ts +6 -0
  20. package/build/dev-kit/app/Models/Post.js +14 -0
  21. package/build/dev-kit/app/Models/User.d.ts +7 -0
  22. package/build/dev-kit/app/Models/User.js +23 -0
  23. package/build/dev-kit/app/Serialization/UserSerialization.d.ts +3 -0
  24. package/build/dev-kit/app/Serialization/UserSerialization.js +6 -0
  25. package/build/dev-kit/app/config.d.ts +3 -0
  26. package/build/dev-kit/app/config.js +31 -0
  27. package/build/dev-kit/app/init.d.ts +4 -0
  28. package/build/dev-kit/app/init.js +16 -0
  29. package/build/dev-kit/app/v1/Events/UserEvent.d.ts +3 -0
  30. package/build/dev-kit/app/v1/Events/UserEvent.js +16 -0
  31. package/build/dev-kit/app/v1/Hooks/CustomerHook.d.ts +3 -0
  32. package/build/dev-kit/app/v1/Hooks/CustomerHook.js +16 -0
  33. package/build/dev-kit/app/v1/Hooks/EmployeeHook.d.ts +2 -0
  34. package/build/dev-kit/app/v1/Hooks/EmployeeHook.js +16 -0
  35. package/build/dev-kit/app/v1/Hooks/UserHook.d.ts +3 -0
  36. package/build/dev-kit/app/v1/Hooks/UserHook.js +17 -0
  37. package/build/dev-kit/app/v1/Models/Customer.d.ts +7 -0
  38. package/build/dev-kit/app/v1/Models/Customer.js +15 -0
  39. package/build/dev-kit/app/v1/Models/Employee.d.ts +9 -0
  40. package/build/dev-kit/app/v1/Models/Employee.js +21 -0
  41. package/build/dev-kit/app/v1/Models/EmployeeAddress.d.ts +8 -0
  42. package/build/dev-kit/app/v1/Models/EmployeeAddress.js +18 -0
  43. package/build/dev-kit/app/v1/Models/Post.d.ts +6 -0
  44. package/build/dev-kit/app/v1/Models/Post.js +14 -0
  45. package/build/dev-kit/app/v1/Models/User.d.ts +7 -0
  46. package/build/dev-kit/app/v1/Models/User.js +23 -0
  47. package/build/dev-kit/app/v1/Serialization/PostSerialization.d.ts +3 -0
  48. package/build/dev-kit/app/v1/Serialization/PostSerialization.js +6 -0
  49. package/build/dev-kit/app/v1/Serialization/UserSerialization.d.ts +3 -0
  50. package/build/dev-kit/app/v1/Serialization/UserSerialization.js +5 -0
  51. package/build/dev-kit/app/v1/config.d.ts +3 -0
  52. package/build/dev-kit/app/v1/config.js +19 -0
  53. package/build/dev-kit/app/v1/init.d.ts +4 -0
  54. package/build/dev-kit/app/v1/init.js +16 -0
  55. package/build/dev-kit/app/v2/Events/UserEvent.d.ts +3 -0
  56. package/build/dev-kit/app/v2/Events/UserEvent.js +16 -0
  57. package/build/dev-kit/app/v2/Hooks/CustomerHook.d.ts +3 -0
  58. package/build/dev-kit/app/v2/Hooks/CustomerHook.js +16 -0
  59. package/build/dev-kit/app/v2/Hooks/EmployeeHook.d.ts +2 -0
  60. package/build/dev-kit/app/v2/Hooks/EmployeeHook.js +16 -0
  61. package/build/dev-kit/app/v2/Hooks/UserHook.d.ts +3 -0
  62. package/build/dev-kit/app/v2/Hooks/UserHook.js +17 -0
  63. package/build/dev-kit/app/v2/Models/Customer.d.ts +10 -0
  64. package/build/dev-kit/app/v2/Models/Customer.js +20 -0
  65. package/build/dev-kit/app/v2/Models/Employee.d.ts +9 -0
  66. package/build/dev-kit/app/v2/Models/Employee.js +21 -0
  67. package/build/dev-kit/app/v2/Models/EmployeeAddress.d.ts +8 -0
  68. package/build/dev-kit/app/v2/Models/EmployeeAddress.js +18 -0
  69. package/build/dev-kit/app/v2/Models/Post.d.ts +6 -0
  70. package/build/dev-kit/app/v2/Models/Post.js +14 -0
  71. package/build/dev-kit/app/v2/Models/User.d.ts +7 -0
  72. package/build/dev-kit/app/v2/Models/User.js +23 -0
  73. package/build/dev-kit/app/v2/Serialization/UserSerialization.d.ts +3 -0
  74. package/build/dev-kit/app/v2/Serialization/UserSerialization.js +5 -0
  75. package/build/dev-kit/app/v2/config.d.ts +3 -0
  76. package/build/dev-kit/app/v2/config.js +9 -0
  77. package/build/dev-kit/app/v2/init.d.ts +4 -0
  78. package/build/dev-kit/app/v2/init.js +16 -0
  79. package/build/dev-kit/app/v3/config.d.ts +3 -0
  80. package/build/dev-kit/app/v3/config.js +9 -0
  81. package/build/dev-kit/config.d.ts +3 -0
  82. package/build/dev-kit/config.js +31 -0
  83. package/build/dev-kit.d.ts +1 -0
  84. package/build/dev-kit.js +16 -0
  85. package/build/package.json +67 -0
  86. package/build/src/Builders/ModelTreeBuilder.d.ts +3 -0
  87. package/build/src/Builders/ModelTreeBuilder.js +21 -17
  88. package/build/src/Builders/RouterBuilder.d.ts +3 -0
  89. package/build/src/Builders/RouterBuilder.js +31 -26
  90. package/build/src/Enums.d.ts +13 -0
  91. package/build/src/Enums.js +15 -1
  92. package/build/src/Exceptions/AxeError.d.ts +8 -0
  93. package/build/src/Exceptions/AxeError.js +11 -0
  94. package/build/src/Handlers/AllHandler.js +6 -5
  95. package/build/src/Handlers/DestroyHandler.js +11 -1
  96. package/build/src/Handlers/DocsHandler.d.ts +3 -0
  97. package/build/src/Handlers/DocsHandler.js +22 -0
  98. package/build/src/Handlers/ForceDestroyHandler.d.ts +3 -0
  99. package/build/src/Handlers/ForceDestroyHandler.js +41 -0
  100. package/build/src/Handlers/HandlerFactory.d.ts +1 -1
  101. package/build/src/Handlers/HandlerFactory.js +4 -1
  102. package/build/src/Handlers/Helpers.d.ts +5 -3
  103. package/build/src/Handlers/Helpers.js +24 -14
  104. package/build/src/Handlers/PaginateHandler.js +6 -5
  105. package/build/src/Handlers/PatchHandler.js +4 -2
  106. package/build/src/Handlers/RoutesHandler.d.ts +3 -0
  107. package/build/src/Handlers/RoutesHandler.js +16 -0
  108. package/build/src/Handlers/ShowHandler.js +6 -5
  109. package/build/src/Handlers/StoreHandler.js +2 -2
  110. package/build/src/Handlers/UpdateHandler.js +4 -2
  111. package/build/src/Helpers.d.ts +4 -0
  112. package/build/src/Helpers.js +78 -0
  113. package/build/src/Interfaces.d.ts +36 -11
  114. package/build/src/Middlewares/acceptLanguageMiddleware.js +3 -5
  115. package/build/src/Model.d.ts +1 -1
  116. package/build/src/Model.js +3 -4
  117. package/build/src/Resolvers/FolderResolver.js +1 -0
  118. package/build/src/Resolvers/GeneralHookResolver.d.ts +4 -2
  119. package/build/src/Resolvers/GeneralHookResolver.js +5 -8
  120. package/build/src/Resolvers/ModelResolver.d.ts +4 -0
  121. package/build/src/Resolvers/ModelResolver.js +26 -8
  122. package/build/src/Resolvers/TransactionResolver.d.ts +4 -2
  123. package/build/src/Resolvers/TransactionResolver.js +5 -4
  124. package/build/src/Resolvers/VersionConfigResolver.d.ts +7 -0
  125. package/build/src/Resolvers/VersionConfigResolver.js +58 -0
  126. package/build/src/Resolvers/VersionResolver.d.ts +7 -0
  127. package/build/src/Resolvers/VersionResolver.js +65 -0
  128. package/build/src/Resolvers/index.d.ts +3 -2
  129. package/build/src/Resolvers/index.js +5 -3
  130. package/build/src/Server.d.ts +3 -2
  131. package/build/src/Server.js +73 -46
  132. package/build/src/Services/APIService.d.ts +16 -0
  133. package/build/src/Services/APIService.js +79 -0
  134. package/build/src/Services/DocumentationService.d.ts +3 -1
  135. package/build/src/Services/DocumentationService.js +6 -0
  136. package/build/src/Services/LogService.d.ts +4 -1
  137. package/build/src/Services/LogService.js +6 -0
  138. package/build/src/Services/ModelService.d.ts +3 -0
  139. package/build/src/Services/ModelService.js +4 -0
  140. package/build/src/Services/QueryService.js +3 -0
  141. package/build/src/Services/SchemaValidatorService.d.ts +3 -0
  142. package/build/src/Services/SchemaValidatorService.js +15 -8
  143. package/build/src/Services/index.d.ts +2 -1
  144. package/build/src/Services/index.js +3 -1
  145. package/build/src/Types.d.ts +2 -0
  146. package/build/src/Types.js +2 -0
  147. package/build/src/constants.d.ts +1 -0
  148. package/build/src/constants.js +2 -1
  149. package/package.json +2 -1
  150. package/readme.md +0 -24
  151. package/CHANGELOG.md +0 -202
@@ -17,13 +17,14 @@ const Enums_1 = require("../Enums");
17
17
  const ApiError_1 = __importDefault(require("../Exceptions/ApiError"));
18
18
  const Services_1 = require("../Services");
19
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());
20
+ const { version, model, req, res, database, relation, parentModel } = pack;
21
+ const queryParser = new Services_1.QueryService(model, version.modelList.get());
23
22
  // We should parse URL query string to use as condition in Lucid query
24
23
  const conditions = queryParser.get(req.query);
25
24
  // Fetching item
26
25
  const query = database.from(model.instance.table);
26
+ // If there is a deletedAtColumn, it means that this table support soft-delete
27
+ (0, Helpers_1.addSoftDeleteQuery)(model, conditions, query);
27
28
  // Users should be able to select some fields to show.
28
29
  queryParser.applyFields(query, conditions.fields);
29
30
  // If there is a relation, we should bind it
@@ -39,12 +40,12 @@ exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
39
40
  throw new ApiError_1.default(`The item is not found on ${model.name}.`);
40
41
  }
41
42
  // 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.getRelatedData)(version, [item], conditions.with, model, version.modelList, database, Enums_1.HandlerTypes.ALL, req);
43
44
  yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onAfterShow, Object.assign(Object.assign({}, pack), { query,
44
45
  conditions,
45
46
  item }));
46
47
  // 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
+ item = yield (0, Helpers_1.serializeData)(version, item, model.serialize, Enums_1.HandlerTypes.SHOW, req);
48
49
  // Filtering hidden fields from the response data.
49
50
  (0, Helpers_1.filterHiddenFields)([item], model.instance.hiddens);
50
51
  return res.json(item);
@@ -16,7 +16,7 @@ const validatorjs_1 = __importDefault(require("validatorjs"));
16
16
  const Helpers_1 = require("./Helpers");
17
17
  const Enums_1 = require("../Enums");
18
18
  exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
19
- const { model, req, res, database, relation, parentModel } = pack;
19
+ const { version, model, req, res, database, relation, parentModel } = pack;
20
20
  const requestMethod = req.method;
21
21
  const fillables = model.instance.getFillableFields(requestMethod);
22
22
  const formData = (0, Helpers_1.getMergedFormData)(req, fillables);
@@ -55,7 +55,7 @@ exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
55
55
  yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onAfterInsert, Object.assign(Object.assign({}, pack), { formData,
56
56
  item }));
57
57
  // Serializing the data by the model's serialize method
58
- item = yield (0, Helpers_1.serializeData)(item, model.instance.serialize, Enums_1.HandlerTypes.INSERT, req);
58
+ item = yield (0, Helpers_1.serializeData)(version, item, model.serialize, Enums_1.HandlerTypes.INSERT, req);
59
59
  // Filtering hidden fields from the response data.
60
60
  (0, Helpers_1.filterHiddenFields)([item], model.instance.hiddens);
61
61
  return res.json(item);
@@ -17,10 +17,12 @@ const Helpers_1 = require("./Helpers");
17
17
  const Enums_1 = require("../Enums");
18
18
  const ApiError_1 = __importDefault(require("../Exceptions/ApiError"));
19
19
  exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
20
- const { model, req, res, database, relation, parentModel } = pack;
20
+ const { version, model, req, res, database, relation, parentModel } = pack;
21
21
  const query = database.from(model.instance.table);
22
22
  // If there is a relation, we should bind it
23
23
  (0, Helpers_1.addForeignKeyQuery)(req, query, relation, parentModel);
24
+ // If there is a deletedAtColumn, it means that this table support soft-delete
25
+ (0, Helpers_1.addSoftDeleteQuery)(model, null, query);
24
26
  yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforeUpdateQuery, Object.assign(Object.assign({}, pack), { query }));
25
27
  let item = yield query
26
28
  .where(model.instance.primaryKey, req.params[model.instance.primaryKey])
@@ -58,7 +60,7 @@ exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
58
60
  formData,
59
61
  query }));
60
62
  // Serializing the data by the model's serialize method
61
- item = yield (0, Helpers_1.serializeData)(item, model.instance.serialize, Enums_1.HandlerTypes.UPDATE, req);
63
+ item = yield (0, Helpers_1.serializeData)(version, item, model.serialize, Enums_1.HandlerTypes.UPDATE, req);
62
64
  // Filtering hidden fields from the response data.
63
65
  (0, Helpers_1.filterHiddenFields)([item], model.instance.hiddens);
64
66
  return res.json(item);
@@ -0,0 +1,4 @@
1
+ import { Request } from "express";
2
+ import { IVersion } from "./Interfaces";
3
+ export declare const getVersionByRequest: (req: Request) => Promise<IVersion>;
4
+ export declare const consoleAxeError: (error: any) => void;
@@ -0,0 +1,78 @@
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.consoleAxeError = exports.getVersionByRequest = void 0;
16
+ const chalk_1 = __importDefault(require("chalk"));
17
+ const change_case_1 = require("change-case");
18
+ const Services_1 = require("./Services");
19
+ const getVersionByRequest = (req) => __awaiter(void 0, void 0, void 0, function* () {
20
+ // Application configuration is need for the default setting.
21
+ const api = Services_1.APIService.getInstance();
22
+ const matchedVersion = api.versions.find((version) => {
23
+ const path = `/${api.config.prefix}/${version.name}`;
24
+ return req.path.indexOf(path) === 0;
25
+ });
26
+ if (!matchedVersion) {
27
+ throw new Error(`Version is not matched: ${req.path}`);
28
+ }
29
+ return matchedVersion;
30
+ });
31
+ exports.getVersionByRequest = getVersionByRequest;
32
+ const consoleAxeError = (error) => {
33
+ const putWithSpace = (text, max) => {
34
+ const diff = max - text.length + 3;
35
+ for (let index = 0; index <= diff; index++) {
36
+ text = `${text} `;
37
+ }
38
+ text = ` ${text}`;
39
+ if (text.length > 77) {
40
+ let lines = [];
41
+ text = text.trim();
42
+ for (let step = 0; step < text.length / 70; step++) {
43
+ lines.push(text.substring(0, 70));
44
+ text = text.substring(70);
45
+ }
46
+ lines.push(text);
47
+ lines = lines.map((line) => putWithSpace(line, max));
48
+ return lines.flat();
49
+ }
50
+ return [text];
51
+ };
52
+ const getMaxLength = (code, message) => {
53
+ let maxLength = message.length;
54
+ if (code.length > message.length) {
55
+ maxLength = code.length;
56
+ }
57
+ if (maxLength > 70) {
58
+ maxLength = 70;
59
+ }
60
+ return maxLength;
61
+ };
62
+ const maxLength = getMaxLength(error.code, error.message);
63
+ const messages = [
64
+ "\n",
65
+ ...putWithSpace(" ", maxLength),
66
+ ...putWithSpace(`[${error.code}]`, maxLength),
67
+ ...putWithSpace(" ", maxLength),
68
+ ...putWithSpace(error.message, maxLength),
69
+ ...putWithSpace(" ", maxLength),
70
+ ];
71
+ console.log(chalk_1.default.bgRed.white(messages.join("\n")));
72
+ console.log(chalk_1.default.cyan([
73
+ "\n",
74
+ "You can find more in the documentation;",
75
+ `https://axe-api.com/errors.html#${(0, change_case_1.paramCase)(error.code)}`,
76
+ ].join("\n")));
77
+ };
78
+ exports.consoleAxeError = consoleAxeError;
@@ -3,6 +3,8 @@ import { Express, Request, Response, NextFunction } from "express";
3
3
  import { Column } from "knex-schema-inspector/lib/types/column";
4
4
  import { HandlerTypes, LogLevels, HttpMethods, HookFunctionTypes, Extensions, Relationships, SortTypes, ConditionTypes, DependencyTypes } from "./Enums";
5
5
  import Model from "./Model";
6
+ import { SerializationFunction } from "./Types";
7
+ import { ModelListService } from "./Services";
6
8
  export interface IColumn extends Column {
7
9
  table_name: string;
8
10
  }
@@ -16,15 +18,18 @@ interface IHandlerBasedSerializer {
16
18
  handler: HandlerTypes[];
17
19
  serializer: ((data: any, request: Request) => void)[];
18
20
  }
21
+ export interface IVersionConfig {
22
+ transaction: boolean | IHandlerBasedTransactionConfig | IHandlerBasedTransactionConfig[];
23
+ serializers: ((data: any, request: Request) => void)[] | IHandlerBasedSerializer[];
24
+ supportedLanguages: string[];
25
+ defaultLanguage: string;
26
+ }
19
27
  export interface IApplicationConfig extends IConfig {
20
28
  env: string;
21
29
  port: number;
22
30
  logLevel: LogLevels;
23
31
  prefix: string;
24
- transaction: boolean | IHandlerBasedTransactionConfig | IHandlerBasedTransactionConfig[];
25
- serializers: ((data: any, request: Request) => void)[] | IHandlerBasedSerializer[];
26
- supportedLanguages: string[];
27
- defaultLanguage: string;
32
+ database: IDatabaseConfig;
28
33
  }
29
34
  export interface ILanguage {
30
35
  title: string;
@@ -36,13 +41,27 @@ export interface IAcceptedLanguage {
36
41
  quality: number;
37
42
  }
38
43
  export declare type IDatabaseConfig = Knex.Config;
39
- export interface IFolders {
40
- App: string;
41
- Config: string;
42
- Events: string;
43
- Hooks: string;
44
- Middlewares: string;
45
- Models: string;
44
+ export interface IVersionFolder {
45
+ root: string;
46
+ config: string;
47
+ events: string;
48
+ hooks: string;
49
+ middlewares: string;
50
+ models: string;
51
+ serialization: string;
52
+ }
53
+ export interface IVersion {
54
+ name: string;
55
+ config: IVersionConfig;
56
+ folders: IVersionFolder;
57
+ modelList: ModelListService;
58
+ modelTree: IModelService[];
59
+ }
60
+ export interface IAPI {
61
+ rootFolder: string;
62
+ appFolder: string;
63
+ versions: IVersion[];
64
+ config: IApplicationConfig;
46
65
  }
47
66
  export interface IGeneralHooks {
48
67
  onBeforeInit: (app: Express) => void | null;
@@ -85,8 +104,10 @@ export interface IModelService {
85
104
  events: Record<HookFunctionTypes, (params: IHookParameter) => void>;
86
105
  isRecursive: boolean;
87
106
  children: IModelService[];
107
+ serialize: SerializationFunction | null;
88
108
  setColumns(columns: IColumn[]): void;
89
109
  setExtensions(type: Extensions, hookFunctionType: HookFunctionTypes, data: (params: IHookParameter) => void): void;
110
+ setSerialization(callback: SerializationFunction): void;
90
111
  }
91
112
  export interface IRelation {
92
113
  type: Relationships;
@@ -96,6 +117,8 @@ export interface IRelation {
96
117
  foreignKey: string;
97
118
  }
98
119
  export interface IRequestPack {
120
+ api: IAPI;
121
+ version: IVersion;
99
122
  req: Request;
100
123
  res: Response;
101
124
  handlerType: HandlerTypes;
@@ -120,6 +143,7 @@ export interface IRawQuery {
120
143
  sort: string | null;
121
144
  fields: string | null;
122
145
  with: string | null;
146
+ trashed: string | null;
123
147
  }
124
148
  export interface ISortField {
125
149
  name: string;
@@ -138,6 +162,7 @@ export interface IQuery {
138
162
  sort: ISortField[];
139
163
  fields: string[];
140
164
  with: IWith[];
165
+ trashed: boolean;
141
166
  }
142
167
  export interface IWhere {
143
168
  prefix: string | null;
@@ -9,15 +9,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- const Services_1 = require("../Services");
13
12
  const Resolvers_1 = require("../Resolvers");
13
+ const Helpers_1 = require("../Helpers");
14
14
  exports.default = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
15
15
  // Application configuration is need for the default setting.
16
- const configs = yield Services_1.IoCService.use("Config");
17
- const application = configs.Application;
18
- const { supportedLanguages, defaultLanguage } = application;
16
+ const version = yield (0, Helpers_1.getVersionByRequest)(req);
19
17
  // Setting the current language by the supported, default and the client prefences
20
- req.currentLanguage = Resolvers_1.AcceptLanguageResolver.resolve(req.get("accept-language") || "", supportedLanguages || ["en"], defaultLanguage || "en");
18
+ req.currentLanguage = Resolvers_1.AcceptLanguageResolver.resolve(req.get("accept-language") || "", version.config.supportedLanguages || ["en"], version.config.defaultLanguage || "en");
21
19
  // Adding the `Content-Language` header to the response object
22
20
  res.setHeader("Content-Language", req.currentLanguage.title);
23
21
  next();
@@ -11,6 +11,7 @@ declare class Model {
11
11
  get hiddens(): string[];
12
12
  get createdAtColumn(): string | null;
13
13
  get updatedAtColumn(): string | null;
14
+ get deletedAtColumn(): string | null;
14
15
  get transaction(): boolean | IHandlerBasedTransactionConfig | IHandlerBasedTransactionConfig[] | null;
15
16
  get ignore(): boolean;
16
17
  getFillableFields(methodType: HttpMethods): string[];
@@ -19,7 +20,6 @@ declare class Model {
19
20
  hasMany(relatedModel: string, primaryKey?: string, foreignKey?: string): IRelation;
20
21
  hasOne(relatedModel: string, primaryKey?: string, foreignKey?: string): IRelation;
21
22
  belongsTo(relatedModel: string, primaryKey: string, foreignKey: string): IRelation;
22
- serialize(data: any, request: Request): any;
23
23
  private hasStringValue;
24
24
  }
25
25
  export default Model;
@@ -35,6 +35,9 @@ class Model {
35
35
  get updatedAtColumn() {
36
36
  return "updated_at";
37
37
  }
38
+ get deletedAtColumn() {
39
+ return null;
40
+ }
38
41
  get transaction() {
39
42
  return null;
40
43
  }
@@ -127,10 +130,6 @@ class Model {
127
130
  belongsTo(relatedModel, primaryKey, foreignKey) {
128
131
  return this.hasOne(relatedModel, foreignKey, primaryKey);
129
132
  }
130
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
131
- serialize(data, request) {
132
- return data;
133
- }
134
133
  hasStringValue() {
135
134
  const tester = this.validations;
136
135
  let status = false;
@@ -13,6 +13,7 @@ class FolderResolver {
13
13
  Hooks: path_1.default.join(appFolder, "app", "Hooks"),
14
14
  Middlewares: path_1.default.join(appFolder, "app", "Middlewares"),
15
15
  Models: path_1.default.join(appFolder, "app", "Models"),
16
+ Serialization: path_1.default.join(appFolder, "app", "Serialization"),
16
17
  };
17
18
  }
18
19
  }
@@ -1,5 +1,7 @@
1
- import { IGeneralHooks } from "../Interfaces";
1
+ import { IGeneralHooks, IVersion } from "../Interfaces";
2
2
  declare class GeneralHookResolver {
3
- static resolve(): Promise<IGeneralHooks>;
3
+ private version;
4
+ constructor(version: IVersion);
5
+ resolve(): Promise<IGeneralHooks>;
4
6
  }
5
7
  export default GeneralHookResolver;
@@ -8,19 +8,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
11
  Object.defineProperty(exports, "__esModule", { value: true });
15
- const path_1 = __importDefault(require("path"));
16
- const Services_1 = require("../Services");
17
12
  const _1 = require(".");
18
13
  class GeneralHookResolver {
19
- static resolve() {
14
+ constructor(version) {
15
+ this.version = version;
16
+ }
17
+ resolve() {
20
18
  return __awaiter(this, void 0, void 0, function* () {
21
- const folders = (yield Services_1.IoCService.use("Folders"));
22
19
  const fileResolver = new _1.FileResolver();
23
- const content = yield fileResolver.resolveContent(path_1.default.join(folders.App, "app"));
20
+ const content = yield fileResolver.resolveContent(this.version.folders.root);
24
21
  if (content && content.init) {
25
22
  const { onBeforeInit = null, onAfterInit = null } = content.init;
26
23
  return { onBeforeInit, onAfterInit };
@@ -1,9 +1,13 @@
1
+ import { IVersion } from "../Interfaces";
1
2
  declare class ModelResolver {
3
+ private version;
4
+ constructor(version: IVersion);
2
5
  resolve(): Promise<void>;
3
6
  private setModelRelations;
4
7
  private getModelList;
5
8
  private setDatabaseColumns;
6
9
  private setModelHooks;
10
+ private setModelSerializations;
7
11
  private getInstanceMethods;
8
12
  }
9
13
  export default ModelResolver;
@@ -16,17 +16,22 @@ const FileResolver_1 = __importDefault(require("./FileResolver"));
16
16
  const Enums_1 = require("../Enums");
17
17
  const Services_1 = require("../Services");
18
18
  const constants_1 = require("../constants");
19
+ const AxeError_1 = __importDefault(require("../Exceptions/AxeError"));
19
20
  class ModelResolver {
21
+ constructor(version) {
22
+ this.version = version;
23
+ }
20
24
  resolve() {
21
25
  return __awaiter(this, void 0, void 0, function* () {
22
- const logger = yield Services_1.IoCService.useByType("LogService");
26
+ const logger = Services_1.LogService.getInstance();
23
27
  const modelList = new Services_1.ModelListService(yield this.getModelList());
24
28
  yield this.setModelRelations(modelList);
25
29
  yield this.setDatabaseColumns(modelList);
26
30
  yield this.setModelHooks(modelList, Enums_1.Extensions.Hooks);
27
31
  yield this.setModelHooks(modelList, Enums_1.Extensions.Events);
28
- Services_1.IoCService.singleton("ModelListService", () => modelList);
29
- logger.info("All models have been resolved.");
32
+ yield this.setModelSerializations(modelList);
33
+ this.version.modelList = modelList;
34
+ logger.info(`[${this.version.name}] All models have been resolved.`);
30
35
  });
31
36
  }
32
37
  setModelRelations(modelList) {
@@ -48,9 +53,8 @@ class ModelResolver {
48
53
  getModelList() {
49
54
  return __awaiter(this, void 0, void 0, function* () {
50
55
  const list = [];
51
- const folders = (yield Services_1.IoCService.use("Folders"));
52
56
  const fileResolver = new FileResolver_1.default();
53
- const models = yield fileResolver.resolve(folders.Models);
57
+ const models = yield fileResolver.resolve(this.version.folders.models);
54
58
  for (const key in models) {
55
59
  list.push(new Services_1.ModelService(key, models[key]));
56
60
  }
@@ -72,7 +76,7 @@ class ModelResolver {
72
76
  for (const model of modelList.get()) {
73
77
  const modelColumns = columns.filter((column) => column.table_name === model.instance.table);
74
78
  if (modelColumns.length === 0) {
75
- throw new Error(`The "${model.instance.table}" table doesn't have any column. Are you sure about the table name?`);
79
+ throw new AxeError_1.default(Enums_1.AxeErrorCode.TABLE_DOESNT_HAVE_ANY_COLUMN, `The "${model.instance.table}" table doesn't have any column.`);
76
80
  }
77
81
  model.setColumns(modelColumns);
78
82
  }
@@ -80,9 +84,10 @@ class ModelResolver {
80
84
  }
81
85
  setModelHooks(modelList, hookType) {
82
86
  return __awaiter(this, void 0, void 0, function* () {
83
- const folders = (yield Services_1.IoCService.use("Folders"));
84
87
  const fileResolver = new FileResolver_1.default();
85
- const folder = hookType === Enums_1.Extensions.Hooks ? folders.Hooks : folders.Events;
88
+ const folder = hookType === Enums_1.Extensions.Hooks
89
+ ? this.version.folders.hooks
90
+ : this.version.folders.events;
86
91
  const hooks = yield fileResolver.resolveContent(folder);
87
92
  for (const model of modelList.get()) {
88
93
  const hookFileName = `${model.name}${hookType
@@ -99,6 +104,19 @@ class ModelResolver {
99
104
  }
100
105
  });
101
106
  }
107
+ setModelSerializations(modelList) {
108
+ return __awaiter(this, void 0, void 0, function* () {
109
+ const fileResolver = new FileResolver_1.default();
110
+ const serializations = yield fileResolver.resolveContent(this.version.folders.serialization);
111
+ for (const model of modelList.get()) {
112
+ const fileName = `${model.name}Serialization`;
113
+ if (serializations[fileName]) {
114
+ const file = serializations[fileName];
115
+ model.setSerialization(file.default);
116
+ }
117
+ }
118
+ });
119
+ }
102
120
  getInstanceMethods(obj) {
103
121
  const properties = Object.getOwnPropertyNames(obj.instance.constructor.prototype);
104
122
  return properties.filter((name) => !constants_1.DEFAULT_METHODS_OF_MODELS.includes(name));
@@ -1,7 +1,9 @@
1
- import { IModelService } from "../Interfaces";
1
+ import { IModelService, IVersion } from "../Interfaces";
2
2
  import { HandlerTypes } from "../Enums";
3
3
  declare class TransactionResolver {
4
- static resolve(model: IModelService, handlerType: HandlerTypes): Promise<boolean>;
4
+ private version;
5
+ constructor(version: IVersion);
6
+ resolve(model: IModelService, handlerType: HandlerTypes): Promise<boolean>;
5
7
  private static resolveTransactionOption;
6
8
  private static getTransactionConfiguration;
7
9
  }
@@ -9,12 +9,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- const Services_1 = require("../Services");
13
12
  class TransactionResolver {
14
- static resolve(model, handlerType) {
13
+ constructor(version) {
14
+ this.version = version;
15
+ }
16
+ resolve(model, handlerType) {
15
17
  return __awaiter(this, void 0, void 0, function* () {
16
- const config = yield Services_1.IoCService.use("Config");
17
- const global = config.Application.transaction;
18
+ const global = this.version.config.transaction;
18
19
  const local = model.instance.transaction;
19
20
  let privilegedOption = false;
20
21
  if (global) {
@@ -0,0 +1,7 @@
1
+ import { IVersion } from "../Interfaces";
2
+ declare class VersionConfigResolver {
3
+ private version;
4
+ constructor(version: IVersion);
5
+ resolve(): Promise<void>;
6
+ }
7
+ export default VersionConfigResolver;
@@ -0,0 +1,58 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ const path_1 = __importDefault(require("path"));
39
+ const fs_1 = __importDefault(require("fs"));
40
+ const AxeError_1 = __importDefault(require("../Exceptions/AxeError"));
41
+ const Enums_1 = require("../Enums");
42
+ class VersionConfigResolver {
43
+ constructor(version) {
44
+ this.version = version;
45
+ }
46
+ resolve() {
47
+ return __awaiter(this, void 0, void 0, function* () {
48
+ const versionConfigFile = path_1.default.join(this.version.folders.root, "config");
49
+ if (!fs_1.default.existsSync(`${versionConfigFile}.ts`) &&
50
+ !fs_1.default.existsSync(`${versionConfigFile}.js`)) {
51
+ throw new AxeError_1.default(Enums_1.AxeErrorCode.VERSION_CONFIG_NOT_FOUND, `The version file not found: ${versionConfigFile}.ts`);
52
+ }
53
+ const { default: content } = yield Promise.resolve().then(() => __importStar(require(versionConfigFile)));
54
+ this.version.config = content;
55
+ });
56
+ }
57
+ }
58
+ exports.default = VersionConfigResolver;
@@ -0,0 +1,7 @@
1
+ declare class VersionResolver {
2
+ resolve(): Promise<void>;
3
+ private getVersions;
4
+ private getDirectories;
5
+ private checkReservedKeys;
6
+ }
7
+ export default VersionResolver;
@@ -0,0 +1,65 @@
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 promises_1 = require("fs/promises");
17
+ const Services_1 = require("../Services");
18
+ const AxeError_1 = __importDefault(require("../Exceptions/AxeError"));
19
+ const Enums_1 = require("../Enums");
20
+ const RESERVED_VERSION_FOLDERS = [
21
+ "Config",
22
+ "Events",
23
+ "Hooks",
24
+ "Models",
25
+ "Serialization",
26
+ ];
27
+ class VersionResolver {
28
+ resolve() {
29
+ return __awaiter(this, void 0, void 0, function* () {
30
+ const logger = Services_1.LogService.getInstance();
31
+ yield this.getVersions();
32
+ logger.info("All API versions have been resolved.");
33
+ });
34
+ }
35
+ getVersions() {
36
+ return __awaiter(this, void 0, void 0, function* () {
37
+ const api = Services_1.APIService.getInstance();
38
+ const versionFolders = yield this.getDirectories(api.appFolder);
39
+ this.checkReservedKeys(versionFolders);
40
+ versionFolders.forEach((version) => {
41
+ const validation = new validatorjs_1.default({ version }, { version: "required|alpha_num" });
42
+ if (validation.fails()) {
43
+ const { version: versionError } = validation.errors.errors;
44
+ const [message] = versionError;
45
+ throw new AxeError_1.default(Enums_1.AxeErrorCode.UNACCEPTABLE_VERSION_NAME, `${message} ("${version}")`);
46
+ }
47
+ api.addVersion(version);
48
+ });
49
+ });
50
+ }
51
+ getDirectories(source) {
52
+ return __awaiter(this, void 0, void 0, function* () {
53
+ return (yield (0, promises_1.readdir)(source, { withFileTypes: true }))
54
+ .filter((dirent) => dirent.isDirectory())
55
+ .map((dirent) => dirent.name);
56
+ });
57
+ }
58
+ checkReservedKeys(names) {
59
+ const reservedName = names.find((name) => RESERVED_VERSION_FOLDERS.includes(name));
60
+ if (reservedName) {
61
+ throw new AxeError_1.default(Enums_1.AxeErrorCode.RESERVED_VERSION_NAME, `You can not use a reserved name in the app directory: ${reservedName}`);
62
+ }
63
+ }
64
+ }
65
+ exports.default = VersionResolver;
@@ -1,8 +1,9 @@
1
1
  import AcceptLanguageResolver from "./AcceptLanguageResolver";
2
2
  import FileResolver from "./FileResolver";
3
- import FolderResolver from "./FolderResolver";
4
3
  import GeneralHookResolver from "./GeneralHookResolver";
5
4
  import ModelResolver from "./ModelResolver";
6
5
  import TransactionResolver from "./TransactionResolver";
6
+ import VersionConfigResolver from "./VersionConfigResolver";
7
+ import VersionResolver from "./VersionResolver";
7
8
  import WithQueryResolver from "./WithQueryResolver";
8
- export { AcceptLanguageResolver, FileResolver, FolderResolver, GeneralHookResolver, ModelResolver, TransactionResolver, WithQueryResolver, };
9
+ export { AcceptLanguageResolver, FileResolver, GeneralHookResolver, ModelResolver, TransactionResolver, VersionConfigResolver, VersionResolver, WithQueryResolver, };