This commit is contained in:
Peter Maquiran
2024-08-30 12:41:50 +01:00
parent ac7e5ccf5b
commit d6a08c6264
33 changed files with 558 additions and 87 deletions
@@ -10,8 +10,11 @@ import { IRoomRemoteRepository } from 'src/app/core/chat/repository/room/room-re
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';
import { RoomEntity } from 'src/app/core/chat/entity/group';
import { RoomEntity, RoomType } from 'src/app/core/chat/entity/group';
import { GetRoomListMapper } from 'src/app/core/chat/mapper/getRoomListMapper';
import { roomByIdDetermineChanges } from '../../../data/async/list/rooms/roomByIdChangeDetector';
import { diff, addedDiff, deletedDiff, updatedDiff, detailedDiff } from 'deep-object-diff';
import { zodSafeValidation } from 'src/app/utils/zodValidation';
const UserSchema = z.object({
wxUserId: z.number(),
@@ -56,7 +59,6 @@ export class GetRoomByIdUseCaseService {
constructor(
private roomRemoteDataSourceService: IRoomRemoteRepository,
// private roomMemoryDataSourceService: Store<RoomRemoteDataSourceState>,
private roomLocalDataSourceService: IRoomLocalRepository,
private MemberListLocalRepository: IMemberLocalRepository
) { }
@@ -64,71 +66,63 @@ export class GetRoomByIdUseCaseService {
@captureAndReraiseAsync('RoomRepositoryService/getRoomById')
async execute(id: RoomByIdInputDTO) {
const result = await this.roomRemoteDataSourceService.getRoom(id)
if(result.isOk()) {
const validData = zodSafeValidation<RoomByIdOutputDTO>(RoomByIdOutputDTOSchema, result.value)
const localListRoom = await this.roomLocalDataSourceService.findAll()
if(localListRoom.isOk()) {
const object = {
chatRoom: result.value.data
}
const { roomsToInsert, roomsToUpdate } = roomListDetermineChanges([object], localListRoom.value)
if(roomsToUpdate) {
const roomsToUpdateEntity = GetRoomListMapper.toDomain(roomsToUpdate)
for( const room of roomsToUpdateEntity) {
this.roomLocalDataSourceService.update(room.id, room)
if(room.expirationDate) {
console.log('room expiration date schedule')
// this.CronJobService.createCronJob('remove expired room', new Date(room.expirationDate), this.execute)
}
}
}
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(room.expirationDate), this.execute)
}
}
}
// for( const roomData of roomsToUpdate) {
// const room = new RoomEntity({
// createdAt: result.value.data.createdAt,
// createdBy: result.value.data.createdBy,
// expirationDate: result.value.data.expirationDate,
// id: result.value.data.id,
// members: result.value.data.members,
// roomName: result.value.data.roomName,
// roomType: result.value.data.roomType,
// })
if(validData.isOk()) {
const localListRoom = await this.roomLocalDataSourceService.findAll()
if(localListRoom.isOk()) {
// this.roomLocalDataSourceService.update(room.id, room)
// }
// ============================
const localList = await this.MemberListLocalRepository.getRoomMemberById(id)
const { membersToInsert, membersToUpdate, membersToDelete } = roomMemberListDetermineChanges(result.value.data.members, localList, id)
for (const user of membersToInsert) {
await this.MemberListLocalRepository.addMember(MemberListMapper(user, id))
const getRoomById = await this.roomLocalDataSourceService.findOne({id:validData.value.data.id})
if(getRoomById.isOk() && getRoomById.value) {
console.log(validData.value)
const room = GetRoomByIdMapper.toDomain(validData.value)
const added: Partial<RoomEntity> = addedDiff(getRoomById.value, room);
const deleted: Partial<RoomEntity> = deletedDiff(getRoomById.value, room);
const updated: Partial<RoomEntity> = updatedDiff(getRoomById.value, room);
delete added.members
if(room.roomType == RoomType.Direct) {
delete updated.roomName
}
if(Object.keys(added).length >= 1 || Object.keys(updated).length >= 1) {
console.log('added', added);
console.log('deleted', deleted);
console.log('updated', updated);
this.roomLocalDataSourceService.update(room.id, room)
}
} else if (getRoomById.isOk() && !getRoomById.value) {
console.log(validData.value)
const room = GetRoomByIdMapper.toDomain(validData.value)
this.roomLocalDataSourceService.insert(room)
}
// ============================
const localList = await this.MemberListLocalRepository.getRoomMemberById(id)
const { membersToInsert, membersToUpdate, membersToDelete } = roomMemberListDetermineChanges(validData.value.data.members, localList, id)
for (const user of membersToInsert) {
await this.MemberListLocalRepository.addMember(MemberListMapper(user, id))
}
for (const user of membersToUpdate) {
await this.MemberListLocalRepository.updateMemberRole(MemberListMapper(user, id))
}
for(const user of membersToDelete) {
await this.MemberListLocalRepository.removeMemberFromRoom(user.$roomIdUserId)
}
}
} else {
for (const user of membersToUpdate) {
await this.MemberListLocalRepository.updateMemberRole(MemberListMapper(user, id))
}
for(const user of membersToDelete) {
await this.MemberListLocalRepository.removeMemberFromRoom(user.$roomIdUserId)
}
}
} else if (isHttpResponse(result.error) ) {
@@ -140,4 +134,4 @@ export class GetRoomByIdUseCaseService {
return result
}
}
}
@@ -80,9 +80,7 @@ export class GetRoomListUseCaseService {
}
const roomsToUpdateEntity = GetRoomListMapper.toDomain(roomsToUpdate)
for( const room of roomsToUpdateEntity) {
this.roomLocalDataSourceService.update(room.id, room)
}
this.roomLocalDataSourceService.updateMany(roomsToUpdateEntity)
for( const room of roomsToDelete) {
this.roomLocalDataSourceService.delete(room.id)