@smartsoft001/crud-shell-nestjs 2.183.0 → 2.185.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.
- package/README.md +61 -4
- package/package.json +9 -9
- package/src/lib/controllers/crud/crud.controller.d.ts +3 -4
- package/src/lib/controllers/crud/crud.controller.js +30 -41
- package/src/lib/controllers/crud/crud.controller.js.map +1 -1
- package/src/lib/controllers/crud/read-attachment.d.ts +11 -0
- package/src/lib/controllers/crud/read-attachment.js +80 -0
- package/src/lib/controllers/crud/read-attachment.js.map +1 -0
- package/src/lib/gateways/crud/crud.gateway.d.ts +12 -2
- package/src/lib/gateways/crud/crud.gateway.js +60 -5
- package/src/lib/gateways/crud/crud.gateway.js.map +1 -1
- package/src/lib/nestjs.module.js +2 -1
- package/src/lib/nestjs.module.js.map +1 -1
package/README.md
CHANGED
|
@@ -27,14 +27,71 @@
|
|
|
27
27
|
<tr><td>PUT /:id</td><td>update — Updates an entity by its ID.</td></tr>
|
|
28
28
|
<tr><td>PATCH /:id</td><td>updatePartial — Partially updates an entity by its ID.</td></tr>
|
|
29
29
|
<tr><td>DELETE /:id</td><td>delete — Deletes an entity by its ID.</td></tr>
|
|
30
|
-
<tr><td>POST /attachments</td><td>uploadAttachment — Uploads
|
|
31
|
-
<tr><td>GET /attachments/:id</td><td>downloadAttachment — Downloads
|
|
32
|
-
<tr><td>DELETE /attachments/:id</td><td>deleteAttachment — Deletes
|
|
30
|
+
<tr><td>POST /attachments</td><td>uploadAttachment — Uploads one file. Requires a JWT and an <code>attachmentPolicy</code> that allows <code>create</code>.</td></tr>
|
|
31
|
+
<tr><td>GET /attachments/:id</td><td>downloadAttachment — Downloads a file. JWT optional; the policy must allow <code>read</code>.</td></tr>
|
|
32
|
+
<tr><td>DELETE /attachments/:id</td><td>deleteAttachment — Deletes a file. Requires a JWT and a policy that allows <code>delete</code>.</td></tr>
|
|
33
33
|
</table>
|
|
34
34
|
|
|
35
|
+
## 🔒 Attachment access
|
|
36
|
+
|
|
37
|
+
The attachment routes are denied unless `SharedConfig.attachmentPolicy` returns exactly `true`. The
|
|
38
|
+
policy is called with `{ operation, id, user }` (`operation` is `create`, `read` or `delete`) before
|
|
39
|
+
storage is read or changed. A valid JWT is not ownership: resolve owner, tenant and roles from data
|
|
40
|
+
the server trusts, and never return an unconditional `true` for private files.
|
|
41
|
+
|
|
42
|
+
- **Linking a file to its uploader.** For `create`, the controller generates the id first and passes
|
|
43
|
+
it to the policy before reading the body. Record `user` against that `id` there and return `true`;
|
|
44
|
+
later `read` and `delete` checks look the id up. A rejected upload can leave a record for an id
|
|
45
|
+
with no file.
|
|
46
|
+
- **The stock Angular UI sends no token for files.** The PDF and attachment displays open files
|
|
47
|
+
with `FileService.download` (`window.open`), and the image, video and `smartFileUrl` displays load
|
|
48
|
+
`FileService.getUrl` as plain URLs, so these are anonymous reads. With the stock UI, allow
|
|
49
|
+
anonymous `read` for files meant to be viewable.
|
|
50
|
+
- **Status codes.** A refusal is a `DomainForbiddenError`; it becomes `403` only when
|
|
51
|
+
`AppExceptionFilter` from `@smartsoft001/nestjs` is registered (otherwise `500`). A missing token
|
|
52
|
+
on upload or delete is `401`.
|
|
53
|
+
- **Limits.** One file of at most `attachmentMaxBytes` (default 10 MiB) and at most
|
|
54
|
+
`attachmentMaxFields` extra form fields (default `0`). The file is buffered before storage;
|
|
55
|
+
oversized, multi-file or extra-field requests answer `413` and nothing is stored. The upload
|
|
56
|
+
answers only after the storage write finished.
|
|
57
|
+
|
|
58
|
+
### Migration
|
|
59
|
+
|
|
60
|
+
The attachment routes used to have no guard. After upgrading: configure `attachmentPolicy`, register
|
|
61
|
+
`AppExceptionFilter`, send a Bearer token on uploads and deletes, and raise `attachmentMaxBytes` or
|
|
62
|
+
`attachmentMaxFields` if clients send larger files or extra form fields. Existing files have no
|
|
63
|
+
ownership records; the policy decides how to treat them.
|
|
64
|
+
|
|
35
65
|
## 🛠️ Gateways & Methods
|
|
36
66
|
|
|
37
67
|
### CrudGateway
|
|
38
68
|
<table>
|
|
39
|
-
<tr><td>changes (WebSocket)</td><td>handleFilter — Subscribes to changes
|
|
69
|
+
<tr><td>changes (WebSocket)</td><td>handleFilter — Subscribes to the changes of one entity, <code>{ id }</code>, and emits <code>{ id, type }</code> per change. Requires a JWT and a <code>changePolicy</code>.</td></tr>
|
|
40
70
|
</table>
|
|
71
|
+
|
|
72
|
+
### Change subscriptions
|
|
73
|
+
|
|
74
|
+
A subscription is refused unless the socket handshake carries a valid JWT in `auth.token`
|
|
75
|
+
(`io(url, { auth: { token } })`), the message names one entity with `{ id }`, and
|
|
76
|
+
`SharedConfig.changePolicy` returns exactly `true`. The policy receives `{ id, user, type }`. It runs
|
|
77
|
+
once on subscribe without `type`, and again before every event, with a fresh token check, with the
|
|
78
|
+
change `type` (`create`, `update` or `delete`). A refusal on an event ends the subscription. Decide
|
|
79
|
+
from server-side ownership or tenant data, never from the id alone.
|
|
80
|
+
|
|
81
|
+
- **Events carry no document fields.** Clients receive `{ id, type }` and refetch the entity through
|
|
82
|
+
an authorized endpoint.
|
|
83
|
+
- **Deletes.** Mongo emits a `delete` after the document is gone, so a policy that loads the
|
|
84
|
+
document would deny it and the client would never learn about the delete. Branch on
|
|
85
|
+
`type === 'delete'` and decide without loading the document.
|
|
86
|
+
- **Cost.** The policy runs per event and per subscriber; keep it cheap or cache it.
|
|
87
|
+
- **Token expiry.** The token from the handshake is rechecked on every event. After it expires the
|
|
88
|
+
next event ends the subscription; the client must reconnect with a fresh `auth.token`.
|
|
89
|
+
- **Core module.** `CrudShellNestjsCoreModule` always registers the gateway, so every subscription
|
|
90
|
+
is refused until `changePolicy` is set.
|
|
91
|
+
|
|
92
|
+
#### Migration
|
|
93
|
+
|
|
94
|
+
Subscriptions used to be open to anyone, accepted an empty filter and carried the full change,
|
|
95
|
+
including the inserted document or the update delta. After upgrading: configure `changePolicy`,
|
|
96
|
+
connect with the JWT in `auth.token` (and reconnect after it expires), always subscribe with an
|
|
97
|
+
`id`, and refetch the entity on each event instead of applying a payload.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smartsoft001/crud-shell-nestjs",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.185.0",
|
|
4
4
|
"type": "commonjs",
|
|
5
5
|
"main": "./src/index.js",
|
|
6
6
|
"typings": "./src/index.d.ts",
|
|
@@ -34,14 +34,14 @@
|
|
|
34
34
|
"@nestjs/jwt": "^11.0.0",
|
|
35
35
|
"@nestjs/passport": "^11.0.5",
|
|
36
36
|
"@nestjs/websockets": "^11.2.1",
|
|
37
|
-
"@smartsoft001/crud-domain": "2.
|
|
38
|
-
"@smartsoft001/crud-shell-app-services": "2.
|
|
39
|
-
"@smartsoft001/crud-shell-dtos": "2.
|
|
40
|
-
"@smartsoft001/domain-core": "2.
|
|
41
|
-
"@smartsoft001/mongo": "2.
|
|
42
|
-
"@smartsoft001/nestjs": "2.
|
|
43
|
-
"@smartsoft001/users": "2.
|
|
44
|
-
"@smartsoft001/utils": "2.
|
|
37
|
+
"@smartsoft001/crud-domain": "2.185.0",
|
|
38
|
+
"@smartsoft001/crud-shell-app-services": "2.185.0",
|
|
39
|
+
"@smartsoft001/crud-shell-dtos": "2.185.0",
|
|
40
|
+
"@smartsoft001/domain-core": "2.185.0",
|
|
41
|
+
"@smartsoft001/mongo": "2.185.0",
|
|
42
|
+
"@smartsoft001/nestjs": "2.185.0",
|
|
43
|
+
"@smartsoft001/users": "2.185.0",
|
|
44
|
+
"@smartsoft001/utils": "2.185.0",
|
|
45
45
|
"express": "^5.2.1",
|
|
46
46
|
"rxjs": "^7.8.1",
|
|
47
47
|
"socket.io": "^4.8.1"
|
|
@@ -3,7 +3,6 @@ import type { CreateManyMode } from '@smartsoft001/crud-domain';
|
|
|
3
3
|
import { CrudService } from '@smartsoft001/crud-shell-app-services';
|
|
4
4
|
import { IEntity } from '@smartsoft001/domain-core';
|
|
5
5
|
import type { IUser } from '@smartsoft001/users';
|
|
6
|
-
import { Writable } from 'stream';
|
|
7
6
|
import { IQ2mResult } from './query-to-mongo';
|
|
8
7
|
export declare class CrudController<T extends IEntity<string>> {
|
|
9
8
|
protected readonly service: CrudService<T>;
|
|
@@ -24,9 +23,9 @@ export declare class CrudController<T extends IEntity<string>> {
|
|
|
24
23
|
delete(params: {
|
|
25
24
|
id: string;
|
|
26
25
|
}, user: IUser): Promise<void>;
|
|
27
|
-
uploadAttachment(request: Request, response: Response):
|
|
28
|
-
downloadAttachment(id: string, request: Request, response: Response): Promise<void>;
|
|
29
|
-
deleteAttachment(id: string): Promise<void>;
|
|
26
|
+
uploadAttachment(request: Request, response: Response, user?: IUser): Promise<void>;
|
|
27
|
+
downloadAttachment(id: string, request: Request, response: Response, user?: IUser): Promise<void>;
|
|
28
|
+
deleteAttachment(id: string, user?: IUser): Promise<void>;
|
|
30
29
|
protected getQueryObject(queryObject: Record<string, unknown>): IQ2mResult;
|
|
31
30
|
protected parseToXlsx(data: T[]): any;
|
|
32
31
|
protected parseToCsv(data: T[]): string;
|
|
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
exports.CrudController = void 0;
|
|
5
5
|
const tslib_1 = require("tslib");
|
|
6
6
|
const common_1 = require("@nestjs/common");
|
|
7
|
-
const busboy_1 = tslib_1.__importDefault(require("busboy"));
|
|
8
7
|
const json2csv_1 = require("json2csv");
|
|
9
8
|
const _ = tslib_1.__importStar(require("lodash"));
|
|
10
9
|
const moment_timezone_1 = tslib_1.__importDefault(require("moment-timezone"));
|
|
@@ -14,6 +13,7 @@ const nestjs_1 = require("@smartsoft001/nestjs");
|
|
|
14
13
|
const utils_1 = require("@smartsoft001/utils");
|
|
15
14
|
const stream_1 = require("stream");
|
|
16
15
|
const query_to_mongo_1 = require("./query-to-mongo");
|
|
16
|
+
const read_attachment_1 = require("./read-attachment");
|
|
17
17
|
const auth_guard_1 = require("../../guards/auth/auth.guard");
|
|
18
18
|
let CrudController = CrudController_1 = class CrudController {
|
|
19
19
|
service;
|
|
@@ -77,45 +77,27 @@ let CrudController = CrudController_1 = class CrudController {
|
|
|
77
77
|
async delete(params, user) {
|
|
78
78
|
await this.service.delete(params.id, user);
|
|
79
79
|
}
|
|
80
|
-
uploadAttachment(request, response) {
|
|
81
|
-
const parser = (0, busboy_1.default)({
|
|
82
|
-
headers: request.headers,
|
|
83
|
-
});
|
|
80
|
+
async uploadAttachment(request, response, user) {
|
|
84
81
|
const id = utils_1.GuidService.create();
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
mimeType = info.mimeType;
|
|
94
|
-
this.service.uploadAttachment({
|
|
95
|
-
id,
|
|
96
|
-
stream: readable,
|
|
97
|
-
fileName: info.filename,
|
|
98
|
-
encoding: info.encoding,
|
|
99
|
-
mimeType: info.mimeType,
|
|
100
|
-
});
|
|
101
|
-
file.on('data', (data) => {
|
|
102
|
-
readable.push(data);
|
|
103
|
-
});
|
|
82
|
+
await this.service.authorizeAttachment('create', id, user);
|
|
83
|
+
const file = await (0, read_attachment_1.readAttachment)(request, this.service.getAttachmentLimits());
|
|
84
|
+
await this.service.uploadAttachment({
|
|
85
|
+
id,
|
|
86
|
+
stream: stream_1.Readable.from(file.data),
|
|
87
|
+
fileName: file.fileName,
|
|
88
|
+
encoding: file.encoding,
|
|
89
|
+
mimeType: file.mimeType,
|
|
104
90
|
});
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
contentType: mimeType,
|
|
112
|
-
length: readable.readableLength,
|
|
113
|
-
});
|
|
114
|
-
response.end();
|
|
91
|
+
response.set('Location', CrudController_1.getLink(request) + '/' + id);
|
|
92
|
+
response.json({
|
|
93
|
+
id,
|
|
94
|
+
fileName: file.fileName,
|
|
95
|
+
contentType: file.mimeType,
|
|
96
|
+
length: file.data.length,
|
|
115
97
|
});
|
|
116
|
-
return request.pipe(parser);
|
|
117
98
|
}
|
|
118
|
-
async downloadAttachment(id, request, response) {
|
|
99
|
+
async downloadAttachment(id, request, response, user) {
|
|
100
|
+
await this.service.authorizeAttachment('read', id, user);
|
|
119
101
|
const fileInfo = await this.service.getAttachmentInfo(id);
|
|
120
102
|
if (!fileInfo) {
|
|
121
103
|
throw new common_1.NotFoundException('Invalid id');
|
|
@@ -157,7 +139,8 @@ let CrudController = CrudController_1 = class CrudController {
|
|
|
157
139
|
readstream.pipe(response);
|
|
158
140
|
}
|
|
159
141
|
}
|
|
160
|
-
async deleteAttachment(id) {
|
|
142
|
+
async deleteAttachment(id, user) {
|
|
143
|
+
await this.service.authorizeAttachment('delete', id, user);
|
|
161
144
|
await this.service.deleteAttachment(id);
|
|
162
145
|
}
|
|
163
146
|
getQueryObject(queryObject) {
|
|
@@ -304,27 +287,33 @@ tslib_1.__decorate([
|
|
|
304
287
|
tslib_1.__metadata("design:returntype", Promise)
|
|
305
288
|
], CrudController.prototype, "delete", null);
|
|
306
289
|
tslib_1.__decorate([
|
|
290
|
+
(0, common_1.UseGuards)(auth_guard_1.AuthJwtGuard),
|
|
307
291
|
(0, common_1.Post)('attachments'),
|
|
308
292
|
tslib_1.__param(0, (0, common_1.Req)()),
|
|
309
293
|
tslib_1.__param(1, (0, common_1.Res)()),
|
|
294
|
+
tslib_1.__param(2, (0, nestjs_1.User)()),
|
|
310
295
|
tslib_1.__metadata("design:type", Function),
|
|
311
|
-
tslib_1.__metadata("design:paramtypes", [Object, Object]),
|
|
312
|
-
tslib_1.__metadata("design:returntype",
|
|
296
|
+
tslib_1.__metadata("design:paramtypes", [Object, Object, Object]),
|
|
297
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
313
298
|
], CrudController.prototype, "uploadAttachment", null);
|
|
314
299
|
tslib_1.__decorate([
|
|
300
|
+
(0, common_1.UseGuards)(auth_guard_1.AuthOrAnonymousJwtGuard),
|
|
315
301
|
(0, common_1.Get)('attachments/:id'),
|
|
316
302
|
tslib_1.__param(0, (0, common_1.Param)('id')),
|
|
317
303
|
tslib_1.__param(1, (0, common_1.Req)()),
|
|
318
304
|
tslib_1.__param(2, (0, common_1.Res)()),
|
|
305
|
+
tslib_1.__param(3, (0, nestjs_1.User)()),
|
|
319
306
|
tslib_1.__metadata("design:type", Function),
|
|
320
|
-
tslib_1.__metadata("design:paramtypes", [String, Object, Object]),
|
|
307
|
+
tslib_1.__metadata("design:paramtypes", [String, Object, Object, Object]),
|
|
321
308
|
tslib_1.__metadata("design:returntype", Promise)
|
|
322
309
|
], CrudController.prototype, "downloadAttachment", null);
|
|
323
310
|
tslib_1.__decorate([
|
|
311
|
+
(0, common_1.UseGuards)(auth_guard_1.AuthJwtGuard),
|
|
324
312
|
(0, common_1.Delete)('attachments/:id'),
|
|
325
313
|
tslib_1.__param(0, (0, common_1.Param)('id')),
|
|
314
|
+
tslib_1.__param(1, (0, nestjs_1.User)()),
|
|
326
315
|
tslib_1.__metadata("design:type", Function),
|
|
327
|
-
tslib_1.__metadata("design:paramtypes", [String]),
|
|
316
|
+
tslib_1.__metadata("design:paramtypes", [String, Object]),
|
|
328
317
|
tslib_1.__metadata("design:returntype", Promise)
|
|
329
318
|
], CrudController.prototype, "deleteAttachment", null);
|
|
330
319
|
exports.CrudController = CrudController = CrudController_1 = tslib_1.__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud.controller.js","sourceRoot":"","sources":["../../../../../../../../../packages/crud/shell/nestjs/src/lib/controllers/crud/crud.controller.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"crud.controller.js","sourceRoot":"","sources":["../../../../../../../../../packages/crud/shell/nestjs/src/lib/controllers/crud/crud.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Request } from 'express';
|
|
2
|
+
/** Buffer a single bounded file so rejected multipart requests never reach storage. */
|
|
3
|
+
export declare function readAttachment(request: Request, limits: {
|
|
4
|
+
maxBytes: number;
|
|
5
|
+
maxFields: number;
|
|
6
|
+
}): Promise<{
|
|
7
|
+
data: Buffer;
|
|
8
|
+
fileName: string;
|
|
9
|
+
mimeType: string;
|
|
10
|
+
encoding: string;
|
|
11
|
+
}>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readAttachment = readAttachment;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const busboy_1 = tslib_1.__importDefault(require("busboy"));
|
|
7
|
+
/** Buffer a single bounded file so rejected multipart requests never reach storage. */
|
|
8
|
+
function readAttachment(request, limits) {
|
|
9
|
+
return new Promise((resolve, reject) => {
|
|
10
|
+
let parser;
|
|
11
|
+
try {
|
|
12
|
+
parser = (0, busboy_1.default)({
|
|
13
|
+
headers: request.headers,
|
|
14
|
+
limits: {
|
|
15
|
+
fileSize: limits.maxBytes + 1,
|
|
16
|
+
files: 1,
|
|
17
|
+
fields: limits.maxFields,
|
|
18
|
+
// busboy emits partsLimit on reaching the count, so allow one spare part:
|
|
19
|
+
// the file plus the fields stay under it and anything more is rejected.
|
|
20
|
+
parts: 2 + limits.maxFields,
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
reject(new common_1.BadRequestException('Invalid multipart upload'));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const chunks = [];
|
|
29
|
+
let info;
|
|
30
|
+
let settled = false;
|
|
31
|
+
const aborted = () => fail(new common_1.BadRequestException('Upload interrupted'));
|
|
32
|
+
const cleanup = () => {
|
|
33
|
+
request.off('aborted', aborted);
|
|
34
|
+
request.off('error', fail);
|
|
35
|
+
};
|
|
36
|
+
const fail = (error) => {
|
|
37
|
+
if (settled)
|
|
38
|
+
return;
|
|
39
|
+
settled = true;
|
|
40
|
+
cleanup();
|
|
41
|
+
request.unpipe(parser);
|
|
42
|
+
request.resume();
|
|
43
|
+
// Busboy can emit its file event while parsing; let that callback unwind.
|
|
44
|
+
queueMicrotask(() => parser.destroy());
|
|
45
|
+
reject(error);
|
|
46
|
+
};
|
|
47
|
+
const limit = () => fail(new common_1.PayloadTooLargeException(`One file up to ${limits.maxBytes} bytes and ${limits.maxFields} form fields are allowed`));
|
|
48
|
+
parser.on('file', (_field, file, metadata) => {
|
|
49
|
+
info = metadata;
|
|
50
|
+
file.on('error', fail);
|
|
51
|
+
file.on('limit', limit);
|
|
52
|
+
file.on('data', (chunk) => {
|
|
53
|
+
if (!settled)
|
|
54
|
+
chunks.push(chunk);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
parser.on('filesLimit', limit);
|
|
58
|
+
parser.on('fieldsLimit', limit);
|
|
59
|
+
parser.on('partsLimit', limit);
|
|
60
|
+
parser.on('error', () => fail(new common_1.BadRequestException('Invalid multipart upload')));
|
|
61
|
+
parser.on('finish', () => {
|
|
62
|
+
if (settled)
|
|
63
|
+
return;
|
|
64
|
+
if (!info)
|
|
65
|
+
return fail(new common_1.BadRequestException('A file is required'));
|
|
66
|
+
settled = true;
|
|
67
|
+
cleanup();
|
|
68
|
+
resolve({
|
|
69
|
+
data: Buffer.concat(chunks),
|
|
70
|
+
fileName: info.filename,
|
|
71
|
+
mimeType: info.mimeType,
|
|
72
|
+
encoding: info.encoding,
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
request.once('aborted', aborted);
|
|
76
|
+
request.once('error', fail);
|
|
77
|
+
request.pipe(parser);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=read-attachment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-attachment.js","sourceRoot":"","sources":["../../../../../../../../../packages/crud/shell/nestjs/src/lib/controllers/crud/read-attachment.ts"],"names":[],"mappings":";;AAKA,wCAkFC;;AAvFD,2CAA+E;AAC/E,4DAA4B;AAG5B,uFAAuF;AACvF,SAAgB,cAAc,CAC5B,OAAgB,EAChB,MAA+C;IAO/C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,MAAiC,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,GAAG,IAAA,gBAAM,EAAC;gBACd,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,MAAM,EAAE;oBACN,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG,CAAC;oBAC7B,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,MAAM,CAAC,SAAS;oBACxB,0EAA0E;oBAC1E,wEAAwE;oBACxE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,SAAS;iBAC5B;aACF,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,4BAAmB,CAAC,0BAA0B,CAAC,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,IACkE,CAAC;QACvE,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,4BAAmB,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,KAAY,EAAE,EAAE;YAC5B,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACvB,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,0EAA0E;YAC1E,cAAc,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,GAAG,EAAE,CACjB,IAAI,CACF,IAAI,iCAAwB,CAC1B,kBAAkB,MAAM,CAAC,QAAQ,cAAc,MAAM,CAAC,SAAS,0BAA0B,CAC1F,CACF,CAAC;QACJ,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YAC3C,IAAI,GAAG,QAAQ,CAAC;YAChB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACvB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACxB,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAChC,IAAI,CAAC,OAAO;oBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAC/B,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAC/B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CACtB,IAAI,CAAC,IAAI,4BAAmB,CAAC,0BAA0B,CAAC,CAAC,CAC1D,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACvB,IAAI,OAAO;gBAAE,OAAO;YACpB,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC,IAAI,4BAAmB,CAAC,oBAAoB,CAAC,CAAC,CAAC;YACtE,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,EAAE,CAAC;YACV,OAAO,CAAC;gBACN,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,16 +1,26 @@
|
|
|
1
|
+
import { JwtService } from '@nestjs/jwt';
|
|
1
2
|
import { OnGatewayConnection, OnGatewayDisconnect, OnGatewayInit, WsResponse } from '@nestjs/websockets';
|
|
2
3
|
import { Observable } from 'rxjs';
|
|
3
4
|
import type { Socket } from 'socket.io';
|
|
4
5
|
import { CrudService } from '@smartsoft001/crud-shell-app-services';
|
|
5
6
|
import { ItemChangedData } from '@smartsoft001/crud-shell-dtos';
|
|
6
7
|
import { IEntity } from '@smartsoft001/domain-core';
|
|
8
|
+
import { SharedConfig } from '@smartsoft001/nestjs';
|
|
7
9
|
export declare class CrudGateway<T extends IEntity<string>> implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect {
|
|
8
10
|
private service;
|
|
11
|
+
private config?;
|
|
12
|
+
private jwt?;
|
|
9
13
|
private _clientsSubscriptions;
|
|
10
|
-
constructor(service: CrudService<T
|
|
14
|
+
constructor(service: CrudService<T>, config?: SharedConfig, jwt?: JwtService);
|
|
11
15
|
handleFilter(data: {
|
|
12
16
|
id?: string;
|
|
13
|
-
}, client: Socket): Observable<WsResponse<ItemChangedData
|
|
17
|
+
}, client: Socket): Observable<WsResponse<Pick<ItemChangedData, 'id' | 'type'>>>;
|
|
18
|
+
/**
|
|
19
|
+
* Verifies the token and asks `changePolicy`. `type` is absent when the subscription opens and
|
|
20
|
+
* carries the change type before each event, so a policy can allow a delete without loading
|
|
21
|
+
* a resource that no longer exists.
|
|
22
|
+
*/
|
|
23
|
+
private authorize;
|
|
14
24
|
afterInit(server: any): void;
|
|
15
25
|
handleDisconnect(client: any): void;
|
|
16
26
|
private clearSubscription;
|
|
@@ -2,24 +2,75 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CrudGateway = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const jwt_1 = require("@nestjs/jwt");
|
|
5
7
|
const websockets_1 = require("@nestjs/websockets");
|
|
6
8
|
const rxjs_1 = require("rxjs");
|
|
7
9
|
const crud_shell_app_services_1 = require("@smartsoft001/crud-shell-app-services");
|
|
10
|
+
const nestjs_1 = require("@smartsoft001/nestjs");
|
|
8
11
|
let CrudGateway = class CrudGateway {
|
|
9
12
|
service;
|
|
13
|
+
config;
|
|
14
|
+
jwt;
|
|
10
15
|
_clientsSubscriptions = new Map();
|
|
11
|
-
constructor(service) {
|
|
16
|
+
constructor(service, config, jwt) {
|
|
12
17
|
this.service = service;
|
|
18
|
+
this.config = config;
|
|
19
|
+
this.jwt = jwt;
|
|
13
20
|
}
|
|
14
21
|
handleFilter(data, client) {
|
|
15
22
|
const event = 'changes';
|
|
16
23
|
return new rxjs_1.Observable((observer) => {
|
|
17
24
|
this.clearSubscription(client);
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
25
|
+
const subscription = (0, rxjs_1.from)(this.authorize(data, client))
|
|
26
|
+
.pipe((0, rxjs_1.switchMap)(() => this.service.changes({ id: data.id })), (0, rxjs_1.filter)((change) => change.id === data.id), (0, rxjs_1.concatMap)((change) => (0, rxjs_1.from)(this.authorize(data, client, change.type)).pipe((0, rxjs_1.map)(() => ({
|
|
27
|
+
event,
|
|
28
|
+
data: { id: change.id, type: change.type },
|
|
29
|
+
})))))
|
|
30
|
+
.subscribe(observer);
|
|
31
|
+
this._clientsSubscriptions.set(client.id, subscription);
|
|
32
|
+
return () => {
|
|
33
|
+
subscription.unsubscribe();
|
|
34
|
+
if (this._clientsSubscriptions.get(client.id) === subscription) {
|
|
35
|
+
this._clientsSubscriptions.delete(client.id);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
21
38
|
});
|
|
22
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Verifies the token and asks `changePolicy`. `type` is absent when the subscription opens and
|
|
42
|
+
* carries the change type before each event, so a policy can allow a delete without loading
|
|
43
|
+
* a resource that no longer exists.
|
|
44
|
+
*/
|
|
45
|
+
async authorize(data, client, type) {
|
|
46
|
+
try {
|
|
47
|
+
const token = client.handshake?.auth?.['token'];
|
|
48
|
+
if (!data ||
|
|
49
|
+
typeof data.id !== 'string' ||
|
|
50
|
+
!data.id ||
|
|
51
|
+
data.id.length > 128 ||
|
|
52
|
+
!this.jwt ||
|
|
53
|
+
!this.config?.changePolicy ||
|
|
54
|
+
typeof token !== 'string' ||
|
|
55
|
+
token.length > 8192) {
|
|
56
|
+
throw new Error('Denied');
|
|
57
|
+
}
|
|
58
|
+
const payload = await this.jwt.verifyAsync(token);
|
|
59
|
+
if (typeof payload.sub !== 'string' || !payload.sub)
|
|
60
|
+
throw new Error('Denied');
|
|
61
|
+
const user = {
|
|
62
|
+
username: payload.sub,
|
|
63
|
+
permissions: Array.isArray(payload.permissions)
|
|
64
|
+
? payload.permissions.filter((p) => typeof p === 'string')
|
|
65
|
+
: [],
|
|
66
|
+
};
|
|
67
|
+
if ((await this.config.changePolicy({ id: data.id, user, type })) !== true)
|
|
68
|
+
throw new Error('Denied');
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
throw new websockets_1.WsException('Change subscription denied');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
23
74
|
afterInit(server) {
|
|
24
75
|
this._clientsSubscriptions = new Map();
|
|
25
76
|
console.log('CrudGateway Init');
|
|
@@ -54,6 +105,10 @@ exports.CrudGateway = CrudGateway = tslib_1.__decorate([
|
|
|
54
105
|
path: '/' + process.env.URL_PREFIX + '/_socket',
|
|
55
106
|
namespace: '/' + process.env.URL_PREFIX,
|
|
56
107
|
}),
|
|
57
|
-
tslib_1.
|
|
108
|
+
tslib_1.__param(1, (0, common_1.Optional)()),
|
|
109
|
+
tslib_1.__param(2, (0, common_1.Optional)()),
|
|
110
|
+
tslib_1.__metadata("design:paramtypes", [crud_shell_app_services_1.CrudService,
|
|
111
|
+
nestjs_1.SharedConfig,
|
|
112
|
+
jwt_1.JwtService])
|
|
58
113
|
], CrudGateway);
|
|
59
114
|
//# sourceMappingURL=crud.gateway.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud.gateway.js","sourceRoot":"","sources":["../../../../../../../../../packages/crud/shell/nestjs/src/lib/gateways/crud/crud.gateway.ts"],"names":[],"mappings":";;;;AAAA,
|
|
1
|
+
{"version":3,"file":"crud.gateway.js","sourceRoot":"","sources":["../../../../../../../../../packages/crud/shell/nestjs/src/lib/gateways/crud/crud.gateway.ts"],"names":[],"mappings":"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"}
|
package/src/lib/nestjs.module.js
CHANGED
|
@@ -27,7 +27,8 @@ let CrudShellNestjsModule = CrudShellNestjsModule_1 = class CrudShellNestjsModul
|
|
|
27
27
|
auth_guard_1.AuthJwtGuard,
|
|
28
28
|
],
|
|
29
29
|
imports: [
|
|
30
|
-
...(options.restApi &&
|
|
30
|
+
...((options.restApi || options.socket) &&
|
|
31
|
+
tokenConfig?.secretOrPrivateKey
|
|
31
32
|
? [
|
|
32
33
|
passport_1.PassportModule.register({
|
|
33
34
|
defaultStrategy: 'jwt',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nestjs.module.js","sourceRoot":"","sources":["../../../../../../../packages/crud/shell/nestjs/src/lib/nestjs.module.ts"],"names":[],"mappings":";;;;;AAAA,2CAAuD;AACvD,qCAAwC;AACxC,+CAAkD;AAElD,mFAAiE;AACjE,+CAAkD;AAClD,iDAAkE;AAElE,+CAA4C;AAC5C,yCAAsC;AACtC,yDAAwD;AAGjD,IAAM,qBAAqB,6BAA3B,MAAM,qBAAqB;IAChC,MAAM,CAAC,OAAO,CACZ,OAaC;QAED,6EAA6E;QAC7E,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACxC,2EAA2E;QAC3E,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;QAEtE,OAAO;YACL,MAAM,EAAE,uBAAqB;YAC7B,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAW,CAAC,CAAC,CAAC,EAAE;YAC/C,SAAS,EAAE;gBACT,GAAG,kCAAQ;gBACX,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnC,yBAAY;aACb;YACD,OAAO,EAAE;gBACP,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,WAAW,EAAE,kBAAkB;
|
|
1
|
+
{"version":3,"file":"nestjs.module.js","sourceRoot":"","sources":["../../../../../../../packages/crud/shell/nestjs/src/lib/nestjs.module.ts"],"names":[],"mappings":";;;;;AAAA,2CAAuD;AACvD,qCAAwC;AACxC,+CAAkD;AAElD,mFAAiE;AACjE,+CAAkD;AAClD,iDAAkE;AAElE,+CAA4C;AAC5C,yCAAsC;AACtC,yDAAwD;AAGjD,IAAM,qBAAqB,6BAA3B,MAAM,qBAAqB;IAChC,MAAM,CAAC,OAAO,CACZ,OAaC;QAED,6EAA6E;QAC7E,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACxC,2EAA2E;QAC3E,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;QAEtE,OAAO;YACL,MAAM,EAAE,uBAAqB;YAC7B,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAW,CAAC,CAAC,CAAC,EAAE;YAC/C,SAAS,EAAE;gBACT,GAAG,kCAAQ;gBACX,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnC,yBAAY;aACb;YACD,OAAO,EAAE;gBACP,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;oBACvC,WAAW,EAAE,kBAAkB;oBAC7B,CAAC,CAAC;wBACE,yBAAc,CAAC,QAAQ,CAAC;4BACtB,eAAe,EAAE,KAAK;4BACtB,OAAO,EAAE,KAAK;yBACf,CAAC;wBACF,eAAS,CAAC,QAAQ,CAAC;4BACjB,MAAM,EAAE,WAAW,CAAC,kBAAkB;4BACtC,WAAW,EAAE;gCACX,SAAS,EAAE,WAAW,CAAC,SAAS;6BACjC;yBACF,CAAC;qBACH;oBACH,CAAC,CAAC,EAAE,CAAC;gBACP,qBAAY,CAAC,UAAU,CAAC,MAAM,CAAC;gBAC/B,mBAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;aAChC;YACD,OAAO,EAAE,CAAC,GAAG,kCAAQ,EAAE,yBAAY,EAAE,mBAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;SACtE,CAAC;IACJ,CAAC;CACF,CAAA;AApDY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,qBAAqB,CAoDjC;AAGM,IAAM,yBAAyB,iCAA/B,MAAM,yBAAyB;IACpC;;;OAGG;IACH,MAAM,CAAC,OAAO,CACZ,OAWC;QAED,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;QAEtE,OAAO;YACL,MAAM,EAAE,2BAAyB;YACjC,SAAS,EAAE,CAAC,GAAG,kCAAQ,EAAE,GAAG,mBAAQ,EAAE,yBAAY,CAAC;YACnD,OAAO,EAAE;gBACP,yBAAc,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gBACnE,eAAS,CAAC,QAAQ,CAAC;oBACjB,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,kBAAkB;oBAC9C,WAAW,EAAE;wBACX,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,SAAS;qBACzC;iBACF,CAAC;gBACF,qBAAY,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC5B,mBAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;aAChC;YACD,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;CACF,CAAA;AAtCY,8DAAyB;oCAAzB,yBAAyB;IADrC,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,yBAAyB,CAsCrC"}
|