create offline direct message

This commit is contained in:
Peter Maquiran
2024-09-17 16:02:12 +01:00
parent 9be19bfc78
commit 1bc5707321
266 changed files with 860 additions and 2771 deletions
@@ -0,0 +1,44 @@
import { Injectable } from '@angular/core';
import { z } from 'zod';
import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository';
import { SessionStore } from 'src/app/store/session.service';
import { RoomType } from 'src/app/core/chat/entity/group';
import { IDBoolean } from 'src/app/infra/database/dexie/type';
export const RoomCreateLocalDirectMessageInputDTOSchema = z.object({
roomName: z.string(),
members: z.array(z.number()),
receiverId: z.number().optional(),
});
export type RoomCreateLocalDirectMessageInputDTOInputDTO = z.infer<typeof RoomCreateLocalDirectMessageInputDTOSchema>
@Injectable({
providedIn: 'root'
})
export class RoomCreateLocalDirectMessageService {
constructor(
private roomLocalRepository: IRoomLocalRepository
) { }
async execute(input: RoomCreateLocalDirectMessageInputDTOInputDTO) {
return await this.roomLocalRepository.insert({
roomName: input.roomName,
bold: 0,
createdAt: new Date().toISOString(),
createdBy: {
userPhoto: '',
wxeMail: SessionStore.user.Email,
wxFullName: SessionStore.user.FullName,
wxUserId: SessionStore.user.UserId
},
$id: input.receiverId.toString(),
messages: [],
roomType: RoomType.Direct,
local: IDBoolean.true,
receiverId: input.receiverId,
})
}
}
@@ -27,16 +27,24 @@ export class DeleteRoomUseCaseService {
if(result.isOk()) {
const result = await this.roomLocalDataSourceService.delete(id)
// this.messageLiveDataSourceService.sendMessage({
// type: 'createRoom',
// payload: {a: '5'}
// })
const room = await this.roomLocalDataSourceService.findOne({
id: id
})
if(room.isOk()) {
const result = await this.roomLocalDataSourceService.delete(room.value.$id)
}
return result
} else if (isHttpResponse(result.error)) {
if(result.error.status == 404) {
await this.roomLocalDataSourceService.delete(id)
const room = await this.roomLocalDataSourceService.findOne({
id: id
})
if(room.isOk()) {
const result = await this.roomLocalDataSourceService.delete(room.value.$id)
}
}
// this.httpErrorHandle.httpStatusHandle(result.error)
}
@@ -59,6 +59,8 @@ export class GetRoomByIdUseCaseService {
@captureAndReraiseAsync('RoomRepositoryService/getRoomById')
async execute(id: RoomByIdInputDTO) {
console.log('iiiiiiiiiiii', id)
const result = await this.roomRemoteDataSourceService.getRoom(id)
if(result.isOk()) {
@@ -7,6 +7,9 @@ import { IRoomRemoteRepository } from 'src/app/core/chat/repository/room/room-re
import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository';
import { MessageEntitySchema } from 'src/app/core/chat/entity/message';
import { GetRoomListMapper } from 'src/app/core/chat/mapper/getRoomListMapper';
import { IDBoolean } from 'src/app/infra/database/dexie/type';
import { RoomType } from 'src/app/core/chat/entity/group';
import { Logger } from 'src/app/services/logger/main/service';
const CreatedBySchema = z.object({
@@ -64,12 +67,44 @@ export class GetRoomListUseCaseService {
if(localList.isOk()) {
if(result.isOk()) {
const { roomsToDelete, roomsToInsert, roomsToUpdate } = roomListDetermineChanges(result.value.data, localList.value)
const filterValidateRooms = result.value.data.filter(e => {
if(e.chatRoom.roomType == RoomType.Direct) {
if(e.chatRoom.user1 != null && e.chatRoom.user2 != null) {
return true
} else {
Logger.error("direct room invalid data", {
data: e.chatRoom,
user1: e.chatRoom.user1,
user2: e.chatRoom.user2
})
return false
}
}
return true
})
const { roomsToDelete, roomsToInsert, roomsToUpdate } = roomListDetermineChanges(filterValidateRooms, localList.value)
console.log({roomsToDelete, roomsToInsert, roomsToUpdate})
if(roomsToInsert) {
const roomsToInsertEntity = GetRoomListMapper.toDomain(roomsToInsert)
for( const room of roomsToInsertEntity) {
this.roomLocalDataSourceService.insert(room)
this.roomLocalDataSourceService.insert(room).then((result) => {
if( result.isErr() &&
room.roomType == RoomType.Direct &&
result.error.DBErrorName == 'ConstraintError') {
this.roomLocalDataSourceService.update(room.$id, room).then((result) => {
if(result.isErr()) {
console.log('failed to update room id')
}
})
}
})
if(room.expirationDate) {
this.CronJobService.createCronJob('remove expired room', new Date(room.expirationDate), this.execute)
}
@@ -80,7 +115,9 @@ export class GetRoomListUseCaseService {
this.roomLocalDataSourceService.updateMany(roomsToUpdateEntity)
for( const room of roomsToDelete) {
this.roomLocalDataSourceService.delete(room.id)
if(room.local == IDBoolean.false) {
this.roomLocalDataSourceService.delete(room.id)
}
}
}
@@ -0,0 +1,22 @@
import { Injectable } from '@angular/core';
import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository';
import { z } from 'zod';
const RoomGetLocalByIdServiceInputSchema = z.object({
$roomId: z.string()
})
export type IRoomGetLocalByIdServiceInput = z.infer<typeof RoomGetLocalByIdServiceInputSchema >
@Injectable({
providedIn: 'root'
})
export class RoomGetLocalByIdService {
constructor(
private roomLocalDataSourceService: IRoomLocalRepository,
) { }
async execute(input: IRoomGetLocalByIdServiceInput) {
return await this.roomLocalDataSourceService.findOne({$id: input.$roomId})
}
}
@@ -8,6 +8,7 @@ import { IMessageGetAllByRoomIdOutPut } from 'src/app/core/chat/usecase/message/
import { RoomEntity } from 'src/app/core/chat/entity/group';
import { RoomTable } from 'src/app/infra/database/dexie/instance/chat/schema/room';
import { IMessageLocalRepository } from 'src/app/core/chat/repository/message/message-local-repository';
import { messageListDetermineChanges } from '../../../data/async/list/rooms/messageListChangedetector';
@Injectable({
providedIn: 'root'
@@ -42,9 +43,16 @@ export class RoomSetLastMessageService {
for(const room of roomList) {
if(room.messages?.[0]?.id == message.id) {
console.log('listenToUpdateMessage', message.roomId)
const result = await this.roomLocalRepository.update(message.roomId, {
const result = await this.roomLocalRepository.update(room.$id, {
messages: [message]
})
if(result.isErr()) {
console.log('failed to update last message')
} else {
console.log('set last message')
}
}
}
})
@@ -54,10 +62,19 @@ export class RoomSetLastMessageService {
for(const room of roomList) {
if(room.messages?.[0]?.id == message.id) {
console.log({...room.messages?.[0],isDeleted: true})
const result = await this.roomLocalRepository.update(message.roomId, {
messages: [{...room.messages?.[0],isDeleted: true}]
// incoming _message does not have sender
const messageToUpdate = ({...room.messages?.[0],isDeleted: true})
const result = await this.roomLocalRepository.update(room.$id, {
messages: [messageToUpdate]
})
if(result.isErr()) {
console.log('failed to update last message')
} else {
console.log('set last message')
}
}
}
})
@@ -69,31 +86,61 @@ export class RoomSetLastMessageService {
).subscribe(async (message) => {
if(message?.roomId) {
console.log('listenToIncomingMessage', message.roomId)
const result = await this.roomLocalRepository.update(message.roomId, {
messages: [message]
const findRoom = await this.roomLocalRepository.findOne({
id: message.roomId
})
if(result.isErr()) {
console.log('failed to update last message')
} else {
console.log('set last message')
if(findRoom.isOk() && findRoom.value) {
const result = await this.roomLocalRepository.update(findRoom.value.$id, {
messages: [message]
})
if(result.isErr()) {
console.log('failed to update last message')
} else {
console.log('set last message')
}
}
}
});
}
// local storage
private listenToOnSendDataToSocket() {
this.messageLocalRepository.onCreateObservable().subscribe(async (message) => {
if(message?.roomId) {
setTimeout(async() => {
if(message.origin != 'history') {
const result = await this.roomLocalRepository.update(message.roomId, {
messages: [message]
const findRoom = await this.roomLocalRepository.findOne({
id: message.roomId
})
if(findRoom.isOk() && findRoom.value) {
const result = await this.roomLocalRepository.update(findRoom.value.$id, {
messages: [message]
})
if(result.isErr()) {
console.log('failed to update last message')
} else {
console.log('set last message')
}
} else if (message.receiverId) {
// direct message and first message
const findRoom = await this.roomLocalRepository.findOne({
receiverId: message.receiverId
})
if(findRoom.isOk() && findRoom.value) {
const result = await this.roomLocalRepository.update(findRoom.value.$id, {
messages: [message]
})
}
}
}
}, 100)
}
@@ -128,17 +175,47 @@ export class RoomSetLastMessageService {
const loadHistoryLastMessageDate = new Date(loadHistoryFirstMessage.sentAt).getTime()
if(loadHistoryFirstMessage.id == room.value.messages?.[0]?.id) {
const { addedItems, changedItems, deletedItems } = messageListDetermineChanges([loadHistoryFirstMessage], room.value.messages);
for (const message of changedItems) {
const result = await this.roomLocalRepository.update(room.value.$id, {
messages: [message]
})
}
// do nothing
} else if(loadHistoryLastMessageDate>localLastMessageDate) {
await this.roomLocalRepository.update(loadHistoryFirstMessage.roomId, {
// await this.roomLocalRepository.update(loadHistoryFirstMessage.roomId, {
// messages: [loadHistoryFirstMessage]
// })
const result = await this.roomLocalRepository.update(room.value.$id, {
messages: [loadHistoryFirstMessage]
})
if(result.isErr()) {
console.log('failed to update last message')
} else {
console.log('set last message')
}
} else if(loadHistoryLastMessageDate == localLastMessageDate) {
// do nothing
} else if(room.value.messages[0].isDeleted != loadHistoryFirstMessage.isDeleted) {
await this.roomLocalRepository.update(loadHistoryFirstMessage.roomId, {
// await this.roomLocalRepository.update(loadHistoryFirstMessage.roomId, {
// messages: [loadHistoryFirstMessage]
// })
const result = await this.roomLocalRepository.update(room.value.$id, {
messages: [loadHistoryFirstMessage]
})
if(result.isErr()) {
console.log('failed to update last message')
} else {
console.log('set last message')
}
}
}
@@ -0,0 +1,28 @@
import { Injectable } from '@angular/core';
import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository';
import { IDBoolean } from 'src/app/infra/database/dexie/type';
import { z } from 'zod';
const RoomSetLocalToFalseByIdInputSchema = z.object({
$roomId: z.string(),
roomId: z.string()
})
export type IRoomSetLocalToFalseByIdInput = z.infer<typeof RoomSetLocalToFalseByIdInputSchema >
@Injectable({
providedIn: 'root'
})
export class RoomSetLocalToFalseByIdService {
constructor(
private roomLocalDataSourceService: IRoomLocalRepository,
) { }
execute(input: IRoomSetLocalToFalseByIdInput) {
return this.roomLocalDataSourceService.update(input.$roomId, {
local: IDBoolean.false,
id: input.roomId
})
}
}