From 55539eb596730e3e3e1d5032e7d67cd1fc8d0c3b Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Thu, 29 Aug 2024 20:43:57 +0100 Subject: [PATCH] change room name for direct room --- src/app/core/chat/entity/group.ts | 59 ++++++++++++++ src/app/core/chat/mapper/getRoomByIdMapper.ts | 17 ++++ src/app/core/chat/mapper/getRoomListMapper.ts | 31 +++++++ .../message/sync-all-room-messages.service.ts | 80 ++++++++----------- .../room/room-get-by-id-use-case.service.ts | 3 + .../room/room-get-list-use-case.service.ts | 39 +++++---- src/assets/js/shared-worker.js | 12 --- workspace.code-workspace | 3 + 8 files changed, 169 insertions(+), 75 deletions(-) create mode 100644 src/app/core/chat/mapper/getRoomByIdMapper.ts create mode 100644 src/app/core/chat/mapper/getRoomListMapper.ts delete mode 100644 src/assets/js/shared-worker.js diff --git a/src/app/core/chat/entity/group.ts b/src/app/core/chat/entity/group.ts index d98ed1e83..a3cc6f351 100644 --- a/src/app/core/chat/entity/group.ts +++ b/src/app/core/chat/entity/group.ts @@ -1,4 +1,63 @@ +import { SessionStore } from "src/app/store/session.service"; +import { z } from "zod" + export enum RoomType { Group = 1, Direct = 2 +} + +const UserSchema = z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string().nullable(), +}); + +const MemberSchema = z.object({ + id: z.string(), + user: UserSchema, + joinAt: z.string(), + isAdmin: z.boolean() +}); + +export const RoomEntitySchema = z.object({ + id: z.string(), + roomName: z.string(), + createdBy: z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string().email(), + userPhoto: z.string().nullable().optional()// api check + }), + createdAt: z.any(), + expirationDate: z.any().nullable(), + roomType: z.nativeEnum(RoomType), + members: z.array(MemberSchema).optional() +}) + +export type IRoomEntity = z.infer + +export class RoomEntity implements IRoomEntity{ + + id: typeof RoomEntitySchema._input.id + roomName: typeof RoomEntitySchema._input.roomName + createdBy: typeof RoomEntitySchema._input.createdBy + createdAt: typeof RoomEntitySchema._input.createdAt + expirationDate: typeof RoomEntitySchema._input.expirationDate + roomType: typeof RoomEntitySchema._input.roomType + members: typeof RoomEntitySchema._input.members + + constructor(data: IRoomEntity) { + Object.assign(this, data) + if(data.roomType == RoomType.Direct) { + this.setName() + } + } + + setName() { + const userChatName = this.members?.find((e) => e.user.wxUserId != SessionStore.user.UserId) + if(userChatName) { + this.roomName = userChatName.user.wxFullName + } + } } \ No newline at end of file diff --git a/src/app/core/chat/mapper/getRoomByIdMapper.ts b/src/app/core/chat/mapper/getRoomByIdMapper.ts new file mode 100644 index 000000000..4dde9d208 --- /dev/null +++ b/src/app/core/chat/mapper/getRoomByIdMapper.ts @@ -0,0 +1,17 @@ +import { RoomByIdOutputDTO } from "src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service"; +import { RoomEntity } from "../entity/group"; + +export class GetRoomByIdMapper { + static toDomain(input: RoomByIdOutputDTO): RoomEntity { + + return new RoomEntity({ + createdAt: input.data.createdAt, + createdBy: input.data.createdBy, + expirationDate: input.data.expirationDate, + id: input.data.id, + members: input.data.members, + roomName: input.data.roomName, + roomType: input.data.roomType + }) + } +} \ No newline at end of file diff --git a/src/app/core/chat/mapper/getRoomListMapper.ts b/src/app/core/chat/mapper/getRoomListMapper.ts new file mode 100644 index 000000000..71a64a7c8 --- /dev/null +++ b/src/app/core/chat/mapper/getRoomListMapper.ts @@ -0,0 +1,31 @@ +import { RoomListItemOutPutDTO } from "src/app/module/chat/domain/use-case/room/room-get-list-use-case.service"; +import { RoomEntity } from "../entity/group"; +import { captureAndReraiseAsync } from "src/app/services/decorators/captureAndReraiseAsync"; + +export class GetRoomListMapper{ + + // @captureAndReraiseAsync('GetRoomListMapper/toDomain') + static toDomain(inputs: RoomListItemOutPutDTO[]): RoomEntity[] { + + return inputs.map((roomData) => new RoomEntity({ + createdAt: roomData.chatRoom.createdAt, + createdBy: roomData.chatRoom.createdBy, + expirationDate: roomData.chatRoom.expirationDate, + id: roomData.chatRoom.id, + roomName: roomData.chatRoom.roomName, + roomType: roomData.chatRoom.roomType, + members: [roomData.chatRoom.user1, roomData.chatRoom.user2].filter((e) => e?.wxUserId).map((b) => ({ + id: '', + isAdmin: false, + joinAt: '', + user: { + userPhoto: b.userPhoto, + wxeMail: b.wxeMail, + wxFullName: b.wxFullName, + wxUserId: b.wxUserId + } + })) + })); + + } +} \ No newline at end of file diff --git a/src/app/module/chat/domain/use-case/message/sync-all-room-messages.service.ts b/src/app/module/chat/domain/use-case/message/sync-all-room-messages.service.ts index 410a50b4d..07f677e0f 100644 --- a/src/app/module/chat/domain/use-case/message/sync-all-room-messages.service.ts +++ b/src/app/module/chat/domain/use-case/message/sync-all-room-messages.service.ts @@ -36,63 +36,49 @@ export class SyncAllRoomMessagesService { } let n =0 - for(const room of allRooms.value) { - - const result = await this.messageRemoteDataSourceService.getMessagesFromRoom(room.id) - const localResult = await this.messageLocalDataSourceService.getItems(room.id) - - tracing.addEvent('async n '+ n) - n++ - - if(result.isOk()) { - - const { addedItems, changedItems, deletedItems } = messageListDetermineChanges(result.value.data, localResult) - - - for(const message of changedItems) { - let clone: MessageTable = message - clone.roomId = room.id - - this.messageLocalDataSourceService.update(clone.$id, clone) - - const me = message.info.find(e => e.memberId == SessionStore.user.UserId && typeof e.deliverAt == 'string' ) - - if(!me) { + const roomPromises = allRooms.value.map(async (room) => { + const [result, localResult] = await Promise.all([ + this.messageRemoteDataSourceService.getMessagesFromRoom(room.id), + this.messageLocalDataSourceService.getItems(room.id) + ]); + + tracing.addEvent('async n ' + n); + n++; + + if (result.isOk()) { + const { addedItems, changedItems, deletedItems } = messageListDetermineChanges(result.value.data, localResult); + + for (const message of changedItems) { + let clone: MessageTable = { ...message, roomId: room.id }; + await this.messageLocalDataSourceService.update(clone.$id, clone); + + const me = message.info.find(e => e.memberId === SessionStore.user.UserId && typeof e.deliverAt === 'string'); + + if (!me) { this.MessageSocketRepositoryService.sendDeliverAt({ memberId: SessionStore.user.UserId, messageId: message.id, roomId: message.roomId, requestId: uuidv4() - }) - - tracing.addEvent('send delever roomId'+ room.id) + }); + + tracing.addEvent('send deliver roomId ' + room.id); } } - - for(const message of addedItems) { - let clone: MessageTable = message - clone.roomId = room.id - - // const me = message.info.find(e => e.memberId == SessionStore.user.UserId && typeof e.deliverAt == 'string' ) - // if(!me) { - // this.MessageSocketRepositoryService.sendDeliverAt({ - // memberId: SessionStore.user.UserId, - // messageId: message.id, - // roomId: message.roomId, - // requestId: uuidv4() - // }) - - // tracing.addEvent('send delever roomId'+ room.id) - - // } + + for (const message of addedItems) { + let clone: MessageTable = { ...message, roomId: room.id }; + // You can perform operations with addedItems here if needed } - - this.messageLocalDataSourceService.insertMany(addedItems.reverse()) - + + await this.messageLocalDataSourceService.insertMany(addedItems.reverse()); } else { - Logger.error('failed to get room message '+room.id) + Logger.error('failed to get room message ' + room.id); } - } + }); + + // Wait for all the promises to resolve + await Promise.all(roomPromises); return ok(true) } else { diff --git a/src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service.ts b/src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service.ts index ad44f3b51..de7cccf15 100644 --- a/src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service.ts @@ -9,6 +9,7 @@ import { z } from 'zod'; import { IRoomRemoteRepository } from 'src/app/core/chat/repository/room/room-remote-repository'; import { IMemberLocalRepository } from 'src/app/core/chat/repository/member/member-local-repository'; import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; +import { GetRoomByIdMapper } from 'src/app/core/chat/mapper/getRoomByIdMapper'; const UserSchema = z.object({ wxUserId: z.number(), @@ -72,6 +73,7 @@ export class GetRoomByIdUseCaseService { const { roomsToDelete, roomsToInsert, roomsToUpdate } = roomListDetermineChanges([object], localListRoom.value) for( const roomData of roomsToUpdate) { + // const room = GetRoomByIdMapper.toDomain(roomData) this.roomLocalDataSourceService.update(roomData.chatRoom.id, roomData.chatRoom) } @@ -81,6 +83,7 @@ export class GetRoomByIdUseCaseService { const { membersToInsert, membersToUpdate, membersToDelete } = roomMemberListDetermineChanges(result.value.data.members, localList, id) for (const user of membersToInsert) { + await this.MemberListLocalRepository.addMember(MemberListMapper(user, id)) } diff --git a/src/app/module/chat/domain/use-case/room/room-get-list-use-case.service.ts b/src/app/module/chat/domain/use-case/room/room-get-list-use-case.service.ts index 09ed9db49..d2c5abced 100644 --- a/src/app/module/chat/domain/use-case/room/room-get-list-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/room/room-get-list-use-case.service.ts @@ -5,6 +5,9 @@ import { CronJobService } from 'src/app/utils/task-scheduler' import { z } from "zod"; import { IRoomRemoteRepository } from 'src/app/core/chat/repository/room/room-remote-repository'; import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; +import { MessageEntitySchema } from 'src/app/core/chat/entity/message'; +import { RoomEntity, RoomType } from 'src/app/core/chat/entity/group'; +import { GetRoomListMapper } from 'src/app/core/chat/mapper/getRoomListMapper'; const CreatedBySchema = z.object({ @@ -15,14 +18,16 @@ const CreatedBySchema = z.object({ }); const RoomListItemOutPutDTOSchema = z.object({ - chatRoom: z.object({ id: z.string(), roomName: z.string(), createdBy: CreatedBySchema, createdAt: z.string(), expirationDate: z.string().nullable(), // api check - roomType: z.number() + roomType: z.number(), + messages: MessageEntitySchema.array(), + user1: CreatedBySchema.nullable(), + user2: CreatedBySchema.nullable() }), joinAt: z.string() }) @@ -60,29 +65,31 @@ export class GetRoomListUseCaseService { if(localList.isOk()) { if(result.isOk()) { + const { roomsToDelete, roomsToInsert, roomsToUpdate } = roomListDetermineChanges(result.value.data, localList.value) - for( const roomData of roomsToInsert) { - this.roomLocalDataSourceService.insert(roomData.chatRoom) - - if(roomData.chatRoom.expirationDate) { + if(roomsToInsert) { + const roomsToInsertEntity = GetRoomListMapper.toDomain(roomsToInsert) + for( const room of roomsToInsertEntity) { + this.roomLocalDataSourceService.insert(room) + if(room.expirationDate) { console.log('room expiration date schedule') - this.CronJobService.createCronJob('remove expired room', new Date(roomData.chatRoom.expirationDate), this.execute) + this.CronJobService.createCronJob('remove expired room', new Date(room.expirationDate), this.execute) } - } + } + + const roomsToUpdateEntity = GetRoomListMapper.toDomain(roomsToUpdate) + for( const room of roomsToUpdateEntity) { + this.roomLocalDataSourceService.update(room.id, room) + } - for( const roomData of roomsToUpdate) { - this.roomLocalDataSourceService.update(roomData.chatRoom.id, roomData.chatRoom) - } - - for( const roomData of roomsToDelete) { - this.roomLocalDataSourceService.delete(roomData.id) - } + for( const room of roomsToDelete) { + this.roomLocalDataSourceService.delete(room.id) + } } } - return result } diff --git a/src/assets/js/shared-worker.js b/src/assets/js/shared-worker.js deleted file mode 100644 index b768e558f..000000000 --- a/src/assets/js/shared-worker.js +++ /dev/null @@ -1,12 +0,0 @@ -// src/shared-worker.js -self.onconnect = function (event) { - const port = event.ports[0]; - - port.onmessage = function (e) { - const message = e.data; - console.log('Received from client:', message); - - // Echo the message back to all connected clients - port.postMessage('Echo: ' + message); - } -} diff --git a/workspace.code-workspace b/workspace.code-workspace index bf4bc2067..c87889927 100644 --- a/workspace.code-workspace +++ b/workspace.code-workspace @@ -2,6 +2,9 @@ "folders": [ { "path": "." + }, + { + "path": "../../../Downloads/nestjs-microservice-boilerplate-api-master" } ], "settings": {