This commit is contained in:
Peter Maquiran
2024-08-14 15:29:16 +01:00
parent d7eb6a552b
commit ea4ca5c34c
19 changed files with 270 additions and 80 deletions
+4 -2
View File
@@ -2,6 +2,7 @@ import { NgModule } from '@angular/core';
import { SignalRService } from 'src/app/module/chat/infra/socket/signal-r.service'
import { SyncMessageRepositoryService } from './data/service/sync-repository/sync-message-repository.service';
import { UserTypingAsyncService } from 'src/app/module/chat/data/async/socket/user-typing-async.service'
import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service'
@NgModule({
imports: [
@@ -19,10 +20,10 @@ export class ChatModule {
constructor(
private message: SyncMessageRepositoryService,
private SignalRService: SignalRService,
private UserTypingAsyncService: UserTypingAsyncService
private UserTypingAsyncService: UserTypingAsyncService,
private ChatServiceService: ChatServiceService
) {
this.triggerToSendOfflineMessages()
}
@@ -32,6 +33,7 @@ export class ChatModule {
result.subscribe((value) => {
if(value) {
this.ChatServiceService.asyncAllRoomMessage();
this.message.sendLocalMessages()
}
})
@@ -1,6 +1,8 @@
import { RoomListItemOutPutDTO, RoomListOutPutDTO } from "../../../dto/room/roomListOutputDTO";
export function messageListDetermineChanges(serverList: any[], localList: any[]) {
localList = localList.filter(e => e.id)
// Convert lists to dictionaries for easier comparison
const localDict = localList.reduce((acc, item) => {
acc[item.id] = item;
@@ -8,20 +8,19 @@ import { MemberListUPdateStatusInputDTO } from '../../../domain/use-case/socket/
import { MemberTable } from '../../../infra/database/dexie/schema/members';
import { chatDatabase } from '../../../infra/database/dexie/service';
import { RoomTable, RoomTableSchema } from '../../../infra/database/dexie/schema/room';
import { DexieRepository } from 'src/app/infra/repository/dexie/dexie-repository.service';
@Injectable({
providedIn: 'root'
})
export class RoomLocalDataSourceService {
constructor() {}
async removeUserTyping() {
export class RoomLocalDataSourceService extends DexieRepository<RoomTable> {
constructor() {
super(chatDatabase.room, RoomTableSchema)
}
async removeUserTyping() {}
@ValidateSchema(RoomTableSchema)
async createRoom(data: RoomTable) {
try {
@@ -4,7 +4,7 @@ import { MessageAttachmentFileType, MessageAttachmentSource } from "./messageOut
export const MessageInputDTOSchema = z.object({
roomId: z.string().uuid(),
senderId: z.number(),
message: z.string(),
message: z.string().nullable().optional(),
messageType: z.number(),
canEdit: z.boolean(),
oneShot: z.boolean(),
@@ -21,7 +21,7 @@ export const MessageOutPutDataDTOSchema = z.object({
wxeMail: z.string(),
userPhoto: z.string().optional()
}),
message: z.string().nullable(),
message: z.string().nullable().optional(),
messageType: z.number(),
sentAt: z.string(),
canEdit: z.boolean(),
@@ -32,7 +32,7 @@ export class MessageRepositoryService {
async createMessageLocally(entity: MessageEntity) {
//const requestId = InstanceId +'@'+ uuidv4();
const localActionResult = await this.messageLocalDataSourceService.sendMessage(entity)
return localActionResult.map(e => {
@@ -112,8 +112,6 @@ export class MessageRepositoryService {
const { addedItems, changedItems, deletedItems } = messageListDetermineChanges(result.value.data, localResult)
console.log({addedItems, changedItems});
for(const message of changedItems) {
let clone: MessageTable = message
clone.roomId = id
@@ -123,16 +121,16 @@ export class MessageRepositoryService {
for(const message of addedItems) {
let clone: MessageTable = message
clone.roomId = id
}
this.messageLocalDataSourceService.createManyMessage(addedItems.reverse())
for(const message of deletedItems) {
this.messageLocalDataSourceService.deleteByMessageId(message.id)
}
return ok(addedItems)
}
return result
}
@@ -12,11 +12,9 @@ import { RoomUpdateInputDTO } from '../dto/room/roomUpdateInputDTO';
import { SessionStore } from 'src/app/store/session.service';
import { RoomLiveDataSourceService } from '../data-source/room/room-live-data-source.service';
import { isHttpResponse } from 'src/app/services/http.service';
import { MessageLiveDataSourceService } from '../data-source/message/message-live-data-source.service';
import { MemberListUPdateStatusInputDTO } from '../../domain/use-case/socket/member-list-update-status-use-case.service';
import { MemberSetAdminDTO } from '../../domain/use-case/member-admin-use-case.service';
import { MemberListMapper } from '../../domain/mapper/memberLIstMapper';
import { SignalRService } from '../../infra/socket/signal-r.service';
function date(isoDateString) {
@@ -91,6 +89,11 @@ export class RoomRepositoryService {
return result
}
async getRoomList() {
return await this.roomLocalDataSourceService.getRoomList()
}
@captureAndReraiseAsync('RoomRepositoryService/updateRoomBy')
async updateRoomBy(data: RoomUpdateInputDTO) {
@@ -293,4 +296,14 @@ export class RoomRepositoryService {
getRoomMemberNoneAdminByIdLive(roomId) {
return this.roomLocalDataSourceService.getRoomMemberNoneAdminByIdLive(roomId)
}
get find() {
return this.roomLocalDataSourceService.find
}
get findAll() {
return this.roomLocalDataSourceService.findAll
}
}
@@ -13,6 +13,7 @@ import { ListenMessageByRoomIdNewUseCase } from 'src/app/module/chat/domain/use-
import { MemberListUpdateStatusUseCaseService } from 'src/app/module/chat/domain/use-case/socket/member-list-update-status-use-case.service';
import { ListenMessageDeleteByRoomIdService } from './use-case/listene-message-delete-by-roomId.service';
import { ListenMessageUpdateByRoomIdUseCase } from './use-case/listen-message-update-by-roomId.service';
import { SyncAllRoomMessagesService } from './use-case/sync-all-room-messages.service';
import { ListenSendMessageUseCase } from './use-case/listen-send-message.service'
import { filter } from 'rxjs/operators';
import { v4 as uuidv4 } from 'uuid'
@@ -42,7 +43,8 @@ export class ChatServiceService {
private ListenMessageDeleteService: ListenMessageDeleteByRoomIdService,
private ListenMessageUpdateByRoomIdUseCase: ListenMessageUpdateByRoomIdUseCase,
private ListenSendMessageUseCase: ListenSendMessageUseCase,
private MessageAttachmentByMessageIdService: MessageAttachmentByMessageIdUseCase
private MessageAttachmentByMessageIdService: MessageAttachmentByMessageIdUseCase,
private SyncAllRoomMessagesService: SyncAllRoomMessagesService
) {
this.messageLiveSignalRDataSourceService.getMessageDelete()
.pipe()
@@ -119,6 +121,10 @@ export class ChatServiceService {
return this.MessageCreateUseCaseService.execute(input);
}
asyncAllRoomMessage() {
return this.SyncAllRoomMessagesService.execute()
}
getMessageAttachmentByMessageId(input: MessageAttachmentByMessageIdInput) {
return this.MessageAttachmentByMessageIdService.execute(input)
}
@@ -37,34 +37,28 @@ export class MessageCreateUseCaseService {
const createMessageLocally = await this.MessageRepositoryService.createMessageLocally(message)
if(createMessageLocally.isOk()) {
console.log('==========================',message);
if(message.hasAttachment) {
for (const attachment of message.attachments) {
const createAttachmentLocally = this.AttachmentRepositoryService.create({
$messageId: createMessageLocally.value.$id,
file: createDataURL(attachment.file, attachment.mimeType)
file: createDataURL(attachment.file, attachment.mimeType)
})
attachment.safeFile = createDataURL(attachment.file, attachment.mimeType)
}
}
const sendToServer = await this.MessageRepositoryService.sendMessage(message)
// if(sendToServer.isOk()) {
// for (const attachment of message.attachments) {
// const attachment = await this.AttachmentRepositoryService.findOne({
// $messageId: createMessageLocally.value.$id
// })
// }
// }
if(!sendToServer.isOk()) {
console.log('sendToServer error', sendToServer.error)
}
return sendToServer
@@ -7,7 +7,7 @@ const MessageUpdateInputDTOSchema = z.object({
memberId: z.number(),
messageId: z.string(),
roomId: z.string(),
message: z.string(),
message: z.string().optional().nullable(),
requestId: z.string().optional()
})
@@ -0,0 +1,29 @@
import { Injectable } from '@angular/core';
import { RoomRepositoryService } from 'src/app/module/chat/data/repository/room-repository.service'
import { MessageRepositoryService } from 'src/app/module/chat/data/repository/message-respository.service'
import { RoomTable } from '../../infra/database/dexie/schema/room';
@Injectable({
providedIn: 'root'
})
export class SyncAllRoomMessagesService {
constructor(
private RoomRepositoryService: RoomRepositoryService,
private MessageRepositoryService: MessageRepositoryService
) { }
async execute() {
const allRooms: RoomTable[] = await this.RoomRepositoryService.getRoomList()
if(allRooms) {
for(const room of allRooms) {
this.MessageRepositoryService.listAllMessagesByRoomId(room.id)
}
} else {
console.log('get all error', allRooms)
}
}
}
@@ -15,5 +15,5 @@ export const RoomTableSchema = z.object({
})
export type RoomTable = z.infer<typeof RoomTableSchema>
export type DexieRoomsTableSchema = EntityTable<RoomTable, 'id'>;
export type DexieRoomsTable = EntityTable<RoomTable, 'id'>;
export const RoomTableColumn = 'id, createdBy, roomName, roomType, expirationDate, lastMessage'
@@ -10,5 +10,5 @@ export const TypingTableSchema = z.object({
})
export type TypingTable = z.infer<typeof TypingTableSchema>
export type DexieTypingsTableSchema = EntityTable<TypingTable, 'id'>;
export type DexieTypingsTable = EntityTable<TypingTable, 'id'>;
export const TypingTableColumn = 'id, userId, userName, chatRoomId, entryDate'
@@ -1,9 +1,9 @@
import { Dexie, EntityTable, liveQuery } from 'Dexie';
import { Dexie } from 'Dexie';
import { DexieMessageTable, messageTableColumn, MessageTable } from './schema/message';
import { DexieMembersTableSchema, MemberTableColumn } from './schema/members';
import { DexieRoomsTableSchema, RoomTableColumn } from './schema/room';
import { DexieTypingsTableSchema, TypingTableColumn } from './schema/typing';
import { DexieRoomsTable, RoomTableColumn } from './schema/room';
import { DexieTypingsTable, TypingTableColumn } from './schema/typing';
import { MessageEntity } from '../../../domain/entity/message';
import { AttachmentTable, AttachmentTableColumn, DexieAttachmentsTableSchema } from './schema/attachment';
// import DexieMemory from 'dexie-in-memory';
@@ -12,8 +12,8 @@ import { AttachmentTable, AttachmentTableColumn, DexieAttachmentsTableSchema } f
export const chatDatabase = new Dexie('chat-database-infra') as Dexie & {
message: DexieMessageTable,
members: DexieMembersTableSchema,
room: DexieRoomsTableSchema,
typing: DexieTypingsTableSchema,
room: DexieRoomsTable,
typing: DexieTypingsTable,
attachment: DexieAttachmentsTableSchema,
};