Skip to content

Commit

Permalink
Merge branch '1108-Ackknowledge-messages-by-messageHash-instead-of-ti…
Browse files Browse the repository at this point in the history
…mestamp' into testing
  • Loading branch information
AlexNi245 committed Jul 17, 2024
2 parents 27e8c93 + c502aa5 commit 4d0c2a5
Show file tree
Hide file tree
Showing 20 changed files with 180 additions and 240 deletions.
41 changes: 27 additions & 14 deletions packages/delivery-service/src/delivery.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import express from 'express';
import request from 'supertest';
import winston from 'winston';
import delivery from './delivery';
import { Redis, getDatabase, getRedisClient } from './persistence/getDatabase';

const keysA = {
encryptionKeyPair: {
Expand All @@ -24,7 +25,19 @@ const serverSecret = 'veryImportantSecret';
global.logger = winston.createLogger({
transports: [new winston.transports.Console()],
});

let redisClient: Redis;
describe('Delivery', () => {
beforeEach(async () => {
redisClient = await getRedisClient();
await redisClient.flushDb();
});

afterEach(async () => {
await redisClient.flushDb();
await redisClient.disconnect();
});

describe('getMessages', () => {
it('Returns 200 if schema is valid', async () => {
const web3Provider = {
Expand Down Expand Up @@ -81,18 +94,15 @@ describe('Delivery', () => {
);

const db = {
getAccount: async (ensName: string) => ({
...(await getDatabase(redisClient)),
getSession: async (ensName: string) => ({
challenge: '123',
token,
}),
setAccount: async (_: string, __: any) => {
return (_: any, __: any, ___: any) => {};
},
getIdEnsName: async (ensName: string) => ensName,
syncAcknowledge: async (
conversationId: string,
lastMessagePull: string,
) => Promise<void>,
};
const app = express();
app.use(bodyParser.json());
Expand All @@ -102,18 +112,18 @@ describe('Delivery', () => {

const { status } = await request(app)
.post(
'/messages/0x99C19AB10b9EC8aC6fcda9586E81f6B73a298870/syncAcknoledgment/12345',
'/messages/0x99C19AB10b9EC8aC6fcda9586E81f6B73a298870/syncAcknowledgment/12345',
)
.set({
authorization: `Bearer ${token}`,
})

.send({
acknoledgments: [
acknowledgements: [
{
contactAddress:
'0x99C19AB10b9EC8aC6fcda9586E81f6B73a298870',
messageDeliveryServiceTimestamp: 123,
messageHash: 12345,
},
],
});
Expand All @@ -131,7 +141,8 @@ describe('Delivery', () => {
);

const db = {
getAccount: async (ensName: string) => ({
...(await getDatabase(redisClient)),
getSession: async (ensName: string) => ({
challenge: '123',
token,
}),
Expand All @@ -140,6 +151,7 @@ describe('Delivery', () => {
},
getIdEnsName: async (ensName: string) => ensName,
};

const app = express();
app.use(bodyParser.json());
app.use(
Expand All @@ -148,14 +160,14 @@ describe('Delivery', () => {

const { status } = await request(app)
.post(
'/messages/0x99C19AB10b9EC8aC6fcda9586E81f6B73a298870/syncAcknoledgment/fooo',
'/messages/0x99C19AB10b9EC8aC6fcda9586E81f6B73a298870/syncAcknowledgment/fooo',
)
.set({
authorization: `Bearer ${token}`,
})

.send({
acknoledgments: [],
syncAcknowledgment: [],
});

expect(status).toBe(400);
Expand All @@ -169,9 +181,9 @@ describe('Delivery', () => {
const token = await createAuthToken(
'0x99C19AB10b9EC8aC6fcda9586E81f6B73a298870',
);

const db = {
getAccount: async (ensName: string) => ({
...(await getDatabase(redisClient)),
getSession: async (ensName: string) => ({
challenge: '123',
token,
}),
Expand All @@ -180,6 +192,7 @@ describe('Delivery', () => {
},
getIdEnsName: async (ensName: string) => ensName,
};

const app = express();
app.use(bodyParser.json());
app.use(
Expand All @@ -188,7 +201,7 @@ describe('Delivery', () => {

const { status } = await request(app)
.post(
'/messages/0x99C19AB10b9EC8aC6fcda9586E81f6B73a298870/syncAcknoledgment/1234',
'/messages/0x99C19AB10b9EC8aC6fcda9586E81f6B73a298870/syncAcknowledgment/1234',
)
.set({
authorization: `Bearer ${token}`,
Expand Down
111 changes: 28 additions & 83 deletions packages/delivery-service/src/delivery.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Acknoledgment, getMessages, schema } from '@dm3-org/dm3-lib-delivery';
import { Acknowledgment, getMessages, schema } from '@dm3-org/dm3-lib-delivery';
import { auth } from '@dm3-org/dm3-lib-server-side';
import { validateSchema } from '@dm3-org/dm3-lib-shared';
import { getConversationId } from '@dm3-org/dm3-lib-delivery';
Expand All @@ -8,24 +8,24 @@ import express from 'express';
import { IDatabase } from './persistence/getDatabase';
import { DeliveryServiceProfileKeys } from '@dm3-org/dm3-lib-profile';

const syncAcknoledgmentParamsSchema = {
const syncAcknowledgementParamsSchema = {
type: 'object',
properties: {
ensName: { type: 'string' },
last_message_pull: { type: 'string' },
messageHash: { type: 'string' },
},
required: ['ensName', 'last_message_pull'],
required: ['ensName', 'messageHash'],
additionalProperties: false,
};
const syncAcknoledgmentBodySchema = {
const syncAcknowledgementBodySchema = {
type: 'object',
properties: {
acknoledgments: {
acknowledgements: {
type: 'array',
items: schema.Acknoledgment,
items: schema.Acknowledgment,
},
},
required: ['acknoledgments'],
required: ['acknowledgements'],
additionalProperties: false,
};

Expand Down Expand Up @@ -96,98 +96,43 @@ export default (
}
},
);

//TODO remove after storage refactoring
router.post(
'/messages/:ensName/syncAcknoledgment/:last_message_pull',
async (req, res, next) => {
const hasValidParams = validateSchema(
syncAcknoledgmentParamsSchema,
req.params,
);

const hasValidBody = validateSchema(
syncAcknoledgmentBodySchema,
req.body,
);

// eslint-disable-next-line max-len
//Express transform number inputs into strings. So we have to check if a string used as last_message_pull can be converted to a number later on.
const isLastMessagePullNumber = !isNaN(
Number.parseInt(req.params.last_message_pull),
);

if (!hasValidParams || !isLastMessagePullNumber || !hasValidBody) {
return res.sendStatus(400);
}

try {
const ensName = await db.getIdEnsName(req.params.ensName);

await Promise.all(
req.body.acknoledgments.map(async (ack: Acknoledgment) => {
const contactEnsName = await db.getIdEnsName(
ack.contactAddress,
);
const conversationId = getConversationId(
ensName,
contactEnsName,
);

await db.syncAcknowledge(
conversationId,
Number.parseInt(req.params.last_message_pull),
);
}),
);

res.json();
} catch (e) {
next(e);
}
},
);
router.post(
'/messages/:ensName/syncAcknowledgment/:last_message_pull',
'/messages/:ensName/syncAcknowledgment/:messageHash',
async (req, res, next) => {
const hasValidParams = validateSchema(
syncAcknoledgmentParamsSchema,
syncAcknowledgementParamsSchema,
req.params,
);

const hasValidBody = validateSchema(
syncAcknoledgmentBodySchema,
syncAcknowledgementBodySchema,
req.body,
);

// eslint-disable-next-line max-len
//Express transform number inputs into strings. So we have to check if a string used as last_message_pull can be converted to a number later on.
const isLastMessagePullNumber = !isNaN(
Number.parseInt(req.params.last_message_pull),
);

if (!hasValidParams || !isLastMessagePullNumber || !hasValidBody) {
if (!hasValidParams || !hasValidBody) {
return res.sendStatus(400);
}

try {
const ensName = await db.getIdEnsName(req.params.ensName);

await Promise.all(
req.body.acknoledgments.map(async (ack: Acknoledgment) => {
const contactEnsName = await db.getIdEnsName(
ack.contactAddress,
);
const conversationId = getConversationId(
ensName,
contactEnsName,
);

await db.syncAcknowledge(
conversationId,
Number.parseInt(req.params.last_message_pull),
);
}),
req.body.acknowledgements.map(
async (ack: Acknowledgment) => {
const contactEnsName = await db.getIdEnsName(
ack.contactAddress,
);
const conversationId = getConversationId(
ensName,
contactEnsName,
);

await db.syncAcknowledge(
conversationId,
req.params.messageHash,
);
},
),
);

res.json();
Expand Down
5 changes: 2 additions & 3 deletions packages/delivery-service/src/persistence/getDatabase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,14 +117,13 @@ export interface IDatabase extends IAccountDatabase {
createMessage: (
conversationId: string,
envelop: EncryptionEnvelop,
createdAt?: number,
) => Promise<void>;
deleteExpiredMessages: (time: number) => Promise<void>;
getIdEnsName: (ensName: string) => Promise<string>;
syncAcknowledge: (
conversationId: string,
syncTime: number,
) => Promise<void>;
messageHash: string,
) => Promise<boolean>;
getUsersNotificationChannels: (
ensName: string,
) => Promise<NotificationChannel[]>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,13 @@ export function getIncomingMessages(redis: Redis) {
{ REV: true },
);

//For each conversation we're fetching the last 10 messages
const conversations = await Promise.all(
console.log('conversationIds', conversationIds);

//For each conversation we're fetching the latest messages
const messages = await Promise.all(
conversationIds.map((id) => getMessages(redis)(id, 0, limit)),
);

return conversations.reduce((acc, cur) => [...acc, ...cur], []);
return messages.reduce((acc, cur) => [...acc, ...cur], []);
};
}
Loading

0 comments on commit 4d0c2a5

Please sign in to comment.