web_api_base 5.0.0 → 5.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/Application.d.ts +28 -0
  2. package/dist/Application.js +626 -0
  3. package/dist/Application.js.map +1 -0
  4. package/dist/ApplicationConfiguration.d.ts +20 -0
  5. package/dist/ApplicationConfiguration.js +132 -0
  6. package/dist/ApplicationConfiguration.js.map +1 -0
  7. package/dist/File/AbstractFileService.d.ts +11 -0
  8. package/dist/File/AbstractFileService.js +6 -0
  9. package/dist/File/AbstractFileService.js.map +1 -0
  10. package/dist/File/AbstractMultiPartRequestService.d.ts +16 -0
  11. package/dist/File/AbstractMultiPartRequestService.js +12 -0
  12. package/dist/File/AbstractMultiPartRequestService.js.map +1 -0
  13. package/dist/File/File.d.ts +5 -0
  14. package/dist/File/File.js +10 -0
  15. package/dist/File/File.js.map +1 -0
  16. package/dist/File/FileService.d.ts +12 -0
  17. package/dist/File/FileService.js +136 -0
  18. package/dist/File/FileService.js.map +1 -0
  19. package/dist/File/FormidableMultiPartRequestService.d.ts +4 -0
  20. package/dist/File/FormidableMultiPartRequestService.js +73 -0
  21. package/dist/File/FormidableMultiPartRequestService.js.map +1 -0
  22. package/dist/bin/CreateApplication.d.ts +1 -0
  23. package/dist/bin/CreateApplication.js +41 -0
  24. package/dist/bin/CreateApplication.js.map +1 -0
  25. package/dist/bin/CreateController.d.ts +1 -0
  26. package/dist/bin/CreateController.js +42 -0
  27. package/dist/bin/CreateController.js.map +1 -0
  28. package/dist/controllers/AcceptedResult.d.ts +4 -0
  29. package/dist/controllers/AcceptedResult.js +13 -0
  30. package/dist/controllers/AcceptedResult.js.map +1 -0
  31. package/dist/controllers/ActionResult.d.ts +5 -0
  32. package/dist/controllers/ActionResult.js +10 -0
  33. package/dist/controllers/ActionResult.js.map +1 -0
  34. package/dist/controllers/BadRequestResult.d.ts +4 -0
  35. package/dist/controllers/BadRequestResult.js +13 -0
  36. package/dist/controllers/BadRequestResult.js.map +1 -0
  37. package/dist/controllers/CreatedResult.d.ts +4 -0
  38. package/dist/controllers/CreatedResult.js +13 -0
  39. package/dist/controllers/CreatedResult.js.map +1 -0
  40. package/dist/controllers/ErrorResult.d.ts +4 -0
  41. package/dist/controllers/ErrorResult.js +13 -0
  42. package/dist/controllers/ErrorResult.js.map +1 -0
  43. package/dist/controllers/ForbiddenResult.d.ts +4 -0
  44. package/dist/controllers/ForbiddenResult.js +13 -0
  45. package/dist/controllers/ForbiddenResult.js.map +1 -0
  46. package/dist/controllers/GenericResult.d.ts +5 -0
  47. package/dist/controllers/GenericResult.js +13 -0
  48. package/dist/controllers/GenericResult.js.map +1 -0
  49. package/dist/controllers/NoContentResult.d.ts +4 -0
  50. package/dist/controllers/NoContentResult.js +13 -0
  51. package/dist/controllers/NoContentResult.js.map +1 -0
  52. package/dist/controllers/NotFoundResult.d.ts +4 -0
  53. package/dist/controllers/NotFoundResult.js +13 -0
  54. package/dist/controllers/NotFoundResult.js.map +1 -0
  55. package/dist/controllers/OKResult.d.ts +4 -0
  56. package/dist/controllers/OKResult.js +13 -0
  57. package/dist/controllers/OKResult.js.map +1 -0
  58. package/dist/controllers/UnauthorizedResult.d.ts +4 -0
  59. package/dist/controllers/UnauthorizedResult.js +13 -0
  60. package/dist/controllers/UnauthorizedResult.js.map +1 -0
  61. package/dist/controllers/base/ControllerBase.d.ts +28 -0
  62. package/dist/controllers/base/ControllerBase.js +65 -0
  63. package/dist/controllers/base/ControllerBase.js.map +1 -0
  64. package/dist/decorators/controllers/ControllerDecorators.d.ts +68 -0
  65. package/dist/decorators/controllers/ControllerDecorators.js +254 -0
  66. package/dist/decorators/controllers/ControllerDecorators.js.map +1 -0
  67. package/dist/decorators/documentation/DocumentationDecorators.d.ts +17 -0
  68. package/dist/decorators/documentation/DocumentationDecorators.js +39 -0
  69. package/dist/decorators/documentation/DocumentationDecorators.js.map +1 -0
  70. package/dist/decorators/validations/ValidationDecorators.d.ts +53 -0
  71. package/dist/decorators/validations/ValidationDecorators.js +181 -0
  72. package/dist/decorators/validations/ValidationDecorators.js.map +1 -0
  73. package/dist/dependencyInjection/DependecyService.d.ts +28 -0
  74. package/dist/dependencyInjection/DependecyService.js +136 -0
  75. package/dist/dependencyInjection/DependecyService.js.map +1 -0
  76. package/dist/dependencyInjection/IDIContext.d.ts +7 -0
  77. package/dist/dependencyInjection/IDIContext.js +3 -0
  78. package/dist/dependencyInjection/IDIContext.js.map +1 -0
  79. package/dist/documentation/CSS.d.ts +6 -0
  80. package/dist/documentation/CSS.js +302 -0
  81. package/dist/documentation/CSS.js.map +1 -0
  82. package/dist/documentation/Documentation.d.ts +7 -0
  83. package/dist/documentation/Documentation.js +87 -0
  84. package/dist/documentation/Documentation.js.map +1 -0
  85. package/dist/documentation/HTML.d.ts +4 -0
  86. package/dist/documentation/HTML.js +26 -0
  87. package/dist/documentation/HTML.js.map +1 -0
  88. package/dist/documentation/JS.d.ts +5 -0
  89. package/dist/documentation/JS.js +372 -0
  90. package/dist/documentation/JS.js.map +1 -0
  91. package/dist/enums/httpVerbs/HttpVerbs.d.ts +6 -0
  92. package/dist/enums/httpVerbs/HttpVerbs.js +11 -0
  93. package/dist/enums/httpVerbs/HttpVerbs.js.map +1 -0
  94. package/dist/exceptions/ArgumentNullException.d.ts +3 -0
  95. package/dist/exceptions/ArgumentNullException.js +10 -0
  96. package/dist/exceptions/ArgumentNullException.js.map +1 -0
  97. package/dist/exceptions/BodyParseException.d.ts +3 -0
  98. package/dist/exceptions/BodyParseException.js +10 -0
  99. package/dist/exceptions/BodyParseException.js.map +1 -0
  100. package/dist/exceptions/ControllerLoadException.d.ts +3 -0
  101. package/dist/exceptions/ControllerLoadException.js +10 -0
  102. package/dist/exceptions/ControllerLoadException.js.map +1 -0
  103. package/dist/exceptions/DecoratorException.d.ts +3 -0
  104. package/dist/exceptions/DecoratorException.js +10 -0
  105. package/dist/exceptions/DecoratorException.js.map +1 -0
  106. package/dist/exceptions/Exception.d.ts +4 -0
  107. package/dist/exceptions/Exception.js +10 -0
  108. package/dist/exceptions/Exception.js.map +1 -0
  109. package/dist/exceptions/FileNotFoundException.d.ts +3 -0
  110. package/dist/exceptions/FileNotFoundException.js +10 -0
  111. package/dist/exceptions/FileNotFoundException.js.map +1 -0
  112. package/dist/exceptions/FindDependencyException.d.ts +3 -0
  113. package/dist/exceptions/FindDependencyException.js +10 -0
  114. package/dist/exceptions/FindDependencyException.js.map +1 -0
  115. package/dist/exceptions/InvalidEntityException.d.ts +3 -0
  116. package/dist/exceptions/InvalidEntityException.js +10 -0
  117. package/dist/exceptions/InvalidEntityException.js.map +1 -0
  118. package/dist/index.d.ts +71 -0
  119. package/dist/index.js +215 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/interfaces/IApplication.d.ts +13 -0
  122. package/dist/interfaces/IApplication.js +3 -0
  123. package/dist/interfaces/IApplication.js.map +1 -0
  124. package/dist/interfaces/IApplicationConfiguration.d.ts +14 -0
  125. package/dist/interfaces/IApplicationConfiguration.js +3 -0
  126. package/dist/interfaces/IApplicationConfiguration.js.map +1 -0
  127. package/dist/interfaces/IController.d.ts +5 -0
  128. package/dist/interfaces/IController.js +3 -0
  129. package/dist/interfaces/IController.js.map +1 -0
  130. package/dist/metadata/FunctionAnalizer.d.ts +8 -0
  131. package/dist/metadata/FunctionAnalizer.js +23 -0
  132. package/dist/metadata/FunctionAnalizer.js.map +1 -0
  133. package/dist/metadata/OwnMetaDataContainer.d.ts +12 -0
  134. package/dist/metadata/OwnMetaDataContainer.js +33 -0
  135. package/dist/metadata/OwnMetaDataContainer.js.map +1 -0
  136. package/dist/metadata/Type.d.ts +6 -0
  137. package/dist/metadata/Type.js +101 -0
  138. package/dist/metadata/Type.js.map +1 -0
  139. package/dist/midlewares/IMidleware.d.ts +19 -0
  140. package/dist/midlewares/IMidleware.js +3 -0
  141. package/dist/midlewares/IMidleware.js.map +1 -0
  142. package/dist/temp/Application.d.ts +5 -0
  143. package/dist/temp/Application.js +29 -0
  144. package/dist/temp/Application.js.map +1 -0
  145. package/dist/temp/Index.d.ts +1 -0
  146. package/dist/temp/Index.js +19 -0
  147. package/dist/temp/Index.js.map +1 -0
  148. package/dist/temp/controllers/StatusController.d.ts +25 -0
  149. package/dist/temp/controllers/StatusController.js +158 -0
  150. package/dist/temp/controllers/StatusController.js.map +1 -0
  151. package/dist/temp/service/SampleService.d.ts +11 -0
  152. package/dist/temp/service/SampleService.js +24 -0
  153. package/dist/temp/service/SampleService.js.map +1 -0
  154. package/package.json +1 -1
@@ -0,0 +1,28 @@
1
+ import { Express } from "express";
2
+ import IApplication, { ApplicationExceptionHandler } from "./interfaces/IApplication";
3
+ import IApplicationConfiguration from "./interfaces/IApplicationConfiguration";
4
+ import { ControllerBase } from "./controllers/base/ControllerBase";
5
+ import AbstractMultiPartRequestService from "./File/AbstractMultiPartRequestService";
6
+ export default abstract class Application implements IApplication {
7
+ static Configurations: IApplicationConfiguration;
8
+ private _createdControllers;
9
+ private _URIs;
10
+ ApplicationConfiguration: IApplicationConfiguration;
11
+ Express: Express;
12
+ ApplicationThreadExeptionHandler?: ApplicationExceptionHandler;
13
+ constructor();
14
+ StartAsync(): Promise<void>;
15
+ protected UseCors(): void;
16
+ private GetIgnoredPaths;
17
+ private TryFindControllerFolder;
18
+ protected UseControllersAsync(root?: string): Promise<void>;
19
+ protected UseCustomMultiPartRequestHandler<T extends AbstractMultiPartRequestService>(cTor: new (...args: any[]) => T): void;
20
+ protected AppendController<T extends ControllerBase>(ctor: {
21
+ new (...args: any[]): T;
22
+ }): void;
23
+ CreateDocumentation(): void;
24
+ private SendResponseIfNecessary;
25
+ private CastToExpection;
26
+ private CallErrorHandler;
27
+ abstract ConfigureAsync(appConfig: IApplicationConfiguration): Promise<void>;
28
+ }
@@ -0,0 +1,626 @@
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 express_1 = __importDefault(require("express"));
39
+ const ApplicationConfiguration_1 = __importDefault(require("./ApplicationConfiguration"));
40
+ const ControllerDecorators_1 = __importDefault(require("./decorators/controllers/ControllerDecorators"));
41
+ const DependecyService_1 = __importDefault(require("./dependencyInjection/DependecyService"));
42
+ const HttpVerbs_1 = require("./enums/httpVerbs/HttpVerbs");
43
+ const fs_1 = __importDefault(require("fs"));
44
+ const path_1 = __importDefault(require("path"));
45
+ const ValidationDecorators_1 = __importDefault(require("./decorators/validations/ValidationDecorators"));
46
+ const ControllerLoadException_1 = __importDefault(require("./exceptions/ControllerLoadException"));
47
+ const Exception_1 = __importDefault(require("./exceptions/Exception"));
48
+ const Documentation_1 = __importDefault(require("./documentation/Documentation"));
49
+ const ActionResult_1 = __importDefault(require("./controllers/ActionResult"));
50
+ const BodyParseException_1 = __importDefault(require("./exceptions/BodyParseException"));
51
+ const AbstractMultiPartRequestService_1 = __importStar(require("./File/AbstractMultiPartRequestService"));
52
+ const FormidableMultiPartRequestService_1 = __importDefault(require("./File/FormidableMultiPartRequestService"));
53
+ const File_1 = __importDefault(require("./File/File"));
54
+ const Type_1 = __importDefault(require("./metadata/Type"));
55
+ class Application {
56
+ constructor() {
57
+ this._createdControllers = [];
58
+ this._URIs = [];
59
+ this.ApplicationConfiguration = new ApplicationConfiguration_1.default();
60
+ this.Express = (0, express_1.default)();
61
+ }
62
+ StartAsync() {
63
+ return __awaiter(this, void 0, void 0, function* () {
64
+ yield this.ApplicationConfiguration.LoadAsync();
65
+ Application.Configurations = this.ApplicationConfiguration;
66
+ this.Express.use(express_1.default.json({ limit: 50 * 1024 * 1024 }));
67
+ this.ApplicationConfiguration.AddScoped(AbstractMultiPartRequestService_1.default, FormidableMultiPartRequestService_1.default);
68
+ yield this.ConfigureAsync(this.ApplicationConfiguration);
69
+ if (this.ApplicationConfiguration)
70
+ this.Express.use((e, rq, rs, n) => {
71
+ if (e && e instanceof Error && e instanceof SyntaxError) {
72
+ let b = new BodyParseException_1.default(e.message);
73
+ b.stack = e.stack;
74
+ this.CallErrorHandler(rq, rs, b);
75
+ }
76
+ else
77
+ n();
78
+ });
79
+ yield this.ApplicationConfiguration.SaveAsync();
80
+ this.Express.listen(this.ApplicationConfiguration.Port, this.ApplicationConfiguration.Host, () => {
81
+ console.log(`Application running on ${this.ApplicationConfiguration.Host}:${this.ApplicationConfiguration.Port}`);
82
+ });
83
+ });
84
+ }
85
+ UseCors() {
86
+ this.Express.use(require('cors')());
87
+ }
88
+ GetIgnoredPaths() {
89
+ return [
90
+ ".git",
91
+ ".vscode",
92
+ "coverage",
93
+ "node_modules"
94
+ ];
95
+ }
96
+ TryFindControllerFolder(path) {
97
+ if (this.GetIgnoredPaths().filter(s => path.endsWith(s)).length > 0)
98
+ return undefined;
99
+ if (path.indexOf("node_modules") > -1)
100
+ return undefined;
101
+ if (!fs_1.default.existsSync(path))
102
+ return undefined;
103
+ if (fs_1.default.readdirSync(path).filter(s => s.toLowerCase().endsWith("controller.js")).length > 0)
104
+ return path;
105
+ let folder = fs_1.default.readdirSync(path).filter(s => !fs_1.default.lstatSync(path_1.default.join(path, s)).isFile());
106
+ if (folder.length == 0)
107
+ return undefined;
108
+ for (let f of folder) {
109
+ let find = this.TryFindControllerFolder(path_1.default.join(path, f));
110
+ if (find && find.toLowerCase().endsWith("controllers"))
111
+ return find;
112
+ }
113
+ return undefined;
114
+ }
115
+ UseControllersAsync(root) {
116
+ return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
117
+ let controllersPath = this.TryFindControllerFolder(path_1.default.join(root !== null && root !== void 0 ? root : this.ApplicationConfiguration.RootPath, "controllers"));
118
+ if (!controllersPath)
119
+ controllersPath = this.TryFindControllerFolder(root !== null && root !== void 0 ? root : this.ApplicationConfiguration.RootPath);
120
+ if (!controllersPath || !fs_1.default.existsSync(controllersPath))
121
+ return;
122
+ console.debug(`reading controllers in ${controllersPath}`);
123
+ let files = fs_1.default.readdirSync(controllersPath).filter(s => s.toLowerCase().endsWith("controller.js"));
124
+ for (let controllerFile of files) {
125
+ let controllerModule = yield Promise.resolve(`${path_1.default.join(controllersPath, controllerFile)}`).then(s => __importStar(require(s)));
126
+ let controllerClass = undefined;
127
+ if (controllerModule.default == undefined) {
128
+ for (let c in controllerModule) {
129
+ if (c.toLowerCase().endsWith("controller")) {
130
+ controllerClass = controllerModule[c];
131
+ }
132
+ }
133
+ }
134
+ else
135
+ controllerClass = controllerModule.default;
136
+ if (controllerClass == undefined)
137
+ throw new ControllerLoadException_1.default(`Can find any controller from file : ${controllerFile}`);
138
+ let controller = Reflect.construct(controllerClass.prototype.constructor, []);
139
+ if (controller != undefined && controller != null) {
140
+ this.AppendController(controllerClass.prototype.constructor);
141
+ }
142
+ else {
143
+ throw new ControllerLoadException_1.default(`Can not load ${controllerClass.name} controller from file : ${controllerFile}`);
144
+ }
145
+ }
146
+ resolve();
147
+ }));
148
+ }
149
+ UseCustomMultiPartRequestHandler(cTor) {
150
+ this.ApplicationConfiguration.AddScoped(AbstractMultiPartRequestService_1.default, cTor);
151
+ }
152
+ AppendController(ctor) {
153
+ let empty = new ctor();
154
+ let methods = Reflect.ownKeys(empty.constructor.prototype).filter(m => {
155
+ return typeof empty[m] == "function";
156
+ });
157
+ let route = ControllerDecorators_1.default.GetRoute(empty);
158
+ let validateBody = ControllerDecorators_1.default.IsToValidate(empty);
159
+ if (!route)
160
+ return;
161
+ this._createdControllers.push(ctor);
162
+ for (let method of methods) {
163
+ let action = ControllerDecorators_1.default.GetAction(empty, method.toString());
164
+ if (!action) {
165
+ continue;
166
+ }
167
+ let verb = ControllerDecorators_1.default.GetVerb(empty, method.toString());
168
+ let fromBody = ControllerDecorators_1.default.GetFromBodyArgs(empty.constructor, method.toString());
169
+ let fromQuery = ControllerDecorators_1.default.GetFromQueryArgs(empty.constructor, method.toString());
170
+ let fromFiles = ControllerDecorators_1.default.GetFromFilesArgs(empty.constructor, method.toString());
171
+ let maxFilesSize = ControllerDecorators_1.default.GetMaxFilesSize(empty.constructor);
172
+ let headers = ControllerDecorators_1.default.GetHeaders(empty.constructor);
173
+ ControllerDecorators_1.default.GetNonDecoratedArguments(empty, method, fromBody, fromQuery, fromFiles);
174
+ if (!verb)
175
+ verb = HttpVerbs_1.HTTPVerbs.GET;
176
+ if (verb == HttpVerbs_1.HTTPVerbs.GET && fromBody.length > 0)
177
+ throw new ControllerLoadException_1.default(`GET method: ${ctor.name}.${method.toString()} can not have body params`);
178
+ let collision = this._URIs.filter(s => s.URI == `${route}${action}`);
179
+ if (collision.length > 0)
180
+ throw new ControllerLoadException_1.default(`The URI: ${route}${action} exists in two controllers: ${collision[0].Controller} and ${ctor.name}.${method.toString()}`);
181
+ console.debug("appended : ", verb, `${route}${action}`);
182
+ this._URIs.push({ URI: `${route}${action}`, Controller: `${ctor.name}.${method.toString()}` });
183
+ this.Express[verb.toString().toLowerCase()](`${route}${action}`, (request, response) => __awaiter(this, void 0, void 0, function* () {
184
+ let midlewares = ControllerDecorators_1.default.GetMidlewares(empty).map(s => s).reverse();
185
+ midlewares.push(...ControllerDecorators_1.default.GetBefores(empty, method.toString()).map(s => s).reverse());
186
+ let afters = ControllerDecorators_1.default.GetMidlewaresAfter(empty).map(s => s).reverse();
187
+ afters.push(...ControllerDecorators_1.default.GetAfters(empty, method.toString()).map(s => s).reverse());
188
+ let handler = (context) => __awaiter(this, void 0, void 0, function* () {
189
+ var _a, _b;
190
+ for (let h of headers) {
191
+ if (!request.headers[h]) {
192
+ response.status(400);
193
+ response.json({
194
+ Message: "Header missing",
195
+ Detailts: `Header ${h} is required to this endpoint`
196
+ });
197
+ }
198
+ }
199
+ let params = [];
200
+ let ts = ((_b = ((_a = Reflect.getMetadata("design:paramtypes", empty, method.toString())) !== null && _a !== void 0 ? _a : Reflect.getMetadata("design:paramtypes", empty.constructor, method.toString()))) !== null && _b !== void 0 ? _b : []);
201
+ let content_type = request.headers["content-type"];
202
+ let isMultiPartFormData = content_type && content_type.indexOf('multipart/form-data') > -1;
203
+ let parts = [];
204
+ let fromFilesParams = [];
205
+ if (isMultiPartFormData) {
206
+ let multiPartService = DependecyService_1.default.Resolve(AbstractMultiPartRequestService_1.default);
207
+ try {
208
+ parts = yield multiPartService.GetPartsFromRequestAsync(request, { MaxFileSize: maxFilesSize });
209
+ }
210
+ catch (err) {
211
+ return this.CallErrorHandler(request, response, this.CastToExpection(err));
212
+ }
213
+ for (let f of fromFiles) {
214
+ let fs = parts === null || parts === void 0 ? void 0 : parts.filter(s => s.Type == AbstractMultiPartRequestService_1.PartType.FILE);
215
+ if (fs.length > 0) {
216
+ if (f.FileName) {
217
+ let files = fs.filter(s => s.Filename == f.FileName);
218
+ if (files.length > 0) {
219
+ let fileClass = new File_1.default(files[0].Filename, files[0].Content);
220
+ fromFilesParams.push(fileClass);
221
+ params[f.Index] = fileClass;
222
+ }
223
+ }
224
+ else {
225
+ let fileClass = new File_1.default(fs[0].Filename, fs[0].Content);
226
+ fromFilesParams.push(fileClass);
227
+ params[f.Index] = fileClass;
228
+ }
229
+ }
230
+ }
231
+ }
232
+ let fromBodyParams = [];
233
+ if (fromBody.length > 0) {
234
+ fromBody.sort((a, b) => a.Index - b.Index).forEach(f => {
235
+ let obj = undefined;
236
+ if (!f.Field || f.Type.name == "Object") {
237
+ let fieldParts = parts.filter(s => s.Name == 'body');
238
+ if (isMultiPartFormData && fieldParts.length > 0) {
239
+ try {
240
+ obj = JSON.parse(fieldParts[0].Content);
241
+ }
242
+ catch (_a) {
243
+ obj = fieldParts[0].Content;
244
+ }
245
+ }
246
+ else {
247
+ obj = request.body;
248
+ }
249
+ }
250
+ else {
251
+ let fieldParts = parts.filter(s => s.Name == f.Field);
252
+ if (isMultiPartFormData && fieldParts.length > 0) {
253
+ try {
254
+ obj = JSON.parse(fieldParts[0].Content);
255
+ }
256
+ catch (_b) {
257
+ obj = fieldParts[0].Content;
258
+ }
259
+ }
260
+ else {
261
+ obj = request.body[f.Field];
262
+ }
263
+ }
264
+ if (["string", "number", "boolean", "bigint"].filter(s => s == ts[f.Index].name.toLowerCase()).length == 0) {
265
+ try {
266
+ obj.__proto__ = ts[f.Index];
267
+ }
268
+ catch (_c) { }
269
+ if (f.Type.name == "Object") {
270
+ fromBodyParams.push(obj);
271
+ params[f.Index] = obj;
272
+ }
273
+ else {
274
+ let t = Reflect.construct(ts[f.Index], []);
275
+ Object.assign(t, obj);
276
+ fromBodyParams.push(t);
277
+ params[f.Index] = t;
278
+ }
279
+ }
280
+ else {
281
+ if (obj != undefined && typeof obj == "string" && obj.indexOf('"') == 0 && obj.lastIndexOf('"') == obj.length - 1)
282
+ obj = obj.substring(1, obj.length - 1);
283
+ if (obj != undefined && ts[f.Index].name.toLowerCase() == "number") {
284
+ let number = Number.parseFloat(obj.toString());
285
+ if (number != Number.NaN) {
286
+ fromBodyParams.push(number);
287
+ params[f.Index] = number;
288
+ }
289
+ else {
290
+ fromBodyParams.push(undefined);
291
+ params[f.Index] = undefined;
292
+ }
293
+ }
294
+ else if (obj != undefined && ts[f.Index].name.toLowerCase() == "string") {
295
+ fromBodyParams.push(obj.toString());
296
+ params[f.Index] = obj.toString();
297
+ }
298
+ else if (obj != undefined && ts[f.Index].name.toLowerCase() == "date") {
299
+ try {
300
+ fromBodyParams.push(new Date(obj));
301
+ params[f.Index] = new Date(obj);
302
+ }
303
+ catch (_d) { }
304
+ }
305
+ else {
306
+ fromBodyParams.push(obj);
307
+ params[f.Index] = obj;
308
+ }
309
+ }
310
+ });
311
+ }
312
+ let fromQueryParams = [];
313
+ if (fromQuery.length > 0) {
314
+ fromQuery.sort((a, b) => a.Index - b.Index).forEach((f, j) => {
315
+ var _a;
316
+ let obj;
317
+ obj = (_a = request.query[f.Field]) === null || _a === void 0 ? void 0 : _a.toString();
318
+ if (obj != undefined && typeof obj == "string" && obj.indexOf('"') == 0 && obj.lastIndexOf('"') == obj.length - 1)
319
+ obj = obj.substring(1, obj.length - 1);
320
+ if (obj != undefined && f.Type.name.toLowerCase() == "number") {
321
+ let number = Number.parseFloat(obj.toString());
322
+ if (number != Number.NaN) {
323
+ fromQueryParams.push(number);
324
+ params[f.Index] = number;
325
+ }
326
+ else {
327
+ fromBodyParams.push(undefined);
328
+ params[f.Index] = undefined;
329
+ }
330
+ }
331
+ else if (obj != undefined && f.Type.name.toLowerCase() == "string") {
332
+ fromQueryParams.push(obj.toString());
333
+ params[f.Index] = obj.toString();
334
+ }
335
+ else if (obj != undefined && f.Type.name.toLowerCase() == "date") {
336
+ try {
337
+ fromQueryParams.push(new Date(obj));
338
+ params[f.Index] = new Date(obj);
339
+ }
340
+ catch (_b) { }
341
+ }
342
+ else if (obj != undefined && f.Type.name.toLowerCase() == "boolean") {
343
+ try {
344
+ if (typeof obj != "boolean") {
345
+ let v = obj.toString().toLowerCase() == "true";
346
+ fromQueryParams.push(v);
347
+ params[f.Index] = v;
348
+ }
349
+ else {
350
+ fromQueryParams.push(obj);
351
+ params[f.Index] = obj;
352
+ }
353
+ }
354
+ catch (_c) { }
355
+ }
356
+ else {
357
+ fromQueryParams.push(obj);
358
+ params[f.Index] = obj;
359
+ }
360
+ });
361
+ }
362
+ if (validateBody) {
363
+ if (fromBody.length > 0) {
364
+ let modelBindErros = [];
365
+ for (let p of fromBody) {
366
+ if (p.Required && (params.length <= p.Index || params[p.Index] == undefined)) {
367
+ modelBindErros.push(p);
368
+ }
369
+ else {
370
+ try {
371
+ Type_1.default.ValidateType(params[p.Index], ts[p.Index]);
372
+ }
373
+ catch (e) {
374
+ response.status(400);
375
+ response.json({
376
+ Message: "Model binding fail",
377
+ Detailts: e.message
378
+ });
379
+ return;
380
+ }
381
+ }
382
+ }
383
+ if (modelBindErros.length > 0) {
384
+ response.status(400);
385
+ response.json({
386
+ Message: "Model binding fail",
387
+ Detailts: modelBindErros.map(s => `Parameter "${s.Field}" is required`)
388
+ });
389
+ return;
390
+ }
391
+ }
392
+ if (fromQuery.length > 0) {
393
+ let modelBindErros = [];
394
+ for (let p of fromQuery) {
395
+ if (p.Required && (params.length <= p.Index || params[p.Index] == undefined)) {
396
+ modelBindErros.push(p);
397
+ }
398
+ }
399
+ if (modelBindErros.length > 0) {
400
+ response.status(400);
401
+ response.json({
402
+ Message: "Model binding fail",
403
+ Detailts: modelBindErros.map(s => `Parameter "${s.Field}" is required`)
404
+ });
405
+ return;
406
+ }
407
+ }
408
+ if (fromFiles.length > 0) {
409
+ let modelBindErros = [];
410
+ for (let p of fromFiles) {
411
+ if (p.Required && (params.length <= p.Index || params[p.Index] == undefined)) {
412
+ modelBindErros.push(p);
413
+ }
414
+ }
415
+ if (modelBindErros.length > 0) {
416
+ response.status(400);
417
+ response.json({
418
+ Message: "Model binding fail",
419
+ Detailts: modelBindErros.map(s => `The file ${(s.FileName ? `"${s.FileName} "` : "")}is required`)
420
+ });
421
+ return;
422
+ }
423
+ }
424
+ let validationsErrors = [];
425
+ for (let a of fromBodyParams) {
426
+ try {
427
+ validationsErrors.push(...ValidationDecorators_1.default.Validate(a).map(s => s.Message));
428
+ }
429
+ catch (_c) { }
430
+ }
431
+ if (validationsErrors.length > 0) {
432
+ response.status(400);
433
+ response.json({
434
+ Message: "Validation fail",
435
+ Detailts: validationsErrors
436
+ });
437
+ return;
438
+ }
439
+ }
440
+ let controller = DependecyService_1.default.ResolveCtor(empty.constructor);
441
+ if (controller == undefined)
442
+ controller = new ctor();
443
+ try {
444
+ DependecyService_1.default.CheckForDependenciesAndResolve(controller);
445
+ }
446
+ catch (err) {
447
+ this.CallErrorHandler(request, response, this.CastToExpection(err));
448
+ }
449
+ controller.Request = context.Request;
450
+ controller.Response = context.Response;
451
+ try {
452
+ let exceutionTask = controller[method](...params);
453
+ if (exceutionTask instanceof Promise) {
454
+ try {
455
+ let c = yield exceutionTask;
456
+ for (let afterHandler of afters) {
457
+ try {
458
+ yield afterHandler({
459
+ Request: request,
460
+ Response: response,
461
+ Result: c
462
+ });
463
+ }
464
+ catch (subErr) {
465
+ return this.CallErrorHandler(request, response, this.CastToExpection(subErr));
466
+ }
467
+ }
468
+ this.SendResponseIfNecessary(controller, response, c);
469
+ }
470
+ catch (err) {
471
+ for (let afterHandler of afters) {
472
+ try {
473
+ yield afterHandler({
474
+ Exception: this.CastToExpection(err),
475
+ Request: request,
476
+ Response: response
477
+ });
478
+ }
479
+ catch (subErr) {
480
+ return this.CallErrorHandler(request, response, this.CastToExpection(subErr));
481
+ }
482
+ }
483
+ if (afters.length == 0)
484
+ this.CallErrorHandler(request, response, this.CastToExpection(err));
485
+ }
486
+ }
487
+ else {
488
+ for (let afterHandler of afters) {
489
+ try {
490
+ yield afterHandler({
491
+ Request: request,
492
+ Response: response,
493
+ Result: exceutionTask
494
+ });
495
+ }
496
+ catch (err) {
497
+ this.CallErrorHandler(request, response, this.CastToExpection(err));
498
+ }
499
+ }
500
+ this.SendResponseIfNecessary(controller, response, exceutionTask);
501
+ }
502
+ }
503
+ catch (err) {
504
+ for (let afterHandler of afters) {
505
+ try {
506
+ yield afterHandler({
507
+ Exception: this.CastToExpection(err),
508
+ Request: request,
509
+ Response: response
510
+ });
511
+ }
512
+ catch (subErr) {
513
+ this.CallErrorHandler(request, response, this.CastToExpection(subErr));
514
+ }
515
+ }
516
+ if (afters.length == 0)
517
+ this.CallErrorHandler(request, response, this.CastToExpection(err));
518
+ }
519
+ });
520
+ if (midlewares && midlewares.length > 0) {
521
+ let httpRequestContexts = [];
522
+ let pipeline = [];
523
+ for (let i = 0; i <= midlewares.length; i++) {
524
+ httpRequestContexts.push({
525
+ Request: request,
526
+ Response: response,
527
+ Next: () => __awaiter(this, void 0, void 0, function* () { })
528
+ });
529
+ }
530
+ for (let i = 0; i < httpRequestContexts.length; i++) {
531
+ let box = {
532
+ v: i
533
+ };
534
+ pipeline.push({
535
+ Execute: () => __awaiter(this, void 0, void 0, function* () {
536
+ try {
537
+ pipeline.length - 1 == box.v ? yield handler(httpRequestContexts[box.v]) : yield midlewares[box.v](httpRequestContexts[box.v]);
538
+ }
539
+ catch (err) {
540
+ this.CallErrorHandler(request, response, this.CastToExpection(err));
541
+ }
542
+ })
543
+ });
544
+ }
545
+ for (let i = 0; i < pipeline.length; i++) {
546
+ httpRequestContexts[i].Next = i == pipeline.length - 1 ? () => __awaiter(this, void 0, void 0, function* () { }) : () => __awaiter(this, void 0, void 0, function* () {
547
+ try {
548
+ yield pipeline[i + 1].Execute();
549
+ }
550
+ catch (err) {
551
+ this.CallErrorHandler(request, response, this.CastToExpection(err));
552
+ }
553
+ });
554
+ }
555
+ yield pipeline[0].Execute();
556
+ }
557
+ else {
558
+ yield handler({
559
+ Request: request,
560
+ Response: response,
561
+ Next: () => __awaiter(this, void 0, void 0, function* () { })
562
+ });
563
+ }
564
+ }));
565
+ }
566
+ }
567
+ CreateDocumentation() {
568
+ new Documentation_1.default().CreateDocumentation(this._createdControllers, this.Express);
569
+ }
570
+ SendResponseIfNecessary(controller, response, result) {
571
+ if (response.headersSent)
572
+ return;
573
+ if (!result) {
574
+ controller.SendResponse(204);
575
+ return;
576
+ }
577
+ if (result instanceof ActionResult_1.default) {
578
+ controller.SendResponse(result.StatusCode, result.Result);
579
+ return;
580
+ }
581
+ controller.SendResponse(200, result);
582
+ }
583
+ CastToExpection(err) {
584
+ let ex;
585
+ if (err instanceof Exception_1.default)
586
+ ex = err;
587
+ else {
588
+ ex = new Exception_1.default(err.message);
589
+ ex.stack = err.stack;
590
+ }
591
+ return ex;
592
+ }
593
+ CallErrorHandler(request, response, exception) {
594
+ let defaultHandler = (request, response, exception) => {
595
+ try {
596
+ if (response.headersSent)
597
+ return;
598
+ response.status(500);
599
+ response.json(exception);
600
+ }
601
+ catch (err) {
602
+ console.log("Error while trying handle the error");
603
+ console.log(err);
604
+ }
605
+ finally {
606
+ console.log("Inner exception");
607
+ console.log(exception);
608
+ }
609
+ };
610
+ if (this.ApplicationThreadExeptionHandler != undefined) {
611
+ try {
612
+ this.ApplicationThreadExeptionHandler(request, response, this.CastToExpection(exception));
613
+ }
614
+ catch (err) {
615
+ console.log("Error while trying handle the error with custom delegate");
616
+ console.log(err);
617
+ defaultHandler(request, response, this.CastToExpection(err));
618
+ }
619
+ }
620
+ else {
621
+ defaultHandler(request, response, this.CastToExpection(exception));
622
+ }
623
+ }
624
+ }
625
+ exports.default = Application;
626
+ //# sourceMappingURL=Application.js.map