diff --git a/src/app/core/chat/entity/message.ts b/src/app/core/chat/entity/message.ts index e2b06250c..0df8a2b67 100644 --- a/src/app/core/chat/entity/message.ts +++ b/src/app/core/chat/entity/message.ts @@ -1,5 +1,6 @@ import { z } from "zod"; import { base64Schema } from "src/app/utils/zod"; +import { SessionStore } from "src/app/store/session.service"; export enum MessageAttachmentSource { @@ -101,7 +102,7 @@ export class MessageEntity { } static haveSeen(info: typeof MessageEntitySchema._type.info) { - return info.filter(e => typeof e.readAt != 'string') + return info.filter(e => typeof e.readAt != 'string' && e.memberId == SessionStore.user.UserId).length == 1 } } diff --git a/src/app/core/chat/repository/bold/bold-local-repository.ts b/src/app/core/chat/repository/bold/bold-local-repository.ts index f34a691f5..ddf528081 100644 --- a/src/app/core/chat/repository/bold/bold-local-repository.ts +++ b/src/app/core/chat/repository/bold/bold-local-repository.ts @@ -1,7 +1,8 @@ +import Dexie, { PromiseExtended } from "Dexie"; import { BoldTable } from "src/app/infra/database/dexie/instance/chat/schema/bold"; import { DexieRepository } from "src/app/infra/repository/dexie/dexie-repository.service"; export abstract class IBoldLocalRepository extends DexieRepository implements IBoldLocalRepository { - -} \ No newline at end of file + abstract open(): PromiseExtended +} diff --git a/src/app/core/chat/repository/message/message-local-repository.ts b/src/app/core/chat/repository/message/message-local-repository.ts index 912759feb..db56ad23a 100644 --- a/src/app/core/chat/repository/message/message-local-repository.ts +++ b/src/app/core/chat/repository/message/message-local-repository.ts @@ -2,10 +2,12 @@ import { MessageTable } from "src/app/infra/database/dexie/instance/chat/schema/ import { DexieRepository } from "src/app/infra/repository/dexie/dexie-repository.service"; import { MessageEntity } from "../../entity/message"; import { Observable as DexieObservable, PromiseExtended } from 'Dexie'; +import { Observable } from "rxjs"; export abstract class IMessageLocalRepository extends DexieRepository { abstract setAllSenderToFalse(): void abstract getItems(roomId: string): PromiseExtended - abstract getItemsLive(roomId: string): DexieObservable + abstract getItemsLive(roomId: string): DexieObservable abstract getOfflineMessages(): Promise -} \ No newline at end of file + abstract onCreateObservable(): Observable +} diff --git a/src/app/infra/database/dexie/instance/chat/schema/room.ts b/src/app/infra/database/dexie/instance/chat/schema/room.ts index 80cb5fb3e..07b78729a 100644 --- a/src/app/infra/database/dexie/instance/chat/schema/room.ts +++ b/src/app/infra/database/dexie/instance/chat/schema/room.ts @@ -15,7 +15,8 @@ export const RoomTableSchema = z.object({ createdAt: z.any(), expirationDate: z.any().nullable(), roomType: z.nativeEnum(RoomType), - messages: MessageEntitySchema.array().optional() + messages: MessageEntitySchema.array().optional(), + bold: z.number().optional() }) export type RoomTable = z.infer diff --git a/src/app/infra/repository/dexie/dexie-repository.service.ts b/src/app/infra/repository/dexie/dexie-repository.service.ts index 4750c8c47..fd6778a93 100644 --- a/src/app/infra/repository/dexie/dexie-repository.service.ts +++ b/src/app/infra/repository/dexie/dexie-repository.service.ts @@ -85,7 +85,9 @@ export class DexieRepository implements IDexieRepository { const ids = await this.table.bulkAdd(documents as any); return ok(ids); } catch (error) { - + Logger.error(`dexie.js failed to insert many into ${this.table.name}`, { + data: document + }); return err(new Error('Failed to insert multiple documents: ' + error.message)); } } @@ -155,6 +157,9 @@ export class DexieRepository implements IDexieRepository { const documents: any = await this.table.where(filter).toArray(); return ok(documents); } catch (error) { + Logger.error(`dexie.js failed to find into ${this.table.name}`, { + data: filter, + }); return err(new Error('Failed to find documents: ' + error.message)); } } @@ -164,7 +169,10 @@ export class DexieRepository implements IDexieRepository { const document = await this.table.where(filter).first(); return ok(document); } catch (error) { - console.log(filter) + Logger.error(`dexie.js failed to findOne into ${this.table.name}`, { + data: filter, + error + }); return err(new Error('Failed to find document: ' + error.message)); } } diff --git a/src/app/module/chat/data/repository/bold/bold-local-repository.ts b/src/app/module/chat/data/repository/bold/bold-local-repository.ts index 343b826fd..a93bfdda6 100644 --- a/src/app/module/chat/data/repository/bold/bold-local-repository.ts +++ b/src/app/module/chat/data/repository/bold/bold-local-repository.ts @@ -14,7 +14,11 @@ export class BoldLocalRepository extends DexieRepository super(chatDatabase.bold, BoldTableSchema) } + open() { + return chatDatabase.open() + } + listen() { return from(liveQuery(() => chatDatabase.bold.toArray())) } -} \ No newline at end of file +} diff --git a/src/app/module/chat/data/repository/message/message-local-data-source.service.ts b/src/app/module/chat/data/repository/message/message-local-data-source.service.ts index 003635a76..34dad019e 100644 --- a/src/app/module/chat/data/repository/message/message-local-data-source.service.ts +++ b/src/app/module/chat/data/repository/message/message-local-data-source.service.ts @@ -20,21 +20,20 @@ export class MessageLocalDataSourceService extends DexieRepository { - console.log('A new friend is being added:', obj); + this.creatingSubject.next(obj) + console.log('creating', obj) }); - } - // onCreateObservable() { - // return this.creatingSubject.asObservable().pipe( - // filter(e => e?.sender?.wxFullName) - // ) - // } + onCreateObservable() { + return this.creatingSubject.asObservable() + } async setAllSenderToFalse() { try { diff --git a/src/app/module/chat/domain/chat-service.service.ts b/src/app/module/chat/domain/chat-service.service.ts index 47bcb77d9..6e63daeb9 100644 --- a/src/app/module/chat/domain/chat-service.service.ts +++ b/src/app/module/chat/domain/chat-service.service.ts @@ -41,6 +41,7 @@ import { MessageMarkAsReadInput } from "src/app/module/chat/domain/use-case/mess import { BoldRemoveByRoomIdInput, BoldRemoveByRoomIdService } from 'src/app/module/chat/domain/use-case/bold/bold-remove-by-room-id.service'; import { MemberListHttpSyncUseCase } from 'src/app/module/chat/domain/use-case/member/member-list-http-sync-use-case.ts.service' import { RoomBoldSyncUseCaseService } from 'src/app/module/chat/domain/use-case/room/room-bold-sync-use-case.service' +import { RoomSetLastMessageService } from 'src/app/module/chat/domain/use-case/room/room-set-last-message.service' export const InstanceId = uuidv4(); @Injectable({ @@ -82,7 +83,8 @@ export class ChatServiceService { private MessageSocketRepositoryService: MessageSocketRepositoryService, private BoldRemoveByRoomIdService: BoldRemoveByRoomIdService, private MemberListHttpSyncUseCase: MemberListHttpSyncUseCase, - private RoomBoldSyncUseCaseService: RoomBoldSyncUseCaseService + private RoomBoldSyncUseCaseService: RoomBoldSyncUseCaseService, + private RoomSetLastMessageService: RoomSetLastMessageService ) { this.MessageSocketRepositoryService.listenToDeleteMessages() .pipe() diff --git a/src/app/module/chat/domain/use-case/bold/bold-remove-by-room-id.service.ts b/src/app/module/chat/domain/use-case/bold/bold-remove-by-room-id.service.ts index 1c8550323..2e683689b 100644 --- a/src/app/module/chat/domain/use-case/bold/bold-remove-by-room-id.service.ts +++ b/src/app/module/chat/domain/use-case/bold/bold-remove-by-room-id.service.ts @@ -15,7 +15,7 @@ export type BoldRemoveByRoomIdInput = z.infer(BoldRemoveByRoomIdInputSchema, input) if(validation.isOk()) { + console.log('remove buld============================') return await this.boldLocalRepository.delete(input.roomId) } else { tracing.hasError("invalid parameter") } - + } } diff --git a/src/app/module/chat/domain/use-case/room/room-bold-sync-use-case.service.ts b/src/app/module/chat/domain/use-case/room/room-bold-sync-use-case.service.ts index 4b0d6c1b4..dd2f35c1b 100644 --- a/src/app/module/chat/domain/use-case/room/room-bold-sync-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/room/room-bold-sync-use-case.service.ts @@ -3,9 +3,11 @@ import { filter, map } from 'rxjs/operators'; import { IMessageSocketRepository } from 'src/app/core/chat/repository/message/message-socket-repository'; import { MessageEntity } from 'src/app/core/chat/entity/message'; import { IBoldLocalRepository } from 'src/app/core/chat/repository/bold/bold-local-repository'; +import { IMessageLocalRepository } from 'src/app/core/chat/repository/message/message-local-repository'; import { InstanceId } from '../../chat-service.service'; import { IMessageGetAllByRoomIdOutPut } from 'src/app/core/chat/usecase/message/message-get-all-by-room-Id'; import { HttpAdapter } from 'src/app/infra/http/adapter'; +import { SessionStore } from 'src/app/store/session.service'; @Injectable({ @@ -17,9 +19,11 @@ export class RoomBoldSyncUseCaseService { private MessageSocketRepositoryService: IMessageSocketRepository, private boldLocalRepository: IBoldLocalRepository, private http: HttpAdapter, + private messageLocalRepository: IMessageLocalRepository ) { this.listenToIncomingMessage(); - this.loadHistory() + // this.loadHistory() + this.onInsertToDB() } private listenToIncomingMessage() { @@ -39,22 +43,48 @@ export class RoomBoldSyncUseCaseService { }); } - private loadHistory() { - const regex = new RegExp("Room\\/([0-9a-fA-F]{8})-([0-9a-fA-F]{4})-([0-9a-fA-F]{4})-([0-9a-fA-F]{4})-([0-9a-fA-F]{12})\\/Messages"); + // private loadHistory() { + // const regex = new RegExp("Room\\/([0-9a-fA-F]{8})-([0-9a-fA-F]{4})-([0-9a-fA-F]{4})-([0-9a-fA-F]{4})-([0-9a-fA-F]{12})\\/Messages"); - return this.http.listen().pipe( - filter((response: any)=> { - return response?.isOk() && regex.test(response.value.url) + // return this.http.listen().pipe( + // filter((response: any)=> { + // return response?.isOk() && regex.test(response.value.url) + // }), + // map((response: any) => response.value.data as IMessageGetAllByRoomIdOutPut) + // ).subscribe(async (data)=> { + + // if(data.data.length >= 1) { + // for(const message of data.data) { + // const haveSeen = MessageEntity.haveSeen(message.info) + // } + // } + + // }) + // } + + private onInsertToDB() { + + this.messageLocalRepository.onCreateObservable().pipe( + filter(e => { + console.log('onInsertToDB', e) + return e?.origin == 'history' }), - map((response: any) => response.value.data as IMessageGetAllByRoomIdOutPut) - ).subscribe(async (data)=> { + filter(e => e.sender.wxUserId != SessionStore.user.UserId) + ).subscribe(async (newMessage)=> { + const haveSeen = MessageEntity.haveSeen(newMessage.info) + if(!haveSeen) { + setTimeout(async ()=> { - if(data.data.length >= 1) { - for(const message of data.data) { - const haveSeen = MessageEntity.haveSeen(message.info) - } + await this.boldLocalRepository.open() + const result = await this.boldLocalRepository.findOne({roomId: newMessage.roomId}) + + if(result.isOk() && !result.value) { + const result = await this.boldLocalRepository.insert({roomId: newMessage.roomId, bold: 1}) + } else if(result.isOk() && result.value.bold == 0) { + const result = await this.boldLocalRepository.update(newMessage.roomId, {bold: 1}) + } + }, 2000) } - }) } } diff --git a/src/app/module/chat/domain/use-case/room/room-set-last-message.service.ts b/src/app/module/chat/domain/use-case/room/room-set-last-message.service.ts index 9ac6ee497..ddd453a34 100644 --- a/src/app/module/chat/domain/use-case/room/room-set-last-message.service.ts +++ b/src/app/module/chat/domain/use-case/room/room-set-last-message.service.ts @@ -29,10 +29,16 @@ export class RoomSetLastMessageService { filter((message) => !message?.requestId?.startsWith(InstanceId)), // get all message not send by me map(message => Object.assign(new MessageEntity(), message)) ).subscribe(async (message) => { - this.roomLocalRepository.update(message.roomId, { + const result = await this.roomLocalRepository.update(message.roomId, { messages: [message] }) + if(result.isErr()) { + console.log('failed to update last message') + } else { + console.log('set last message') + } + }); } @@ -63,7 +69,7 @@ export class RoomSetLastMessageService { return this.http.listen().pipe( filter((response: any)=> { - return response?.isOk() && regex.test(response.value.url) + return response?.isOk() && regex.test(response.value.url) && response.value.url.endsWith('/Messages') }), map((response: any) => response.value.data as IMessageGetAllByRoomIdOutPut) ).subscribe(async (data)=> { @@ -92,7 +98,7 @@ export class RoomSetLastMessageService { } else if(loadHistoryLastMessageDate == localLastMessageDate) { // console.log('same', loadHistoryFirstMessage, roomEntity) } else { - console.log('bug!', loadHistoryFirstMessage, roomEntity) + // console.log('bug!', loadHistoryFirstMessage, roomEntity) } } diff --git a/src/app/ui/chat/component/messages/messages.page.html b/src/app/ui/chat/component/messages/messages.page.html index 0ba296045..302be39f0 100644 --- a/src/app/ui/chat/component/messages/messages.page.html +++ b/src/app/ui/chat/component/messages/messages.page.html @@ -56,7 +56,7 @@
- {{ message.message }} + {{ message.message }} {{ message.sentAt }}