taon 21.0.51 → 21.0.53
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.
- package/bin/taon +5 -5
- package/bin/taon-debug +5 -5
- package/bin/taon-debug-brk +4 -4
- package/browser/fesm2022/taon-browser.mjs +11 -1
- package/browser/fesm2022/taon-browser.mjs.map +1 -1
- package/browser/package.json +1 -1
- package/browser-prod/fesm2022/taon-browser.mjs +11 -1
- package/browser-prod/fesm2022/taon-browser.mjs.map +1 -1
- package/browser-prod/package.json +1 -1
- package/icon-menu-taon.svg +15 -15
- package/lib/build-info._auto-generated_.d.ts +1 -1
- package/lib/build-info._auto-generated_.js +1 -1
- package/lib/endpoint-context.d.ts +1 -1
- package/lib/endpoint-context.js +11 -6
- package/lib/endpoint-context.js.map +1 -1
- package/lib/package.json +1 -1
- package/lib/ui/index.js +2 -2
- package/lib/ui/taon-admin-mode-configuration/index.js +2 -2
- package/lib-prod/base-classes/base-abstract-entity.js +33 -0
- package/lib-prod/base-classes/base-angular-service.js +56 -0
- package/lib-prod/base-classes/base-class.js +37 -0
- package/lib-prod/base-classes/base-context.js +21 -0
- package/lib-prod/base-classes/base-controller.js +162 -0
- package/lib-prod/base-classes/base-crud-controller.js +235 -0
- package/lib-prod/base-classes/base-custom-repository.js +20 -0
- package/lib-prod/base-classes/base-electron-service.js +0 -0
- package/lib-prod/base-classes/base-entity.js +32 -0
- package/lib-prod/base-classes/base-file-upload.middleware.js +78 -0
- package/lib-prod/base-classes/base-injector.js +202 -0
- package/lib-prod/base-classes/base-middleware.js +6 -0
- package/lib-prod/base-classes/base-migration.js +23 -0
- package/lib-prod/base-classes/base-provider.js +6 -0
- package/lib-prod/base-classes/base-repository.js +589 -0
- package/lib-prod/base-classes/base-subscriber-for-entity.js +154 -0
- package/lib-prod/base-classes/base.js +0 -0
- package/lib-prod/build-info._auto-generated_.js +14 -0
- package/lib-prod/config/controller-config.js +28 -0
- package/lib-prod/config/controller-options.js +6 -0
- package/lib-prod/config/method-config.js +9 -0
- package/lib-prod/config/param-config.js +9 -0
- package/lib-prod/constants.js +29 -0
- package/lib-prod/context-db-migrations.js +339 -0
- package/lib-prod/create-context.js +152 -0
- package/lib-prod/decorators/classes/controller-decorator.js +21 -0
- package/lib-prod/decorators/classes/entity-decorator.js +49 -0
- package/lib-prod/decorators/classes/middleware-decorator.js +26 -0
- package/lib-prod/decorators/classes/migration-decorator.js +24 -0
- package/lib-prod/decorators/classes/provider-decorator.js +25 -0
- package/lib-prod/decorators/classes/repository-decorator.js +24 -0
- package/lib-prod/decorators/classes/subscriber-decorator.js +25 -0
- package/lib-prod/decorators/decorator-abstract-opt.js +5 -0
- package/lib-prod/decorators/http/http-decorators.js +5 -0
- package/lib-prod/decorators/http/http-methods-decorators.js +144 -0
- package/lib-prod/decorators/http/http-params-decorators.js +68 -0
- package/lib-prod/dependency-injection/di-container.js +31 -0
- package/lib-prod/endpoint-context-storage.js +36 -0
- package/lib-prod/endpoint-context.js +2033 -0
- package/lib-prod/entity-process.js +214 -0
- package/lib-prod/env/env.angular-node-app.js +130 -0
- package/lib-prod/env/env.docs-webapp.js +130 -0
- package/lib-prod/env/env.electron-app.js +130 -0
- package/lib-prod/env/env.mobile-app.js +130 -0
- package/lib-prod/env/env.npm-lib-and-cli-tool.js +130 -0
- package/lib-prod/env/env.vscode-plugin.js +130 -0
- package/lib-prod/env/index.js +6 -0
- package/lib-prod/express-types.js +0 -0
- package/lib-prod/formly/formly.models.js +0 -0
- package/lib-prod/formly/fromly.js +184 -0
- package/lib-prod/formly/type-from-entity.js +58 -0
- package/lib-prod/get-response-value.js +19 -0
- package/lib-prod/global-state/taon-global-state/index.js +5 -0
- package/lib-prod/global-state/taon-global-state/taon-global-state.abstract.context.js +20 -0
- package/lib-prod/global-state/taon-global-state/taon-global-state.constants.js +10 -0
- package/lib-prod/global-state/taon-global-state/taon-global-state.controller.js +48 -0
- package/lib-prod/global-state/taon-global-state/taon-global-state.entity.js +48 -0
- package/lib-prod/global-state/taon-global-state/taon-global-state.middleware.js +22 -0
- package/lib-prod/global-state/taon-global-state/taon-global-state.models.js +34 -0
- package/lib-prod/global-state/taon-global-state/taon-global-state.provider.js +22 -0
- package/lib-prod/global-state/taon-global-state/taon-global-state.repository.js +47 -0
- package/lib-prod/global-state/taon-global-state/taon-global-state.subscriber.js +29 -0
- package/lib-prod/global-state/taon-global-state/taon-global-state.utils.js +11 -0
- package/lib-prod/global-state/taon-transaction-registry/index.js +10 -0
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.abstract.context.js +22 -0
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.constants.js +8 -0
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.controller.js +41 -0
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.entity.js +56 -0
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.middleware.js +22 -0
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.models.js +10 -0
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.provider.js +22 -0
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.repository.js +36 -0
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.subscriber.js +29 -0
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.utils.js +6 -0
- package/lib-prod/helpers/class-helpers.js +195 -0
- package/lib-prod/helpers/clone-obj.js +21 -0
- package/lib-prod/helpers/taon-helpers.js +129 -0
- package/lib-prod/index._auto-generated_.js +0 -0
- package/lib-prod/index.js +231 -0
- package/lib-prod/inject.js +34 -0
- package/lib-prod/migrations/index.js +1 -0
- package/lib-prod/migrations/migrations_index._auto-generated_.js +0 -0
- package/lib-prod/models.js +109 -0
- package/lib-prod/orm/columns.js +124 -0
- package/lib-prod/orm/index.js +1 -0
- package/lib-prod/package.json +1 -1
- package/lib-prod/realtime/realtime-client.js +196 -0
- package/lib-prod/realtime/realtime-core.js +82 -0
- package/lib-prod/realtime/realtime-server.js +252 -0
- package/lib-prod/realtime/realtime-strategy/index.js +4 -0
- package/lib-prod/realtime/realtime-strategy/realtime-strategy-ipc.js +226 -0
- package/lib-prod/realtime/realtime-strategy/realtime-strategy-mock.js +262 -0
- package/lib-prod/realtime/realtime-strategy/realtime-strategy-socket-io.js +21 -0
- package/lib-prod/realtime/realtime-strategy/realtime-strategy.js +14 -0
- package/lib-prod/realtime/realtime-subs-manager.js +96 -0
- package/lib-prod/realtime/realtime.models.js +0 -0
- package/lib-prod/symbols.js +109 -0
- package/lib-prod/ui/index.js +5 -0
- package/lib-prod/ui/taon-admin-mode-configuration/index.js +5 -0
- package/lib-prod/validators.js +74 -0
- package/package.json +1 -1
- package/websql/fesm2022/taon-websql.mjs +11 -1
- package/websql/fesm2022/taon-websql.mjs.map +1 -1
- package/websql/package.json +1 -1
- package/websql-prod/fesm2022/taon-websql.mjs +11 -1
- package/websql-prod/fesm2022/taon-websql.mjs.map +1 -1
- package/websql-prod/package.json +1 -1
- package/lib-prod/base-classes/base-abstract-entity.ts +0 -34
- package/lib-prod/base-classes/base-angular-service.ts +0 -107
- package/lib-prod/base-classes/base-class.ts +0 -46
- package/lib-prod/base-classes/base-context.ts +0 -21
- package/lib-prod/base-classes/base-controller.ts +0 -240
- package/lib-prod/base-classes/base-crud-controller.ts +0 -298
- package/lib-prod/base-classes/base-custom-repository.ts +0 -10
- package/lib-prod/base-classes/base-electron-service.ts +0 -60
- package/lib-prod/base-classes/base-entity.ts +0 -28
- package/lib-prod/base-classes/base-file-upload.middleware.ts +0 -92
- package/lib-prod/base-classes/base-injector.ts +0 -278
- package/lib-prod/base-classes/base-middleware.ts +0 -71
- package/lib-prod/base-classes/base-migration.ts +0 -26
- package/lib-prod/base-classes/base-provider.ts +0 -8
- package/lib-prod/base-classes/base-repository.ts +0 -942
- package/lib-prod/base-classes/base-subscriber-for-entity.ts +0 -196
- package/lib-prod/base-classes/base.ts +0 -31
- package/lib-prod/build-info._auto-generated_.ts +0 -27
- package/lib-prod/config/controller-config.ts +0 -58
- package/lib-prod/config/controller-options.ts +0 -19
- package/lib-prod/config/method-config.ts +0 -55
- package/lib-prod/config/param-config.ts +0 -16
- package/lib-prod/constants.ts +0 -63
- package/lib-prod/context-db-migrations.ts +0 -488
- package/lib-prod/create-context.ts +0 -345
- package/lib-prod/decorators/classes/controller-decorator.ts +0 -25
- package/lib-prod/decorators/classes/entity-decorator.ts +0 -57
- package/lib-prod/decorators/classes/middleware-decorator.ts +0 -29
- package/lib-prod/decorators/classes/migration-decorator.ts +0 -27
- package/lib-prod/decorators/classes/provider-decorator.ts +0 -28
- package/lib-prod/decorators/classes/repository-decorator.ts +0 -26
- package/lib-prod/decorators/classes/subscriber-decorator.ts +0 -28
- package/lib-prod/decorators/decorator-abstract-opt.ts +0 -4
- package/lib-prod/decorators/http/http-decorators.ts +0 -26
- package/lib-prod/decorators/http/http-methods-decorators.ts +0 -275
- package/lib-prod/decorators/http/http-params-decorators.ts +0 -105
- package/lib-prod/dependency-injection/di-container.ts +0 -39
- package/lib-prod/endpoint-context-storage.ts +0 -47
- package/lib-prod/endpoint-context.ts +0 -3105
- package/lib-prod/entity-process.ts +0 -286
- package/lib-prod/env/env.angular-node-app.ts +0 -66
- package/lib-prod/env/env.docs-webapp.ts +0 -66
- package/lib-prod/env/env.electron-app.ts +0 -66
- package/lib-prod/env/env.mobile-app.ts +0 -66
- package/lib-prod/env/env.npm-lib-and-cli-tool.ts +0 -66
- package/lib-prod/env/env.vscode-plugin.ts +0 -66
- package/lib-prod/env/index.ts +0 -6
- package/lib-prod/express-types.ts +0 -4
- package/lib-prod/formly/formly.models.ts +0 -7
- package/lib-prod/formly/fromly.ts +0 -261
- package/lib-prod/formly/type-from-entity.ts +0 -80
- package/lib-prod/get-response-value.ts +0 -30
- package/lib-prod/global-state/taon-global-state/index.ts +0 -6
- package/lib-prod/global-state/taon-global-state/taon-global-state.abstract.context.ts +0 -21
- package/lib-prod/global-state/taon-global-state/taon-global-state.constants.ts +0 -9
- package/lib-prod/global-state/taon-global-state/taon-global-state.controller.ts +0 -44
- package/lib-prod/global-state/taon-global-state/taon-global-state.entity.ts +0 -40
- package/lib-prod/global-state/taon-global-state/taon-global-state.middleware.ts +0 -12
- package/lib-prod/global-state/taon-global-state/taon-global-state.models.ts +0 -48
- package/lib-prod/global-state/taon-global-state/taon-global-state.provider.ts +0 -16
- package/lib-prod/global-state/taon-global-state/taon-global-state.repository.ts +0 -47
- package/lib-prod/global-state/taon-global-state/taon-global-state.subscriber.ts +0 -18
- package/lib-prod/global-state/taon-global-state/taon-global-state.utils.ts +0 -21
- package/lib-prod/global-state/taon-transaction-registry/index.ts +0 -11
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.abstract.context.ts +0 -23
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.constants.ts +0 -7
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.controller.ts +0 -38
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.entity.ts +0 -54
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.middleware.ts +0 -12
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.models.ts +0 -6
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.provider.ts +0 -16
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.repository.ts +0 -29
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.subscriber.ts +0 -20
- package/lib-prod/global-state/taon-transaction-registry/taon-transaction-registry.utils.ts +0 -9
- package/lib-prod/helpers/class-helpers.ts +0 -315
- package/lib-prod/helpers/clone-obj.ts +0 -24
- package/lib-prod/helpers/taon-helpers.ts +0 -181
- package/lib-prod/index._auto-generated_.ts +0 -5
- package/lib-prod/index.ts +0 -323
- package/lib-prod/inject.ts +0 -111
- package/lib-prod/lib-info.md +0 -8
- package/lib-prod/migrations/index.ts +0 -2
- package/lib-prod/migrations/migrations-info.md +0 -6
- package/lib-prod/migrations/migrations_index._auto-generated_.ts +0 -5
- package/lib-prod/models.ts +0 -427
- package/lib-prod/orm/columns.ts +0 -121
- package/lib-prod/orm/index.ts +0 -62
- package/lib-prod/realtime/realtime-client.ts +0 -288
- package/lib-prod/realtime/realtime-core.ts +0 -134
- package/lib-prod/realtime/realtime-server.ts +0 -398
- package/lib-prod/realtime/realtime-strategy/index.ts +0 -4
- package/lib-prod/realtime/realtime-strategy/realtime-strategy-ipc.ts +0 -344
- package/lib-prod/realtime/realtime-strategy/realtime-strategy-mock.ts +0 -349
- package/lib-prod/realtime/realtime-strategy/realtime-strategy-socket-io.ts +0 -30
- package/lib-prod/realtime/realtime-strategy/realtime-strategy.ts +0 -21
- package/lib-prod/realtime/realtime-subs-manager.ts +0 -127
- package/lib-prod/realtime/realtime.models.ts +0 -33
- package/lib-prod/symbols.ts +0 -136
- package/lib-prod/ui/index.ts +0 -1
- package/lib-prod/ui/taon-admin-mode-configuration/index.ts +0 -1
- package/lib-prod/validators.ts +0 -103
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
4
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
5
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
6
|
+
if (decorator = decorators[i])
|
|
7
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
8
|
+
if (kind && result) __defProp(target, key, result);
|
|
9
|
+
return result;
|
|
10
|
+
};
|
|
11
|
+
var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
|
|
12
|
+
import * as FormData from "form-data";
|
|
13
|
+
import {
|
|
14
|
+
HttpResponseError
|
|
15
|
+
} from "ng2-rest/lib-prod";
|
|
16
|
+
import { crossPlatformPath, fse, path, CoreModels__NS__TaonHttpErrorCustomProp, UtilsTerminal__NS__waitMilliseconds } from "tnp-core/lib-prod";
|
|
17
|
+
import { TaonController } from "../decorators/classes/controller-decorator";
|
|
18
|
+
import { POST } from "../decorators/http/http-methods-decorators";
|
|
19
|
+
import { Body, Query } from "../decorators/http/http-params-decorators";
|
|
20
|
+
import { TaonBaseFileUploadMiddleware } from "./base-file-upload.middleware";
|
|
21
|
+
import { TaonBaseInjector } from "./base-injector";
|
|
22
|
+
let TaonBaseController = class extends TaonBaseInjector {
|
|
23
|
+
/**
|
|
24
|
+
* Hook that is called when taon app is inited
|
|
25
|
+
* (all contexts are created and inited)
|
|
26
|
+
*/
|
|
27
|
+
async afterAllCtxInited(options) {
|
|
28
|
+
}
|
|
29
|
+
uploadFormDataToServer(formData, queryParams) {
|
|
30
|
+
return async (req, res) => {
|
|
31
|
+
const files = req.files;
|
|
32
|
+
if (!files) {
|
|
33
|
+
throw "No file(s) received";
|
|
34
|
+
}
|
|
35
|
+
const responseArr = files.map((f) => {
|
|
36
|
+
const savedAbs = crossPlatformPath(path.resolve(f.path));
|
|
37
|
+
return {
|
|
38
|
+
ok: true,
|
|
39
|
+
originalName: f.originalname,
|
|
40
|
+
savedAs: path.basename(savedAbs),
|
|
41
|
+
// savedPath: void 0, // not needed
|
|
42
|
+
size: f.size,
|
|
43
|
+
mimetype: f.mimetype
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
for (const res2 of responseArr) {
|
|
47
|
+
await this.afterFileUploadAction(res2, queryParams || {});
|
|
48
|
+
}
|
|
49
|
+
return responseArr;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//#endregion
|
|
53
|
+
//#region after file upload hook
|
|
54
|
+
/**
|
|
55
|
+
* Hook after file is uploaded
|
|
56
|
+
* through `uploadFormDataToServer` or `uploadLocalFileToServer`
|
|
57
|
+
*/
|
|
58
|
+
afterFileUploadAction(file, queryParams) {
|
|
59
|
+
}
|
|
60
|
+
//#region upload local file to server
|
|
61
|
+
async uploadLocalFileToServer(absFilePath, options, queryParams) {
|
|
62
|
+
const stat = fse.statSync(absFilePath);
|
|
63
|
+
const stream = fse.createReadStream(absFilePath);
|
|
64
|
+
const form = new FormData();
|
|
65
|
+
form.append("file", stream, {
|
|
66
|
+
filename: path.basename(absFilePath),
|
|
67
|
+
knownLength: stat.size
|
|
68
|
+
});
|
|
69
|
+
const data = await this.uploadFormDataToServer(form, queryParams).request(
|
|
70
|
+
options || {}
|
|
71
|
+
);
|
|
72
|
+
return data.body.json;
|
|
73
|
+
}
|
|
74
|
+
//#endregion
|
|
75
|
+
// async check() {
|
|
76
|
+
// await this._waitForProperStatusChange({
|
|
77
|
+
// request: () => this.uploadFormDataToServer(void 0, void 0).request(),
|
|
78
|
+
// statusCheck: resp => resp.body.json[0].ok,
|
|
79
|
+
// });
|
|
80
|
+
// }
|
|
81
|
+
/**
|
|
82
|
+
* Easy way to wait for status change with http (1s default) pooling.
|
|
83
|
+
*
|
|
84
|
+
* example (in sub class):
|
|
85
|
+
* ```ts
|
|
86
|
+
async check() {
|
|
87
|
+
await this.waitForProperStatusChange({
|
|
88
|
+
request: () => this.uploadFormDataToServer(void 0, void 0).request(),
|
|
89
|
+
statusCheck: resp => resp.body.json[0].ok,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
async _waitForProperStatusChange(options) {
|
|
95
|
+
const poolingInterval = options.poolingInterval || 1e3;
|
|
96
|
+
const taonRequest = options.request;
|
|
97
|
+
let maxTries = options.maxTries || Number.POSITIVE_INFINITY;
|
|
98
|
+
let i = 0;
|
|
99
|
+
let httpErrorsCount = 0;
|
|
100
|
+
while (true) {
|
|
101
|
+
await UtilsTerminal__NS__waitMilliseconds(poolingInterval);
|
|
102
|
+
try {
|
|
103
|
+
const resp = await taonRequest({
|
|
104
|
+
reqIndexNum: i,
|
|
105
|
+
httpErrorsCount
|
|
106
|
+
});
|
|
107
|
+
if (options.statusCheck && options.statusCheck(resp)) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
} catch (error) {
|
|
111
|
+
httpErrorsCount++;
|
|
112
|
+
if (options.loopRequestsOnBackendError) {
|
|
113
|
+
const isProperTaonError = error instanceof HttpResponseError && error.body.json[CoreModels__NS__TaonHttpErrorCustomProp];
|
|
114
|
+
const isHttpError = error instanceof HttpResponseError && !isProperTaonError;
|
|
115
|
+
const isUnknownError = !(error instanceof HttpResponseError);
|
|
116
|
+
const resBool = await options.loopRequestsOnBackendError({
|
|
117
|
+
taonError: isProperTaonError ? error : void 0,
|
|
118
|
+
unknownHttpError: isHttpError ? error : void 0,
|
|
119
|
+
unknownError: isUnknownError ? error : void 0,
|
|
120
|
+
reqIndexNum: i,
|
|
121
|
+
httpErrorsCount
|
|
122
|
+
});
|
|
123
|
+
if (resBool) {
|
|
124
|
+
i++;
|
|
125
|
+
continue;
|
|
126
|
+
} else {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (httpErrorsCount > (options.allowedHttpErrors || Number.POSITIVE_INFINITY)) {
|
|
131
|
+
throw new Error(
|
|
132
|
+
`Too many http errors (${httpErrorsCount}) for "${options.actionName}".`
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (i++ > maxTries) {
|
|
137
|
+
throw new Error(
|
|
138
|
+
`Timeout waiting for "${options.actionName}" to be finished. Waited for ${maxTries} seconds`
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
__decorateClass([
|
|
145
|
+
POST({
|
|
146
|
+
overrideContentType: "multipart/form-data",
|
|
147
|
+
middlewares: ({ parentMiddlewares }) => ({
|
|
148
|
+
...parentMiddlewares,
|
|
149
|
+
TaonBaseFileUploadMiddleware
|
|
150
|
+
})
|
|
151
|
+
}),
|
|
152
|
+
__decorateParam(0, Body()),
|
|
153
|
+
__decorateParam(1, Query())
|
|
154
|
+
], TaonBaseController.prototype, "uploadFormDataToServer", 1);
|
|
155
|
+
TaonBaseController = __decorateClass([
|
|
156
|
+
TaonController({
|
|
157
|
+
className: "TaonBaseController"
|
|
158
|
+
})
|
|
159
|
+
], TaonBaseController);
|
|
160
|
+
export {
|
|
161
|
+
TaonBaseController
|
|
162
|
+
};
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
4
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
5
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
6
|
+
if (decorator = decorators[i])
|
|
7
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
8
|
+
if (kind && result) __defProp(target, key, result);
|
|
9
|
+
return result;
|
|
10
|
+
};
|
|
11
|
+
var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
|
|
12
|
+
import { ___NS__isArray, ___NS__isFunction, ___NS__isString, Helpers__NS__error, Helpers__NS__warn } from "tnp-core/lib-prod";
|
|
13
|
+
import { TaonController } from "../decorators/classes/controller-decorator";
|
|
14
|
+
import {
|
|
15
|
+
GET,
|
|
16
|
+
PUT,
|
|
17
|
+
DELETE,
|
|
18
|
+
POST,
|
|
19
|
+
PATCH
|
|
20
|
+
} from "../decorators/http/http-methods-decorators";
|
|
21
|
+
import { Query, Body } from "../decorators/http/http-params-decorators";
|
|
22
|
+
import { ClassHelpers__NS__getClassFnFromObject, ClassHelpers__NS__getName } from "../helpers/class-helpers";
|
|
23
|
+
import { Symbols__NS__metadata, Symbols__NS__old } from "../symbols";
|
|
24
|
+
import { Validators__NS__preventUndefinedModel } from "../validators";
|
|
25
|
+
import { TaonBaseController } from "./base-controller";
|
|
26
|
+
let TaonBaseCrudController = class extends TaonBaseController {
|
|
27
|
+
//#region fields
|
|
28
|
+
db;
|
|
29
|
+
//#endregion
|
|
30
|
+
//#region init
|
|
31
|
+
async _() {
|
|
32
|
+
if (!___NS__isFunction(this.entityClassResolveFn)) {
|
|
33
|
+
Helpers__NS__warn(
|
|
34
|
+
`Skipping initing CRUD controller ${ClassHelpers__NS__getName(
|
|
35
|
+
this
|
|
36
|
+
)} because entityClassResolveFn is not provided.`
|
|
37
|
+
);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
let entityClassFn = this.entityClassResolveFn();
|
|
41
|
+
this.db = this.injectRepo(entityClassFn);
|
|
42
|
+
if (entityClassFn) {
|
|
43
|
+
const configEntity = Reflect.getMetadata(
|
|
44
|
+
Symbols__NS__metadata.options.entity,
|
|
45
|
+
ClassHelpers__NS__getClassFnFromObject(this)
|
|
46
|
+
);
|
|
47
|
+
if (configEntity?.createTable === false) {
|
|
48
|
+
Helpers__NS__warn(
|
|
49
|
+
`Table for entity ${ClassHelpers__NS__getName(
|
|
50
|
+
entityClassFn
|
|
51
|
+
)} will not be created. Crud will not work properly.`
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
} else {
|
|
55
|
+
Helpers__NS__error(`Entity class not provided for controller ${ClassHelpers__NS__getName(
|
|
56
|
+
this
|
|
57
|
+
)}.
|
|
58
|
+
|
|
59
|
+
Please provide entity as class property entityClassFn:
|
|
60
|
+
|
|
61
|
+
class ${ClassHelpers__NS__getName(this)} extends TaonBaseCrudController<Entity> {
|
|
62
|
+
// ...
|
|
63
|
+
entityClassResolveFn = ()=> MyEntityClass;
|
|
64
|
+
// ...
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
`);
|
|
68
|
+
}
|
|
69
|
+
await super._();
|
|
70
|
+
}
|
|
71
|
+
bufforedChanges(id, property, alreadyLength) {
|
|
72
|
+
return async (request, response) => {
|
|
73
|
+
const model = await this.db.getBy(id);
|
|
74
|
+
if (model === void 0) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
Validators__NS__preventUndefinedModel(model, id);
|
|
78
|
+
let value = model[property];
|
|
79
|
+
let result;
|
|
80
|
+
if (___NS__isString(value) || ___NS__isArray(value)) {
|
|
81
|
+
result = value.slice(alreadyLength);
|
|
82
|
+
}
|
|
83
|
+
return result;
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
pagination(pageNumber = 1, pageSize = 10, search = "") {
|
|
87
|
+
return async (request, response) => {
|
|
88
|
+
if (this.db.repositoryExists) {
|
|
89
|
+
const query = {
|
|
90
|
+
page: pageNumber,
|
|
91
|
+
take: pageSize,
|
|
92
|
+
keyword: search
|
|
93
|
+
};
|
|
94
|
+
const take = query.take || 10;
|
|
95
|
+
const page = query.page || 1;
|
|
96
|
+
const skip = (page - 1) * take;
|
|
97
|
+
const keyword = query.keyword || "";
|
|
98
|
+
const [result, total] = await this.db.findAndCount({
|
|
99
|
+
// where: { name: Like('%' + keyword + '%') },
|
|
100
|
+
// order: { name: "DESC" },
|
|
101
|
+
take,
|
|
102
|
+
skip
|
|
103
|
+
});
|
|
104
|
+
response?.setHeader(Symbols__NS__old.X_TOTAL_COUNT, total);
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
return [];
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
getAll() {
|
|
111
|
+
return async (request, response) => {
|
|
112
|
+
if (this.db.repositoryExists) {
|
|
113
|
+
const { models, totalCount } = await this.db.getAll();
|
|
114
|
+
response?.setHeader(Symbols__NS__old.X_TOTAL_COUNT, totalCount);
|
|
115
|
+
return models;
|
|
116
|
+
}
|
|
117
|
+
return [];
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
getBy(id) {
|
|
121
|
+
return async () => {
|
|
122
|
+
const model = await this.db.getBy(id);
|
|
123
|
+
return model;
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
updateById(id, item) {
|
|
127
|
+
return async () => {
|
|
128
|
+
const model = await this.db.updateById(id, item);
|
|
129
|
+
return model;
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
patchById(id, item) {
|
|
133
|
+
return async () => {
|
|
134
|
+
const model = await this.db.updateById(id, item);
|
|
135
|
+
return model;
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
bulkUpdate(items) {
|
|
139
|
+
return async () => {
|
|
140
|
+
if (!Array.isArray(items) || items?.length === 0) {
|
|
141
|
+
return [];
|
|
142
|
+
}
|
|
143
|
+
const { models } = await this.db.bulkUpdate(items);
|
|
144
|
+
return models;
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
deleteById(id) {
|
|
148
|
+
return async () => {
|
|
149
|
+
const model = await this.db.deleteById(id);
|
|
150
|
+
return model;
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
bulkDelete(ids) {
|
|
154
|
+
return async () => {
|
|
155
|
+
const models = await this.db.bulkDelete(ids);
|
|
156
|
+
return models;
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
clearTable() {
|
|
160
|
+
return async () => {
|
|
161
|
+
await this.db.clear();
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
save(item) {
|
|
165
|
+
return async () => {
|
|
166
|
+
const model = await this.db.save(item);
|
|
167
|
+
return model;
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
bulkCreate(items) {
|
|
171
|
+
return async () => {
|
|
172
|
+
const models = await this.db.bulkCreate(items);
|
|
173
|
+
return models;
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
//#endregion
|
|
177
|
+
};
|
|
178
|
+
__decorateClass([
|
|
179
|
+
GET(),
|
|
180
|
+
__decorateParam(0, Query(`id`)),
|
|
181
|
+
__decorateParam(1, Query(`property`)),
|
|
182
|
+
__decorateParam(2, Query("alreadyLength"))
|
|
183
|
+
], TaonBaseCrudController.prototype, "bufforedChanges", 1);
|
|
184
|
+
__decorateClass([
|
|
185
|
+
GET(),
|
|
186
|
+
__decorateParam(0, Query("pageNumber")),
|
|
187
|
+
__decorateParam(1, Query("pageSize")),
|
|
188
|
+
__decorateParam(2, Query("search"))
|
|
189
|
+
], TaonBaseCrudController.prototype, "pagination", 1);
|
|
190
|
+
__decorateClass([
|
|
191
|
+
GET()
|
|
192
|
+
], TaonBaseCrudController.prototype, "getAll", 1);
|
|
193
|
+
__decorateClass([
|
|
194
|
+
GET(),
|
|
195
|
+
__decorateParam(0, Query(`id`))
|
|
196
|
+
], TaonBaseCrudController.prototype, "getBy", 1);
|
|
197
|
+
__decorateClass([
|
|
198
|
+
PUT(),
|
|
199
|
+
__decorateParam(0, Query(`id`)),
|
|
200
|
+
__decorateParam(1, Body())
|
|
201
|
+
], TaonBaseCrudController.prototype, "updateById", 1);
|
|
202
|
+
__decorateClass([
|
|
203
|
+
PATCH(),
|
|
204
|
+
__decorateParam(0, Query(`id`)),
|
|
205
|
+
__decorateParam(1, Body())
|
|
206
|
+
], TaonBaseCrudController.prototype, "patchById", 1);
|
|
207
|
+
__decorateClass([
|
|
208
|
+
PUT(),
|
|
209
|
+
__decorateParam(0, Body())
|
|
210
|
+
], TaonBaseCrudController.prototype, "bulkUpdate", 1);
|
|
211
|
+
__decorateClass([
|
|
212
|
+
DELETE(),
|
|
213
|
+
__decorateParam(0, Query(`id`))
|
|
214
|
+
], TaonBaseCrudController.prototype, "deleteById", 1);
|
|
215
|
+
__decorateClass([
|
|
216
|
+
DELETE(),
|
|
217
|
+
__decorateParam(0, Query(`ids`))
|
|
218
|
+
], TaonBaseCrudController.prototype, "bulkDelete", 1);
|
|
219
|
+
__decorateClass([
|
|
220
|
+
DELETE()
|
|
221
|
+
], TaonBaseCrudController.prototype, "clearTable", 1);
|
|
222
|
+
__decorateClass([
|
|
223
|
+
POST(),
|
|
224
|
+
__decorateParam(0, Body())
|
|
225
|
+
], TaonBaseCrudController.prototype, "save", 1);
|
|
226
|
+
__decorateClass([
|
|
227
|
+
POST(),
|
|
228
|
+
__decorateParam(0, Body())
|
|
229
|
+
], TaonBaseCrudController.prototype, "bulkCreate", 1);
|
|
230
|
+
TaonBaseCrudController = __decorateClass([
|
|
231
|
+
TaonController({ className: "TaonBaseCrudController" })
|
|
232
|
+
], TaonBaseCrudController);
|
|
233
|
+
export {
|
|
234
|
+
TaonBaseCrudController
|
|
235
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
4
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
5
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
6
|
+
if (decorator = decorators[i])
|
|
7
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
8
|
+
if (kind && result) __defProp(target, key, result);
|
|
9
|
+
return result;
|
|
10
|
+
};
|
|
11
|
+
import { TaonRepository } from "../decorators/classes/repository-decorator";
|
|
12
|
+
import { TaonBaseInjector } from "./base-injector";
|
|
13
|
+
let TaonBaseCustomRepository = class extends TaonBaseInjector {
|
|
14
|
+
};
|
|
15
|
+
TaonBaseCustomRepository = __decorateClass([
|
|
16
|
+
TaonRepository({ className: "TaonBaseCustomRepository" })
|
|
17
|
+
], TaonBaseCustomRepository);
|
|
18
|
+
export {
|
|
19
|
+
TaonBaseCustomRepository
|
|
20
|
+
};
|
|
File without changes
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
4
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
5
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
6
|
+
if (decorator = decorators[i])
|
|
7
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
8
|
+
if (kind && result) __defProp(target, key, result);
|
|
9
|
+
return result;
|
|
10
|
+
};
|
|
11
|
+
import { Entity } from "taon-typeorm/lib-prod";
|
|
12
|
+
import { TaonBaseClass } from "./base-class";
|
|
13
|
+
let TaonBaseEntity = class extends TaonBaseClass {
|
|
14
|
+
/**
|
|
15
|
+
* simple check if relation is ok
|
|
16
|
+
*/
|
|
17
|
+
relation(relationName) {
|
|
18
|
+
return relationName;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* simple check if relation is ok
|
|
22
|
+
*/
|
|
23
|
+
relations(relationNames) {
|
|
24
|
+
return relationNames;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
TaonBaseEntity = __decorateClass([
|
|
28
|
+
Entity()
|
|
29
|
+
], TaonBaseEntity);
|
|
30
|
+
export {
|
|
31
|
+
TaonBaseEntity
|
|
32
|
+
};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
4
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
5
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
6
|
+
if (decorator = decorators[i])
|
|
7
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
8
|
+
if (kind && result) __defProp(target, key, result);
|
|
9
|
+
return result;
|
|
10
|
+
};
|
|
11
|
+
import * as crypto from "crypto";
|
|
12
|
+
import * as multer from "multer";
|
|
13
|
+
import { crossPlatformPath, fse, path } from "tnp-core/lib-prod";
|
|
14
|
+
import { TaonMiddleware } from "../decorators/classes/middleware-decorator";
|
|
15
|
+
import {
|
|
16
|
+
TaonBaseMiddleware
|
|
17
|
+
} from "./base-middleware";
|
|
18
|
+
let TaonBaseFileUploadMiddleware = class extends TaonBaseMiddleware {
|
|
19
|
+
async interceptServerMethod({ req, res, next }, { methodName, expressPath }) {
|
|
20
|
+
return this.middleware()(req, res, next);
|
|
21
|
+
}
|
|
22
|
+
//#region upload Dir
|
|
23
|
+
uploadDir() {
|
|
24
|
+
return crossPlatformPath([this.ctx.cwd, "uploaded-files"]);
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
//#region storage
|
|
28
|
+
storage() {
|
|
29
|
+
const uploadDir = this.uploadDir();
|
|
30
|
+
if (!fse.existsSync(uploadDir)) {
|
|
31
|
+
try {
|
|
32
|
+
fse.mkdirSync(uploadDir, { recursive: true });
|
|
33
|
+
} catch (error) {
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return multer.diskStorage({
|
|
37
|
+
destination: (_req, _file, cb) => cb(null, uploadDir),
|
|
38
|
+
filename: (_req, file, cb) => {
|
|
39
|
+
const ext = path.extname(file.originalname).toLowerCase();
|
|
40
|
+
const base = path.basename(file.originalname, ext).replace(/[^\w.-]/g, "_");
|
|
41
|
+
const uniq = `${Date.now()}-${crypto.randomBytes(6).toString("hex")}`;
|
|
42
|
+
const filenameToProcess = `${base}-${uniq}${ext}`;
|
|
43
|
+
cb(null, filenameToProcess);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
//#endregion
|
|
48
|
+
//#region upload
|
|
49
|
+
upload() {
|
|
50
|
+
return multer({
|
|
51
|
+
storage: this.storage(),
|
|
52
|
+
limits: { fileSize: 1024 * 1024 * 1024 }
|
|
53
|
+
// 1 GiB cap; tweak as needed
|
|
54
|
+
// TODO implement file filter if needed
|
|
55
|
+
// fileFilter: (_req, file, cb) => {
|
|
56
|
+
// // accept only .zip by filename extension
|
|
57
|
+
// if (path.extname(file.originalname).toLowerCase() !== '.zip') {
|
|
58
|
+
// return cb(new Error('Only .zip files are allowed'));
|
|
59
|
+
// }
|
|
60
|
+
// cb(null, true);
|
|
61
|
+
// },
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region middleware
|
|
66
|
+
middleware() {
|
|
67
|
+
return this.upload().any();
|
|
68
|
+
}
|
|
69
|
+
//#endregion
|
|
70
|
+
};
|
|
71
|
+
TaonBaseFileUploadMiddleware = __decorateClass([
|
|
72
|
+
TaonMiddleware({
|
|
73
|
+
className: "TaonBaseFileUploadMiddleware"
|
|
74
|
+
})
|
|
75
|
+
], TaonBaseFileUploadMiddleware);
|
|
76
|
+
export {
|
|
77
|
+
TaonBaseFileUploadMiddleware
|
|
78
|
+
};
|