mirror of
https://code.equilibrium.co.ao/ITO/doneit-web.git
synced 2026-04-19 21:06:06 +00:00
create offline direct message
This commit is contained in:
@@ -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
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user