@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.
- package/CHANGELOG.md +8 -0
- package/dist/repositories/file-outbox.builders.d.ts +10 -0
- package/dist/repositories/file-outbox.builders.d.ts.map +1 -0
- package/dist/repositories/file-outbox.builders.js +45 -0
- package/dist/repositories/file-outbox.builders.js.map +1 -0
- package/dist/repositories/file-repository.types.d.ts +44 -0
- package/dist/repositories/file-repository.types.d.ts.map +1 -0
- package/dist/repositories/file-repository.types.js +2 -0
- package/dist/repositories/file-repository.types.js.map +1 -0
- package/dist/repositories/index.d.ts +4 -0
- package/dist/repositories/index.d.ts.map +1 -0
- package/dist/repositories/index.js +4 -0
- package/dist/repositories/index.js.map +1 -0
- package/dist/repositories/postgres-file.repository.d.ts +20 -0
- package/dist/repositories/postgres-file.repository.d.ts.map +1 -0
- package/dist/repositories/postgres-file.repository.js +136 -0
- package/dist/repositories/postgres-file.repository.js.map +1 -0
- package/dist/test/data-source.d.ts.map +1 -1
- package/dist/test/data-source.js +24 -4
- package/dist/test/data-source.js.map +1 -1
- package/dist/test/file-outbox.builders.unit.spec.d.ts +2 -0
- package/dist/test/file-outbox.builders.unit.spec.d.ts.map +1 -0
- package/dist/test/file-outbox.builders.unit.spec.js +61 -0
- package/dist/test/file-outbox.builders.unit.spec.js.map +1 -0
- package/dist/test/helpers/file-db.helper.d.ts +10 -0
- package/dist/test/helpers/file-db.helper.d.ts.map +1 -0
- package/dist/test/helpers/file-db.helper.js +20 -0
- package/dist/test/helpers/file-db.helper.js.map +1 -0
- package/dist/test/integration/file.model.int.spec.js +4 -1
- package/dist/test/integration/file.model.int.spec.js.map +1 -1
- package/dist/test/integration/postgres-file.repository.int.spec.d.ts +2 -0
- package/dist/test/integration/postgres-file.repository.int.spec.d.ts.map +1 -0
- package/dist/test/integration/postgres-file.repository.int.spec.js +452 -0
- package/dist/test/integration/postgres-file.repository.int.spec.js.map +1 -0
- package/dist/test/migrations/common/1776786226145-JobsOutboxAndEventQueue.d.ts +7 -0
- package/dist/test/migrations/common/1776786226145-JobsOutboxAndEventQueue.d.ts.map +1 -0
- package/dist/test/migrations/common/1776786226145-JobsOutboxAndEventQueue.js +12 -0
- package/dist/test/migrations/common/1776786226145-JobsOutboxAndEventQueue.js.map +1 -0
- package/dist/test/migrations/common/1776974876099-JobsOutboxAndEventQueueWithTraceId.d.ts +7 -0
- package/dist/test/migrations/common/1776974876099-JobsOutboxAndEventQueueWithTraceId.d.ts.map +1 -0
- package/dist/test/migrations/common/1776974876099-JobsOutboxAndEventQueueWithTraceId.js +12 -0
- package/dist/test/migrations/common/1776974876099-JobsOutboxAndEventQueueWithTraceId.js.map +1 -0
- package/dist/test/migrations/common/1777630647718-UpdateOutboxModels.d.ts +7 -0
- package/dist/test/migrations/common/1777630647718-UpdateOutboxModels.d.ts.map +1 -0
- package/dist/test/migrations/common/1777630647718-UpdateOutboxModels.js +12 -0
- package/dist/test/migrations/common/1777630647718-UpdateOutboxModels.js.map +1 -0
- package/dist/test/migrations/common/1777985367963-AddTargetServicesToEventQueue.d.ts +6 -0
- package/dist/test/migrations/common/1777985367963-AddTargetServicesToEventQueue.d.ts.map +1 -0
- package/dist/test/migrations/common/1777985367963-AddTargetServicesToEventQueue.js +76 -0
- package/dist/test/migrations/common/1777985367963-AddTargetServicesToEventQueue.js.map +1 -0
- package/dist/test/migrations/common/1779114963391-AddJobAudit.d.ts +7 -0
- package/dist/test/migrations/common/1779114963391-AddJobAudit.d.ts.map +1 -0
- package/dist/test/migrations/common/1779114963391-AddJobAudit.js +18 -0
- package/dist/test/migrations/common/1779114963391-AddJobAudit.js.map +1 -0
- package/dist/test/migrations/common/1779115100001-AddJobAuditStatusTrigger.d.ts +7 -0
- package/dist/test/migrations/common/1779115100001-AddJobAuditStatusTrigger.d.ts.map +1 -0
- package/dist/test/migrations/common/1779115100001-AddJobAuditStatusTrigger.js +45 -0
- package/dist/test/migrations/common/1779115100001-AddJobAuditStatusTrigger.js.map +1 -0
- package/dist/test/migrations/common/1779353596425-AddEmitterToJobAudit.d.ts +7 -0
- package/dist/test/migrations/common/1779353596425-AddEmitterToJobAudit.d.ts.map +1 -0
- package/dist/test/migrations/common/1779353596425-AddEmitterToJobAudit.js +18 -0
- package/dist/test/migrations/common/1779353596425-AddEmitterToJobAudit.js.map +1 -0
- package/dist/test/migrations/common/1779360000000-FixEventQueueStatusDefault.d.ts +7 -0
- package/dist/test/migrations/common/1779360000000-FixEventQueueStatusDefault.d.ts.map +1 -0
- package/dist/test/migrations/common/1779360000000-FixEventQueueStatusDefault.js +12 -0
- package/dist/test/migrations/common/1779360000000-FixEventQueueStatusDefault.js.map +1 -0
- package/dist/test/migrations/common/1779542033290-AddEmitterIdToOutbox.d.ts +6 -0
- package/dist/test/migrations/common/1779542033290-AddEmitterIdToOutbox.d.ts.map +1 -0
- package/dist/test/migrations/common/1779542033290-AddEmitterIdToOutbox.js +13 -0
- package/dist/test/migrations/common/1779542033290-AddEmitterIdToOutbox.js.map +1 -0
- package/dist/test/migrations/common/1779700000000-UpdateEventQueueTriggerTargetService.d.ts +6 -0
- package/dist/test/migrations/common/1779700000000-UpdateEventQueueTriggerTargetService.d.ts.map +1 -0
- package/dist/test/migrations/common/1779700000000-UpdateEventQueueTriggerTargetService.js +151 -0
- package/dist/test/migrations/common/1779700000000-UpdateEventQueueTriggerTargetService.js.map +1 -0
- package/dist/test/migrations/common/1779800000000-UpdateJobAuditStatusTrigger.d.ts +7 -0
- package/dist/test/migrations/common/1779800000000-UpdateJobAuditStatusTrigger.d.ts.map +1 -0
- package/dist/test/migrations/common/1779800000000-UpdateJobAuditStatusTrigger.js +72 -0
- package/dist/test/migrations/common/1779800000000-UpdateJobAuditStatusTrigger.js.map +1 -0
- package/dist/test/migrations/common/1781000000000-AddCorrelationIdToEventQueue.d.ts +7 -0
- package/dist/test/migrations/common/1781000000000-AddCorrelationIdToEventQueue.d.ts.map +1 -0
- package/dist/test/migrations/common/1781000000000-AddCorrelationIdToEventQueue.js +12 -0
- package/dist/test/migrations/common/1781000000000-AddCorrelationIdToEventQueue.js.map +1 -0
- package/dist/test/migrations/domain/1775000000000-EnableUuidExtension.d.ts +7 -0
- package/dist/test/migrations/domain/1775000000000-EnableUuidExtension.d.ts.map +1 -0
- package/dist/test/migrations/domain/1775000000000-EnableUuidExtension.js +9 -0
- package/dist/test/migrations/domain/1775000000000-EnableUuidExtension.js.map +1 -0
- package/dist/test/mocks/outbox-write-failure.mock.d.ts +4 -0
- package/dist/test/mocks/outbox-write-failure.mock.d.ts.map +1 -0
- package/dist/test/mocks/outbox-write-failure.mock.js +14 -0
- package/dist/test/mocks/outbox-write-failure.mock.js.map +1 -0
- package/dist/test/root-entrypoint.unit.spec.js +6 -0
- package/dist/test/root-entrypoint.unit.spec.js.map +1 -1
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"file-repository.types.js","sourceRoot":"","sources":["../../src/repositories/file-repository.types.ts"],"names":[],"mappings":""}
|
|
@@ -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 @@
|
|
|
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":"
|
|
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"}
|
package/dist/test/data-source.js
CHANGED
|
@@ -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
|
-
|
|
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:
|
|
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;
|
|
1
|
+
{"version":3,"file":"data-source.js","sourceRoot":"","sources":["../../src/test/data-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
-
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-file.repository.int.spec.d.ts","sourceRoot":"","sources":["../../../src/test/integration/postgres-file.repository.int.spec.ts"],"names":[],"mappings":""}
|