Skip to content

Commit 49c5dff

Browse files
committed
add addMessageBatch
1 parent 069e624 commit 49c5dff

File tree

5 files changed

+142
-36
lines changed

5 files changed

+142
-36
lines changed

packages/backend/src/persistance/getDatabase.ts

+6-7
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ import { syncAcknowledge } from './messages/syncAcknowledge';
2020
import { PrismaClient } from '@prisma/client';
2121
import { addConversation } from './storage/postgres/addConversation';
2222
import { getConversationList } from './storage/postgres/getConversationList';
23-
import { addMessage } from './storage/postgres/addMessage';
2423
import { getMessages } from './storage/postgres/getMessages';
2524
import {
26-
EditMessageBatchPayload,
25+
MessageBatch,
2726
editMessageBatch,
2827
} from './storage/postgres/editMessageBatch';
2928
import { getNumberOfMessages } from './storage/postgres/getNumberOfMessages';
3029
import { getNumberOfConversations } from './storage/postgres/getNumberOfConversations';
30+
import { addMessageBatch } from './storage/postgres/addMessageBatch';
3131

3232
export enum RedisPrefix {
3333
Conversation = 'conversation:',
@@ -127,7 +127,7 @@ export async function getDatabase(
127127
storage_addConversation: addConversation(prisma),
128128
storage_getConversationList: getConversationList(prisma),
129129
//Storage Add Messages
130-
storage_addMessage: addMessage(prisma),
130+
storage_addMessageBatch: addMessageBatch(prisma),
131131
//Storage Get Messages
132132
storage_getMessages: getMessages(prisma),
133133
//Storage Edit Message Batch
@@ -232,11 +232,10 @@ export interface IDatabase {
232232
encryptedContactName: string,
233233
) => Promise<boolean>;
234234
storage_getConversationList: (ensName: string) => Promise<string[]>;
235-
storage_addMessage: (
235+
storage_addMessageBatch: (
236236
ensName: string,
237237
encryptedContactName: string,
238-
messageId: string,
239-
encryptedEnvelopContainer: string,
238+
messageBatch: MessageBatch[],
240239
) => Promise<boolean>;
241240
storage_getMessages: (
242241
ensName: string,
@@ -246,7 +245,7 @@ export interface IDatabase {
246245
storage_editMesageBatch: (
247246
ensName: string,
248247
encryptedContactName: string,
249-
editMessageBatchPayload: EditMessageBatchPayload[],
248+
messageBatch: MessageBatch[],
250249
) => Promise<void>;
251250
storage_getNumberOfMessages: (
252251
ensName: string,

packages/backend/src/persistance/storage/postgres/addMessage.ts packages/backend/src/persistance/storage/postgres/addMessageBatch.ts

+19-11
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { PrismaClient } from '@prisma/client';
2+
import { MessageBatch } from './editMessageBatch';
23

3-
export const addMessage =
4+
export const addMessageBatch =
45
(db: PrismaClient) =>
56
async (
67
ensName: string,
78
contactName: string,
8-
messageId: string,
9-
encryptedEnvelopContainer: string,
9+
messageBatch: MessageBatch[],
1010
) => {
1111
try {
1212
let account = await db.account.findFirst({
@@ -32,25 +32,33 @@ export const addMessage =
3232
});
3333

3434
if (!conversation) {
35+
console.log('Creating conversation');
3536
conversation = await db.conversation.create({
3637
data: {
37-
encryptedId: contactName,
3838
accountId: ensName,
39+
encryptedId: contactName,
3940
},
4041
});
42+
addMessageBatch;
4143
}
4244

43-
await db.encryptedMessage.create({
44-
data: {
45-
id: messageId,
46-
conversationId: conversation.encryptedId,
47-
encryptedEnvelopContainer,
45+
const createMessagePromises = messageBatch.map(
46+
({ messageId, encryptedEnvelopContainer }) => {
47+
return db.encryptedMessage.create({
48+
data: {
49+
id: messageId,
50+
conversationId: contactName,
51+
encryptedEnvelopContainer,
52+
},
53+
});
4854
},
49-
});
55+
);
56+
57+
await db.$transaction(createMessagePromises);
5058

5159
return true;
5260
} catch (e) {
53-
console.log('addMessage error ', e);
61+
console.log('addMessageBatch error ', e);
5462
return false;
5563
}
5664
};

packages/backend/src/persistance/storage/postgres/editMessageBatch.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { PrismaClient } from '@prisma/client';
22

3-
export type EditMessageBatchPayload = {
3+
export type MessageBatch = {
44
messageId: string;
55
encryptedEnvelopContainer: string;
66
};
@@ -10,7 +10,7 @@ export const editMessageBatch =
1010
async (
1111
ensName: string,
1212
contactName: string,
13-
editMessageBatchPayload: EditMessageBatchPayload[],
13+
editMessageBatchPayload: MessageBatch[],
1414
) => {
1515
let account = await db.account.findFirst({
1616
where: {

packages/backend/src/storage.test.ts

+84-11
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@ import {
2020
} from '../test/testHelper';
2121
import auth from './auth';
2222
import { addConversation } from './persistance/storage/postgres/addConversation';
23-
import { addMessage } from './persistance/storage/postgres/addMessage';
2423
import {
25-
EditMessageBatchPayload,
24+
MessageBatch,
2625
editMessageBatch,
2726
} from './persistance/storage/postgres/editMessageBatch';
2827
import { getConversationList } from './persistance/storage/postgres/getConversationList';
2928
import { getMessages } from './persistance/storage/postgres/getMessages';
3029
import storage from './storage';
3130
import { getNumberOfMessages } from './persistance/storage/postgres/getNumberOfMessages';
3231
import { getNumberOfConversations } from './persistance/storage/postgres/getNumberOfConversations';
32+
import { addMessageBatch } from './persistance/storage/postgres/addMessageBatch';
3333

3434
const keysA = {
3535
encryptionKeyPair: {
@@ -95,7 +95,7 @@ describe('Storage', () => {
9595
},
9696
getIdEnsName: async (ensName: string) => ensName,
9797
storage_editMessageBatch: editMessageBatch(prisma),
98-
storage_addMessage: addMessage(prisma),
98+
storage_addMessageBatch: addMessageBatch(prisma),
9999
storage_getMessages: getMessages(prisma),
100100
storage_addConversation: addConversation(prisma),
101101
storage_getConversationList: getConversationList(prisma),
@@ -168,7 +168,7 @@ describe('Storage', () => {
168168
authorization: `Bearer ${token}`,
169169
})
170170
.send({
171-
message: JSON.stringify(encryptedEnvelop),
171+
encryptedEnvelopContainer: JSON.stringify(encryptedEnvelop),
172172
encryptedContactName: sha256(receiver.account.ensName),
173173
messageId: '123',
174174
});
@@ -204,6 +204,79 @@ describe('Storage', () => {
204204
).toStrictEqual(encryptedEnvelop);
205205
});
206206
});
207+
describe('addMessageBatch', () => {
208+
it('can add a messageBatch', async () => {
209+
const message = await createMessage(
210+
sender.account.ensName,
211+
receiver.account.ensName,
212+
'Hello',
213+
sender.profileKeys.signingKeyPair.privateKey,
214+
);
215+
const { encryptedEnvelop, envelop } = await buildEnvelop(
216+
message,
217+
(receiverPublicSigningKey: string, message: string) => {
218+
return encryptAsymmetric(receiverPublicSigningKey, message);
219+
},
220+
{
221+
from: sender.account,
222+
to: receiver.account,
223+
deliverServiceProfile: deliveryService.profile,
224+
keys: sender.profileKeys,
225+
},
226+
);
227+
228+
const { status } = await request(app)
229+
.post(`/new/bob.eth/addMessageBatch`)
230+
.set({
231+
authorization: `Bearer ${token}`,
232+
})
233+
.send({
234+
encryptedContactName: sha256(receiver.account.ensName),
235+
messageBatch: [
236+
{
237+
encryptedEnvelopContainer:
238+
JSON.stringify(encryptedEnvelop),
239+
messageId: '123',
240+
},
241+
{
242+
encryptedEnvelopContainer:
243+
JSON.stringify(encryptedEnvelop),
244+
messageId: '456',
245+
},
246+
],
247+
});
248+
expect(status).toBe(200);
249+
250+
const { body } = await request(app)
251+
.get(`/new/bob.eth/conversationList`)
252+
.set({
253+
authorization: `Bearer ${token}`,
254+
})
255+
.send();
256+
257+
expect(status).toBe(200);
258+
expect(body).toEqual([sha256(receiver.account.ensName)]);
259+
expect(body.length).toBe(1);
260+
261+
const { status: getMessagesStatus, body: messages } = await request(
262+
app,
263+
)
264+
.get(`/new/bob.eth/getMessages`)
265+
.set({
266+
authorization: `Bearer ${token}`,
267+
})
268+
.send({
269+
encryptedContactName: sha256(receiver.account.ensName),
270+
page: 0,
271+
});
272+
273+
expect(getMessagesStatus).toBe(200);
274+
expect(messages.length).toBe(2);
275+
expect(
276+
JSON.parse(JSON.parse(messages[0]).encryptedEnvelopContainer),
277+
).toStrictEqual(encryptedEnvelop);
278+
});
279+
});
207280
describe('getNumberOfMessages', () => {
208281
it('can get number of messages', async () => {
209282
//create message
@@ -232,7 +305,7 @@ describe('Storage', () => {
232305
authorization: `Bearer ${token}`,
233306
})
234307
.send({
235-
message: JSON.stringify(encryptedEnvelop),
308+
encryptedEnvelopContainer: JSON.stringify(encryptedEnvelop),
236309
encryptedContactName: sha256(receiver.account.ensName),
237310
messageId: '123',
238311
});
@@ -243,7 +316,7 @@ describe('Storage', () => {
243316
authorization: `Bearer ${token}`,
244317
})
245318
.send({
246-
message: JSON.stringify(encryptedEnvelop),
319+
encryptedEnvelopContainer: JSON.stringify(encryptedEnvelop),
247320
encryptedContactName: sha256(receiver.account.ensName),
248321
messageId: '456',
249322
});
@@ -254,7 +327,7 @@ describe('Storage', () => {
254327
authorization: `Bearer ${token}`,
255328
})
256329
.send({
257-
message: JSON.stringify(encryptedEnvelop),
330+
encryptedEnvelopContainer: JSON.stringify(encryptedEnvelop),
258331
encryptedContactName: sha256(receiver.account.ensName),
259332
messageId: '123',
260333
});
@@ -319,7 +392,7 @@ describe('Storage', () => {
319392
describe('editMessageBatch', () => {
320393
it('should create a message if they has not been created before', async () => {
321394
const encryptedContactName = 'testContactName';
322-
const payload: EditMessageBatchPayload[] = [
395+
const payload: MessageBatch[] = [
323396
{
324397
messageId: 'testMessageId',
325398
encryptedEnvelopContainer: 'testEncryptedEnvelopContainer',
@@ -359,7 +432,7 @@ describe('Storage', () => {
359432
it('should update encryptedMessage message', async () => {
360433
const ensName = 'testEnsName';
361434
const contactName = 'testContactName';
362-
const originalPayload: EditMessageBatchPayload[] = [
435+
const originalPayload: MessageBatch[] = [
363436
{
364437
messageId: 'testMessageId',
365438
encryptedEnvelopContainer: 'testEncryptedEnvelopContainer',
@@ -371,13 +444,13 @@ describe('Storage', () => {
371444
authorization: `Bearer ${token}`,
372445
})
373446
.send({
374-
message: JSON.stringify(originalPayload),
447+
encryptedEnvelopContainer: JSON.stringify(originalPayload),
375448
encryptedContactName: sha256(receiver.account.ensName),
376449
messageId: '123',
377450
});
378451
expect(status).toBe(200);
379452

380-
const updatedPayload: EditMessageBatchPayload[] = [
453+
const updatedPayload: MessageBatch[] = [
381454
{
382455
messageId: 'testMessageId',
383456
encryptedEnvelopContainer: 'NEW ENVELOP',

packages/backend/src/storage.ts

+31-5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { normalizeEnsName } from '@dm3-org/dm3-lib-profile';
22
import cors from 'cors';
33
import express from 'express';
44
import stringify from 'safe-stable-stringify';
5+
import { MessageBatch } from './persistance/storage/postgres/editMessageBatch';
56

67
export default () => {
78
const router = express.Router();
@@ -31,20 +32,20 @@ export default () => {
3132
});
3233

3334
router.post('/new/:ensName/addMessage', async (req, res, next) => {
34-
const { message, encryptedContactName, messageId } = req.body;
35+
const { encryptedEnvelopContainer, encryptedContactName, messageId } =
36+
req.body;
3537

36-
if (!message || !encryptedContactName || !messageId) {
38+
if (!encryptedEnvelopContainer || !encryptedContactName || !messageId) {
3739
res.status(400).send('invalid schema');
3840
return;
3941
}
4042

4143
try {
4244
const ensName = normalizeEnsName(req.params.ensName);
43-
const success = await req.app.locals.db.storage_addMessage(
45+
const success = await req.app.locals.db.storage_addMessageBatch(
4446
ensName,
4547
encryptedContactName,
46-
messageId,
47-
message,
48+
[{ messageId, encryptedEnvelopContainer }],
4849
);
4950
if (success) {
5051
return res.send();
@@ -54,6 +55,31 @@ export default () => {
5455
next(e);
5556
}
5657
});
58+
router.post('/new/:ensName/addMessageBatch', async (req, res, next) => {
59+
const { messageBatch, encryptedContactName } = req.body;
60+
61+
if (
62+
!messageBatch ||
63+
!Array.isArray(messageBatch) ||
64+
!encryptedContactName
65+
) {
66+
res.status(400).send('invalid schema');
67+
return;
68+
}
69+
70+
try {
71+
const ensName = normalizeEnsName(req.params.ensName);
72+
73+
await req.app.locals.db.storage_addMessageBatch(
74+
ensName,
75+
encryptedContactName,
76+
messageBatch,
77+
);
78+
return res.send();
79+
} catch (e) {
80+
return res.status(400).send('unable to add message batch');
81+
}
82+
});
5783

5884
router.get('/new/:ensName/getMessages/', async (req, res, next) => {
5985
const pageNumber = parseInt(req.body.page);

0 commit comments

Comments
 (0)