diff --git a/src/app/services/Repositorys/chat/data-source/message/message-local-data-source.service.ts b/src/app/services/Repositorys/chat/data-source/message/message-local-data-source.service.ts index 5efee8ac7..c6eed105d 100644 --- a/src/app/services/Repositorys/chat/data-source/message/message-local-data-source.service.ts +++ b/src/app/services/Repositorys/chat/data-source/message/message-local-data-source.service.ts @@ -19,6 +19,12 @@ const tableSchema = z.object({ canEdit: z.boolean(), oneShot: z.boolean(), requireUnlock: z.boolean(), + sender: z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string() + }) }) export type TableMessage = z.infer @@ -45,9 +51,11 @@ export class MessageLocalDataSourceService { async createMessage(data: MessageInputDTO) { try { + console.log('add', data) const result = await messageDataSource.message.add(data) return ok(result as string) } catch (e) { + console.log('add error') return err(false) } @@ -57,6 +65,7 @@ export class MessageLocalDataSourceService { async update(data: TableMessage) { try { + console.log('update', data) const result = await messageDataSource.message.update(data.id, data) return ok(result) } catch (e) { @@ -65,12 +74,41 @@ export class MessageLocalDataSourceService { } + + async findOrUpdate(data: TableMessage) { + const findResult = await this.findMessageById(data.messageId) + + console.log('findOrUpdate', findResult) + + if(findResult.isOk()) { + return this.update({...findResult.value, ...data}) + } else { + return this.createMessage(data) + } + } + getItemsLive(roomId: string): Observable { return liveQuery(() => messageDataSource.message.where('roomId').equals(roomId).toArray() as any) as any } - addIdToMessage() {} + async findMessageById(messageId: string) { + try { + console.log('messageId', messageId) + const a = await messageDataSource.message.where('messageId').equals(messageId).first() + + if(a) { + return ok(a) + } else { + return err('not found') + } + + } catch (e) { + console.log('error') + return err('DB error') + } + + } } diff --git a/src/app/services/Repositorys/chat/data-source/message/message-remote-data-source.service.ts b/src/app/services/Repositorys/chat/data-source/message/message-remote-data-source.service.ts index 0cc28287a..e6e59195a 100644 --- a/src/app/services/Repositorys/chat/data-source/message/message-remote-data-source.service.ts +++ b/src/app/services/Repositorys/chat/data-source/message/message-remote-data-source.service.ts @@ -5,6 +5,7 @@ import { DataSourceReturn } from '../../../type'; import { MessageInputDTO, MessageInputDTOSchema } from '../../dto/message/messageInputDtO'; import { ValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; import { MessageOutPutDTO } from '../../dto/message/messageOutputDTO'; +import { MessageListOutput } from '../../dto/message/messageListOutputDTO'; @Injectable({ providedIn: 'root' @@ -24,9 +25,8 @@ export class MessageRemoteDataSourceService { return await this.httpService.post(`${this.baseUrl}/Messages/${id}/React`, reaction); } - async getMessagesFromRoom(id: MessageListInputDTO): DataSourceReturn { + async getMessagesFromRoom(id: string): DataSourceReturn { return await this.httpService.get(`${this.baseUrl}/Room/${id}/Messages`); } - } diff --git a/src/app/services/Repositorys/chat/dto/message/messageListOutputDTO.ts b/src/app/services/Repositorys/chat/dto/message/messageListOutputDTO.ts new file mode 100644 index 000000000..3d45d499f --- /dev/null +++ b/src/app/services/Repositorys/chat/dto/message/messageListOutputDTO.ts @@ -0,0 +1,29 @@ +import { z } from "zod" + +const SenderSchema = z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string() +}); + +const DataSchema = z.object({ + id: z.string(), + sender: SenderSchema, + message: z.string(), + messageType: z.number(), + sentAt: z.string().datetime(), + deliverAt: z.string().datetime().nullable(), + canEdit: z.boolean(), + oneShot: z.boolean(), + requireUnlock: z.boolean() +}); + +const MessageListOutputSchema = z.object({ + success: z.boolean(), + message: z.string().nullable(), + data: z.array(DataSchema) +}); + + +export type MessageListOutput = z.infer diff --git a/src/app/services/Repositorys/chat/repository/message-respository.service.ts b/src/app/services/Repositorys/chat/repository/message-respository.service.ts index f5eea1931..3a61dde53 100644 --- a/src/app/services/Repositorys/chat/repository/message-respository.service.ts +++ b/src/app/services/Repositorys/chat/repository/message-respository.service.ts @@ -23,13 +23,19 @@ export class MessageRepositoryService { if(localActionResult.isOk()) { const sendMessageResult = await this.messageRemoteDataSourceService.sendMessage(data) - if(sendMessageResult.isOk()) { - let clone: TableMessage = sendMessageResult.value.data - - clone.messageId = sendMessageResult.value.data.id - clone.id = localActionResult.value + let clone: TableMessage = { + ...sendMessageResult.value.data, + sender: { + userPhoto: '', + wxeMail: '', + wxFullName: '', + wxUserId: 0 + }, + messageId: sendMessageResult.value.data.id, + id : localActionResult.value + } return this.messageLocalDataSourceService.update(clone) } @@ -37,13 +43,21 @@ export class MessageRepositoryService { } } - async listAllMessagesByRoomId() { - this.messageRemoteDataSourceService - } + async listAllMessagesByRoomId(id: string) { + const result = await this.messageRemoteDataSourceService.getMessagesFromRoom(id) - async getMessagesFromRoom(data: MessageListInputDTO) { - const result = await this.messageRemoteDataSourceService.getMessagesFromRoom(data) + if(result.isOk()) { + console.log({result}) + for(const message of result.value.data) { + let clone: TableMessage = message + clone.messageId = message.id + clone.roomId = id + delete clone.id + + await this.messageLocalDataSourceService.findOrUpdate(clone) + } + } return result } diff --git a/src/app/services/Repositorys/contacts/data-source/contacts-data-source.service.ts b/src/app/services/Repositorys/contacts/data-source/contacts-data-source.service.ts index 81a7fbc5b..11e757c7a 100644 --- a/src/app/services/Repositorys/contacts/data-source/contacts-data-source.service.ts +++ b/src/app/services/Repositorys/contacts/data-source/contacts-data-source.service.ts @@ -1,8 +1,5 @@ import { Injectable } from '@angular/core'; import { HttpService } from 'src/app/services/http.service'; -import { MessageOutPutDTO } from '../../chat/dto/message/messageOutputDTO'; -import { MessageListInputDTO } from '../../chat/dto/message/messageListInputDTO'; - export interface UserContacts { wxUserId: number; @@ -12,10 +9,10 @@ export interface UserContacts { } export interface UserListResult { - total: number, + total: number, result: UserContacts[] } - + export interface UserList { success: boolean; message: string; diff --git a/src/app/shared/chat/messages/messages.page.ts b/src/app/shared/chat/messages/messages.page.ts index 84dabb608..dd1e05268 100644 --- a/src/app/shared/chat/messages/messages.page.ts +++ b/src/app/shared/chat/messages/messages.page.ts @@ -143,6 +143,8 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy ngOnChanges(changes: SimpleChanges): void { this.roomData$ = this.roomRepositoryService.getItemByIdLive(this.roomId) this.roomMessage$ = this.messageRepositoryService.getItemsLive(this.roomId) + + this.messageRepositoryService.listAllMessagesByRoomId(this.roomId) } sendTyping() {} @@ -408,7 +410,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy const data: MessageInputDTO = { roomId: this.roomId, senderId: SessionStore.user.UserId, - message: "hello", + message: this.textField, messageType: 0, canEdit: false, oneShot:false,