|
| 1 | +// eslint-disable-next-line |
1 | 2 | const { messages } = require('elasticio-node');
|
2 |
| - |
3 |
| -const groupsSeen = {}; |
| 3 | +const ObjectStorageWrapperExtended = require('./utils-wrapper/ObjectStorageWrapperExtended'); |
4 | 4 |
|
5 | 5 | async function processAction(msg) {
|
| 6 | + const storage = new ObjectStorageWrapperExtended(this); |
6 | 7 | const {
|
7 | 8 | groupSize,
|
8 | 9 | groupId,
|
9 | 10 | messageId,
|
10 | 11 | messageData,
|
11 | 12 | } = msg.body;
|
| 13 | + const incomingData = {}; |
| 14 | + const object = { |
| 15 | + messageId, |
| 16 | + groupId, |
| 17 | + messageData, |
| 18 | + }; |
12 | 19 |
|
13 | 20 | if (groupSize <= 0) {
|
14 | 21 | throw new Error('Size must be a positive integer.');
|
15 | 22 | }
|
| 23 | + if (!messageData) { |
| 24 | + incomingData[messageId] = undefined; |
| 25 | + } |
16 | 26 |
|
17 |
| - if (!groupsSeen[groupId]) { |
18 |
| - groupsSeen[groupId] = { |
19 |
| - groupSize, |
20 |
| - messageIdsSeen: new Set(), |
21 |
| - incomingData: {}, |
22 |
| - }; |
| 27 | + const { |
| 28 | + messageGroup, |
| 29 | + messageGroupId, |
| 30 | + messageGroupSize, |
| 31 | + isCreated, |
| 32 | + } = await storage.createMessageGroupIfNotExists(groupId, groupSize); |
| 33 | + |
| 34 | + if (isCreated) { |
| 35 | + await storage.createNewObjectInMessageGroup(object, messageGroupId); |
| 36 | + this.logger.info('New Group created. Added message'); |
| 37 | + } |
| 38 | + if (!isCreated) { |
| 39 | + await storage.createNewObjectInMessageGroup(object, messageGroupId); |
| 40 | + this.logger.info('Existed Group found. Added message'); |
| 41 | + this.logger.info(`Saved messages: ${Object.keys(messageGroup.messageIdsSeen).join(', ')}`); |
23 | 42 | }
|
24 | 43 |
|
25 |
| - groupsSeen[groupId].messageIdsSeen.add(messageId); |
26 |
| - groupsSeen[groupId].incomingData[messageId] = messageData; |
27 |
| - const numberSeen = groupsSeen[groupId].messageIdsSeen.size; |
| 44 | + const parsedMessageGroup = await storage.lookupParsedObjectById(messageGroupId); |
| 45 | + const filteredMessages = parsedMessageGroup.messages |
| 46 | + .filter((message) => message.messageId !== messageId); |
| 47 | + filteredMessages.push(object); |
| 48 | + parsedMessageGroup.messages = filteredMessages; |
| 49 | + await storage.updateObject(messageGroupId, parsedMessageGroup); |
| 50 | + const messagesNumberSeen = Object.keys(parsedMessageGroup.messageIdsSeen).length; |
28 | 51 |
|
29 | 52 | this.logger.info(
|
30 |
| - `Saw message ${messageId} of group ${groupId} Currently the group has ${numberSeen} of ${groupSize} message(s).`, |
| 53 | + `Saw message ${messageId} of group ${groupId}. |
| 54 | + Currently the group has ${messagesNumberSeen} of ${messageGroupSize} message(s).`, |
31 | 55 | );
|
32 | 56 |
|
33 |
| - if (numberSeen >= groupSize) { |
| 57 | + if (messagesNumberSeen >= messageGroupSize) { |
| 58 | + parsedMessageGroup.messages.forEach((message) => { |
| 59 | + incomingData[message.messageId] = message.messageData; |
| 60 | + }); |
| 61 | + |
34 | 62 | await this.emit('data', messages.newMessageWithBody({
|
35 | 63 | groupSize,
|
36 | 64 | groupId,
|
37 |
| - messageData: groupsSeen[groupId].incomingData, |
| 65 | + messageData: incomingData, |
38 | 66 | }));
|
39 |
| - delete groupsSeen[groupId]; |
| 67 | + await storage.deleteObjectById(messageGroupId); |
| 68 | + this.logger.info(`Message group with id ${messageGroupId} has been deleted`); |
40 | 69 | }
|
41 | 70 | }
|
42 | 71 |
|
|
0 commit comments