change room name for direct room

This commit is contained in:
Peter Maquiran
2024-08-29 20:43:57 +01:00
parent feea78fd59
commit 55539eb596
8 changed files with 169 additions and 75 deletions
+59
View File
@@ -1,4 +1,63 @@
import { SessionStore } from "src/app/store/session.service";
import { z } from "zod"
export enum RoomType { export enum RoomType {
Group = 1, Group = 1,
Direct = 2 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<typeof RoomEntitySchema>
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
}
}
}
@@ -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
})
}
}
@@ -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
}
}))
}));
}
}
@@ -36,26 +36,23 @@ export class SyncAllRoomMessagesService {
} }
let n =0 let n =0
for(const room of allRooms.value) { const roomPromises = allRooms.value.map(async (room) => {
const [result, localResult] = await Promise.all([
this.messageRemoteDataSourceService.getMessagesFromRoom(room.id),
this.messageLocalDataSourceService.getItems(room.id)
]);
const result = await this.messageRemoteDataSourceService.getMessagesFromRoom(room.id) tracing.addEvent('async n ' + n);
const localResult = await this.messageLocalDataSourceService.getItems(room.id) n++;
tracing.addEvent('async n '+ n)
n++
if (result.isOk()) { if (result.isOk()) {
const { addedItems, changedItems, deletedItems } = messageListDetermineChanges(result.value.data, localResult);
const { addedItems, changedItems, deletedItems } = messageListDetermineChanges(result.value.data, localResult)
for (const message of changedItems) { for (const message of changedItems) {
let clone: MessageTable = message let clone: MessageTable = { ...message, roomId: room.id };
clone.roomId = room.id await this.messageLocalDataSourceService.update(clone.$id, clone);
this.messageLocalDataSourceService.update(clone.$id, clone) const me = message.info.find(e => e.memberId === SessionStore.user.UserId && typeof e.deliverAt === 'string');
const me = message.info.find(e => e.memberId == SessionStore.user.UserId && typeof e.deliverAt == 'string' )
if (!me) { if (!me) {
this.MessageSocketRepositoryService.sendDeliverAt({ this.MessageSocketRepositoryService.sendDeliverAt({
@@ -63,36 +60,25 @@ export class SyncAllRoomMessagesService {
messageId: message.id, messageId: message.id,
roomId: message.roomId, roomId: message.roomId,
requestId: uuidv4() requestId: uuidv4()
}) });
tracing.addEvent('send delever roomId'+ room.id) tracing.addEvent('send deliver roomId ' + room.id);
} }
} }
for (const message of addedItems) { for (const message of addedItems) {
let clone: MessageTable = message let clone: MessageTable = { ...message, roomId: room.id };
clone.roomId = room.id // You can perform operations with addedItems here if needed
// 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)
// }
} }
this.messageLocalDataSourceService.insertMany(addedItems.reverse()) await this.messageLocalDataSourceService.insertMany(addedItems.reverse());
} else { } 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) return ok(true)
} else { } else {
@@ -9,6 +9,7 @@ import { z } from 'zod';
import { IRoomRemoteRepository } from 'src/app/core/chat/repository/room/room-remote-repository'; 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 { IMemberLocalRepository } from 'src/app/core/chat/repository/member/member-local-repository';
import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-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({ const UserSchema = z.object({
wxUserId: z.number(), wxUserId: z.number(),
@@ -72,6 +73,7 @@ export class GetRoomByIdUseCaseService {
const { roomsToDelete, roomsToInsert, roomsToUpdate } = roomListDetermineChanges([object], localListRoom.value) const { roomsToDelete, roomsToInsert, roomsToUpdate } = roomListDetermineChanges([object], localListRoom.value)
for( const roomData of roomsToUpdate) { for( const roomData of roomsToUpdate) {
// const room = GetRoomByIdMapper.toDomain(roomData)
this.roomLocalDataSourceService.update(roomData.chatRoom.id, roomData.chatRoom) 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) const { membersToInsert, membersToUpdate, membersToDelete } = roomMemberListDetermineChanges(result.value.data.members, localList, id)
for (const user of membersToInsert) { for (const user of membersToInsert) {
await this.MemberListLocalRepository.addMember(MemberListMapper(user, id)) await this.MemberListLocalRepository.addMember(MemberListMapper(user, id))
} }
@@ -5,6 +5,9 @@ import { CronJobService } from 'src/app/utils/task-scheduler'
import { z } from "zod"; import { z } from "zod";
import { IRoomRemoteRepository } from 'src/app/core/chat/repository/room/room-remote-repository'; 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 { 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({ const CreatedBySchema = z.object({
@@ -15,14 +18,16 @@ const CreatedBySchema = z.object({
}); });
const RoomListItemOutPutDTOSchema = z.object({ const RoomListItemOutPutDTOSchema = z.object({
chatRoom: z.object({ chatRoom: z.object({
id: z.string(), id: z.string(),
roomName: z.string(), roomName: z.string(),
createdBy: CreatedBySchema, createdBy: CreatedBySchema,
createdAt: z.string(), createdAt: z.string(),
expirationDate: z.string().nullable(), // api check expirationDate: z.string().nullable(), // api check
roomType: z.number() roomType: z.number(),
messages: MessageEntitySchema.array(),
user1: CreatedBySchema.nullable(),
user2: CreatedBySchema.nullable()
}), }),
joinAt: z.string() joinAt: z.string()
}) })
@@ -60,29 +65,31 @@ export class GetRoomListUseCaseService {
if(localList.isOk()) { if(localList.isOk()) {
if(result.isOk()) { if(result.isOk()) {
const { roomsToDelete, roomsToInsert, roomsToUpdate } = roomListDetermineChanges(result.value.data, localList.value) const { roomsToDelete, roomsToInsert, roomsToUpdate } = roomListDetermineChanges(result.value.data, localList.value)
for( const roomData of roomsToInsert) { if(roomsToInsert) {
this.roomLocalDataSourceService.insert(roomData.chatRoom) const roomsToInsertEntity = GetRoomListMapper.toDomain(roomsToInsert)
for( const room of roomsToInsertEntity) {
if(roomData.chatRoom.expirationDate) { this.roomLocalDataSourceService.insert(room)
if(room.expirationDate) {
console.log('room expiration date schedule') 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) { for( const room of roomsToDelete) {
this.roomLocalDataSourceService.update(roomData.chatRoom.id, roomData.chatRoom) this.roomLocalDataSourceService.delete(room.id)
}
for( const roomData of roomsToDelete) {
this.roomLocalDataSourceService.delete(roomData.id)
} }
} }
} }
return result return result
} }
-12
View File
@@ -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);
}
}
+3
View File
@@ -2,6 +2,9 @@
"folders": [ "folders": [
{ {
"path": "." "path": "."
},
{
"path": "../../../Downloads/nestjs-microservice-boilerplate-api-master"
} }
], ],
"settings": { "settings": {