@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 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 an attachment for an entity.</td></tr>
31
- <tr><td>GET /attachments/:id</td><td>downloadAttachment — Downloads an attachment by its ID.</td></tr>
32
- <tr><td>DELETE /attachments/:id</td><td>deleteAttachment — Deletes an attachment by its ID.</td></tr>
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 for entities and streams updates to the client.</td></tr>
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.183.0",
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.183.0",
38
- "@smartsoft001/crud-shell-app-services": "2.183.0",
39
- "@smartsoft001/crud-shell-dtos": "2.183.0",
40
- "@smartsoft001/domain-core": "2.183.0",
41
- "@smartsoft001/mongo": "2.183.0",
42
- "@smartsoft001/nestjs": "2.183.0",
43
- "@smartsoft001/users": "2.183.0",
44
- "@smartsoft001/utils": "2.183.0",
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): Writable;
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
- const readable = new stream_1.Readable();
86
- // eslint-disable-next-line @typescript-eslint/no-empty-function
87
- readable._read = () => { };
88
- // Both stay undefined when the request carried no file part.
89
- let fileName;
90
- let mimeType;
91
- parser.on('file', (field, file, info) => {
92
- fileName = info.filename;
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
- parser.on('finish', function () {
106
- readable.push(null);
107
- response.set('Location', CrudController_1.getLink(response.req) + '/' + id);
108
- response.json({
109
- id,
110
- fileName,
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", stream_1.Writable)
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
- this._clientsSubscriptions.set(client.id, this.service.changes(data).subscribe((res) => {
19
- observer.next({ event, data: res });
20
- }, (error) => observer.error(error)));
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.__metadata("design:paramtypes", [crud_shell_app_services_1.CrudService])
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,mDAS4B;AAC5B,+BAAgD;AAGhD,mFAAoE;AAS7D,IAAM,WAAW,GAAjB,MAAM,WAAW;IAKF;IAFZ,qBAAqB,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEhE,YAAoB,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAG/C,YAAY,CACK,IAAqB,EACjB,MAAc;QAEjC,MAAM,KAAK,GAAG,SAAS,CAAC;QAExB,OAAO,IAAI,iBAAU,CAA8B,CAAC,QAAQ,EAAE,EAAE;YAC9D,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAE/B,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAC5B,MAAM,CAAC,EAAE,EACT,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAClC,CAAC,GAAG,EAAE,EAAE;gBACN,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;YACtC,CAAC,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CACjC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,MAAW;QACnB,IAAI,CAAC,qBAAqB,GAAG,IAAI,GAAG,EAAwB,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAClC,CAAC;IAED,gBAAgB,CAAC,MAAW;QAC1B,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAE/B,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC;IAEO,iBAAiB,CAAC,MAAsB;QAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE/D,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,CAAC,WAAW,EAAE,CAAC;YAC3B,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,gBAAgB,CAAC,MAAW,EAAE,GAAG,IAAW;QAC1C,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;CACF,CAAA;AApDY,kCAAW;AAQtB;IADC,IAAA,6BAAgB,EAAC,SAAS,CAAC;IAEzB,mBAAA,IAAA,wBAAW,GAAE,CAAA;IACb,mBAAA,IAAA,4BAAe,GAAE,CAAA;;;4CACjB,iBAAU;+CAgBZ;sBA3BU,WAAW;IALvB,IAAA,6BAAgB,EAAC;QAChB,UAAU,EAAE,CAAC,WAAW,CAAC;QACzB,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,UAAU;QAC/C,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU;KACxC,CAAC;6CAM6B,qCAAW;GAL7B,WAAW,CAoDvB"}
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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"}
@@ -27,7 +27,8 @@ let CrudShellNestjsModule = CrudShellNestjsModule_1 = class CrudShellNestjsModul
27
27
  auth_guard_1.AuthJwtGuard,
28
28
  ],
29
29
  imports: [
30
- ...(options.restApi && tokenConfig?.secretOrPrivateKey
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;oBACpD,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;AAnDY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,qBAAqB,CAmDjC;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"}
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"}