From a6fa89fda4a282b8465b3728664fbb37ed51535c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=87=E3=83=B4=E3=81=81=E3=82=93=E3=81=99?= Date: Thu, 26 Oct 2023 15:17:27 +0530 Subject: [PATCH 1/3] try --- src/definition/accessors/IRoomRead.ts | 2 +- src/server/accessors/RoomRead.ts | 4 ++-- src/server/bridges/RoomBridge.ts | 8 ++++++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/definition/accessors/IRoomRead.ts b/src/definition/accessors/IRoomRead.ts index 58e0583c7..bc2df163b 100644 --- a/src/definition/accessors/IRoomRead.ts +++ b/src/definition/accessors/IRoomRead.ts @@ -45,7 +45,7 @@ export interface IRoomRead { * @param roomId the room's id * @returns an iterator for messages */ - getMessages(roomId: string): Promise>; + getMessages(roomId: string): Promise; /** * Gets an iterator for all of the users in the provided room. diff --git a/src/server/accessors/RoomRead.ts b/src/server/accessors/RoomRead.ts index da4273f53..fb987a014 100644 --- a/src/server/accessors/RoomRead.ts +++ b/src/server/accessors/RoomRead.ts @@ -23,8 +23,8 @@ export class RoomRead implements IRoomRead { return this.roomBridge.doGetCreatorByName(name, this.appId); } - public getMessages(roomId: string): Promise> { - throw new Error('Method not implemented.'); + public getMessages(roomId: string): Promise> { + return this.roomBridge.doGetMessages(roomId, this.appId); } public getMembers(roomId: string): Promise> { diff --git a/src/server/bridges/RoomBridge.ts b/src/server/bridges/RoomBridge.ts index 677620283..9f5df39bc 100644 --- a/src/server/bridges/RoomBridge.ts +++ b/src/server/bridges/RoomBridge.ts @@ -91,6 +91,12 @@ export abstract class RoomBridge extends BaseBridge { } } + public async doGetMessages(roomId: string, appId: string): Promise> { + if (this.hasReadPermission(appId)) { + return this.getMessages(roomId, appId); + } + } + protected abstract create(room: IRoom, members: Array, appId: string): Promise; protected abstract getById(roomId: string, appId: string): Promise; @@ -123,6 +129,8 @@ export abstract class RoomBridge extends BaseBridge { protected abstract getLeaders(roomId: string, appId: string): Promise>; + protected abstract getMessages(roomId: string, appId: string): Promise>; + private hasWritePermission(appId: string): boolean { if (AppPermissionManager.hasPermission(appId, AppPermissions.room.write)) { return true; From 23b66e082041837ca1fc8a4a979b3c89a477fa70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=87=E3=83=B4=E3=81=81=E3=82=93=E3=81=99?= Date: Thu, 11 Apr 2024 14:31:17 +0530 Subject: [PATCH 2/3] add tests & method --- src/definition/accessors/IRoomRead.ts | 19 +++++++++++++++---- src/server/accessors/RoomRead.ts | 11 +++++++++-- src/server/bridges/RoomBridge.ts | 22 +++++++++++++++++++--- tests/server/accessors/RoomRead.spec.ts | 11 ++++++++++- tests/test-data/bridges/roomBridge.ts | 4 ++++ 5 files changed, 57 insertions(+), 10 deletions(-) diff --git a/src/definition/accessors/IRoomRead.ts b/src/definition/accessors/IRoomRead.ts index bc2df163b..4e827507d 100644 --- a/src/definition/accessors/IRoomRead.ts +++ b/src/definition/accessors/IRoomRead.ts @@ -40,12 +40,23 @@ export interface IRoomRead { getCreatorUserByName(name: string): Promise; /** - * Gets an iterator for all of the messages in the provided room. + * Retrieves an array of messages from the specified room. * - * @param roomId the room's id - * @returns an iterator for messages + * @param roomId The unique identifier of the room from which to retrieve messages. + * @param options Optional parameters for retrieving messages: + * - limit: The maximum number of messages to retrieve. If more than 100 is passed, it defaults to 100. + * - skip: The number of messages to skip (for pagination). + * - sort: An object defining the sorting order of the messages. Each key is a field to sort by, and the value is either 1 for ascending order or -1 for descending order. + * @returns A Promise that resolves to an array of IMessage objects representing the messages in the room. */ - getMessages(roomId: string): Promise; + getMessages( + roomId: string, + options?: Partial<{ + limit: number; + skip: number; + sort: Record; + }>, + ): Promise; /** * Gets an iterator for all of the users in the provided room. diff --git a/src/server/accessors/RoomRead.ts b/src/server/accessors/RoomRead.ts index fb987a014..cd25ac3d0 100644 --- a/src/server/accessors/RoomRead.ts +++ b/src/server/accessors/RoomRead.ts @@ -23,8 +23,15 @@ export class RoomRead implements IRoomRead { return this.roomBridge.doGetCreatorByName(name, this.appId); } - public getMessages(roomId: string): Promise> { - return this.roomBridge.doGetMessages(roomId, this.appId); + public getMessages( + roomId: string, + options?: Partial<{ + limit: number; + skip: number; + sort: Record; + }>, + ): Promise { + return this.roomBridge.doGetMessages(roomId, this.appId, options); } public getMembers(roomId: string): Promise> { diff --git a/src/server/bridges/RoomBridge.ts b/src/server/bridges/RoomBridge.ts index 9f5df39bc..2cb72f994 100644 --- a/src/server/bridges/RoomBridge.ts +++ b/src/server/bridges/RoomBridge.ts @@ -91,9 +91,17 @@ export abstract class RoomBridge extends BaseBridge { } } - public async doGetMessages(roomId: string, appId: string): Promise> { + public async doGetMessages( + roomId: string, + appId: string, + options?: Partial<{ + limit: number; + skip: number; + sort: Record; + }>, + ): Promise { if (this.hasReadPermission(appId)) { - return this.getMessages(roomId, appId); + return this.getMessages(roomId, appId, options); } } @@ -129,7 +137,15 @@ export abstract class RoomBridge extends BaseBridge { protected abstract getLeaders(roomId: string, appId: string): Promise>; - protected abstract getMessages(roomId: string, appId: string): Promise>; + protected abstract getMessages( + roomId: string, + appId: string, + options?: Partial<{ + limit: number; + skip: number; + sort: Record; + }>, + ): Promise; private hasWritePermission(appId: string): boolean { if (AppPermissionManager.hasPermission(appId, AppPermissions.room.write)) { diff --git a/tests/server/accessors/RoomRead.spec.ts b/tests/server/accessors/RoomRead.spec.ts index 5d2a142c5..f99eae19e 100644 --- a/tests/server/accessors/RoomRead.spec.ts +++ b/tests/server/accessors/RoomRead.spec.ts @@ -5,21 +5,26 @@ import type { IUser } from '../../../src/definition/users'; import { RoomRead } from '../../../src/server/accessors'; import type { RoomBridge } from '../../../src/server/bridges'; import { TestData } from '../../test-data/utilities'; +import type { IMessage } from '../../../src/definition/messages'; export class RoomReadAccessorTestFixture { private room: IRoom; private user: IUser; + private messages: IMessage[]; + private mockRoomBridgeWithRoom: RoomBridge; @SetupFixture public setupFixture() { this.room = TestData.getRoom(); this.user = TestData.getUser(); + this.messages = ['507f1f77bcf86cd799439011', '507f191e810c19729de860ea'].map((id) => TestData.getMessage(id)); const theRoom = this.room; const theUser = this.user; + const theMessages = this.messages; this.mockRoomBridgeWithRoom = { doGetById(id, appId): Promise { return Promise.resolve(theRoom); @@ -39,6 +44,9 @@ export class RoomReadAccessorTestFixture { doGetMembers(name, appId): Promise> { return Promise.resolve([theUser]); }, + doGetMessages(roomId, appId, options): Promise { + return Promise.resolve(theMessages); + }, } as RoomBridge; } @@ -58,6 +66,8 @@ export class RoomReadAccessorTestFixture { Expect(await rr.getCreatorUserByName('testing')).toBe(this.user); Expect(await rr.getDirectByUsernames([this.user.username])).toBeDefined(); Expect(await rr.getDirectByUsernames([this.user.username])).toBe(this.room); + Expect(await rr.getMessages('testing')).toBeDefined(); + Expect(await rr.getMessages('testing')).toBe(this.messages); } @AsyncTest() @@ -65,7 +75,6 @@ export class RoomReadAccessorTestFixture { Expect(() => new RoomRead(this.mockRoomBridgeWithRoom, 'testing-app')).not.toThrow(); const rr = new RoomRead(this.mockRoomBridgeWithRoom, 'testing-app'); - await Expect(() => rr.getMessages('faker')).toThrowErrorAsync(Error, 'Method not implemented.'); Expect(await rr.getMembers('testing')).toBeDefined(); Expect((await rr.getMembers('testing')) as Array).not.toBeEmpty(); diff --git a/tests/test-data/bridges/roomBridge.ts b/tests/test-data/bridges/roomBridge.ts index c25edbb4f..30c2ce4ed 100644 --- a/tests/test-data/bridges/roomBridge.ts +++ b/tests/test-data/bridges/roomBridge.ts @@ -32,6 +32,10 @@ export class TestsRoomBridge extends RoomBridge { throw new Error('Method not implemented.'); } + public getMessages(roomId: string, appId: string, options?: Partial<{ limit: number; skip: number; sort: Record }>): Promise { + throw new Error('Method not implemented.'); + } + public update(room: IRoom, members: Array, appId: string): Promise { throw new Error('Method not implemented.'); } From 807de785724c48104b4643271b96260fc558df8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=87=E3=83=B4=E3=81=81=E3=82=93=E3=81=99?= Date: Tue, 16 Apr 2024 00:05:03 +0530 Subject: [PATCH 3/3] make options("limit") required --- src/server/accessors/RoomRead.ts | 2 +- src/server/bridges/RoomBridge.ts | 22 +++++++++++----------- tests/test-data/bridges/roomBridge.ts | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/server/accessors/RoomRead.ts b/src/server/accessors/RoomRead.ts index cd25ac3d0..d79a64028 100644 --- a/src/server/accessors/RoomRead.ts +++ b/src/server/accessors/RoomRead.ts @@ -31,7 +31,7 @@ export class RoomRead implements IRoomRead { sort: Record; }>, ): Promise { - return this.roomBridge.doGetMessages(roomId, this.appId, options); + return this.roomBridge.doGetMessages(roomId, { limit: 100, ...options }, this.appId); } public getMembers(roomId: string): Promise> { diff --git a/src/server/bridges/RoomBridge.ts b/src/server/bridges/RoomBridge.ts index 2cb72f994..a1ec60952 100644 --- a/src/server/bridges/RoomBridge.ts +++ b/src/server/bridges/RoomBridge.ts @@ -93,15 +93,15 @@ export abstract class RoomBridge extends BaseBridge { public async doGetMessages( roomId: string, - appId: string, - options?: Partial<{ + options: { limit: number; - skip: number; - sort: Record; - }>, + skip?: number; + sort?: Record; + }, + appId: string, ): Promise { if (this.hasReadPermission(appId)) { - return this.getMessages(roomId, appId, options); + return this.getMessages(roomId, options, appId); } } @@ -139,12 +139,12 @@ export abstract class RoomBridge extends BaseBridge { protected abstract getMessages( roomId: string, - appId: string, - options?: Partial<{ + options: { limit: number; - skip: number; - sort: Record; - }>, + skip?: number; + sort?: Record; + }, + appId: string, ): Promise; private hasWritePermission(appId: string): boolean { diff --git a/tests/test-data/bridges/roomBridge.ts b/tests/test-data/bridges/roomBridge.ts index 30c2ce4ed..92a596f8e 100644 --- a/tests/test-data/bridges/roomBridge.ts +++ b/tests/test-data/bridges/roomBridge.ts @@ -32,7 +32,7 @@ export class TestsRoomBridge extends RoomBridge { throw new Error('Method not implemented.'); } - public getMessages(roomId: string, appId: string, options?: Partial<{ limit: number; skip: number; sort: Record }>): Promise { + public getMessages(roomId: string, options: { limit: number; skip?: number; sort?: Record }, appId: string): Promise { throw new Error('Method not implemented.'); }