@volontariapp/domain-storage 0.6.0 → 0.7.0-snap-9494fcb

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 (93) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/repositories/file-outbox.builders.d.ts +10 -0
  3. package/dist/repositories/file-outbox.builders.d.ts.map +1 -0
  4. package/dist/repositories/file-outbox.builders.js +45 -0
  5. package/dist/repositories/file-outbox.builders.js.map +1 -0
  6. package/dist/repositories/file-repository.types.d.ts +44 -0
  7. package/dist/repositories/file-repository.types.d.ts.map +1 -0
  8. package/dist/repositories/file-repository.types.js +2 -0
  9. package/dist/repositories/file-repository.types.js.map +1 -0
  10. package/dist/repositories/index.d.ts +4 -0
  11. package/dist/repositories/index.d.ts.map +1 -0
  12. package/dist/repositories/index.js +4 -0
  13. package/dist/repositories/index.js.map +1 -0
  14. package/dist/repositories/postgres-file.repository.d.ts +20 -0
  15. package/dist/repositories/postgres-file.repository.d.ts.map +1 -0
  16. package/dist/repositories/postgres-file.repository.js +136 -0
  17. package/dist/repositories/postgres-file.repository.js.map +1 -0
  18. package/dist/test/data-source.d.ts.map +1 -1
  19. package/dist/test/data-source.js +24 -4
  20. package/dist/test/data-source.js.map +1 -1
  21. package/dist/test/file-outbox.builders.unit.spec.d.ts +2 -0
  22. package/dist/test/file-outbox.builders.unit.spec.d.ts.map +1 -0
  23. package/dist/test/file-outbox.builders.unit.spec.js +61 -0
  24. package/dist/test/file-outbox.builders.unit.spec.js.map +1 -0
  25. package/dist/test/helpers/file-db.helper.d.ts +10 -0
  26. package/dist/test/helpers/file-db.helper.d.ts.map +1 -0
  27. package/dist/test/helpers/file-db.helper.js +20 -0
  28. package/dist/test/helpers/file-db.helper.js.map +1 -0
  29. package/dist/test/integration/file.model.int.spec.js +4 -1
  30. package/dist/test/integration/file.model.int.spec.js.map +1 -1
  31. package/dist/test/integration/postgres-file.repository.int.spec.d.ts +2 -0
  32. package/dist/test/integration/postgres-file.repository.int.spec.d.ts.map +1 -0
  33. package/dist/test/integration/postgres-file.repository.int.spec.js +452 -0
  34. package/dist/test/integration/postgres-file.repository.int.spec.js.map +1 -0
  35. package/dist/test/migrations/common/1776786226145-JobsOutboxAndEventQueue.d.ts +7 -0
  36. package/dist/test/migrations/common/1776786226145-JobsOutboxAndEventQueue.d.ts.map +1 -0
  37. package/dist/test/migrations/common/1776786226145-JobsOutboxAndEventQueue.js +12 -0
  38. package/dist/test/migrations/common/1776786226145-JobsOutboxAndEventQueue.js.map +1 -0
  39. package/dist/test/migrations/common/1776974876099-JobsOutboxAndEventQueueWithTraceId.d.ts +7 -0
  40. package/dist/test/migrations/common/1776974876099-JobsOutboxAndEventQueueWithTraceId.d.ts.map +1 -0
  41. package/dist/test/migrations/common/1776974876099-JobsOutboxAndEventQueueWithTraceId.js +12 -0
  42. package/dist/test/migrations/common/1776974876099-JobsOutboxAndEventQueueWithTraceId.js.map +1 -0
  43. package/dist/test/migrations/common/1777630647718-UpdateOutboxModels.d.ts +7 -0
  44. package/dist/test/migrations/common/1777630647718-UpdateOutboxModels.d.ts.map +1 -0
  45. package/dist/test/migrations/common/1777630647718-UpdateOutboxModels.js +12 -0
  46. package/dist/test/migrations/common/1777630647718-UpdateOutboxModels.js.map +1 -0
  47. package/dist/test/migrations/common/1777985367963-AddTargetServicesToEventQueue.d.ts +6 -0
  48. package/dist/test/migrations/common/1777985367963-AddTargetServicesToEventQueue.d.ts.map +1 -0
  49. package/dist/test/migrations/common/1777985367963-AddTargetServicesToEventQueue.js +76 -0
  50. package/dist/test/migrations/common/1777985367963-AddTargetServicesToEventQueue.js.map +1 -0
  51. package/dist/test/migrations/common/1779114963391-AddJobAudit.d.ts +7 -0
  52. package/dist/test/migrations/common/1779114963391-AddJobAudit.d.ts.map +1 -0
  53. package/dist/test/migrations/common/1779114963391-AddJobAudit.js +18 -0
  54. package/dist/test/migrations/common/1779114963391-AddJobAudit.js.map +1 -0
  55. package/dist/test/migrations/common/1779115100001-AddJobAuditStatusTrigger.d.ts +7 -0
  56. package/dist/test/migrations/common/1779115100001-AddJobAuditStatusTrigger.d.ts.map +1 -0
  57. package/dist/test/migrations/common/1779115100001-AddJobAuditStatusTrigger.js +45 -0
  58. package/dist/test/migrations/common/1779115100001-AddJobAuditStatusTrigger.js.map +1 -0
  59. package/dist/test/migrations/common/1779353596425-AddEmitterToJobAudit.d.ts +7 -0
  60. package/dist/test/migrations/common/1779353596425-AddEmitterToJobAudit.d.ts.map +1 -0
  61. package/dist/test/migrations/common/1779353596425-AddEmitterToJobAudit.js +18 -0
  62. package/dist/test/migrations/common/1779353596425-AddEmitterToJobAudit.js.map +1 -0
  63. package/dist/test/migrations/common/1779360000000-FixEventQueueStatusDefault.d.ts +7 -0
  64. package/dist/test/migrations/common/1779360000000-FixEventQueueStatusDefault.d.ts.map +1 -0
  65. package/dist/test/migrations/common/1779360000000-FixEventQueueStatusDefault.js +12 -0
  66. package/dist/test/migrations/common/1779360000000-FixEventQueueStatusDefault.js.map +1 -0
  67. package/dist/test/migrations/common/1779542033290-AddEmitterIdToOutbox.d.ts +6 -0
  68. package/dist/test/migrations/common/1779542033290-AddEmitterIdToOutbox.d.ts.map +1 -0
  69. package/dist/test/migrations/common/1779542033290-AddEmitterIdToOutbox.js +13 -0
  70. package/dist/test/migrations/common/1779542033290-AddEmitterIdToOutbox.js.map +1 -0
  71. package/dist/test/migrations/common/1779700000000-UpdateEventQueueTriggerTargetService.d.ts +6 -0
  72. package/dist/test/migrations/common/1779700000000-UpdateEventQueueTriggerTargetService.d.ts.map +1 -0
  73. package/dist/test/migrations/common/1779700000000-UpdateEventQueueTriggerTargetService.js +151 -0
  74. package/dist/test/migrations/common/1779700000000-UpdateEventQueueTriggerTargetService.js.map +1 -0
  75. package/dist/test/migrations/common/1779800000000-UpdateJobAuditStatusTrigger.d.ts +7 -0
  76. package/dist/test/migrations/common/1779800000000-UpdateJobAuditStatusTrigger.d.ts.map +1 -0
  77. package/dist/test/migrations/common/1779800000000-UpdateJobAuditStatusTrigger.js +72 -0
  78. package/dist/test/migrations/common/1779800000000-UpdateJobAuditStatusTrigger.js.map +1 -0
  79. package/dist/test/migrations/common/1781000000000-AddCorrelationIdToEventQueue.d.ts +7 -0
  80. package/dist/test/migrations/common/1781000000000-AddCorrelationIdToEventQueue.d.ts.map +1 -0
  81. package/dist/test/migrations/common/1781000000000-AddCorrelationIdToEventQueue.js +12 -0
  82. package/dist/test/migrations/common/1781000000000-AddCorrelationIdToEventQueue.js.map +1 -0
  83. package/dist/test/migrations/domain/1775000000000-EnableUuidExtension.d.ts +7 -0
  84. package/dist/test/migrations/domain/1775000000000-EnableUuidExtension.d.ts.map +1 -0
  85. package/dist/test/migrations/domain/1775000000000-EnableUuidExtension.js +9 -0
  86. package/dist/test/migrations/domain/1775000000000-EnableUuidExtension.js.map +1 -0
  87. package/dist/test/mocks/outbox-write-failure.mock.d.ts +4 -0
  88. package/dist/test/mocks/outbox-write-failure.mock.d.ts.map +1 -0
  89. package/dist/test/mocks/outbox-write-failure.mock.js +14 -0
  90. package/dist/test/mocks/outbox-write-failure.mock.js.map +1 -0
  91. package/dist/test/root-entrypoint.unit.spec.js +6 -0
  92. package/dist/test/root-entrypoint.unit.spec.js.map +1 -1
  93. package/package.json +9 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.7.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Add `PostgresFileRepository` (sub-path `@volontariapp/domain-storage/repositories`) with `createPending`, `confirmUpload`, `switchToAsync`, `resetToAwaitingUpload`, `completeScan` and `rejectScan`. Each transition is a single conditional `UPDATE ... RETURNING`; the `storage.scan_file` job (`jobs_outbox`) and the `storage.file_scanned` / `storage.file_rejected` events (`event_queue`, only for an `ATTACHED` file) are written in the same transaction.
8
+
9
+ WARNING, do not wire `completeScan` / `rejectScan` into `ms-storage` or `worker-storage` yet: `StorageStream` does not exist in `@volontariapp/shared` (ticket 1.14), so the `storage.file_scanned` / `storage.file_rejected` events are written with an empty `targetServices` (`FILE_SCAN_RESULT_TARGET_SERVICES`). The outbox pusher skips such a row without an error and the consumer then marks it `COMPLETED`: the event would be silently lost and the post media would stay `PENDING`. Fill the constant once `StorageStream` exists. The `storage.scan_file` job is not affected.
10
+
3
11
  ## 0.6.0
4
12
 
5
13
  ### Minor Changes
@@ -0,0 +1,10 @@
1
+ import { EventQueueEntity, JobsOutboxEntity } from '@volontariapp/database';
2
+ import { StorageEventMessagingType, StorageJobType } from '@volontariapp/messaging';
3
+ import type { RejectionReason } from '../enums/rejection-reason.enum.js';
4
+ import type { ScanTransitionRow } from './file-repository.types.js';
5
+ export declare const FILE_OUTBOX_EMITTER = "ms-storage";
6
+ export declare const FILE_SCAN_RESULT_TARGET_SERVICES: EventQueueEntity['targetServices'];
7
+ export declare const buildScanFileJob: (fileId: string, ownerId: string) => JobsOutboxEntity<StorageJobType.SCAN_FILE>;
8
+ export declare const buildFileScannedEvent: (row: ScanTransitionRow) => EventQueueEntity<StorageEventMessagingType.FILE_SCANNED>;
9
+ export declare const buildFileRejectedEvent: (row: ScanTransitionRow, reason: RejectionReason) => EventQueueEntity<StorageEventMessagingType.FILE_REJECTED>;
10
+ //# sourceMappingURL=file-outbox.builders.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,45 @@
1
+ import { EventQueueEntity, JobsOutboxEntity } from '@volontariapp/database';
2
+ import { StorageEventMessagingType, StorageJobType, StorageQueue } from '@volontariapp/messaging';
3
+ import { InternalServerError } from '@volontariapp/errors';
4
+ export const FILE_OUTBOX_EMITTER = 'ms-storage';
5
+ export const FILE_SCAN_RESULT_TARGET_SERVICES = [];
6
+ export const buildScanFileJob = (fileId, ownerId) => JobsOutboxEntity.createJob({
7
+ type: StorageJobType.SCAN_FILE,
8
+ emitter: FILE_OUTBOX_EMITTER,
9
+ emitterId: ownerId,
10
+ target: StorageQueue.STORAGE,
11
+ payload: { fileId },
12
+ scheduledAt: new Date(),
13
+ });
14
+ const requireEntityId = (row) => {
15
+ if (row.entity_id === null) {
16
+ throw new InternalServerError(`Attached file ${row.id} has no entity_id`, 'FILE_ATTACHED_WITHOUT_ENTITY', { fileId: row.id });
17
+ }
18
+ return row.entity_id;
19
+ };
20
+ export const buildFileScannedEvent = (row) => EventQueueEntity.createEvent({
21
+ type: StorageEventMessagingType.FILE_SCANNED,
22
+ emitter: FILE_OUTBOX_EMITTER,
23
+ emitterId: row.owner_id,
24
+ payload: {
25
+ fileId: row.id,
26
+ ownerId: row.owner_id,
27
+ entityType: row.entity_type,
28
+ entityId: requireEntityId(row),
29
+ },
30
+ targetServices: FILE_SCAN_RESULT_TARGET_SERVICES,
31
+ });
32
+ export const buildFileRejectedEvent = (row, reason) => EventQueueEntity.createEvent({
33
+ type: StorageEventMessagingType.FILE_REJECTED,
34
+ emitter: FILE_OUTBOX_EMITTER,
35
+ emitterId: row.owner_id,
36
+ payload: {
37
+ fileId: row.id,
38
+ ownerId: row.owner_id,
39
+ entityType: row.entity_type,
40
+ entityId: requireEntityId(row),
41
+ reason,
42
+ },
43
+ targetServices: FILE_SCAN_RESULT_TARGET_SERVICES,
44
+ });
45
+ //# sourceMappingURL=file-outbox.builders.js.map
@@ -0,0 +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"}
@@ -0,0 +1,44 @@
1
+ import type { EntityType } from '../enums/entity-type.enum.js';
2
+ import type { FileStatus } from '../enums/file-status.enum.js';
3
+ import type { RejectionReason } from '../enums/rejection-reason.enum.js';
4
+ import type { ValidationMode } from '../enums/validation-mode.enum.js';
5
+ export interface CreatePendingFileInput {
6
+ id: string;
7
+ ownerId: string;
8
+ entityType: EntityType;
9
+ declaredMimeType: string;
10
+ declaredSize: number;
11
+ quarantineKey: string;
12
+ validationMode: ValidationMode;
13
+ uploadExpiresAt: Date;
14
+ }
15
+ export interface ConfirmUploadInput {
16
+ fileId: string;
17
+ ownerId: string;
18
+ actualSize: number;
19
+ }
20
+ export interface ConfirmUploadResult {
21
+ id: string;
22
+ validationMode: ValidationMode;
23
+ }
24
+ export interface CompleteScanInput {
25
+ fileId: string;
26
+ publicKey: string;
27
+ }
28
+ export interface RejectScanInput {
29
+ fileId: string;
30
+ reason: RejectionReason;
31
+ }
32
+ export interface ScanTransitionResult {
33
+ fileId: string;
34
+ status: FileStatus;
35
+ eventEmitted: boolean;
36
+ }
37
+ export interface ScanTransitionRow {
38
+ id: string;
39
+ status: FileStatus;
40
+ entity_type: EntityType;
41
+ entity_id: string | null;
42
+ owner_id: string;
43
+ }
44
+ //# sourceMappingURL=file-repository.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-repository.types.d.ts","sourceRoot":"","sources":["../../src/repositories/file-repository.types.ts"],"names":[],"mappings":"AAAA,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;AAEvE,MAAM,WAAW,sBAAsB;IAErC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,EAAE,IAAI,CAAC;CACvB;AAED,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;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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=file-repository.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-repository.types.js","sourceRoot":"","sources":["../../src/repositories/file-repository.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export * from './file-outbox.builders.js';
2
+ export * from './file-repository.types.js';
3
+ export * from './postgres-file.repository.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/repositories/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './file-outbox.builders.js';
2
+ export * from './file-repository.types.js';
3
+ export * from './postgres-file.repository.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/repositories/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { DataSource } from 'typeorm';
2
+ import { FileModel } from '../models/file.model.js';
3
+ import type { CompleteScanInput, ConfirmUploadInput, ConfirmUploadResult, CreatePendingFileInput, RejectScanInput, ScanTransitionResult } from './file-repository.types.js';
4
+ export declare const RESET_UPLOAD_DELAY_MINUTES = 15;
5
+ export declare class PostgresFileRepository {
6
+ private readonly dataSource;
7
+ private readonly logger;
8
+ constructor(dataSource: DataSource);
9
+ createPending(input: CreatePendingFileInput): Promise<FileModel>;
10
+ confirmUpload(input: ConfirmUploadInput): Promise<ConfirmUploadResult | null>;
11
+ switchToAsync(fileId: string): Promise<boolean>;
12
+ resetToAwaitingUpload(fileId: string): Promise<boolean>;
13
+ completeScan(input: CompleteScanInput): Promise<ScanTransitionResult | null>;
14
+ rejectScan(input: RejectScanInput): Promise<ScanTransitionResult | null>;
15
+ private finishScan;
16
+ private runInTransaction;
17
+ private writeScanJob;
18
+ private logTransition;
19
+ }
20
+ //# sourceMappingURL=postgres-file.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-file.repository.d.ts","sourceRoot":"","sources":["../../src/repositories/postgres-file.repository.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,SAAS,CAAC;AAIzD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAMpD,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,oBAAoB,EAErB,MAAM,4BAA4B,CAAC;AAGpC,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAuB7C,qBAAa,sBAAsB;IAGrB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwD;gBAElD,UAAU,EAAE,UAAU;IAG7C,aAAa,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,SAAS,CAAC;IAkBhE,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;IAqBvD,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAkB5E,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;YAiBhE,UAAU;YAmCV,gBAAgB;YAahB,YAAY;IAQ1B,OAAO,CAAC,aAAa;CAOtB"}
@@ -0,0 +1,136 @@
1
+ import { EventQueueModel, JobsOutboxModel } from '@volontariapp/database';
2
+ import { Logger } from '@volontariapp/logger';
3
+ import { FileStatus } from '../enums/file-status.enum.js';
4
+ import { ScanStatus } from '../enums/scan-status.enum.js';
5
+ import { ValidationMode } from '../enums/validation-mode.enum.js';
6
+ import { FileModel } from '../models/file.model.js';
7
+ import { buildFileRejectedEvent, buildFileScannedEvent, buildScanFileJob, } from './file-outbox.builders.js';
8
+ export const RESET_UPLOAD_DELAY_MINUTES = 15;
9
+ export class PostgresFileRepository {
10
+ dataSource;
11
+ logger = new Logger({ context: PostgresFileRepository.name });
12
+ constructor(dataSource) {
13
+ this.dataSource = dataSource;
14
+ }
15
+ async createPending(input) {
16
+ const repository = this.dataSource.getRepository(FileModel);
17
+ await repository.insert({
18
+ ...input,
19
+ status: FileStatus.PENDING,
20
+ scanStatus: ScanStatus.AWAITING_UPLOAD,
21
+ });
22
+ const saved = await repository.findOneByOrFail({ id: input.id });
23
+ this.logger.log(`File ${saved.id} created, awaiting upload (${saved.validationMode})`);
24
+ return saved;
25
+ }
26
+ async confirmUpload(input) {
27
+ const result = await this.runInTransaction('confirmUpload', input.fileId, async (manager) => {
28
+ const [rows] = await manager.query(`UPDATE files
29
+ SET scan_status = $1, confirmed_at = now(), actual_size = $2,
30
+ scan_attempts = scan_attempts + 1, updated_at = now()
31
+ WHERE id = $3 AND owner_id = $4
32
+ AND scan_status = $5
33
+ AND upload_expires_at > now()
34
+ RETURNING id, owner_id, validation_mode`, [
35
+ ScanStatus.SCANNING,
36
+ input.actualSize,
37
+ input.fileId,
38
+ input.ownerId,
39
+ ScanStatus.AWAITING_UPLOAD,
40
+ ]);
41
+ const row = rows.at(0);
42
+ if (!row)
43
+ return null;
44
+ if (row.validation_mode === ValidationMode.ASYNC) {
45
+ await this.writeScanJob(manager, row.id, row.owner_id);
46
+ }
47
+ return { id: row.id, validationMode: row.validation_mode };
48
+ });
49
+ this.logTransition('confirmUpload', input.fileId, result !== null);
50
+ return result;
51
+ }
52
+ async switchToAsync(fileId) {
53
+ const switched = await this.runInTransaction('switchToAsync', fileId, async (manager) => {
54
+ const [rows] = await manager.query(`UPDATE files
55
+ SET validation_mode = $1, updated_at = now()
56
+ WHERE id = $2 AND scan_status = $3 AND validation_mode = $4
57
+ RETURNING id, owner_id`, [ValidationMode.ASYNC, fileId, ScanStatus.SCANNING, ValidationMode.SYNC]);
58
+ const row = rows.at(0);
59
+ if (!row)
60
+ return false;
61
+ await this.writeScanJob(manager, row.id, row.owner_id);
62
+ return true;
63
+ });
64
+ this.logTransition('switchToAsync', fileId, switched);
65
+ return switched;
66
+ }
67
+ async resetToAwaitingUpload(fileId) {
68
+ const [rows] = await this.dataSource.query(`UPDATE files
69
+ SET scan_status = $1,
70
+ upload_expires_at = GREATEST(upload_expires_at, now() + make_interval(mins => $2)),
71
+ updated_at = now()
72
+ WHERE id = $3 AND scan_status = $4
73
+ RETURNING id`, [ScanStatus.AWAITING_UPLOAD, RESET_UPLOAD_DELAY_MINUTES, fileId, ScanStatus.SCANNING]);
74
+ const reset = rows.length > 0;
75
+ this.logTransition('resetToAwaitingUpload', fileId, reset);
76
+ return reset;
77
+ }
78
+ async completeScan(input) {
79
+ return this.finishScan({
80
+ assignments: `scan_status = $1, public_key = $2, scanned_at = now()`,
81
+ params: [ScanStatus.CLEAN, input.publicKey],
82
+ }, input.fileId, async (manager, row) => {
83
+ await manager.insert(EventQueueModel, buildFileScannedEvent(row));
84
+ }, 'completeScan');
85
+ }
86
+ async rejectScan(input) {
87
+ return this.finishScan({
88
+ assignments: `scan_status = $1, rejection_reason = $2, scanned_at = now()`,
89
+ params: [ScanStatus.REJECTED, input.reason],
90
+ }, input.fileId, async (manager, row) => {
91
+ await manager.insert(EventQueueModel, buildFileRejectedEvent(row, input.reason));
92
+ }, 'rejectScan');
93
+ }
94
+ async finishScan(update, fileId, writeEvent, transition) {
95
+ const result = await this.runInTransaction(transition, fileId, async (manager) => {
96
+ const idParam = update.params.length + 1;
97
+ const [rows] = await manager.query(`UPDATE files
98
+ SET ${update.assignments}, updated_at = now()
99
+ WHERE id = $${String(idParam)}
100
+ AND scan_status = $${String(idParam + 1)}
101
+ AND status NOT IN ($${String(idParam + 2)}, $${String(idParam + 3)})
102
+ RETURNING id, status, entity_type, entity_id, owner_id`, [...update.params, fileId, ScanStatus.SCANNING, FileStatus.ORPHANED, FileStatus.DELETED]);
103
+ const row = rows.at(0);
104
+ if (!row)
105
+ return null;
106
+ const eventEmitted = row.status === FileStatus.ATTACHED;
107
+ if (eventEmitted) {
108
+ await writeEvent(manager, row);
109
+ }
110
+ return { fileId: row.id, status: row.status, eventEmitted };
111
+ });
112
+ this.logTransition(transition, fileId, result !== null);
113
+ return result;
114
+ }
115
+ async runInTransaction(transition, fileId, work) {
116
+ try {
117
+ return await this.dataSource.transaction(work);
118
+ }
119
+ catch (error) {
120
+ this.logger.error(`${transition} failed and was rolled back for file ${fileId}`, error);
121
+ throw error;
122
+ }
123
+ }
124
+ async writeScanJob(manager, fileId, ownerId) {
125
+ await manager.insert(JobsOutboxModel, buildScanFileJob(fileId, ownerId));
126
+ }
127
+ logTransition(transition, fileId, applied) {
128
+ if (applied) {
129
+ this.logger.log(`${transition} applied on file ${fileId}`);
130
+ }
131
+ else {
132
+ this.logger.warn(`${transition} matched no row for file ${fileId}`);
133
+ }
134
+ }
135
+ }
136
+ //# sourceMappingURL=postgres-file.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-file.repository.js","sourceRoot":"","sources":["../../src/repositories/postgres-file.repository.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-source.d.ts","sourceRoot":"","sources":["../../src/test/data-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAQrC,eAAO,MAAM,cAAc,YAWzB,CAAC;AAMH,eAAO,MAAM,gBAAgB,QAAa,OAAO,CAAC,IAAI,CAYrD,CAAC;AAEF,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAIhD,CAAC;AAEF,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAEhD,CAAC"}
1
+ {"version":3,"file":"data-source.d.ts","sourceRoot":"","sources":["../../src/test/data-source.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AA6BrC,eAAO,MAAM,cAAc,YAWzB,CAAC;AAMH,eAAO,MAAM,gBAAgB,QAAa,OAAO,CAAC,IAAI,CAYrD,CAAC;AAEF,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAIhD,CAAC;AAEF,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAIhD,CAAC"}
@@ -1,6 +1,26 @@
1
+ import { EventQueueModel, JobsOutboxModel } from '@volontariapp/database';
2
+ import { readdirSync } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
1
5
  import { DataSource } from 'typeorm';
2
6
  import { FileModel, ReleasedEntityModel } from '../models/index.js';
3
- import { InitialStorageSchema1791300000000 } from './migrations/domain/1791300000000-InitialStorageSchema.js';
7
+ const MIGRATIONS_DIR = join(dirname(fileURLToPath(import.meta.url)), 'migrations');
8
+ const loadMigrations = async () => {
9
+ const migrations = [];
10
+ for (const directory of ['domain', 'common']) {
11
+ const directoryPath = join(MIGRATIONS_DIR, directory);
12
+ const files = readdirSync(directoryPath).filter((file) => file.endsWith('.ts') || file.endsWith('.js'));
13
+ for (const file of files) {
14
+ const module = (await import(join(directoryPath, file)));
15
+ for (const exported of Object.values(module)) {
16
+ if (typeof exported === 'function') {
17
+ migrations.push(exported);
18
+ }
19
+ }
20
+ }
21
+ }
22
+ return migrations;
23
+ };
4
24
  const LOCAL_HOSTS = ['localhost', '127.0.0.1'];
5
25
  const host = process.env.TEST_DB_HOST ?? 'localhost';
6
26
  export const testDataSource = new DataSource({
@@ -10,8 +30,8 @@ export const testDataSource = new DataSource({
10
30
  username: process.env.TEST_DB_USER ?? 'user',
11
31
  password: process.env.TEST_DB_PASSWORD ?? 'password',
12
32
  database: process.env.TEST_DB_NAME ?? 'ms_storage',
13
- entities: [FileModel, ReleasedEntityModel],
14
- migrations: [InitialStorageSchema1791300000000],
33
+ entities: [FileModel, ReleasedEntityModel, EventQueueModel, JobsOutboxModel],
34
+ migrations: await loadMigrations(),
15
35
  synchronize: false,
16
36
  logging: false,
17
37
  });
@@ -31,6 +51,6 @@ export const closeTestDb = async () => {
31
51
  }
32
52
  };
33
53
  export const truncateAll = async () => {
34
- await testDataSource.query('TRUNCATE TABLE files, released_entities RESTART IDENTITY CASCADE');
54
+ await testDataSource.query('TRUNCATE TABLE files, released_entities, event_queue, jobs_outbox RESTART IDENTITY CASCADE');
35
55
  };
36
56
  //# sourceMappingURL=data-source.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-source.js","sourceRoot":"","sources":["../../src/test/data-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,iCAAiC,EAAE,MAAM,2DAA2D,CAAC;AAE9G,MAAM,WAAW,GAAsB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AAElE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,WAAW,CAAC;AAErD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,UAAU,CAAC;IAC3C,IAAI,EAAE,UAAU;IAChB,IAAI;IACJ,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC;IAC9C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM;IAC5C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,UAAU;IACpD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,YAAY;IAClD,QAAQ,EAAE,CAAC,SAAS,EAAE,mBAAmB,CAAC;IAC1C,UAAU,EAAE,CAAC,iCAAiC,CAAC;IAC/C,WAAW,EAAE,KAAK;IAClB,OAAO,EAAE,KAAK;CACf,CAAC,CAAC;AAMH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,IAAmB,EAAE;IACxD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,qCAAqC,IAAI,yDAAyD,CACnG,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC;QAClC,MAAM,cAAc,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,cAAc,CAAC,YAAY,EAAE,CAAC;QACpC,MAAM,cAAc,CAAC,aAAa,EAAE,CAAC;IACvC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IACnD,IAAI,cAAc,CAAC,aAAa,EAAE,CAAC;QACjC,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IACnD,MAAM,cAAc,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;AACjG,CAAC,CAAC"}
1
+ {"version":3,"file":"data-source.js","sourceRoot":"","sources":["../../src/test/data-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=file-outbox.builders.unit.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-outbox.builders.unit.spec.d.ts","sourceRoot":"","sources":["../../src/test/file-outbox.builders.unit.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ import { describe, expect, it } from '@jest/globals';
2
+ import { OutboxStatus } from '@volontariapp/database';
3
+ import { StorageEventMessagingType, StorageJobType, StorageQueue } from '@volontariapp/messaging';
4
+ import { EntityType, FileStatus, RejectionReason } from '../index.js';
5
+ import { buildFileRejectedEvent, buildFileScannedEvent, buildScanFileJob, FILE_OUTBOX_EMITTER, } from '../repositories/file-outbox.builders.js';
6
+ const attachedRow = (overrides = {}) => ({
7
+ id: '11111111-1111-4111-8111-111111111111',
8
+ status: FileStatus.ATTACHED,
9
+ entity_type: EntityType.POST,
10
+ entity_id: '22222222-2222-4222-8222-222222222222',
11
+ owner_id: '33333333-3333-4333-8333-333333333333',
12
+ ...overrides,
13
+ });
14
+ describe('file outbox builders', () => {
15
+ describe('buildScanFileJob()', () => {
16
+ it('targets the storage queue with the file id and is schedulable immediately', () => {
17
+ const before = Date.now();
18
+ const job = buildScanFileJob('file-1', 'owner-1');
19
+ expect(job.type).toBe(StorageJobType.SCAN_FILE);
20
+ expect(job.target).toBe(StorageQueue.STORAGE);
21
+ expect(job.payload).toEqual({ fileId: 'file-1' });
22
+ expect(job.emitter).toBe(FILE_OUTBOX_EMITTER);
23
+ expect(job.emitterId).toBe('owner-1');
24
+ expect(job.status).toBe(OutboxStatus.PENDING);
25
+ expect(job.scheduledAt?.getTime()).toBeGreaterThanOrEqual(before);
26
+ });
27
+ });
28
+ describe('buildFileScannedEvent()', () => {
29
+ it('carries the file, its owner, its entity and the owner as emitter id', () => {
30
+ const event = buildFileScannedEvent(attachedRow());
31
+ expect(event.type).toBe(StorageEventMessagingType.FILE_SCANNED);
32
+ expect(event.emitterId).toBe('33333333-3333-4333-8333-333333333333');
33
+ expect(event.payload.after).toEqual({
34
+ fileId: '11111111-1111-4111-8111-111111111111',
35
+ ownerId: '33333333-3333-4333-8333-333333333333',
36
+ entityType: EntityType.POST,
37
+ entityId: '22222222-2222-4222-8222-222222222222',
38
+ });
39
+ });
40
+ it('refuses an attached row without entity id', () => {
41
+ expect(() => buildFileScannedEvent(attachedRow({ entity_id: null }))).toThrow('has no entity_id');
42
+ });
43
+ });
44
+ describe('buildFileRejectedEvent()', () => {
45
+ it('adds the rejection reason to the scanned payload', () => {
46
+ const event = buildFileRejectedEvent(attachedRow(), RejectionReason.MALWARE);
47
+ expect(event.type).toBe(StorageEventMessagingType.FILE_REJECTED);
48
+ expect(event.payload.after).toEqual({
49
+ fileId: '11111111-1111-4111-8111-111111111111',
50
+ ownerId: '33333333-3333-4333-8333-333333333333',
51
+ entityType: EntityType.POST,
52
+ entityId: '22222222-2222-4222-8222-222222222222',
53
+ reason: RejectionReason.MALWARE,
54
+ });
55
+ });
56
+ it('refuses an attached row without entity id', () => {
57
+ expect(() => buildFileRejectedEvent(attachedRow({ entity_id: null }), RejectionReason.MALWARE)).toThrow('has no entity_id');
58
+ });
59
+ });
60
+ });
61
+ //# sourceMappingURL=file-outbox.builders.unit.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-outbox.builders.unit.spec.js","sourceRoot":"","sources":["../../src/test/file-outbox.builders.unit.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { EventQueueModel, JobsOutboxModel } from '@volontariapp/database';
2
+ import type { ScanStatus } from '../../enums/scan-status.enum.js';
3
+ import { FileModel } from '../../models/file.model.js';
4
+ import type { FileData } from '../factories/file.factory.js';
5
+ export declare const insertFile: (overrides?: Partial<FileData>) => Promise<FileModel>;
6
+ export declare const readFile: (id: string) => Promise<FileModel>;
7
+ export declare const readEvents: () => Promise<EventQueueModel[]>;
8
+ export declare const readJobs: () => Promise<JobsOutboxModel[]>;
9
+ export declare const attachDirectly: (fileId: string, entityId: string) => Promise<ScanStatus | null>;
10
+ //# sourceMappingURL=file-db.helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-db.helper.d.ts","sourceRoot":"","sources":["../../../src/test/helpers/file-db.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAGvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE7D,eAAO,MAAM,UAAU,eAAqB,OAAO,CAAC,QAAQ,CAAC,KAAQ,OAAO,CAAC,SAAS,CAGrF,CAAC;AAEF,eAAO,MAAM,QAAQ,OAAc,MAAM,KAAG,OAAO,CAAC,SAAS,CACI,CAAC;AAElE,eAAO,MAAM,UAAU,QAAa,OAAO,CAAC,eAAe,EAAE,CACwB,CAAC;AAEtF,eAAO,MAAM,QAAQ,QAAa,OAAO,CAAC,eAAe,EAAE,CAC0B,CAAC;AAOtF,eAAO,MAAM,cAAc,WACjB,MAAM,YACJ,MAAM,KACf,OAAO,CAAC,UAAU,GAAG,IAAI,CAS3B,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { EventQueueModel, JobsOutboxModel } from '@volontariapp/database';
2
+ import { FileStatus } from '../../enums/file-status.enum.js';
3
+ import { FileModel } from '../../models/file.model.js';
4
+ import { testDataSource } from '../data-source.js';
5
+ import { buildFileData } from '../factories/file.factory.js';
6
+ export const insertFile = async (overrides = {}) => {
7
+ const repository = testDataSource.getRepository(FileModel);
8
+ return repository.save(repository.create(buildFileData(overrides)));
9
+ };
10
+ export const readFile = async (id) => testDataSource.getRepository(FileModel).findOneByOrFail({ id });
11
+ export const readEvents = async () => testDataSource.getRepository(EventQueueModel).find({ order: { createdAt: 'ASC' } });
12
+ export const readJobs = async () => testDataSource.getRepository(JobsOutboxModel).find({ order: { createdAt: 'ASC' } });
13
+ export const attachDirectly = async (fileId, entityId) => {
14
+ const [rows] = await testDataSource.query(`UPDATE files
15
+ SET status = $1, entity_id = $2, attached_at = now(), updated_at = now()
16
+ WHERE id = $3 AND status IN ($4, $5)
17
+ RETURNING scan_status`, [FileStatus.ATTACHED, entityId, fileId, FileStatus.PENDING, FileStatus.RESERVED]);
18
+ return rows.at(0)?.scan_status ?? null;
19
+ };
20
+ //# sourceMappingURL=file-db.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-db.helper.js","sourceRoot":"","sources":["../../../src/test/helpers/file-db.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAG7D,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,YAA+B,EAAE,EAAsB,EAAE;IACxF,MAAM,UAAU,GAAG,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAC3D,OAAO,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,EAAU,EAAsB,EAAE,CAC/D,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAElE,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,IAAgC,EAAE,CAC/D,cAAc,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;AAEtF,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAgC,EAAE,CAC7D,cAAc,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;AAOtF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,MAAc,EACd,QAAgB,EACY,EAAE;IAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,cAAc,CAAC,KAAK,CACvC;;;2BAGuB,EACvB,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,CACjF,CAAC;IACF,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,IAAI,CAAC;AACzC,CAAC,CAAC"}
@@ -63,7 +63,10 @@ describe('files and released_entities persistence (integration)', () => {
63
63
  });
64
64
  it('does not drift between the model and the migrated database', async () => {
65
65
  const sqlInMemory = await testDataSource.driver.createSchemaBuilder().log();
66
- expect(sqlInMemory.upQueries.map((query) => query.query)).toEqual([]);
66
+ const ownQueries = sqlInMemory.upQueries
67
+ .map((query) => query.query)
68
+ .filter((query) => !/event_queue|jobs_outbox/.test(query));
69
+ expect(ownQueries).toEqual([]);
67
70
  });
68
71
  it('detects a drift when the database differs from the model', async () => {
69
72
  await testDataSource.query('ALTER TABLE files ADD COLUMN drifted int');
@@ -1 +1 @@
1
- {"version":3,"file":"file.model.int.spec.js","sourceRoot":"","sources":["../../../src/test/integration/file.model.int.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file.model.int.spec.js","sourceRoot":"","sources":["../../../src/test/integration/file.model.int.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=postgres-file.repository.int.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-file.repository.int.spec.d.ts","sourceRoot":"","sources":["../../../src/test/integration/postgres-file.repository.int.spec.ts"],"names":[],"mappings":""}