@volontariapp/domain-storage 0.9.0 → 0.10.0-snap-82a898f

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +18 -2
  2. package/dist/entities/file.entity.d.ts +1 -1
  3. package/dist/entities/file.entity.d.ts.map +1 -1
  4. package/dist/entities/file.entity.js +6 -3
  5. package/dist/entities/file.entity.js.map +1 -1
  6. package/dist/enums/file-attachment-outcome.enum.d.ts +8 -0
  7. package/dist/enums/file-attachment-outcome.enum.d.ts.map +1 -0
  8. package/dist/enums/file-attachment-outcome.enum.js +9 -0
  9. package/dist/enums/file-attachment-outcome.enum.js.map +1 -0
  10. package/dist/enums/index.d.ts +1 -0
  11. package/dist/enums/index.d.ts.map +1 -1
  12. package/dist/enums/index.js +1 -0
  13. package/dist/enums/index.js.map +1 -1
  14. package/dist/models/index.js.map +1 -1
  15. package/dist/policies/attachment-validation.rule.d.ts +13 -0
  16. package/dist/policies/attachment-validation.rule.d.ts.map +1 -1
  17. package/dist/policies/attachment-validation.rule.js +35 -0
  18. package/dist/policies/attachment-validation.rule.js.map +1 -1
  19. package/dist/repositories/file-outbox.builders.d.ts +11 -1
  20. package/dist/repositories/file-outbox.builders.d.ts.map +1 -1
  21. package/dist/repositories/file-outbox.builders.js +25 -1
  22. package/dist/repositories/file-outbox.builders.js.map +1 -1
  23. package/dist/repositories/file-repository.types.d.ts +36 -0
  24. package/dist/repositories/file-repository.types.d.ts.map +1 -1
  25. package/dist/repositories/interfaces/file.repository.d.ts +5 -1
  26. package/dist/repositories/interfaces/file.repository.d.ts.map +1 -1
  27. package/dist/repositories/postgres-file.repository.d.ts +10 -2
  28. package/dist/repositories/postgres-file.repository.d.ts.map +1 -1
  29. package/dist/repositories/postgres-file.repository.js +217 -3
  30. package/dist/repositories/postgres-file.repository.js.map +1 -1
  31. package/dist/test/confirmation-validation.rule.unit.spec.d.ts +2 -0
  32. package/dist/test/confirmation-validation.rule.unit.spec.d.ts.map +1 -0
  33. package/dist/test/confirmation-validation.rule.unit.spec.js +85 -0
  34. package/dist/test/confirmation-validation.rule.unit.spec.js.map +1 -0
  35. package/dist/test/file-outbox.builders.unit.spec.js +52 -3
  36. package/dist/test/file-outbox.builders.unit.spec.js.map +1 -1
  37. package/dist/test/file.entity.unit.spec.js +23 -5
  38. package/dist/test/file.entity.unit.spec.js.map +1 -1
  39. package/dist/test/helpers/file-db.helper.d.ts +2 -2
  40. package/dist/test/helpers/file-db.helper.d.ts.map +1 -1
  41. package/dist/test/helpers/file-db.helper.js +2 -8
  42. package/dist/test/helpers/file-db.helper.js.map +1 -1
  43. package/dist/test/integration/postgres-file.repository.attach-release.int.spec.d.ts +2 -0
  44. package/dist/test/integration/postgres-file.repository.attach-release.int.spec.d.ts.map +1 -0
  45. package/dist/test/integration/postgres-file.repository.attach-release.int.spec.js +623 -0
  46. package/dist/test/integration/postgres-file.repository.attach-release.int.spec.js.map +1 -0
  47. package/dist/test/integration/postgres-file.repository.int.spec.js +5 -56
  48. package/dist/test/integration/postgres-file.repository.int.spec.js.map +1 -1
  49. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.10.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`11fe06c`](https://github.com/Volontariapp/npm-packages/commit/11fe06c3eda4b27b9f089d90fbf5a3e862587d74) Thanks [@VictorAgahi](https://github.com/VictorAgahi)! - Add `attachFromConfirmationEvent`, `releaseForEntity`, `releaseFile` and `releaseForOwner` to `PostgresFileRepository` / `IFileRepository` (ticket 1.11).
8
+
9
+ - `attachFromConfirmationEvent({ fileIds, entityType, entityId, ownerId })` attaches the files named by a confirmation event, on the synchronous path (`RESERVED` for the entity) and the asynchronous one (`PENDING`, never reserved). It reuses the rule of `reserve`: the new pure `classifyFileForConfirmation` delegates to `classifyFileForAttachment` for every file the entity does not already hold. One transaction, under a per entity `pg_advisory_xact_lock` (doc 11 P1): an entity with a tombstone releases the named `PENDING` / `RESERVED` files of the owner instead of attaching them; a file attached after its scan ended writes `storage.file_scanned` / `storage.file_rejected`; a file the rule refuses writes `storage.attachment_rejected` (`NOT_FOUND`, `WRONG_ENTITY_TYPE`, `NOT_CONFIRMED`, `CONTENT_REJECTED`, `ALREADY_ATTACHED`); a replay (`ATTACHED` or `ORPHANED` for the entity) writes nothing. It returns one `FileAttachmentResult` per file (`FileAttachmentOutcome`).
10
+ - `releaseForEntity({ entityType, entityId })` writes the `released_entities` tombstone (`ReleasedEntityEntity`, `ON CONFLICT DO NOTHING`) and orphans the `RESERVED` / `ATTACHED` files of the entity, in one transaction under the same lock.
11
+ - `releaseFile({ fileId, entityType, entityId, ownerId?, newFileId? })` orphans a named file from `PENDING` (owner required, `entity_id` recorded), `RESERVED` or `ATTACHED` (matched on the entity, owner optional for events without owner such as the badge icon); it is skipped when `newFileId` is the same file.
12
+ - `releaseForOwner({ ownerId })` orphans every `PENDING` / `RESERVED` / `ATTACHED` file of the owner except the `BADGE_ICON` platform resources (`OWNER_RELEASE_EXCLUDED_ENTITY_TYPES`).
13
+ - `ORPHANED` is absorbing and every method is idempotent. No method reads or writes a date condition.
14
+
15
+ Also, from the review of the repository refactor: `now` is removed from `NewFileData` (a caller could backdate `createdAt` and the upload deadline), and `FileEntity.create` refuses a `presignedUrlTtlSeconds` above `MAX_PRESIGNED_URL_TTL_SECONDS` (7 days) with a `BadRequestError` instead of an Invalid Date that only failed in the database driver.
16
+
17
+ WARNING, unchanged: `StorageStream` does not exist in `@volontariapp/shared` (ticket 1.14), so every storage event of this package is written with an empty `targetServices` (`FILE_SCAN_RESULT_TARGET_SERVICES`): `storage.file_scanned`, `storage.file_rejected` and, new in this version, `storage.attachment_rejected` (written by `attachFromConfirmationEvent`). The outbox pusher skips such a row without an error and the consumer marks it `COMPLETED`: the event is silently lost, and the post media or the cover would stay `PENDING`. Do not wire these methods into `post-processor-storage`, `ms-storage` or `worker-storage` before `StorageStream` exists and the constant is filled.
18
+
3
19
  ## 0.9.0
4
20
 
5
21
  ### Minor Changes
@@ -7,10 +23,10 @@
7
23
  - [`3ef7b69`](https://github.com/Volontariapp/npm-packages/commit/3ef7b69ced4e5561c5dc6dcbeff8ec219aadbf29) Thanks [@VictorAgahi](https://github.com/VictorAgahi)! - Align the file repository on the `domain-user` pattern.
8
24
 
9
25
  - Add `FileEntity` (pure domain class, exported by the root entry point) whose `FileEntity.create` holds the declaration invariants: allowed MIME type, validation mode resolved from the declared size, quarantine key, and `uploadExpiresAt` computed as creation + presigned URL lifetime + 5 minutes. Add `ReleasedEntityEntity` for the `released_entities` tombstone (used by ticket 1.11).
10
- - Add `registerStorageMappings()` (sub-path `@volontariapp/domain-storage/models`, also run when that sub-path is imported) mapping `FileEntity`, `ReleasedEntityEntity` and the outbox entities to their models.
26
+ - Add `registerStorageMappings()` (sub-path `@volontariapp/domain-storage/models`, also run when that sub-path is imported: unlike `domain-post` and `domain-event`, which register at the import of their root entry point, the root of this package must not load `typeorm`; `domain-user` leaves the registration to the consumer) mapping `FileEntity`, `ReleasedEntityEntity` and the outbox entities to their models.
11
27
  - Add `IFileRepository`, which returns entities. `PostgresFileRepository` now extends `BaseRepository<FileModel, FileEntity>`, is `@Injectable()` and writes `jobs_outbox` / `event_queue` through `JobsOutboxRepository` / `EventQueueRepository` of `@volontariapp/outbox`. Add `findByEntity`; `findById`, `findByIds` come from `BaseRepository`. Transitions (`confirmUpload`, `switchToAsync`, `resetToAwaitingUpload`, `completeScan`, `rejectScan`, `reserve`) stay single conditional `UPDATE ... RETURNING` statements.
12
28
 
13
- BREAKING for direct users of the repository (none yet: `ms-storage` does not use it): the constructor takes a `Repository<FileModel>` (`@InjectRepository(FileModel)`) instead of a `DataSource`; `createPending` takes `{ ownerId, entityType, declaredMimeType, declaredSize, presignedUrlTtlSeconds, id?, now? }` (the quarantine key, validation mode and deadline are derived) and returns a `FileEntity`; `reserve` returns `FileEntity[]`. New dependencies: `@nestjs/common`, `@volontariapp/outbox`; dev: `@nestjs/typeorm`.
29
+ BREAKING for direct users of the repository (none yet: `ms-storage` does not use it): the constructor takes a `Repository<FileModel>` (`@InjectRepository(FileModel)`) instead of a `DataSource`; `createPending` takes `{ ownerId, entityType, declaredMimeType, declaredSize, presignedUrlTtlSeconds, id? }` (the quarantine key, validation mode and deadline are derived; the creation instant is always the current time, and the presigned URL lifetime is refused above `MAX_PRESIGNED_URL_TTL_SECONDS`, 7 days, with a `BadRequestError`) and returns a `FileEntity`; `reserve` returns `FileEntity[]`. New dependencies: `@nestjs/common`, `@volontariapp/outbox`; dev: `@nestjs/typeorm`.
14
30
 
15
31
  WARNING, unchanged: do not wire `completeScan` / `rejectScan` into `ms-storage` or `worker-storage` yet. `StorageStream` does not exist in `@volontariapp/shared` (ticket 1.14), so `FILE_SCAN_RESULT_TARGET_SERVICES` is still empty: the outbox pusher skips such an `event_queue` row without an error and the event is silently lost.
16
32
 
@@ -4,6 +4,7 @@ import type { RejectionReason } from '../enums/rejection-reason.enum.js';
4
4
  import { ScanStatus } from '../enums/scan-status.enum.js';
5
5
  import type { ValidationMode } from '../enums/validation-mode.enum.js';
6
6
  export declare const UPLOAD_EXPIRY_GRACE_MS: number;
7
+ export declare const MAX_PRESIGNED_URL_TTL_SECONDS: number;
7
8
  export interface NewFileData {
8
9
  id?: string;
9
10
  ownerId: string;
@@ -11,7 +12,6 @@ export interface NewFileData {
11
12
  declaredMimeType: string;
12
13
  declaredSize: number;
13
14
  presignedUrlTtlSeconds: number;
14
- now?: Date;
15
15
  }
16
16
  export declare class FileEntity {
17
17
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"file.entity.d.ts","sourceRoot":"","sources":["../../src/entities/file.entity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAWvE,eAAO,MAAM,sBAAsB,QAAgB,CAAC;AAGpD,MAAM,WAAW,WAAW;IAE1B,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IAEzB,YAAY,EAAE,MAAM,CAAC;IAErB,sBAAsB,EAAE,MAAM,CAAC;IAE/B,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAWD,qBAAa,UAAU;IACrB,EAAE,EAAG,MAAM,CAAC;IACZ,OAAO,EAAG,MAAM,CAAC;IACjB,UAAU,EAAG,UAAU,CAAC;IACxB,QAAQ,EAAG,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAG,UAAU,CAAC;IACpB,UAAU,EAAG,UAAU,CAAC;IACxB,eAAe,EAAG,eAAe,GAAG,IAAI,CAAC;IACzC,gBAAgB,EAAG,MAAM,CAAC;IAC1B,YAAY,EAAG,MAAM,CAAC;IACtB,UAAU,EAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAG,MAAM,CAAC;IACvB,SAAS,EAAG,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAG,MAAM,CAAC;IACtB,iBAAiB,EAAG,IAAI,GAAG,IAAI,CAAC;IAChC,cAAc,EAAG,cAAc,CAAC;IAChC,eAAe,EAAG,IAAI,CAAC;IACvB,WAAW,EAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAG,IAAI,GAAG,IAAI,CAAC;IACxB,UAAU,EAAG,IAAI,GAAG,IAAI,CAAC;IACzB,UAAU,EAAG,IAAI,GAAG,IAAI,CAAC;IACzB,SAAS,EAAG,IAAI,CAAC;IACjB,SAAS,EAAG,IAAI,CAAC;IAUjB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU;CAgD7C"}
1
+ {"version":3,"file":"file.entity.d.ts","sourceRoot":"","sources":["../../src/entities/file.entity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAWvE,eAAO,MAAM,sBAAsB,QAAgB,CAAC;AAOpD,eAAO,MAAM,6BAA6B,QAAmB,CAAC;AAG9D,MAAM,WAAW,WAAW;IAE1B,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IAEzB,YAAY,EAAE,MAAM,CAAC;IAErB,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAWD,qBAAa,UAAU;IACrB,EAAE,EAAG,MAAM,CAAC;IACZ,OAAO,EAAG,MAAM,CAAC;IACjB,UAAU,EAAG,UAAU,CAAC;IACxB,QAAQ,EAAG,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAG,UAAU,CAAC;IACpB,UAAU,EAAG,UAAU,CAAC;IACxB,eAAe,EAAG,eAAe,GAAG,IAAI,CAAC;IACzC,gBAAgB,EAAG,MAAM,CAAC;IAC1B,YAAY,EAAG,MAAM,CAAC;IACtB,UAAU,EAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAG,MAAM,CAAC;IACvB,SAAS,EAAG,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAG,MAAM,CAAC;IACtB,iBAAiB,EAAG,IAAI,GAAG,IAAI,CAAC;IAChC,cAAc,EAAG,cAAc,CAAC;IAChC,eAAe,EAAG,IAAI,CAAC;IACvB,WAAW,EAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAG,IAAI,GAAG,IAAI,CAAC;IACxB,UAAU,EAAG,IAAI,GAAG,IAAI,CAAC;IACzB,UAAU,EAAG,IAAI,GAAG,IAAI,CAAC;IACzB,SAAS,EAAG,IAAI,CAAC;IACjB,SAAS,EAAG,IAAI,CAAC;IAUjB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU;CAqD7C"}
@@ -7,6 +7,7 @@ import { resolveValidationMode } from '../policies/resolve-validation-mode.js';
7
7
  import { FileId } from '../value-objects/file-id.vo.js';
8
8
  import { MimeType } from '../value-objects/mime-type.vo.js';
9
9
  export const UPLOAD_EXPIRY_GRACE_MS = 5 * 60 * 1000;
10
+ export const MAX_PRESIGNED_URL_TTL_SECONDS = 7 * 24 * 60 * 60;
10
11
  export class FileEntity {
11
12
  id;
12
13
  ownerId;
@@ -36,14 +37,16 @@ export class FileEntity {
36
37
  ownerId: data.ownerId,
37
38
  });
38
39
  }
39
- if (!Number.isFinite(data.presignedUrlTtlSeconds) || data.presignedUrlTtlSeconds <= 0) {
40
- throw new BadRequestError('Presigned URL lifetime must be a positive number of seconds', 'INVALID_PRESIGNED_URL_TTL', { presignedUrlTtlSeconds: data.presignedUrlTtlSeconds });
40
+ if (!Number.isFinite(data.presignedUrlTtlSeconds) ||
41
+ data.presignedUrlTtlSeconds <= 0 ||
42
+ data.presignedUrlTtlSeconds > MAX_PRESIGNED_URL_TTL_SECONDS) {
43
+ throw new BadRequestError(`Presigned URL lifetime must be between 1 and ${String(MAX_PRESIGNED_URL_TTL_SECONDS)} seconds`, 'INVALID_PRESIGNED_URL_TTL', { presignedUrlTtlSeconds: data.presignedUrlTtlSeconds });
41
44
  }
42
45
  getValidationPolicy(data.entityType);
43
46
  const mimeType = MimeType.create(data.declaredMimeType, data.entityType);
44
47
  const validationMode = resolveValidationMode(data.entityType, data.declaredSize);
45
48
  const id = (data.id === undefined ? FileId.generate() : FileId.create(data.id)).getValue();
46
- const now = data.now ?? new Date();
49
+ const now = new Date();
47
50
  const file = new FileEntity();
48
51
  file.id = id;
49
52
  file.ownerId = data.ownerId;
@@ -1 +1 @@
1
- {"version":3,"file":"file.entity.js","sourceRoot":"","sources":["../../src/entities/file.entity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file.entity.js","sourceRoot":"","sources":["../../src/entities/file.entity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare enum FileAttachmentOutcome {
2
+ ATTACHED = "ATTACHED",
3
+ ALREADY_ATTACHED = "ALREADY_ATTACHED",
4
+ ALREADY_RELEASED = "ALREADY_RELEASED",
5
+ ENTITY_RELEASED = "ENTITY_RELEASED",
6
+ REJECTED = "REJECTED"
7
+ }
8
+ //# sourceMappingURL=file-attachment-outcome.enum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-attachment-outcome.enum.d.ts","sourceRoot":"","sources":["../../src/enums/file-attachment-outcome.enum.ts"],"names":[],"mappings":"AACA,oBAAY,qBAAqB;IAE/B,QAAQ,aAAa;IAErB,gBAAgB,qBAAqB;IAErC,gBAAgB,qBAAqB;IAErC,eAAe,oBAAoB;IAEnC,QAAQ,aAAa;CACtB"}
@@ -0,0 +1,9 @@
1
+ export var FileAttachmentOutcome;
2
+ (function (FileAttachmentOutcome) {
3
+ FileAttachmentOutcome["ATTACHED"] = "ATTACHED";
4
+ FileAttachmentOutcome["ALREADY_ATTACHED"] = "ALREADY_ATTACHED";
5
+ FileAttachmentOutcome["ALREADY_RELEASED"] = "ALREADY_RELEASED";
6
+ FileAttachmentOutcome["ENTITY_RELEASED"] = "ENTITY_RELEASED";
7
+ FileAttachmentOutcome["REJECTED"] = "REJECTED";
8
+ })(FileAttachmentOutcome || (FileAttachmentOutcome = {}));
9
+ //# sourceMappingURL=file-attachment-outcome.enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-attachment-outcome.enum.js","sourceRoot":"","sources":["../../src/enums/file-attachment-outcome.enum.ts"],"names":[],"mappings":"AACA,MAAM,CAAN,IAAY,qBAWX;AAXD,WAAY,qBAAqB;IAE/B,8CAAqB,CAAA;IAErB,8DAAqC,CAAA;IAErC,8DAAqC,CAAA;IAErC,4DAAmC,CAAA;IAEnC,8CAAqB,CAAA;AACvB,CAAC,EAXW,qBAAqB,KAArB,qBAAqB,QAWhC"}
@@ -4,4 +4,5 @@ export * from './scan-status.enum.js';
4
4
  export * from './validation-mode.enum.js';
5
5
  export * from './rejection-reason.enum.js';
6
6
  export * from './attachment-refusal-reason.enum.js';
7
+ export * from './file-attachment-outcome.enum.js';
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/enums/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/enums/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC"}
@@ -4,4 +4,5 @@ export * from './scan-status.enum.js';
4
4
  export * from './validation-mode.enum.js';
5
5
  export * from './rejection-reason.enum.js';
6
6
  export * from './attachment-refusal-reason.enum.js';
7
+ export * from './file-attachment-outcome.enum.js';
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/enums/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/enums/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,aAAa,CAAC;AAG5B,uBAAuB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,aAAa,CAAC;AAK5B,uBAAuB,EAAE,CAAC"}
@@ -25,4 +25,17 @@ export type AttachmentVerdict = {
25
25
  readonly reason: AttachmentRefusalReason;
26
26
  };
27
27
  export declare function classifyFileForAttachment(file: AttachmentCandidate | null, target: AttachmentTarget): AttachmentVerdict;
28
+ export type ConfirmationVerdict = {
29
+ readonly kind: 'ATTACH_RESERVED';
30
+ } | {
31
+ readonly kind: 'ATTACH_PENDING';
32
+ } | {
33
+ readonly kind: 'ALREADY_ATTACHED';
34
+ } | {
35
+ readonly kind: 'ALREADY_RELEASED';
36
+ } | {
37
+ readonly kind: 'REJECTED';
38
+ readonly refusal: AttachmentRefusalReason | 'NOT_FOUND';
39
+ };
40
+ export declare function classifyFileForConfirmation(file: AttachmentCandidate | null, target: AttachmentTarget): ConfirmationVerdict;
28
41
  //# sourceMappingURL=attachment-validation.rule.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"attachment-validation.rule.d.ts","sourceRoot":"","sources":["../../src/policies/attachment-validation.rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AACrF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAI1D,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;CACxB;AAGD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,iBAAiB,GAEzB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAE5B;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GAEjC;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GAC9B;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAA;CAAE,CAAC;AA6B3E,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,mBAAmB,GAAG,IAAI,EAChC,MAAM,EAAE,gBAAgB,GACvB,iBAAiB,CA6BnB"}
1
+ {"version":3,"file":"attachment-validation.rule.d.ts","sourceRoot":"","sources":["../../src/policies/attachment-validation.rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AACrF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAI1D,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;CACxB;AAGD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,iBAAiB,GAEzB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAE5B;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GAEjC;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GAC9B;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAA;CAAE,CAAC;AA6B3E,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,mBAAmB,GAAG,IAAI,EAChC,MAAM,EAAE,gBAAgB,GACvB,iBAAiB,CA6BnB;AAED,MAAM,MAAM,mBAAmB,GAE3B;IAAE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,GAEpC;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAEnC;IAAE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAErC;IAAE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAErC;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,uBAAuB,GAAG,WAAW,CAAA;CAAE,CAAC;AAqC3F,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,mBAAmB,GAAG,IAAI,EAChC,MAAM,EAAE,gBAAgB,GACvB,mBAAmB,CAkBrB"}
@@ -37,4 +37,39 @@ export function classifyFileForAttachment(file, target) {
37
37
  return refused(AttachmentRefusalReason.FILE_RELEASED);
38
38
  }
39
39
  }
40
+ const ATTACH_RESERVED = { kind: 'ATTACH_RESERVED' };
41
+ const ATTACH_PENDING = { kind: 'ATTACH_PENDING' };
42
+ const ALREADY_ATTACHED = { kind: 'ALREADY_ATTACHED' };
43
+ const ALREADY_RELEASED = { kind: 'ALREADY_RELEASED' };
44
+ const verdictForHeldFile = (status) => {
45
+ switch (status) {
46
+ case FileStatus.RESERVED:
47
+ return ATTACH_RESERVED;
48
+ case FileStatus.ATTACHED:
49
+ return ALREADY_ATTACHED;
50
+ case FileStatus.ORPHANED:
51
+ case FileStatus.DELETED:
52
+ return ALREADY_RELEASED;
53
+ case FileStatus.PENDING:
54
+ return null;
55
+ }
56
+ };
57
+ export function classifyFileForConfirmation(file, target) {
58
+ if (file?.ownerId === target.ownerId && isSameEntity(file, target)) {
59
+ const held = verdictForHeldFile(file.status);
60
+ if (held)
61
+ return held;
62
+ }
63
+ const verdict = classifyFileForAttachment(file, target);
64
+ switch (verdict.kind) {
65
+ case 'RESERVE':
66
+ return ATTACH_PENDING;
67
+ case 'NOT_FOUND':
68
+ return { kind: 'REJECTED', refusal: 'NOT_FOUND' };
69
+ case 'REFUSED':
70
+ return { kind: 'REJECTED', refusal: verdict.reason };
71
+ case 'ALREADY_HELD':
72
+ return ALREADY_ATTACHED;
73
+ }
74
+ }
40
75
  //# sourceMappingURL=attachment-validation.rule.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"attachment-validation.rule.js","sourceRoot":"","sources":["../../src/policies/attachment-validation.rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AAErF,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AA2BjE,MAAM,OAAO,GAAsB,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AACvD,MAAM,YAAY,GAAsB,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;AACjE,MAAM,SAAS,GAAsB,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAE3D,MAAM,OAAO,GAAG,CAAC,MAA+B,EAAqB,EAAE,CAAC,CAAC;IACvE,IAAI,EAAE,SAAS;IACf,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,IAAyB,EAAE,MAAwB,EAAW,EAAE,CACpF,IAAI,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU;IACrC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;AAgBjE,MAAM,UAAU,yBAAyB,CACvC,IAAgC,EAChC,MAAwB;IAExB,IAAI,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1C,OAAO,OAAO,CAAC,uBAAuB,CAAC,oBAAoB,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,EAAE,YAAY,EAAE,GAAG,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAChE,MAAM,YAAY,GAChB,IAAI,CAAC,UAAU,KAAK,UAAU,CAAC,KAAK;QACpC,CAAC,IAAI,CAAC,UAAU,KAAK,UAAU,CAAC,QAAQ,IAAI,YAAY,CAAC,CAAC;IAC5D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC,uBAAuB,CAAC,wBAAwB,CAAC,CAAC;IACnE,CAAC;IAED,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,UAAU,CAAC,OAAO;YACrB,OAAO,OAAO,CAAC;QACjB,KAAK,UAAU,CAAC,QAAQ,CAAC;QACzB,KAAK,UAAU,CAAC,QAAQ;YACtB,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC;gBAC/B,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,0BAA0B,CAAC,CAAC;QAClE,KAAK,UAAU,CAAC,QAAQ,CAAC;QACzB,KAAK,UAAU,CAAC,OAAO;YACrB,OAAO,OAAO,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"attachment-validation.rule.js","sourceRoot":"","sources":["../../src/policies/attachment-validation.rule.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,20 @@
1
1
  import { EventQueueEntity, JobsOutboxEntity } from '@volontariapp/database';
2
- import { StorageEventMessagingType, StorageJobType } from '@volontariapp/messaging';
2
+ import { StorageAttachmentRejectionReason, StorageEventMessagingType, StorageJobType } from '@volontariapp/messaging';
3
+ import { AttachmentRefusalReason } from '../enums/attachment-refusal-reason.enum.js';
4
+ import type { EntityType } from '../enums/entity-type.enum.js';
3
5
  import type { RejectionReason } from '../enums/rejection-reason.enum.js';
6
+ import { ScanStatus } from '../enums/scan-status.enum.js';
4
7
  import type { ScanTransitionRow } from './file-repository.types.js';
5
8
  export declare const FILE_OUTBOX_EMITTER = "ms-storage";
6
9
  export declare const FILE_SCAN_RESULT_TARGET_SERVICES: EventQueueEntity['targetServices'];
7
10
  export declare const buildScanFileJob: (fileId: string, ownerId: string) => JobsOutboxEntity<StorageJobType.SCAN_FILE>;
8
11
  export declare const buildFileScannedEvent: (row: ScanTransitionRow) => EventQueueEntity<StorageEventMessagingType.FILE_SCANNED>;
9
12
  export declare const buildFileRejectedEvent: (row: ScanTransitionRow, reason: RejectionReason) => EventQueueEntity<StorageEventMessagingType.FILE_REJECTED>;
13
+ export declare const toAttachmentRejectionReason: (refusal: AttachmentRefusalReason | "NOT_FOUND", scanStatus: ScanStatus | null) => StorageAttachmentRejectionReason;
14
+ export declare const buildAttachmentRejectedEvent: (rejection: {
15
+ fileId: string;
16
+ entityType: EntityType;
17
+ entityId: string;
18
+ reason: StorageAttachmentRejectionReason;
19
+ }, ownerId: string) => EventQueueEntity<StorageEventMessagingType.ATTACHMENT_REJECTED>;
10
20
  //# sourceMappingURL=file-outbox.builders.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-outbox.builders.d.ts","sourceRoot":"","sources":["../../src/repositories/file-outbox.builders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,yBAAyB,EAAE,cAAc,EAAgB,MAAM,yBAAyB,CAAC;AAElG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAGpE,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAUhD,eAAO,MAAM,gCAAgC,EAAE,gBAAgB,CAAC,gBAAgB,CAAM,CAAC;AAEvF,eAAO,MAAM,gBAAgB,WACnB,MAAM,WACL,MAAM,KACd,gBAAgB,CAAC,cAAc,CAAC,SAAS,CAQxC,CAAC;AAiBL,eAAO,MAAM,qBAAqB,QAC3B,iBAAiB,KACrB,gBAAgB,CAAC,yBAAyB,CAAC,YAAY,CAYtD,CAAC;AAEL,eAAO,MAAM,sBAAsB,QAC5B,iBAAiB,UACd,eAAe,KACtB,gBAAgB,CAAC,yBAAyB,CAAC,aAAa,CAavD,CAAC"}
1
+ {"version":3,"file":"file-outbox.builders.d.ts","sourceRoot":"","sources":["../../src/repositories/file-outbox.builders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EACL,gCAAgC,EAChC,yBAAyB,EACzB,cAAc,EAEf,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AACrF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAGpE,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAYhD,eAAO,MAAM,gCAAgC,EAAE,gBAAgB,CAAC,gBAAgB,CAAM,CAAC;AAEvF,eAAO,MAAM,gBAAgB,WACnB,MAAM,WACL,MAAM,KACd,gBAAgB,CAAC,cAAc,CAAC,SAAS,CAQxC,CAAC;AAiBL,eAAO,MAAM,qBAAqB,QAC3B,iBAAiB,KACrB,gBAAgB,CAAC,yBAAyB,CAAC,YAAY,CAYtD,CAAC;AAEL,eAAO,MAAM,sBAAsB,QAC5B,iBAAiB,UACd,eAAe,KACtB,gBAAgB,CAAC,yBAAyB,CAAC,aAAa,CAavD,CAAC;AAQL,eAAO,MAAM,2BAA2B,YAC7B,uBAAuB,GAAG,WAAW,cAClC,UAAU,GAAG,IAAI,KAC5B,gCAcF,CAAC;AAEF,eAAO,MAAM,4BAA4B,cAC5B;IACT,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,gCAAgC,CAAC;CAC1C,WACQ,MAAM,KACd,gBAAgB,CAAC,yBAAyB,CAAC,mBAAmB,CAO7D,CAAC"}
@@ -1,6 +1,8 @@
1
1
  import { EventQueueEntity, JobsOutboxEntity } from '@volontariapp/database';
2
- import { StorageEventMessagingType, StorageJobType, StorageQueue } from '@volontariapp/messaging';
2
+ import { StorageAttachmentRejectionReason, StorageEventMessagingType, StorageJobType, StorageQueue, } from '@volontariapp/messaging';
3
3
  import { InternalServerError } from '@volontariapp/errors';
4
+ import { AttachmentRefusalReason } from '../enums/attachment-refusal-reason.enum.js';
5
+ import { ScanStatus } from '../enums/scan-status.enum.js';
4
6
  export const FILE_OUTBOX_EMITTER = 'ms-storage';
5
7
  export const FILE_SCAN_RESULT_TARGET_SERVICES = [];
6
8
  export const buildScanFileJob = (fileId, ownerId) => JobsOutboxEntity.createJob({
@@ -42,4 +44,26 @@ export const buildFileRejectedEvent = (row, reason) => EventQueueEntity.createEv
42
44
  },
43
45
  targetServices: FILE_SCAN_RESULT_TARGET_SERVICES,
44
46
  });
47
+ export const toAttachmentRejectionReason = (refusal, scanStatus) => {
48
+ switch (refusal) {
49
+ case 'NOT_FOUND':
50
+ case AttachmentRefusalReason.FILE_RELEASED:
51
+ return StorageAttachmentRejectionReason.NOT_FOUND;
52
+ case AttachmentRefusalReason.ENTITY_TYPE_MISMATCH:
53
+ return StorageAttachmentRejectionReason.WRONG_ENTITY_TYPE;
54
+ case AttachmentRefusalReason.ATTACHED_TO_ANOTHER_ENTITY:
55
+ return StorageAttachmentRejectionReason.ALREADY_ATTACHED;
56
+ case AttachmentRefusalReason.SCAN_STATUS_NOT_ACCEPTED:
57
+ return scanStatus === ScanStatus.REJECTED
58
+ ? StorageAttachmentRejectionReason.CONTENT_REJECTED
59
+ : StorageAttachmentRejectionReason.NOT_CONFIRMED;
60
+ }
61
+ };
62
+ export const buildAttachmentRejectedEvent = (rejection, ownerId) => EventQueueEntity.createEvent({
63
+ type: StorageEventMessagingType.ATTACHMENT_REJECTED,
64
+ emitter: FILE_OUTBOX_EMITTER,
65
+ emitterId: ownerId,
66
+ payload: rejection,
67
+ targetServices: FILE_SCAN_RESULT_TARGET_SERVICES,
68
+ });
45
69
  //# sourceMappingURL=file-outbox.builders.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-outbox.builders.js","sourceRoot":"","sources":["../../src/repositories/file-outbox.builders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,yBAAyB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAClG,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAK3D,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAAC;AAUhD,MAAM,CAAC,MAAM,gCAAgC,GAAuC,EAAE,CAAC;AAEvF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,MAAc,EACd,OAAe,EAC6B,EAAE,CAC9C,gBAAgB,CAAC,SAAS,CAA2B;IACnD,IAAI,EAAE,cAAc,CAAC,SAAS;IAC9B,OAAO,EAAE,mBAAmB;IAC5B,SAAS,EAAE,OAAO;IAClB,MAAM,EAAE,YAAY,CAAC,OAAO;IAC5B,OAAO,EAAE,EAAE,MAAM,EAAE;IACnB,WAAW,EAAE,IAAI,IAAI,EAAE;CACxB,CAAC,CAAC;AAML,MAAM,eAAe,GAAG,CAAC,GAAsB,EAAU,EAAE;IACzD,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,mBAAmB,CAC3B,iBAAiB,GAAG,CAAC,EAAE,mBAAmB,EAC1C,8BAA8B,EAC9B,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,CACnB,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC,SAAS,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,GAAsB,EACoC,EAAE,CAC5D,gBAAgB,CAAC,WAAW,CAAyC;IACnE,IAAI,EAAE,yBAAyB,CAAC,YAAY;IAC5C,OAAO,EAAE,mBAAmB;IAC5B,SAAS,EAAE,GAAG,CAAC,QAAQ;IACvB,OAAO,EAAE;QACP,MAAM,EAAE,GAAG,CAAC,EAAE;QACd,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC;KAC/B;IACD,cAAc,EAAE,gCAAgC;CACjD,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,GAAsB,EACtB,MAAuB,EACoC,EAAE,CAC7D,gBAAgB,CAAC,WAAW,CAA0C;IACpE,IAAI,EAAE,yBAAyB,CAAC,aAAa;IAC7C,OAAO,EAAE,mBAAmB;IAC5B,SAAS,EAAE,GAAG,CAAC,QAAQ;IACvB,OAAO,EAAE;QACP,MAAM,EAAE,GAAG,CAAC,EAAE;QACd,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC;QAC9B,MAAM;KACP;IACD,cAAc,EAAE,gCAAgC;CACjD,CAAC,CAAC"}
1
+ {"version":3,"file":"file-outbox.builders.js","sourceRoot":"","sources":["../../src/repositories/file-outbox.builders.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
+ import type { StorageAttachmentRejectionReason } from '@volontariapp/messaging';
1
2
  import type { NewFileData } from '../entities/file.entity.js';
2
3
  import type { EntityType } from '../enums/entity-type.enum.js';
4
+ import type { FileAttachmentOutcome } from '../enums/file-attachment-outcome.enum.js';
3
5
  import type { FileStatus } from '../enums/file-status.enum.js';
4
6
  import type { ScanStatus } from '../enums/scan-status.enum.js';
5
7
  import type { RejectionReason } from '../enums/rejection-reason.enum.js';
@@ -48,4 +50,38 @@ export interface ScanTransitionRow {
48
50
  entity_id: string | null;
49
51
  owner_id: string;
50
52
  }
53
+ export interface AttachFromConfirmationEventInput {
54
+ fileIds: readonly string[];
55
+ entityType: EntityType;
56
+ entityId: string;
57
+ ownerId: string;
58
+ }
59
+ export interface FileAttachmentResult {
60
+ fileId: string;
61
+ outcome: FileAttachmentOutcome;
62
+ rejectionReason?: StorageAttachmentRejectionReason;
63
+ scanEventEmitted: boolean;
64
+ }
65
+ export interface AttachedRow extends ScanTransitionRow {
66
+ scan_status: ScanStatus;
67
+ rejection_reason: RejectionReason | null;
68
+ }
69
+ export interface ReleaseForEntityInput {
70
+ entityType: EntityType;
71
+ entityId: string;
72
+ }
73
+ export interface ReleaseForEntityResult {
74
+ releasedFileIds: string[];
75
+ tombstoneCreated: boolean;
76
+ }
77
+ export interface ReleaseFileInput {
78
+ fileId: string;
79
+ entityType: EntityType;
80
+ entityId: string;
81
+ ownerId?: string;
82
+ newFileId?: string;
83
+ }
84
+ export interface ReleaseForOwnerInput {
85
+ ownerId: string;
86
+ }
51
87
  //# sourceMappingURL=file-repository.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-repository.types.d.ts","sourceRoot":"","sources":["../../src/repositories/file-repository.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAGvE,MAAM,MAAM,sBAAsB,GAAG,WAAW,CAAC;AAEjD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAEhC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IAEjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,UAAU,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,eAAe,CAAC;CACzB;AAGD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IAEf,MAAM,EAAE,UAAU,CAAC;IAEnB,YAAY,EAAE,OAAO,CAAC;CACvB;AAGD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,UAAU,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB"}
1
+ {"version":3,"file":"file-repository.types.d.ts","sourceRoot":"","sources":["../../src/repositories/file-repository.types.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { FileEntity } from '../../entities/file.entity.js';
2
2
  import type { EntityType } from '../../enums/entity-type.enum.js';
3
- import type { CompleteScanInput, ConfirmUploadInput, ConfirmUploadResult, CreatePendingFileInput, RejectScanInput, ReserveFilesInput, ScanTransitionResult } from '../file-repository.types.js';
3
+ import type { AttachFromConfirmationEventInput, CompleteScanInput, ConfirmUploadInput, ConfirmUploadResult, CreatePendingFileInput, FileAttachmentResult, RejectScanInput, ReleaseFileInput, ReleaseForEntityInput, ReleaseForEntityResult, ReleaseForOwnerInput, ReserveFilesInput, ScanTransitionResult } from '../file-repository.types.js';
4
4
  export interface IFileRepository {
5
5
  createPending(input: CreatePendingFileInput): Promise<FileEntity>;
6
6
  findById(id: string): Promise<FileEntity | null>;
@@ -12,5 +12,9 @@ export interface IFileRepository {
12
12
  completeScan(input: CompleteScanInput): Promise<ScanTransitionResult | null>;
13
13
  rejectScan(input: RejectScanInput): Promise<ScanTransitionResult | null>;
14
14
  reserve(input: ReserveFilesInput): Promise<FileEntity[]>;
15
+ attachFromConfirmationEvent(input: AttachFromConfirmationEventInput): Promise<FileAttachmentResult[]>;
16
+ releaseForEntity(input: ReleaseForEntityInput): Promise<ReleaseForEntityResult>;
17
+ releaseFile(input: ReleaseFileInput): Promise<boolean>;
18
+ releaseForOwner(input: ReleaseForOwnerInput): Promise<string[]>;
15
19
  }
16
20
  //# sourceMappingURL=file.repository.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file.repository.d.ts","sourceRoot":"","sources":["../../../src/repositories/interfaces/file.repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,6BAA6B,CAAC;AASrC,MAAM,WAAW,eAAe;IAE9B,aAAa,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAElE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACjD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAChD,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAG9E,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IAE9E,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhD,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAExD,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IAE7E,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IAEzE,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;CAC1D"}
1
+ {"version":3,"file":"file.repository.d.ts","sourceRoot":"","sources":["../../../src/repositories/interfaces/file.repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EACV,gCAAgC,EAChC,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,6BAA6B,CAAC;AASrC,MAAM,WAAW,eAAe;IAE9B,aAAa,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAElE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACjD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAChD,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAG9E,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IAE9E,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhD,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAExD,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IAE7E,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IAEzE,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IASzD,2BAA2B,CACzB,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAKnC,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAKhF,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAKvD,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACjE"}
@@ -1,11 +1,12 @@
1
1
  import type { Repository } from '@volontariapp/database';
2
2
  import { BaseRepository } from '@volontariapp/database';
3
3
  import { FileEntity } from '../entities/file.entity.js';
4
- import type { EntityType } from '../enums/entity-type.enum.js';
4
+ import { EntityType } from '../enums/entity-type.enum.js';
5
5
  import { FileModel } from '../models/index.js';
6
6
  import type { IFileRepository } from './interfaces/file.repository.js';
7
- import type { CompleteScanInput, ConfirmUploadInput, ConfirmUploadResult, CreatePendingFileInput, RejectScanInput, ReserveFilesInput, ScanTransitionResult } from './file-repository.types.js';
7
+ import type { AttachFromConfirmationEventInput, CompleteScanInput, ConfirmUploadInput, ConfirmUploadResult, CreatePendingFileInput, FileAttachmentResult, RejectScanInput, ReleaseFileInput, ReleaseForEntityInput, ReleaseForEntityResult, ReleaseForOwnerInput, ReserveFilesInput, ScanTransitionResult } from './file-repository.types.js';
8
8
  export declare const RESET_UPLOAD_DELAY_MINUTES = 15;
9
+ export declare const OWNER_RELEASE_EXCLUDED_ENTITY_TYPES: readonly EntityType[];
9
10
  export declare class PostgresFileRepository extends BaseRepository<FileModel, FileEntity> implements IFileRepository {
10
11
  constructor(repository: Repository<FileModel>);
11
12
  createPending(input: CreatePendingFileInput): Promise<FileEntity>;
@@ -14,6 +15,13 @@ export declare class PostgresFileRepository extends BaseRepository<FileModel, Fi
14
15
  switchToAsync(fileId: string): Promise<boolean>;
15
16
  resetToAwaitingUpload(fileId: string): Promise<boolean>;
16
17
  reserve(input: ReserveFilesInput): Promise<FileEntity[]>;
18
+ attachFromConfirmationEvent(input: AttachFromConfirmationEventInput): Promise<FileAttachmentResult[]>;
19
+ private settleConfirmation;
20
+ private emitScanResultOfAttachedFile;
21
+ releaseForEntity(input: ReleaseForEntityInput): Promise<ReleaseForEntityResult>;
22
+ releaseFile(input: ReleaseFileInput): Promise<boolean>;
23
+ releaseForOwner(input: ReleaseForOwnerInput): Promise<string[]>;
24
+ private lockEntity;
17
25
  completeScan(input: CompleteScanInput): Promise<ScanTransitionResult | null>;
18
26
  rejectScan(input: RejectScanInput): Promise<ScanTransitionResult | null>;
19
27
  private finishScan;
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-file.repository.d.ts","sourceRoot":"","sources":["../../src/repositories/postgres-file.repository.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAoC,MAAM,wBAAwB,CAAC;AAK1F,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAQ/D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAS/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EAEf,iBAAiB,EACjB,oBAAoB,EAErB,MAAM,4BAA4B,CAAC;AAGpC,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAoB7C,qBACa,sBACX,SAAQ,cAAc,CAAC,SAAS,EAAE,UAAU,CAC5C,YAAW,eAAe;gBAEe,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC;IAQpE,aAAa,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC;IAUjE,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAS7E,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAsC7E,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyB/C,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BvD,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IA2FxD,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAoB5E,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;YAgBhE,UAAU;YAmCV,gBAAgB;YAahB,YAAY;IAW1B,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,aAAa;CAOtB"}
1
+ {"version":3,"file":"postgres-file.repository.d.ts","sourceRoot":"","sources":["../../src/repositories/postgres-file.repository.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAoC,MAAM,wBAAwB,CAAC;AAM1F,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAU1D,OAAO,EAAE,SAAS,EAAuB,MAAM,oBAAoB,CAAC;AAiBpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAEV,gCAAgC,EAChC,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EAEpB,iBAAiB,EACjB,oBAAoB,EAErB,MAAM,4BAA4B,CAAC;AAGpC,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAM7C,eAAO,MAAM,mCAAmC,EAAE,SAAS,UAAU,EAA4B,CAAC;AAoBlG,qBACa,sBACX,SAAQ,cAAc,CAAC,SAAS,EAAE,UAAU,CAC5C,YAAW,eAAe;gBAEe,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC;IAQpE,aAAa,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC;IAUjE,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAS7E,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAsC7E,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyB/C,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BvD,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IA6GxD,2BAA2B,CAC/B,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,oBAAoB,EAAE,CAAC;YA0HpB,kBAAkB;YA2DlB,4BAA4B;IAkCpC,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAkD/E,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAyCtD,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YA6BvD,UAAU;IAelB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAoB5E,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;YAgBhE,UAAU;YAmCV,gBAAgB;YAahB,YAAY;IAW1B,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,aAAa;CAOtB"}