@volontariapp/post-processors 3.3.15-snap-ea4af4d → 3.4.0-snap-78178f5
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 +6 -0
- package/dist/common/base-storage-entity-result.post-processor.d.ts +16 -0
- package/dist/common/base-storage-entity-result.post-processor.d.ts.map +1 -0
- package/dist/common/base-storage-entity-result.post-processor.js +67 -0
- package/dist/common/base-storage-entity-result.post-processor.js.map +1 -0
- package/dist/common/index.d.ts +1 -0
- package/dist/common/index.d.ts.map +1 -1
- package/dist/common/index.js +1 -0
- package/dist/common/index.js.map +1 -1
- package/dist/test/common/base-storage-entity-result.post-processor.unit.spec.d.ts +2 -0
- package/dist/test/common/base-storage-entity-result.post-processor.unit.spec.d.ts.map +1 -0
- package/dist/test/common/base-storage-entity-result.post-processor.unit.spec.js +135 -0
- package/dist/test/common/base-storage-entity-result.post-processor.unit.spec.js.map +1 -0
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BatchPostProcessor } from '../core/processors/batch.post-processor.js';
|
|
2
|
+
import type { PostProcessorOptions, BatchEventItem } from '../interfaces/index.js';
|
|
3
|
+
import type { Redis } from 'ioredis';
|
|
4
|
+
import type { StorageEventMessagingType, StorageEntityType, IStorageFileEntityPayload } from '@volontariapp/messaging';
|
|
5
|
+
export type StorageResultEventType = StorageEventMessagingType.FILE_SCANNED | StorageEventMessagingType.FILE_REJECTED | StorageEventMessagingType.ATTACHMENT_REJECTED;
|
|
6
|
+
export declare abstract class BaseStorageEntityResultPostProcessor<TEvent extends StorageResultEventType = StorageResultEventType, TStatus = unknown, TResult extends object | boolean = boolean> extends BatchPostProcessor<TEvent> {
|
|
7
|
+
protected readonly expectedEventType: TEvent;
|
|
8
|
+
protected readonly expectedEntityType: StorageEntityType;
|
|
9
|
+
protected readonly targetStatus: TStatus;
|
|
10
|
+
constructor(redisDriver: Redis, options: PostProcessorOptions, expectedEventType: TEvent, expectedEntityType: StorageEntityType, targetStatus: TStatus);
|
|
11
|
+
protected shouldProcess(eventType: TEvent | string): boolean;
|
|
12
|
+
protected processEvents(events: BatchEventItem<TEvent>[]): Promise<void>;
|
|
13
|
+
protected abstract applyResult(entityId: string, fileId: string, status: TStatus, payload: IStorageFileEntityPayload): Promise<TResult | null | undefined>;
|
|
14
|
+
protected onSuccess(entityId: string, fileId: string, _result: TResult, messageId: string): Promise<void> | void;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=base-storage-entity-result.post-processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-storage-entity-result.post-processor.d.ts","sourceRoot":"","sources":["../../src/common/base-storage-entity-result.post-processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EACV,yBAAyB,EACzB,iBAAiB,EACjB,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,sBAAsB,GAC9B,yBAAyB,CAAC,YAAY,GACtC,yBAAyB,CAAC,aAAa,GACvC,yBAAyB,CAAC,mBAAmB,CAAC;AASlD,8BAAsB,oCAAoC,CACxD,MAAM,SAAS,sBAAsB,GAAG,sBAAsB,EAC9D,OAAO,GAAG,OAAO,EACjB,OAAO,SAAS,MAAM,GAAG,OAAO,GAAG,OAAO,CAC1C,SAAQ,kBAAkB,CAAC,MAAM,CAAC;IAIhC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM;IAC5C,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,iBAAiB;IACxD,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO;gBAJxC,WAAW,EAAE,KAAK,EAClB,OAAO,EAAE,oBAAoB,EACV,iBAAiB,EAAE,MAAM,EACzB,kBAAkB,EAAE,iBAAiB,EACrC,YAAY,EAAE,OAAO;cAKvB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;cAIrD,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA8E9E,SAAS,CAAC,QAAQ,CAAC,WAAW,CAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAMtC,SAAS,CAAC,SAAS,CACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;CAWxB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { BatchPostProcessor } from '../core/processors/batch.post-processor.js';
|
|
2
|
+
export class BaseStorageEntityResultPostProcessor extends BatchPostProcessor {
|
|
3
|
+
expectedEventType;
|
|
4
|
+
expectedEntityType;
|
|
5
|
+
targetStatus;
|
|
6
|
+
constructor(redisDriver, options, expectedEventType, expectedEntityType, targetStatus) {
|
|
7
|
+
super(redisDriver, options);
|
|
8
|
+
this.expectedEventType = expectedEventType;
|
|
9
|
+
this.expectedEntityType = expectedEntityType;
|
|
10
|
+
this.targetStatus = targetStatus;
|
|
11
|
+
}
|
|
12
|
+
shouldProcess(eventType) {
|
|
13
|
+
return eventType === this.expectedEventType.toString();
|
|
14
|
+
}
|
|
15
|
+
async processEvents(events) {
|
|
16
|
+
for (const { event, messageId } of events) {
|
|
17
|
+
const rawPayload = event.payload;
|
|
18
|
+
const payload = rawPayload?.after;
|
|
19
|
+
if (!payload?.fileId || !payload.entityId) {
|
|
20
|
+
this.logger.error(`Invalid payload for ${String(this.expectedEventType)}: missing required fields`, {
|
|
21
|
+
messageId,
|
|
22
|
+
payload: event.payload,
|
|
23
|
+
});
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (payload.entityType !== this.expectedEntityType) {
|
|
27
|
+
this.logger.debug(`Ignoring storage event for non-${this.expectedEntityType.toLowerCase()} entity: ${String(payload.entityType)}`, {
|
|
28
|
+
messageId,
|
|
29
|
+
fileId: payload.fileId,
|
|
30
|
+
entityId: payload.entityId,
|
|
31
|
+
entityType: payload.entityType,
|
|
32
|
+
});
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const updated = await this.applyResult(payload.entityId, payload.fileId, this.targetStatus, payload);
|
|
37
|
+
if (!updated) {
|
|
38
|
+
this.logger.warn(`Entity not found when applying storage result for ${this.expectedEntityType} ${payload.entityId}`, {
|
|
39
|
+
messageId,
|
|
40
|
+
entityId: payload.entityId,
|
|
41
|
+
fileId: payload.fileId,
|
|
42
|
+
});
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
await this.onSuccess(payload.entityId, payload.fileId, updated, messageId);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
this.logger.error(`Failed to apply storage result status for ${this.expectedEntityType} ${payload.entityId}`, error, {
|
|
49
|
+
messageId,
|
|
50
|
+
entityId: payload.entityId,
|
|
51
|
+
fileId: payload.fileId,
|
|
52
|
+
status: this.targetStatus,
|
|
53
|
+
});
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
onSuccess(entityId, fileId, _result, messageId) {
|
|
59
|
+
this.logger.info(`Successfully applied storage result status for ${this.expectedEntityType} ${entityId} and file ${fileId}`, {
|
|
60
|
+
messageId,
|
|
61
|
+
entityId,
|
|
62
|
+
fileId,
|
|
63
|
+
status: this.targetStatus,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=base-storage-entity-result.post-processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-storage-entity-result.post-processor.js","sourceRoot":"","sources":["../../src/common/base-storage-entity-result.post-processor.ts"],"names":[],"mappings":"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"}
|
package/dist/common/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,wCAAwC,CAAC;AACvD,cAAc,uCAAuC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,wCAAwC,CAAC;AACvD,cAAc,uCAAuC,CAAC;AACtD,cAAc,gDAAgD,CAAC"}
|
package/dist/common/index.js
CHANGED
package/dist/common/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,wCAAwC,CAAC;AACvD,cAAc,uCAAuC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,wCAAwC,CAAC;AACvD,cAAc,uCAAuC,CAAC;AACtD,cAAc,gDAAgD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-storage-entity-result.post-processor.unit.spec.d.ts","sourceRoot":"","sources":["../../../src/test/common/base-storage-entity-result.post-processor.unit.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, jest } from '@jest/globals';
|
|
2
|
+
import { createMock } from '@volontariapp/testing';
|
|
3
|
+
import { StorageEventMessagingType, StorageEntityType, } from '@volontariapp/messaging';
|
|
4
|
+
import { BaseStorageEntityResultPostProcessor, } from '../../common/base-storage-entity-result.post-processor.js';
|
|
5
|
+
class ConcreteStorageEntityResultPostProcessor extends BaseStorageEntityResultPostProcessor {
|
|
6
|
+
applyResultMock = jest.fn();
|
|
7
|
+
onSuccessMock = jest.fn();
|
|
8
|
+
applyResult(entityId, fileId, status, payload) {
|
|
9
|
+
return this.applyResultMock(entityId, fileId, status, payload);
|
|
10
|
+
}
|
|
11
|
+
onSuccess(entityId, fileId, result, messageId) {
|
|
12
|
+
void super.onSuccess(entityId, fileId, result, messageId);
|
|
13
|
+
return this.onSuccessMock(entityId, fileId, result, messageId);
|
|
14
|
+
}
|
|
15
|
+
testProcessEvents(events) {
|
|
16
|
+
return this.processEvents(events);
|
|
17
|
+
}
|
|
18
|
+
testShouldProcess(eventType) {
|
|
19
|
+
return this.shouldProcess(eventType);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
describe('BaseStorageEntityResultPostProcessor — Unit', () => {
|
|
23
|
+
let redisMock;
|
|
24
|
+
let processor;
|
|
25
|
+
const validOptions = {
|
|
26
|
+
streamName: 'stream:storage:scanned',
|
|
27
|
+
groupName: 'group:test',
|
|
28
|
+
consumerName: 'consumer-test',
|
|
29
|
+
};
|
|
30
|
+
const expectedEventType = StorageEventMessagingType.FILE_SCANNED;
|
|
31
|
+
const expectedEntityType = StorageEntityType.POST;
|
|
32
|
+
const targetStatus = 'CLEAN';
|
|
33
|
+
beforeEach(() => {
|
|
34
|
+
jest.clearAllMocks();
|
|
35
|
+
redisMock = createMock();
|
|
36
|
+
redisMock.duplicate.mockReturnValue(redisMock);
|
|
37
|
+
processor = new ConcreteStorageEntityResultPostProcessor(redisMock, validOptions, expectedEventType, expectedEntityType, targetStatus);
|
|
38
|
+
});
|
|
39
|
+
describe('shouldProcess', () => {
|
|
40
|
+
it('should return true when event type matches expectedEventType', () => {
|
|
41
|
+
expect(processor.testShouldProcess(StorageEventMessagingType.FILE_SCANNED)).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
it('should return false when event type does not match', () => {
|
|
44
|
+
expect(processor.testShouldProcess(StorageEventMessagingType.FILE_REJECTED)).toBe(false);
|
|
45
|
+
expect(processor.testShouldProcess('unknown.event')).toBe(false);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('processEvents', () => {
|
|
49
|
+
const buildBatchItem = (payloadOverride, messageId = '1700000000000-0') => {
|
|
50
|
+
const payload = payloadOverride === null
|
|
51
|
+
? null
|
|
52
|
+
: {
|
|
53
|
+
fileId: 'file-123',
|
|
54
|
+
entityId: 'post-456',
|
|
55
|
+
entityType: StorageEntityType.POST,
|
|
56
|
+
ownerId: 'user-789',
|
|
57
|
+
...payloadOverride,
|
|
58
|
+
};
|
|
59
|
+
return {
|
|
60
|
+
messageId,
|
|
61
|
+
event: {
|
|
62
|
+
id: 'evt-1',
|
|
63
|
+
version: 1,
|
|
64
|
+
type: StorageEventMessagingType.FILE_SCANNED,
|
|
65
|
+
emitter: 'ms-storage',
|
|
66
|
+
emitterId: 'file-123',
|
|
67
|
+
traceId: 'trace-1',
|
|
68
|
+
correlationId: 'corr-1',
|
|
69
|
+
createdAt: new Date().toISOString(),
|
|
70
|
+
payload: {
|
|
71
|
+
before: undefined,
|
|
72
|
+
after: payload,
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
it('should successfully apply result and call onSuccess for matching entity', async () => {
|
|
78
|
+
const batchItem = buildBatchItem();
|
|
79
|
+
const updatedEntity = {
|
|
80
|
+
id: 'post-456',
|
|
81
|
+
fileId: 'file-123',
|
|
82
|
+
status: targetStatus,
|
|
83
|
+
};
|
|
84
|
+
processor.applyResultMock.mockResolvedValueOnce(updatedEntity);
|
|
85
|
+
await processor.testProcessEvents([batchItem]);
|
|
86
|
+
expect(processor.applyResultMock).toHaveBeenCalledTimes(1);
|
|
87
|
+
expect(processor.applyResultMock).toHaveBeenCalledWith('post-456', 'file-123', targetStatus, expect.objectContaining({
|
|
88
|
+
entityId: 'post-456',
|
|
89
|
+
fileId: 'file-123',
|
|
90
|
+
entityType: StorageEntityType.POST,
|
|
91
|
+
}));
|
|
92
|
+
expect(processor.onSuccessMock).toHaveBeenCalledTimes(1);
|
|
93
|
+
expect(processor.onSuccessMock).toHaveBeenCalledWith('post-456', 'file-123', updatedEntity, '1700000000000-0');
|
|
94
|
+
});
|
|
95
|
+
it('should skip event when entityType does not match expectedEntityType', async () => {
|
|
96
|
+
const batchItem = buildBatchItem({ entityType: StorageEntityType.EVENT_COVER });
|
|
97
|
+
await processor.testProcessEvents([batchItem]);
|
|
98
|
+
expect(processor.applyResultMock).not.toHaveBeenCalled();
|
|
99
|
+
expect(processor.onSuccessMock).not.toHaveBeenCalled();
|
|
100
|
+
});
|
|
101
|
+
it('should skip event when fileId is missing', async () => {
|
|
102
|
+
const batchItem = buildBatchItem({ fileId: '' });
|
|
103
|
+
await processor.testProcessEvents([batchItem]);
|
|
104
|
+
expect(processor.applyResultMock).not.toHaveBeenCalled();
|
|
105
|
+
expect(processor.onSuccessMock).not.toHaveBeenCalled();
|
|
106
|
+
});
|
|
107
|
+
it('should skip event when entityId is missing', async () => {
|
|
108
|
+
const batchItem = buildBatchItem({ entityId: '' });
|
|
109
|
+
await processor.testProcessEvents([batchItem]);
|
|
110
|
+
expect(processor.applyResultMock).not.toHaveBeenCalled();
|
|
111
|
+
expect(processor.onSuccessMock).not.toHaveBeenCalled();
|
|
112
|
+
});
|
|
113
|
+
it('should skip event when payload is null or missing', async () => {
|
|
114
|
+
const batchItem = buildBatchItem(null);
|
|
115
|
+
await processor.testProcessEvents([batchItem]);
|
|
116
|
+
expect(processor.applyResultMock).not.toHaveBeenCalled();
|
|
117
|
+
expect(processor.onSuccessMock).not.toHaveBeenCalled();
|
|
118
|
+
});
|
|
119
|
+
it('should not throw and not call onSuccess if entity is not found (returns null)', async () => {
|
|
120
|
+
const batchItem = buildBatchItem();
|
|
121
|
+
processor.applyResultMock.mockResolvedValueOnce(null);
|
|
122
|
+
await expect(processor.testProcessEvents([batchItem])).resolves.not.toThrow();
|
|
123
|
+
expect(processor.applyResultMock).toHaveBeenCalledTimes(1);
|
|
124
|
+
expect(processor.onSuccessMock).not.toHaveBeenCalled();
|
|
125
|
+
});
|
|
126
|
+
it('should re-throw error if applyResult throws an error', async () => {
|
|
127
|
+
const batchItem = buildBatchItem();
|
|
128
|
+
const dbError = new Error('Database connection failed');
|
|
129
|
+
processor.applyResultMock.mockRejectedValueOnce(dbError);
|
|
130
|
+
await expect(processor.testProcessEvents([batchItem])).rejects.toThrow('Database connection failed');
|
|
131
|
+
expect(processor.onSuccessMock).not.toHaveBeenCalled();
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=base-storage-entity-result.post-processor.unit.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-storage-entity-result.post-processor.unit.spec.js","sourceRoot":"","sources":["../../../src/test/common/base-storage-entity-result.post-processor.unit.spec.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volontariapp/post-processors",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.0-snap-78178f5",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"provenance": true
|
|
@@ -37,11 +37,11 @@
|
|
|
37
37
|
"test:int:watch": "INTEGRATION=true node --experimental-vm-modules $(yarn bin jest) --watch"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@volontariapp/database": "3.10.13
|
|
40
|
+
"@volontariapp/database": "3.10.13",
|
|
41
41
|
"@volontariapp/health-check": "1.0.10",
|
|
42
42
|
"@volontariapp/logger": "0.4.0",
|
|
43
|
-
"@volontariapp/messaging": "2.28.1
|
|
44
|
-
"@volontariapp/outbox": "0.10.17
|
|
43
|
+
"@volontariapp/messaging": "2.28.1",
|
|
44
|
+
"@volontariapp/outbox": "0.10.17",
|
|
45
45
|
"@volontariapp/shared": "0.17.0"
|
|
46
46
|
},
|
|
47
47
|
"peerDependencies": {
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"@opentelemetry/sdk-trace-node": "^2.7.1",
|
|
57
57
|
"@types/jest": "^30.0.0",
|
|
58
58
|
"@types/node": "^24.0.0",
|
|
59
|
-
"@volontariapp/contracts": "4.8.2
|
|
59
|
+
"@volontariapp/contracts": "4.8.2",
|
|
60
60
|
"@volontariapp/testing": "1.0.3",
|
|
61
61
|
"ioredis": "^5.3.7",
|
|
62
62
|
"jest": "^29.7.0",
|