@clairejs/server 3.15.2 → 3.16.0

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 (85) hide show
  1. package/.mocharc.json +3 -0
  2. package/dist/common/AbstractController.js +3 -0
  3. package/dist/common/ControllerMetadata.js +1 -0
  4. package/dist/common/FileOperation.js +6 -0
  5. package/dist/common/ServerModelMetadata.js +1 -0
  6. package/dist/common/Transactionable.js +17 -0
  7. package/dist/common/auth/AbstractPrincipalResolver.js +2 -0
  8. package/dist/common/auth/IPrincipal.js +1 -0
  9. package/dist/common/constants.js +7 -0
  10. package/dist/common/decorator.d.ts +2 -2
  11. package/dist/common/decorator.js +6 -0
  12. package/dist/common/request/EndpointMetadata.js +1 -0
  13. package/dist/common/request/HttpData.js +1 -0
  14. package/dist/common/request/HttpEndpoint.js +1 -0
  15. package/dist/common/request/JobData.js +1 -0
  16. package/dist/common/request/MountedEndpointInfo.js +1 -0
  17. package/dist/common/request/RequestOptions.js +1 -0
  18. package/dist/common/request/SocketData.js +1 -0
  19. package/dist/common/request/types.d.ts +1 -1
  20. package/dist/common/request/types.js +1 -0
  21. package/dist/controllers/FileManageController.js +90 -0
  22. package/dist/controllers/FileUploadController.js +64 -0
  23. package/dist/controllers/dto/system.js +14 -0
  24. package/dist/controllers/dto/upload.js +205 -0
  25. package/dist/http/auth/AbstractHttpAuthorizer.js +2 -0
  26. package/dist/http/common/HttpRequest.js +72 -0
  27. package/dist/http/common/HttpResponse.js +62 -0
  28. package/dist/http/controller/AbstractHttpController.js +21 -0
  29. package/dist/http/controller/AbstractHttpMiddleware.js +2 -0
  30. package/dist/http/controller/AbstractHttpRequestHandler.js +69 -0
  31. package/dist/http/controller/CrudHttpController.js +302 -0
  32. package/dist/http/controller/DefaultHttpRequestHandler.js +143 -0
  33. package/dist/http/decorators.d.ts +1 -1
  34. package/dist/http/decorators.js +86 -0
  35. package/dist/http/file-upload/AbstractFileUploadHandler.js +2 -0
  36. package/dist/http/file-upload/FileUploadHandler.js +41 -0
  37. package/dist/http/file-upload/types.d.ts +1 -1
  38. package/dist/http/file-upload/types.js +1 -0
  39. package/dist/http/repository/AbstractRepository.js +26 -0
  40. package/dist/http/repository/DtoRepository.d.ts +3 -3
  41. package/dist/http/repository/DtoRepository.js +204 -0
  42. package/dist/http/repository/ICrudRepository.js +1 -0
  43. package/dist/http/repository/ModelRepository.js +696 -0
  44. package/dist/http/security/AbstractAccessCondition.js +2 -0
  45. package/dist/http/security/access-conditions/FilterModelFieldAccessCondition.js +30 -0
  46. package/dist/http/security/access-conditions/MaximumQueryLimit.js +31 -0
  47. package/dist/http/security/cors.js +1 -0
  48. package/dist/http/utils.js +32 -0
  49. package/dist/index.js +75 -1
  50. package/dist/job/AbstractJobController.js +9 -0
  51. package/dist/job/AbstractJobRepository.js +2 -0
  52. package/dist/job/AbstractJobScheduler.js +48 -0
  53. package/dist/job/AwsJobScheduler.js +405 -0
  54. package/dist/job/LocalJobScheduler.js +273 -0
  55. package/dist/job/decorators.js +57 -0
  56. package/dist/job/interfaces.js +10 -0
  57. package/dist/logging/FileLogMedium.js +44 -0
  58. package/dist/services/AbstractFileService.js +28 -0
  59. package/dist/services/AbstractMailService.js +2 -0
  60. package/dist/services/AbstractService.js +3 -0
  61. package/dist/services/AbstractSmsService.js +2 -0
  62. package/dist/services/implementations/LocalFileService.js +42 -0
  63. package/dist/services/implementations/LocalMailService.js +27 -0
  64. package/dist/services/implementations/LocalSmsService.js +17 -0
  65. package/dist/services/implementations/S3FileService.js +107 -0
  66. package/dist/services/implementations/SesMailService.js +64 -0
  67. package/dist/socket/AbstractServerSocket.js +44 -0
  68. package/dist/socket/AbstractServerSocketManager.d.ts +1 -1
  69. package/dist/socket/AbstractServerSocketManager.js +348 -0
  70. package/dist/socket/AbstractSocketConnectionHandler.js +2 -0
  71. package/dist/socket/AbstractSocketController.d.ts +3 -3
  72. package/dist/socket/AbstractSocketController.js +12 -0
  73. package/dist/socket/AwsSocketManager.d.ts +2 -2
  74. package/dist/socket/AwsSocketManager.js +160 -0
  75. package/dist/socket/IServerSocket.js +1 -0
  76. package/dist/socket/LocalSocketManager.js +292 -0
  77. package/dist/system/ClaireServer.js +78 -0
  78. package/dist/system/ExpressWrapper.js +122 -0
  79. package/dist/system/LambdaWrapper.js +151 -0
  80. package/dist/system/ServerGlobalStore.js +1 -0
  81. package/dist/system/lamba-request-mapper.js +49 -0
  82. package/dist/system/locale/LocaleEntry.js +13 -0
  83. package/dist/system/locale/LocaleTranslation.js +47 -0
  84. package/dist/system/locale/decorators.js +14 -0
  85. package/package.json +13 -20
package/.mocharc.json ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "node-option": ["experimental-specifier-resolution=node", "loader=ts-node/esm"]
3
+ }
@@ -0,0 +1,3 @@
1
+ import { Transactionable } from "./Transactionable";
2
+ export class AbstractController extends Transactionable {
3
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ export var FileOperation;
2
+ (function (FileOperation) {
3
+ FileOperation["GET"] = "getObject";
4
+ FileOperation["PUT"] = "putObject";
5
+ FileOperation["DELETE"] = "deleteObject";
6
+ })(FileOperation || (FileOperation = {}));
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ import { Errors } from "@clairejs/core";
2
+ import { getTransactionFromContext } from "@clairejs/orm";
3
+ export class Transactionable {
4
+ transactionFactory;
5
+ constructor(transactionFactory) {
6
+ this.transactionFactory = transactionFactory;
7
+ }
8
+ async createTransaction() {
9
+ if (!this.transactionFactory) {
10
+ throw Errors.SYSTEM_ERROR("Transaction factory not injected to this class");
11
+ }
12
+ return this.transactionFactory.createTransaction();
13
+ }
14
+ async getCurrentTransaction() {
15
+ return getTransactionFromContext(this);
16
+ }
17
+ }
@@ -0,0 +1,2 @@
1
+ export class AbstractPrincipalResolver {
2
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ //@internal
2
+ export const ExitCode = {
3
+ SIGTERM_INTERUPTION: -1,
4
+ SIGINT_INTERUPTION: -2,
5
+ UNCAUGHT_EXCEPTION: -3,
6
+ UNHANDLED_REJECTION: -4,
7
+ };
@@ -1,5 +1,5 @@
1
1
  import { Constructor } from "@clairejs/core";
2
2
  import { AbstractController } from "./AbstractController";
3
3
  export declare const Controller: (config?: {
4
- permissionGroup?: string | undefined;
5
- } | undefined) => <T extends AbstractController>(constructor: Constructor<T>) => void;
4
+ permissionGroup?: string;
5
+ }) => <T extends AbstractController>(constructor: Constructor<T>) => void;
@@ -0,0 +1,6 @@
1
+ import { getServiceProvider, initObjectMetadata } from "@clairejs/core";
2
+ export const Controller = (config) => (constructor) => {
3
+ getServiceProvider().register(constructor, "singleton");
4
+ const metadata = initObjectMetadata(constructor.prototype);
5
+ metadata.permissionGroup = config?.permissionGroup;
6
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -1 +1 @@
1
- export declare type RequestDataSource = "body" | "params" | "queries" | "headers" | "socket" | "raw";
1
+ export type RequestDataSource = "body" | "params" | "queries" | "headers" | "socket" | "raw";
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,90 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { Injectable } from "@clairejs/core";
14
+ import { ResponseBuilder } from "../http/common/HttpResponse";
15
+ import { AbstractHttpController } from "../http/controller/AbstractHttpController";
16
+ import { ApiResponse, Body, Get, Post, Queries } from "../http/decorators";
17
+ import { AbstractFileService } from "../services/AbstractFileService";
18
+ import { GetFileAccessUrlRequest, GetFileAccessUrlResponse, GetFileInfoRequest, GetFileInfoResponse, MoveFileRequest, RemoveFileRequest, } from "./dto/upload";
19
+ let FileManageController = class FileManageController extends AbstractHttpController {
20
+ fileService;
21
+ constructor(fileService) {
22
+ super(null);
23
+ this.fileService = fileService;
24
+ }
25
+ async moveFile(body) {
26
+ await this.fileService.moveObject(body.operations);
27
+ return ResponseBuilder.success();
28
+ }
29
+ async copyFile(body) {
30
+ await this.fileService.copyObject(body.operations);
31
+ return ResponseBuilder.success();
32
+ }
33
+ async removeFile(body) {
34
+ await this.fileService.removeObject(body.uris);
35
+ return ResponseBuilder.success();
36
+ }
37
+ async getFileAccessUrl(queries) {
38
+ const result = await this.fileService.getAccessUrls(queries.uris, queries.public);
39
+ return ResponseBuilder.json({ urls: result }).get();
40
+ }
41
+ async getFileInfo(queries) {
42
+ const result = await this.fileService.getFileSize(queries.uris);
43
+ const response = {
44
+ fileInfos: result.map((size) => ({ fileSizeBytes: size })),
45
+ };
46
+ return ResponseBuilder.json(response).get();
47
+ }
48
+ };
49
+ __decorate([
50
+ Post("/file/move"),
51
+ __param(0, Body()),
52
+ __metadata("design:type", Function),
53
+ __metadata("design:paramtypes", [MoveFileRequest]),
54
+ __metadata("design:returntype", Promise)
55
+ ], FileManageController.prototype, "moveFile", null);
56
+ __decorate([
57
+ Post("/file/copy"),
58
+ __param(0, Body()),
59
+ __metadata("design:type", Function),
60
+ __metadata("design:paramtypes", [MoveFileRequest]),
61
+ __metadata("design:returntype", Promise)
62
+ ], FileManageController.prototype, "copyFile", null);
63
+ __decorate([
64
+ Post("/file/remove"),
65
+ __param(0, Body()),
66
+ __metadata("design:type", Function),
67
+ __metadata("design:paramtypes", [RemoveFileRequest]),
68
+ __metadata("design:returntype", Promise)
69
+ ], FileManageController.prototype, "removeFile", null);
70
+ __decorate([
71
+ Get("/file"),
72
+ ApiResponse(GetFileAccessUrlResponse),
73
+ __param(0, Queries()),
74
+ __metadata("design:type", Function),
75
+ __metadata("design:paramtypes", [GetFileAccessUrlRequest]),
76
+ __metadata("design:returntype", Promise)
77
+ ], FileManageController.prototype, "getFileAccessUrl", null);
78
+ __decorate([
79
+ Get("/file/info"),
80
+ ApiResponse(GetFileInfoResponse),
81
+ __param(0, Queries()),
82
+ __metadata("design:type", Function),
83
+ __metadata("design:paramtypes", [GetFileInfoRequest]),
84
+ __metadata("design:returntype", Promise)
85
+ ], FileManageController.prototype, "getFileInfo", null);
86
+ FileManageController = __decorate([
87
+ Injectable(),
88
+ __metadata("design:paramtypes", [AbstractFileService])
89
+ ], FileManageController);
90
+ export { FileManageController };
@@ -0,0 +1,64 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { Errors, Injectable } from "@clairejs/core";
14
+ import randomstring from "randomstring";
15
+ import { ResponseBuilder } from "../http/common/HttpResponse";
16
+ import { AbstractHttpController } from "../http/controller/AbstractHttpController";
17
+ import { ApiResponse, Get, Queries } from "../http/decorators";
18
+ import { AbstractFileService } from "../services/AbstractFileService";
19
+ import { GetMultipleUploadResponseBody, GetMultipleUploadUrlsQueries, GetUploadUrlQueries, GetUploadUrlResponseBody, } from "./dto/upload";
20
+ let FileUploadController = class FileUploadController extends AbstractHttpController {
21
+ fileService;
22
+ allowedUploadExtensions;
23
+ constructor(fileService, allowedUploadExtensions) {
24
+ super(null);
25
+ this.fileService = fileService;
26
+ this.allowedUploadExtensions = allowedUploadExtensions;
27
+ }
28
+ async getUploadUrl(queries) {
29
+ const ext = queries.extension?.toLowerCase();
30
+ if (ext && !this.allowedUploadExtensions.includes(ext)) {
31
+ throw Errors.VALIDATION_ERROR("Not allowed file extension");
32
+ }
33
+ const urls = await this.fileService.getUploadUrlForTempUri(`tmp/${randomstring.generate({ length: 64 })}${ext ? `.${ext}` : ""}`);
34
+ return ResponseBuilder.json(urls).get();
35
+ }
36
+ async getMultipleUploadUrls(queries) {
37
+ if (queries.extensions.some((ext) => !this.allowedUploadExtensions.includes(ext))) {
38
+ throw Errors.VALIDATION_ERROR("Not allowed file extension");
39
+ }
40
+ const urls = await Promise.all(queries.extensions.map((ext) => this.fileService.getUploadUrlForTempUri(`tmp/${randomstring.generate({ length: 64 })}${ext ? `.${ext}` : ""}`)));
41
+ return ResponseBuilder.json({ files: urls }).get();
42
+ }
43
+ };
44
+ __decorate([
45
+ Get("/upload-url"),
46
+ ApiResponse(GetUploadUrlResponseBody),
47
+ __param(0, Queries()),
48
+ __metadata("design:type", Function),
49
+ __metadata("design:paramtypes", [GetUploadUrlQueries]),
50
+ __metadata("design:returntype", Promise)
51
+ ], FileUploadController.prototype, "getUploadUrl", null);
52
+ __decorate([
53
+ Get("/upload-urls"),
54
+ ApiResponse(GetMultipleUploadResponseBody),
55
+ __param(0, Queries()),
56
+ __metadata("design:type", Function),
57
+ __metadata("design:paramtypes", [GetMultipleUploadUrlsQueries]),
58
+ __metadata("design:returntype", Promise)
59
+ ], FileUploadController.prototype, "getMultipleUploadUrls", null);
60
+ FileUploadController = __decorate([
61
+ Injectable(),
62
+ __metadata("design:paramtypes", [AbstractFileService, Array])
63
+ ], FileUploadController);
64
+ export { FileUploadController };
@@ -0,0 +1,14 @@
1
+ export var CacheOperation;
2
+ (function (CacheOperation) {
3
+ CacheOperation["GET"] = "get";
4
+ CacheOperation["KEYS"] = "keys";
5
+ CacheOperation["HGET"] = "hget";
6
+ CacheOperation["HKEYS"] = "hkeys";
7
+ CacheOperation["FLUSH"] = "flush";
8
+ })(CacheOperation || (CacheOperation = {}));
9
+ export var UserVerificationMethod;
10
+ (function (UserVerificationMethod) {
11
+ UserVerificationMethod["SMS_OTP"] = "SMS";
12
+ UserVerificationMethod["VOICE_OTP"] = "VOICE";
13
+ UserVerificationMethod["MANUAL_OTP"] = "MANUAL";
14
+ })(UserVerificationMethod || (UserVerificationMethod = {}));
@@ -0,0 +1,205 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Data, DataType, ElementDto, Field } from "@clairejs/core";
11
+ let GetUploadUrlQueries = class GetUploadUrlQueries {
12
+ extension;
13
+ };
14
+ __decorate([
15
+ Field({
16
+ description: "Extension of the file to be uploaded (without dot)",
17
+ }),
18
+ __metadata("design:type", String)
19
+ ], GetUploadUrlQueries.prototype, "extension", void 0);
20
+ GetUploadUrlQueries = __decorate([
21
+ Data()
22
+ ], GetUploadUrlQueries);
23
+ export { GetUploadUrlQueries };
24
+ let GetUploadUrlResponseBody = class GetUploadUrlResponseBody {
25
+ objectKey;
26
+ putPresignedUrl;
27
+ deletePresignedUrl;
28
+ };
29
+ __decorate([
30
+ Field({
31
+ description: "Object key of file that store in the server",
32
+ isRequired: true,
33
+ }),
34
+ __metadata("design:type", String)
35
+ ], GetUploadUrlResponseBody.prototype, "objectKey", void 0);
36
+ __decorate([
37
+ Field({
38
+ description: "Presigned URl to put the file to server",
39
+ }),
40
+ __metadata("design:type", String)
41
+ ], GetUploadUrlResponseBody.prototype, "putPresignedUrl", void 0);
42
+ __decorate([
43
+ Field({
44
+ description: "Presigned URL to remove the temporary file from server",
45
+ isRequired: true,
46
+ }),
47
+ __metadata("design:type", String)
48
+ ], GetUploadUrlResponseBody.prototype, "deletePresignedUrl", void 0);
49
+ GetUploadUrlResponseBody = __decorate([
50
+ Data()
51
+ ], GetUploadUrlResponseBody);
52
+ export { GetUploadUrlResponseBody };
53
+ let GetMultipleUploadUrlsQueries = class GetMultipleUploadUrlsQueries {
54
+ extensions;
55
+ };
56
+ __decorate([
57
+ Field({
58
+ description: "Extensions of those files",
59
+ isRequired: true,
60
+ vectorProps: { allowDuplicated: true },
61
+ }),
62
+ __metadata("design:type", Array)
63
+ ], GetMultipleUploadUrlsQueries.prototype, "extensions", void 0);
64
+ GetMultipleUploadUrlsQueries = __decorate([
65
+ Data({ relaxed: true })
66
+ ], GetMultipleUploadUrlsQueries);
67
+ export { GetMultipleUploadUrlsQueries };
68
+ export class GetMultipleUploadResponseBody {
69
+ files;
70
+ }
71
+ __decorate([
72
+ Field({
73
+ description: "Upload urls for files",
74
+ vectorProps: { elementDataType: DataType.OBJECT },
75
+ ...ElementDto(GetUploadUrlResponseBody),
76
+ }),
77
+ __metadata("design:type", Array)
78
+ ], GetMultipleUploadResponseBody.prototype, "files", void 0);
79
+ let MoveOperation = class MoveOperation {
80
+ fromURI;
81
+ toURI;
82
+ };
83
+ __decorate([
84
+ Field({ description: "Source of move operation", isRequired: true }),
85
+ __metadata("design:type", String)
86
+ ], MoveOperation.prototype, "fromURI", void 0);
87
+ __decorate([
88
+ Field({ description: "Destination of move operation", isRequired: true }),
89
+ __metadata("design:type", String)
90
+ ], MoveOperation.prototype, "toURI", void 0);
91
+ MoveOperation = __decorate([
92
+ Data()
93
+ ], MoveOperation);
94
+ export { MoveOperation };
95
+ let MoveFileRequest = class MoveFileRequest {
96
+ operations;
97
+ };
98
+ __decorate([
99
+ Field({
100
+ description: "All move operations",
101
+ isRequired: true,
102
+ vectorProps: { elementDataType: DataType.OBJECT },
103
+ ...ElementDto(MoveOperation),
104
+ }),
105
+ __metadata("design:type", Array)
106
+ ], MoveFileRequest.prototype, "operations", void 0);
107
+ MoveFileRequest = __decorate([
108
+ Data()
109
+ ], MoveFileRequest);
110
+ export { MoveFileRequest };
111
+ let RemoveFileRequest = class RemoveFileRequest {
112
+ uris;
113
+ };
114
+ __decorate([
115
+ Field({
116
+ description: "File URIs to remove",
117
+ isRequired: true,
118
+ vectorProps: { elementDataType: DataType.STRING },
119
+ }),
120
+ __metadata("design:type", Array)
121
+ ], RemoveFileRequest.prototype, "uris", void 0);
122
+ RemoveFileRequest = __decorate([
123
+ Data()
124
+ ], RemoveFileRequest);
125
+ export { RemoveFileRequest };
126
+ let GetFileAccessUrlRequest = class GetFileAccessUrlRequest {
127
+ uris;
128
+ public;
129
+ };
130
+ __decorate([
131
+ Field({
132
+ description: "All URIs to get access link",
133
+ isRequired: true,
134
+ vectorProps: { elementDataType: DataType.STRING },
135
+ }),
136
+ __metadata("design:type", Array)
137
+ ], GetFileAccessUrlRequest.prototype, "uris", void 0);
138
+ __decorate([
139
+ Field({
140
+ description: "Whether to get public or private link",
141
+ isRequired: true,
142
+ }),
143
+ __metadata("design:type", Boolean)
144
+ ], GetFileAccessUrlRequest.prototype, "public", void 0);
145
+ GetFileAccessUrlRequest = __decorate([
146
+ Data({ relaxed: true })
147
+ ], GetFileAccessUrlRequest);
148
+ export { GetFileAccessUrlRequest };
149
+ let GetFileAccessUrlResponse = class GetFileAccessUrlResponse {
150
+ urls;
151
+ };
152
+ __decorate([
153
+ Field({
154
+ description: "File access URLs",
155
+ isRequired: true,
156
+ vectorProps: { elementDataType: DataType.STRING },
157
+ }),
158
+ __metadata("design:type", Array)
159
+ ], GetFileAccessUrlResponse.prototype, "urls", void 0);
160
+ GetFileAccessUrlResponse = __decorate([
161
+ Data()
162
+ ], GetFileAccessUrlResponse);
163
+ export { GetFileAccessUrlResponse };
164
+ let GetFileInfoRequest = class GetFileInfoRequest {
165
+ uris;
166
+ };
167
+ __decorate([
168
+ Field({
169
+ description: "File URIs to get info",
170
+ isRequired: true,
171
+ vectorProps: { elementDataType: DataType.STRING },
172
+ }),
173
+ __metadata("design:type", Array)
174
+ ], GetFileInfoRequest.prototype, "uris", void 0);
175
+ GetFileInfoRequest = __decorate([
176
+ Data({ relaxed: true })
177
+ ], GetFileInfoRequest);
178
+ export { GetFileInfoRequest };
179
+ let FileInfo = class FileInfo {
180
+ fileSizeBytes;
181
+ };
182
+ __decorate([
183
+ Field({ description: "Size of file in bytes", isRequired: true }),
184
+ __metadata("design:type", Number)
185
+ ], FileInfo.prototype, "fileSizeBytes", void 0);
186
+ FileInfo = __decorate([
187
+ Data()
188
+ ], FileInfo);
189
+ export { FileInfo };
190
+ let GetFileInfoResponse = class GetFileInfoResponse {
191
+ fileInfos;
192
+ };
193
+ __decorate([
194
+ Field({
195
+ description: "File infos",
196
+ isRequired: true,
197
+ vectorProps: { elementDataType: DataType.OBJECT },
198
+ ...ElementDto(FileInfo),
199
+ }),
200
+ __metadata("design:type", Array)
201
+ ], GetFileInfoResponse.prototype, "fileInfos", void 0);
202
+ GetFileInfoResponse = __decorate([
203
+ Data()
204
+ ], GetFileInfoResponse);
205
+ export { GetFileInfoResponse };
@@ -0,0 +1,2 @@
1
+ export class AbstractRequestAuthorizer {
2
+ }
@@ -0,0 +1,72 @@
1
+ import { HttpMethod, validateData, Errors } from "@clairejs/core";
2
+ export class HttpRequest {
3
+ endpointMetadata;
4
+ valueHolder = {};
5
+ clientIP;
6
+ headers;
7
+ method;
8
+ hash;
9
+ pathName;
10
+ cookies;
11
+ params = {};
12
+ query = {};
13
+ body = {};
14
+ authInfo;
15
+ constructor(options, endpointMetadata) {
16
+ this.endpointMetadata = endpointMetadata;
17
+ this.clientIP = options.clientIP;
18
+ this.method = options.method;
19
+ this.pathName = options.pathName;
20
+ this.headers = (options.headers || {});
21
+ this.cookies = (options.cookies || {});
22
+ this.hash = options.hash || "";
23
+ this.params.data = options.params || {};
24
+ this.query.data = options.query || {};
25
+ this.body.data = options.body || {};
26
+ }
27
+ jsonParsing(value, modelMetadata) {
28
+ const result = { ...value };
29
+ for (const field of modelMetadata.fields) {
30
+ try {
31
+ //-- parse if value is found or field is required
32
+ if (value[field.name] !== undefined || field.isRequired) {
33
+ result[field.name] = JSON.parse(value[field.name]);
34
+ }
35
+ }
36
+ catch (err) {
37
+ throw Errors.VALIDATION_ERROR(`JSON parsing failed for field ${field.name}`);
38
+ }
39
+ }
40
+ return result;
41
+ }
42
+ getAuthInfo() {
43
+ return this.authInfo;
44
+ }
45
+ setAuthInfo(authInfo) {
46
+ this.authInfo = authInfo;
47
+ }
48
+ getParams() {
49
+ if (this.endpointMetadata?.paramsValidationDto && !this.params.validated) {
50
+ this.params.data = validateData(this.params.data, this.endpointMetadata.paramsValidationDto);
51
+ this.params.validated = true;
52
+ }
53
+ return this.params.data;
54
+ }
55
+ getQuery() {
56
+ if (this.endpointMetadata?.queriesValidationDto && !this.query.validated) {
57
+ this.query.data = validateData(this.jsonParsing(this.query.data, this.endpointMetadata.queriesValidationDto), this.endpointMetadata.queriesValidationDto);
58
+ this.query.validated = true;
59
+ }
60
+ return this.query.data;
61
+ }
62
+ getBody() {
63
+ if (this.endpointMetadata &&
64
+ (this.endpointMetadata.httpMethod === HttpMethod.POST ||
65
+ this.endpointMetadata.httpMethod === HttpMethod.PUT) &&
66
+ this.endpointMetadata?.bodyValidationDto) {
67
+ this.body.data = validateData(this.body.data, this.endpointMetadata.bodyValidationDto, false);
68
+ this.body.validated = true;
69
+ }
70
+ return this.body.data;
71
+ }
72
+ }
@@ -0,0 +1,62 @@
1
+ export class HttpResponse {
2
+ value;
3
+ code;
4
+ headers = {};
5
+ cookies = {};
6
+ }
7
+ export class ResponseBuilder {
8
+ response;
9
+ constructor() {
10
+ this.response = new HttpResponse();
11
+ }
12
+ status(code) {
13
+ this.response.code = code;
14
+ return this;
15
+ }
16
+ header(name, value) {
17
+ this.response.headers[name] = value;
18
+ return this;
19
+ }
20
+ cookie(name, value, options) {
21
+ this.response.cookies[name] = { value, options };
22
+ return this;
23
+ }
24
+ get() {
25
+ return this.response;
26
+ }
27
+ static json(jsonValue) {
28
+ const builder = new ResponseBuilder();
29
+ builder.response.value = jsonValue;
30
+ builder.response.headers["Content-Type"] = "application/json";
31
+ return builder;
32
+ }
33
+ static html(htmlValue) {
34
+ const builder = new ResponseBuilder();
35
+ builder.response.value = htmlValue;
36
+ builder.response.headers["Content-Type"] = "text/html; charset=UTF-8";
37
+ return builder;
38
+ }
39
+ static binary(buffer) {
40
+ const builder = new ResponseBuilder();
41
+ builder.response.value = buffer;
42
+ builder.response.headers["Content-Type"] = "application/octet-stream";
43
+ return builder;
44
+ }
45
+ static success() {
46
+ const builder = new ResponseBuilder();
47
+ builder.response.code = 200;
48
+ return builder.response;
49
+ }
50
+ static notFound(data) {
51
+ const builder = new ResponseBuilder();
52
+ builder.response.code = 404;
53
+ builder.response.value = data;
54
+ return builder.response;
55
+ }
56
+ static accessDenied(data) {
57
+ const builder = new ResponseBuilder();
58
+ builder.response.code = 403;
59
+ builder.response.value = data;
60
+ return builder.response;
61
+ }
62
+ }
@@ -0,0 +1,21 @@
1
+ import { getObjectMetadata } from "@clairejs/core";
2
+ import { AbstractController } from "../../common/AbstractController";
3
+ const isEndpoint = (metadata) => {
4
+ return !!metadata.httpMethod || metadata.openAccess !== undefined || !!metadata.accessConditions;
5
+ };
6
+ export class AbstractHttpController extends AbstractController {
7
+ databaseAdapter;
8
+ constructor(databaseAdapter) {
9
+ super(databaseAdapter);
10
+ this.databaseAdapter = databaseAdapter;
11
+ }
12
+ getEndpointMetadata() {
13
+ const controllerMetadata = getObjectMetadata(this.constructor);
14
+ if (!controllerMetadata) {
15
+ return [];
16
+ }
17
+ return controllerMetadata.fields
18
+ .filter((f) => isEndpoint(f))
19
+ .map((f) => ({ ...f, permissionGroup: controllerMetadata.permissionGroup }));
20
+ }
21
+ }
@@ -0,0 +1,2 @@
1
+ export class AbstractHttpMiddleware {
2
+ }