From ef12ff439db0d361a139bd66f4e87b2608221112 Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Sun, 18 Aug 2024 13:27:57 +0100 Subject: [PATCH] code refactoring --- src/app/app-routing.module.ts | 4 - .../dexie/dexie-repository.service.ts | 1 - src/app/module/chat/chat.module.ts | 6 +- .../member-list-local-data-source.service.ts | 48 --- .../room/room-live-data-source.service.ts | 44 --- .../room/room-memory-data-source.ts | 65 ---- .../member-list-local-repository.service.ts} | 90 +---- .../member-list-remote-repository.service.ts} | 6 +- .../repository/message-respository.service.ts | 81 +---- .../room-local-repository.service.ts | 93 ++++++ .../room-remote-repository.service.ts} | 43 ++- .../repository/room-repository.service.ts | 309 ------------------ .../chat/domain/chat-service.service.ts | 77 ++++- .../use-case/member-add-use-case.service.ts | 27 ++ .../use-case/member-admin-use-case.service.ts | 6 +- .../use-case/member/-use-case.service.ts | 22 ++ .../message-create-use-case.service.ts | 51 ++- ...age-delete-by-id-live-use-case.service.ts} | 0 ...-download-attachment-user-case.service.ts} | 0 ...get-attachment-localy-use-case.service.ts} | 0 ...essage-reaction-by-id-use-case.service.ts} | 0 ... message-update-by-id-use-case.service.ts} | 0 ...messages-send-offline-use-case.service.ts} | 0 .../use-case/room-create-use-case.service.ts | 47 +++ .../room-delete-by-id-use-case.service.ts | 42 +++ .../room-get-by-id-use-case.service.ts | 69 ++++ .../room-get-list-use-case.service.ts | 47 +++ .../room-leave-by-id-use-case.service.ts | 34 ++ .../room-update-by-id-use-case.service.ts | 39 +++ ...ber-list-update-status-use-case.service.ts | 7 +- .../sync-all-room-messages.service.ts | 57 +++- .../use-case/typing-send-use-case.service.ts | 22 ++ src/app/module/chat/infra/socket/signalR.ts | 2 +- src/app/pages/login/login.page.ts | 4 +- src/app/ui/chat/chat-routing.module.ts | 4 + src/app/ui/chat/chat.page.ts | 17 +- .../component/edit-group/edit-group.page.ts | 7 +- .../group-contacts/group-contacts.page.ts | 17 +- .../messages/contacts/contacts.page.ts | 8 +- .../chat/component/messages/messages.page.ts | 22 +- .../component/new-group/new-group.page.ts | 7 +- .../modal/chat-popover/chat-popover.page.ts | 12 +- .../modal/messages/contacts/contacts.page.ts | 2 - .../ui/chat/modal/messages/messages.page.ts | 14 +- .../set-room-owner-routing.module.ts | 0 .../set-room-owner/set-room-owner.module.ts | 0 .../set-room-owner/set-room-owner.page.html | 0 .../set-room-owner/set-room-owner.page.scss | 0 .../set-room-owner.page.spec.ts | 0 .../set-room-owner/set-room-owner.page.ts | 11 +- 50 files changed, 729 insertions(+), 735 deletions(-) delete mode 100644 src/app/module/chat/data/data-source/member-list/member-list-local-data-source.service.ts delete mode 100644 src/app/module/chat/data/data-source/room/room-live-data-source.service.ts delete mode 100644 src/app/module/chat/data/data-source/room/room-memory-data-source.ts rename src/app/module/chat/data/{data-source/room/rooom-local-data-source.service.ts => repository/member-list-local-repository.service.ts} (61%) rename src/app/module/chat/data/{data-source/member-list/member-list-remote-data-source.service.ts => repository/member-list-remote-repository.service.ts} (88%) create mode 100644 src/app/module/chat/data/repository/room-local-repository.service.ts rename src/app/module/chat/data/{data-source/room/room-remote-data-source.service.ts => repository/room-remote-repository.service.ts} (69%) delete mode 100644 src/app/module/chat/data/repository/room-repository.service.ts create mode 100644 src/app/module/chat/domain/use-case/member-add-use-case.service.ts create mode 100644 src/app/module/chat/domain/use-case/member/-use-case.service.ts rename src/app/module/chat/domain/use-case/{message-delete-live-use-case.service.ts => message-delete-by-id-live-use-case.service.ts} (100%) rename src/app/module/chat/domain/use-case/{download-message-attachment-user-case.service.ts => message-download-attachment-user-case.service.ts} (100%) rename src/app/module/chat/domain/use-case/{get-message-attachment-localy-use-case.service.ts => message-get-attachment-localy-use-case.service.ts} (100%) rename src/app/module/chat/domain/use-case/{message-reaction-use-case.service.ts => message-reaction-by-id-use-case.service.ts} (100%) rename src/app/module/chat/domain/use-case/{message-update-use-case.service.ts => message-update-by-id-use-case.service.ts} (100%) rename src/app/module/chat/domain/use-case/{send-local-messages-use-case.service.ts => messages-send-offline-use-case.service.ts} (100%) create mode 100644 src/app/module/chat/domain/use-case/room-create-use-case.service.ts create mode 100644 src/app/module/chat/domain/use-case/room-delete-by-id-use-case.service.ts create mode 100644 src/app/module/chat/domain/use-case/room-get-by-id-use-case.service.ts create mode 100644 src/app/module/chat/domain/use-case/room-get-list-use-case.service.ts create mode 100644 src/app/module/chat/domain/use-case/room-leave-by-id-use-case.service.ts create mode 100644 src/app/module/chat/domain/use-case/room-update-by-id-use-case.service.ts create mode 100644 src/app/module/chat/domain/use-case/typing-send-use-case.service.ts rename src/app/{modals => ui/chat/modal}/set-room-owner/set-room-owner-routing.module.ts (100%) rename src/app/{modals => ui/chat/modal}/set-room-owner/set-room-owner.module.ts (100%) rename src/app/{modals => ui/chat/modal}/set-room-owner/set-room-owner.page.html (100%) rename src/app/{modals => ui/chat/modal}/set-room-owner/set-room-owner.page.scss (100%) rename src/app/{modals => ui/chat/modal}/set-room-owner/set-room-owner.page.spec.ts (100%) rename src/app/{modals => ui/chat/modal}/set-room-owner/set-room-owner.page.ts (83%) diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 5a5b1c31a..ec132a02e 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -226,10 +226,6 @@ const routes = [ path: 'previewer', loadChildren: () => import('./modals/previewer/previewer.module').then( m => m.PreviewerPageModule) }, - { - path: 'set-room-owner', - loadChildren: () => import('./modals/set-room-owner/set-room-owner.module').then( m => m.SetRoomOwnerPageModule) - }, { path: 'diplomas-gerar', loadChildren: () => import('./shared/gabinete-digital/diplomas-gerar/diplomas-gerar.module').then( m => m.DiplomasGerarPageModule) diff --git a/src/app/infra/repository/dexie/dexie-repository.service.ts b/src/app/infra/repository/dexie/dexie-repository.service.ts index 26e574060..d01988d29 100644 --- a/src/app/infra/repository/dexie/dexie-repository.service.ts +++ b/src/app/infra/repository/dexie/dexie-repository.service.ts @@ -112,7 +112,6 @@ export class DexieRepository { async findAll(): Promise> { try { - console.log(this.table) const documents = await this.table.toArray() return ok(documents); } catch (error) { diff --git a/src/app/module/chat/chat.module.ts b/src/app/module/chat/chat.module.ts index eb8d07fc3..de30e1dd1 100644 --- a/src/app/module/chat/chat.module.ts +++ b/src/app/module/chat/chat.module.ts @@ -30,7 +30,7 @@ export class ChatModule { } - syncMessage() { + async syncMessage() { const connection = this.SignalRService.getConnectionState() connection.pipe( @@ -38,7 +38,7 @@ export class ChatModule { ).subscribe((value)=> { if(value) { // on reconnect - this.ChatServiceService.asyncAllRoomMessage(); + this.ChatServiceService.start(); } }); @@ -52,7 +52,7 @@ export class ChatModule { // on page reload sync if(!(!SessionStore.user.Inactivity || !SessionStore.exist)) { - this.ChatServiceService.asyncAllRoomMessage(); + this.ChatServiceService.start(); } } } diff --git a/src/app/module/chat/data/data-source/member-list/member-list-local-data-source.service.ts b/src/app/module/chat/data/data-source/member-list/member-list-local-data-source.service.ts deleted file mode 100644 index 5abe78f16..000000000 --- a/src/app/module/chat/data/data-source/member-list/member-list-local-data-source.service.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Injectable } from '@angular/core'; -import { RoomListItemOutPutDTO, RoomListOutPutDTO } from '../../dto/room/roomListOutputDTO'; -import { Dexie, EntityTable, liveQuery, Observable } from 'Dexie'; -import { z } from 'zod'; -import { DexieRepository } from 'src/app/infra/repository/dexie/dexie-repository.service'; - - -const MemberTableSchema = z.object({ - $roomIdUserId: z.string().optional(), - id: z.string(), - roomId: z.string(), - user: z.object({ - wxUserId: z.number(), - wxFullName: z.string(), - wxeMail: z.string(), - userPhoto: z.string().nullable(), - }), - joinAt: z.string(), - status: z.string() -}) -export type IMemberTable = z.infer - -type IMemberTableSchema = EntityTable -// Database declaration (move this to its own module also) -export const roomMemberList = new Dexie('roomMemberList') as Dexie & { - memberList: EntityTable; -}; - -roomMemberList.version(1).stores({ - memberList: '$roomIdUserId, id, user, joinAt, roomId, status', -}); - -@Injectable({ - providedIn: 'root' -}) -export class MemberListLocalDataSourceService extends DexieRepository { - - constructor() { - super(roomMemberList.memberList, MemberTableSchema); - - // messageDataSource.message.hook('creating', (primKey, obj, trans) => { - // // const newMessage = await trans.table('message').get(primKey); - // this.messageSubject.next(obj); - // // return newMessage - // }) - - } -} diff --git a/src/app/module/chat/data/data-source/room/room-live-data-source.service.ts b/src/app/module/chat/data/data-source/room/room-live-data-source.service.ts deleted file mode 100644 index 2d9b33a85..000000000 --- a/src/app/module/chat/data/data-source/room/room-live-data-source.service.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Injectable } from '@angular/core'; -import { SignalRService } from '../../../infra/socket/signal-r.service'; -import { AddMemberToRoomInputDTO } from '../../dto/room/addMemberToRoomInputDto'; -import { v4 as uuidv4 } from 'uuid' -@Injectable({ - providedIn: 'root' -}) -export class RoomLiveDataSourceService { - - constructor( - private socket: SignalRService, - ) {} - - // async getRoomById(data: WebSocketMessage) { - - // try { - - // const result = await this.socket.sendMessage(data).toPromise() - - // console.log({result}) - - // return ok(result) - // } catch (e) { - // return err(e) - // } - - // } - - async addMemberToRoom(data: AddMemberToRoomInputDTO) { - - const result = await this.socket.sendData({ - method: 'AddRoomMember', - data: { - requestId: uuidv4(), - roomId: data.id, - members: data.members - } - }) - - console.log({result}) - - return result - } -} diff --git a/src/app/module/chat/data/data-source/room/room-memory-data-source.ts b/src/app/module/chat/data/data-source/room/room-memory-data-source.ts deleted file mode 100644 index b064d8fcd..000000000 --- a/src/app/module/chat/data/data-source/room/room-memory-data-source.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { createAction, createFeatureSelector, createReducer, createSelector, on, props } from "@ngrx/store"; -import { RoomOutPutDTO } from "../../dto/room/roomOutputDTO"; -import { RoomTable } from "../../../infra/database/dexie/schema/room"; - - -export interface ChatRoom { - [roomId: string]: RoomTable[]; -} - -export interface RoomRemoteDataSourceState { - chatRooms: ChatRoom; -} - -export const initialState: RoomRemoteDataSourceState = { - chatRooms: { - // add more rooms as needed - } -}; - -export const addMessage = createAction( - '[Chat] Add Message', - props<{ roomId: string; message: any }>() -); - -export const addRoom = createAction( - '[Chat] Add Room', - props() -); - -const _chatReducer = createReducer( - initialState, - on(addMessage, (state, { roomId, message }) => ({ - ...state, - chatRooms: { - ...state.chatRooms, - [roomId]: [...(state.chatRooms[roomId] || []), message] - } - })), - on(addRoom, (state, roomData: RoomOutPutDTO) => ({ - ...state, - chatRooms: { - ...state.chatRooms, - [roomData.data.roomName]: roomData.data - } - })) -); - -export function chatReducer(state, action) { - return _chatReducer(state, action); -} - -// Create a feature selector -export const selectChatState = createFeatureSelector('chat'); - -// Create a selector for a specific room's messages -export const selectMessagesByRoom = (roomId: string) => createSelector( - selectChatState, - (state: RoomRemoteDataSourceState) => state.chatRooms[roomId] || [] -); - -// Create a selector for the list of rooms -export const selectAllRooms = createSelector( - selectChatState, - (state: RoomRemoteDataSourceState) => Object.keys(state.chatRooms) -); diff --git a/src/app/module/chat/data/data-source/room/rooom-local-data-source.service.ts b/src/app/module/chat/data/repository/member-list-local-repository.service.ts similarity index 61% rename from src/app/module/chat/data/data-source/room/rooom-local-data-source.service.ts rename to src/app/module/chat/data/repository/member-list-local-repository.service.ts index e492d5b36..baf86e842 100644 --- a/src/app/module/chat/data/data-source/room/rooom-local-data-source.service.ts +++ b/src/app/module/chat/data/repository/member-list-local-repository.service.ts @@ -1,72 +1,31 @@ import { Injectable } from '@angular/core'; -import { RoomListItemOutPutDTO, RoomListOutPutDTO } from '../../dto/room/roomListOutputDTO'; -import { liveQuery, Observable } from 'Dexie'; -import { err, ok, Result } from 'neverthrow'; +import { RoomListItemOutPutDTO, RoomListOutPutDTO } from '../dto/room/roomListOutputDTO'; +import { Dexie, EntityTable, liveQuery, Observable } from 'Dexie'; import { z } from 'zod'; -import { ValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; -import { MemberListUPdateStatusInputDTO } from '../../../domain/use-case/socket/member-list-update-status-use-case.service'; -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'; +import { RoomTable, RoomTableSchema } from '../../infra/database/dexie/schema/room'; +import { chatDatabase } from '../../infra/database/dexie/service'; +import { ok } from 'neverthrow'; +import { err, Result } from 'neverthrow'; +import { MemberListUPdateStatusInputDTO } from '../../domain/use-case/socket/member-list-update-status-use-case.service'; +import { MemberTable } from '../../infra/database/dexie/schema/members'; @Injectable({ providedIn: 'root' }) -export class RoomLocalDataSourceService extends DexieRepository { +export class MemberListLocalRepository extends DexieRepository { constructor() { super(chatDatabase.room, RoomTableSchema) + + // messageDataSource.message.hook('creating', (primKey, obj, trans) => { + // // const newMessage = await trans.table('message').get(primKey); + // this.messageSubject.next(obj); + // // return newMessage + // }) + } - async removeUserTyping() {} - - @ValidateSchema(RoomTableSchema) - async createRoom(data: RoomTable) { - try { - const result = await chatDatabase.room.add(data) - return ok(result) - } catch (e) { - return err(false) - } - } - - - async deleteRoomById(id: string) { - try { - const result = await chatDatabase.room.delete(id) - return ok(result) - } catch (e) { - return err(false) - } - } - - - async leaveRoom(id: string) { - return this.deleteRoomById(id) - } - - async updateRoom(data: RoomTable) { - try { - const result = await chatDatabase.room.update(data.id, data); - - return ok(result) - } catch (e) { - return err(false) - } - } - - async createOrUpdateRoom(data: RoomTable) { - const createResult = await this.createRoom(data) - - if(createResult.isOk()) { - return createResult - } else { - return this.updateRoom(data) - } - } - - async addMember(data: MemberTable) { try { data.$roomIdUserId = data.roomId + data.wxUserId @@ -122,7 +81,7 @@ export class RoomLocalDataSourceService extends DexieRepository { const member = await chatDatabase.members.where({ $roomIdUserId: $roomIdUserId }).first(); if (member) { - const result = await ok(chatDatabase.members.delete($roomIdUserId)); + const result = ok(await chatDatabase.members.delete($roomIdUserId)); console.log(`Member with $roomIdUserId ${$roomIdUserId} removed from room ${member.roomId}.`); return result } else { @@ -135,19 +94,6 @@ export class RoomLocalDataSourceService extends DexieRepository { } } - async getRoomById(id: any) { - try { - const result = await chatDatabase.room.get(id) - return ok(result) - } catch (e) { - return err(false) - } - } - - - async getRoomList() { - return await chatDatabase.room.toArray() - } getMemberLive(data: {roomId, wxUserId}) { const $roomIdUserId = data.roomId + data.wxUserId @@ -175,6 +121,4 @@ export class RoomLocalDataSourceService extends DexieRepository { return members.filter(e => e.isAdmin != true) }) } - } - diff --git a/src/app/module/chat/data/data-source/member-list/member-list-remote-data-source.service.ts b/src/app/module/chat/data/repository/member-list-remote-repository.service.ts similarity index 88% rename from src/app/module/chat/data/data-source/member-list/member-list-remote-data-source.service.ts rename to src/app/module/chat/data/repository/member-list-remote-repository.service.ts index 62a307816..1ac249968 100644 --- a/src/app/module/chat/data/data-source/member-list/member-list-remote-data-source.service.ts +++ b/src/app/module/chat/data/repository/member-list-remote-repository.service.ts @@ -3,13 +3,13 @@ import { Result } from 'neverthrow'; import { ValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; import { HttpService } from 'src/app/services/http.service'; import { DataSourceReturn } from 'src/app/services/Repositorys/type'; -import { AddMemberToRoomInputDTOSchema, AddMemberToRoomInputDTO } from '../../dto/room/addMemberToRoomInputDto'; -import { UserRemoveListInputDTOSchema, UserRemoveListInputDTO } from '../../dto/room/userRemoveListInputDTO'; +import { AddMemberToRoomInputDTOSchema, AddMemberToRoomInputDTO } from '../dto/room/addMemberToRoomInputDto'; +import { UserRemoveListInputDTOSchema, UserRemoveListInputDTO } from '../dto/room/userRemoveListInputDTO'; @Injectable({ providedIn: 'root' }) -export class MemberListRemoteDataSourceService { +export class MemberListRemoteRepository { private baseUrl = 'https://gdapi-dev.dyndns.info/stage/api/v2/Chat'; // Your base URL diff --git a/src/app/module/chat/data/repository/message-respository.service.ts b/src/app/module/chat/data/repository/message-respository.service.ts index e584d107e..f7df09b1a 100644 --- a/src/app/module/chat/data/repository/message-respository.service.ts +++ b/src/app/module/chat/data/repository/message-respository.service.ts @@ -4,14 +4,9 @@ import { SessionStore } from 'src/app/store/session.service'; import { SignalRService } from '../../infra/socket/signal-r.service'; import { v4 as uuidv4 } from 'uuid' import { err, ok } from 'neverthrow'; -import { MessageDeleteInputDTO } from '../../domain/use-case/message-delete-live-use-case.service'; -import { MessageUpdateInput } from '../../domain/use-case/message-update-use-case.service'; -import { messageListDetermineChanges } from '../async/list/rooms/messageListChangedetector'; -import { MessageEntity } from '../../domain/entity/message'; +import { MessageDeleteInputDTO } from '../../domain/use-case/message-delete-by-id-live-use-case.service'; +import { MessageUpdateInput } from '../../domain/use-case/message-update-by-id-use-case.service'; import { InstanceId } from '../../domain/chat-service.service'; -import { MessageMapper } from '../../domain/mapper/messageMapper'; -import { MessageOutPutDataDTO } from '../dto/message/messageOutputDTO'; -import { MessageTable } from 'src/app/module/chat/infra/database/dexie/schema/message'; import { MessageLocalDataSourceService } from '../data-source/message/message-local-data-source.service'; import { MessageLiveDataSourceService } from '../data-source/message/message-live-signalr-data-source.service'; import { AttachmentLocalDataSource } from 'src/app/module/chat/data/data-source/attachment/attachment-local-data-source.service' @@ -29,48 +24,6 @@ export class MessageRepositoryService { private AttachmentLocalDataSourceService: AttachmentLocalDataSource ) {} - - async createMessageLocally(entity: MessageEntity) { - //const requestId = InstanceId +'@'+ uuidv4(); - - const localActionResult = await this.messageLocalDataSourceService.sendMessage(entity) - - return localActionResult.map(e => { - entity.$id = e - return entity - }) - } - - async sendMessage(entity: MessageEntity) { - - entity.sending = true - - const DTO = MessageMapper.fromDomain(entity, entity.requestId) - const sendMessageResult = await this.messageLiveSignalRDataSourceService.sendMessage(DTO) - // return this sendMessageResult - - if(sendMessageResult.isOk()) { - - if(sendMessageResult.value.sender == undefined || sendMessageResult.value.sender == null) { - - delete sendMessageResult.value.sender - } - - let clone: MessageTable = { - ...sendMessageResult.value, - id: sendMessageResult.value.id, - $id : entity.$id - } - - return this.messageLocalDataSourceService.update(entity.$id, {...clone, sending: false, roomId: entity.roomId}) - } else { - await this.messageLocalDataSourceService.update(entity.$id, {sending: false, $id: entity.$id}) - return err('no connection') - } - - } - - sendMessageDelete(data: MessageDeleteInputDTO) { data['requestId'] = InstanceId +'@'+ uuidv4(); @@ -104,36 +57,6 @@ export class MessageRepositoryService { }) } - async listAllMessagesByRoomId(id: string) { - const result = await this.messageRemoteDataSourceService.getMessagesFromRoom(id) - const localResult = await this.messageLocalDataSourceService.getItems(id) - - if(result.isOk()) { - - const { addedItems, changedItems, deletedItems } = messageListDetermineChanges(result.value.data, localResult) - - for(const message of changedItems) { - let clone: MessageTable = message - clone.roomId = id - this.messageLocalDataSourceService.findOrUpdate(clone) - } - - 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 - } getItemsLive (roomId: string) { return this.messageLocalDataSourceService.getItemsLive(roomId) diff --git a/src/app/module/chat/data/repository/room-local-repository.service.ts b/src/app/module/chat/data/repository/room-local-repository.service.ts new file mode 100644 index 000000000..d6f579524 --- /dev/null +++ b/src/app/module/chat/data/repository/room-local-repository.service.ts @@ -0,0 +1,93 @@ +import { Injectable } from '@angular/core'; +import { RoomListItemOutPutDTO, RoomListOutPutDTO } from '../dto/room/roomListOutputDTO'; +import { liveQuery, Observable } from 'Dexie'; +import { err, ok, Result } from 'neverthrow'; +import { z } from 'zod'; +import { ValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; +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 RoomLocalRepository extends DexieRepository { + + constructor() { + super(chatDatabase.room, RoomTableSchema) + } + + async removeUserTyping() {} + + @ValidateSchema(RoomTableSchema) + async createRoom(data: RoomTable) { + try { + const result = await chatDatabase.room.add(data) + return ok(result) + } catch (e) { + return err(false) + } + } + + + async deleteRoomById(id: string) { + try { + const result = await chatDatabase.room.delete(id) + return ok(result) + } catch (e) { + return err(false) + } + } + + + async leaveRoom(id: string) { + return this.deleteRoomById(id) + } + + async updateRoom(data: RoomTable) { + try { + const result = await chatDatabase.room.update(data.id, data); + + return ok(result) + } catch (e) { + return err(false) + } + } + + async createOrUpdateRoom(data: RoomTable) { + const createResult = await this.createRoom(data) + + if(createResult.isOk()) { + return createResult + } else { + return this.updateRoom(data) + } + } + + + async getRoomById(id: any) { + try { + const result = await chatDatabase.room.get(id) + return ok(result) + } catch (e) { + return err(false) + } + } + + + async getRoomList() { + return await this.findAll() + } + + + getItemsLive(): Observable { + return liveQuery(() => chatDatabase.room.toArray()) as any; + } + + getRoomByIdLive(id: any): Observable { + return liveQuery(() => chatDatabase.room.get(id)) as any; + } + + +} + diff --git a/src/app/module/chat/data/data-source/room/room-remote-data-source.service.ts b/src/app/module/chat/data/repository/room-remote-repository.service.ts similarity index 69% rename from src/app/module/chat/data/data-source/room/room-remote-data-source.service.ts rename to src/app/module/chat/data/repository/room-remote-repository.service.ts index 393ce8f89..a8012169b 100644 --- a/src/app/module/chat/data/data-source/room/room-remote-data-source.service.ts +++ b/src/app/module/chat/data/repository/room-remote-repository.service.ts @@ -1,20 +1,22 @@ import { Injectable } from '@angular/core'; import { Result } from 'neverthrow'; import { HttpService } from 'src/app/services/http.service'; -import { RoomListOutPutDTO, RoomListOutPutDTOSchema } from '../../dto/room/roomListOutputDTO'; -import { RoomInputDTO, RoomInputDTOSchema } from '../../dto/room/roomInputDTO'; -import { RoomOutPutDTO, RoomOutPutDTOSchema } from '../../dto/room/roomOutputDTO'; -import { AddMemberToRoomInputDTO, AddMemberToRoomInputDTOSchema } from '../../dto/room/addMemberToRoomInputDto'; +import { RoomListOutPutDTO, RoomListOutPutDTOSchema } from '../dto/room/roomListOutputDTO'; +import { RoomInputDTO, RoomInputDTOSchema } from '../dto/room/roomInputDTO'; +import { RoomOutPutDTO, RoomOutPutDTOSchema } from '../dto/room/roomOutputDTO'; +import { AddMemberToRoomInputDTO, AddMemberToRoomInputDTOSchema } from '../dto/room/addMemberToRoomInputDto'; import { ValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; -import { RoomByIdInputDTO, RoomByIdInputDTOSchema } from '../../dto/room/roomByIdInputDTO'; -import { RoomByIdOutputDTO, RoomByIdOutputDTOSchema } from '../../dto/room/roomByIdOutputDTO'; +import { RoomByIdInputDTO, RoomByIdInputDTOSchema } from '../dto/room/roomByIdInputDTO'; +import { RoomByIdOutputDTO, RoomByIdOutputDTOSchema } from '../dto/room/roomByIdOutputDTO'; import { APIReturn } from 'src/app/services/decorators/api-validate-schema.decorator'; -import { UserRemoveListInputDTO, UserRemoveListInputDTOSchema } from '../../dto/room/userRemoveListInputDTO'; -import { RoomUpdateInputDTO, RoomUpdateInputDTOSchema } from '../../dto/room/roomUpdateInputDTO'; -import { RoomUpdateOutputDTO } from '../../dto/room/roomUpdateOutputDTO'; +import { UserRemoveListInputDTO, UserRemoveListInputDTOSchema } from '../dto/room/userRemoveListInputDTO'; +import { RoomUpdateInputDTO, RoomUpdateInputDTOSchema } from '../dto/room/roomUpdateInputDTO'; +import { RoomUpdateOutputDTO } from '../dto/room/roomUpdateOutputDTO'; import { DataSourceReturn } from 'src/app/services/Repositorys/type'; import { SessionStore } from 'src/app/store/session.service'; -import { MemberSetAdminDTO } from '../../../domain/use-case/member-admin-use-case.service'; +import { MemberSetAdminDTO } from '../../domain/use-case/member-admin-use-case.service'; +import { SignalRService } from '../../infra/socket/signal-r.service'; +import { v4 as uuidv4 } from 'uuid' @Injectable({ providedIn: 'root' @@ -23,7 +25,10 @@ export class RoomRemoteDataSourceService { private baseUrl = 'https://gdapi-dev.dyndns.info/stage/api/v2/Chat'; // Your base URL - constructor(private httpService: HttpService) {} + constructor( + private httpService: HttpService, + private socket: SignalRService, + ) {} @ValidateSchema(RoomInputDTOSchema) @@ -71,4 +76,20 @@ export class RoomRemoteDataSourceService { return await this.httpService.patch(`${this.baseUrl}/Room/${data.roomId}/Member/${data.memberId}/admin`); } + + async addMemberToRoomSocket(data: AddMemberToRoomInputDTO) { + + const result = await this.socket.sendData({ + method: 'AddRoomMember', + data: { + requestId: uuidv4(), + roomId: data.id, + members: data.members + } + }) + + console.log({result}) + + return result + } } diff --git a/src/app/module/chat/data/repository/room-repository.service.ts b/src/app/module/chat/data/repository/room-repository.service.ts deleted file mode 100644 index 5db98d9ac..000000000 --- a/src/app/module/chat/data/repository/room-repository.service.ts +++ /dev/null @@ -1,309 +0,0 @@ -import { Injectable } from '@angular/core'; -import { RoomRemoteDataSourceService } from '../data-source/room/room-remote-data-source.service' -import { RoomInputDTO } from '../dto/room/roomInputDTO'; -import { AddMemberToRoomInputDTO } from '../dto/room/addMemberToRoomInputDto'; -import { RoomLocalDataSourceService } from '../data-source/room/rooom-local-data-source.service'; -import { RoomByIdInputDTO } from '../dto/room/roomByIdInputDTO'; -import { roomListDetermineChanges } from '../async/list/rooms/roomListChangeDetector'; -import { UserRemoveListInputDTO } from '../dto/room/userRemoveListInputDTO'; -import { roomMemberListDetermineChanges } from '../async/list/rooms/roomMembersChangeDetector'; -import { captureAndReraiseAsync } from 'src/app/services/decorators/captureAndReraiseAsync'; -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 { 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'; - - -function date(isoDateString) { - let date = new Date(isoDateString); - - const tzOffset = -date.getTimezoneOffset(); // in minutes - const diff = tzOffset >= 0 ? '+' : '-'; - const pad = (n: number) => (n < 10 ? '0' : '') + n; - - return date.getFullYear() + - '-' + pad(date.getMonth() + 1) + - '-' + pad(date.getDate()) + - 'T' + pad(date.getHours()) + - ':' + pad(date.getMinutes()) + - ':' + pad(date.getSeconds()) + - diff + pad(Math.floor(Math.abs(tzOffset) / 60)) + - ':' + pad(Math.abs(tzOffset) % 60); -} -@Injectable({ - providedIn: 'root' -}) -export class RoomRepositoryService { - - constructor( - private roomRemoteDataSourceService: RoomRemoteDataSourceService, - // private roomMemoryDataSourceService: Store, - private roomLocalDataSourceService: RoomLocalDataSourceService, - private roomLiveSignalRDataSourceService: RoomLiveDataSourceService, - ) {} - - @captureAndReraiseAsync('RoomRepositoryService/list') - async list() { - const result = await this.roomRemoteDataSourceService.getRoomList() - - const localList = await this.roomLocalDataSourceService.getRoomList() - - if(result.isOk()) { - const { roomsToDelete, roomsToInsert, roomsToUpdate } = roomListDetermineChanges(result.value.data, localList) - - for( const roomData of roomsToInsert) { - this.roomLocalDataSourceService.createRoom(roomData.chatRoom) - } - - for( const roomData of roomsToUpdate) { - this.roomLocalDataSourceService.updateRoom(roomData.chatRoom) - } - - for( const roomData of roomsToDelete) { - this.roomLocalDataSourceService.deleteRoomById(roomData.id) - } - - try { - const rooms = roomsToInsert.concat(roomsToUpdate) - - for(const room of rooms) { - const expirationDate = new Date(room.chatRoom.expirationDate); - const now = new Date(); - if (room.chatRoom.expirationDate != null && expirationDate.getTime() >= now.getTime()) { - const timeRemaining = expirationDate.getTime() - now.getTime(); - setTimeout(() => { - this.list() - }, timeRemaining) - } - - } - } catch (error) { - console.log(error) - } - - - } - return result - } - - - async getRoomList() { - return await this.roomLocalDataSourceService.getRoomList() - } - - @captureAndReraiseAsync('RoomRepositoryService/updateRoomBy') - async updateRoomBy(data: RoomUpdateInputDTO) { - - const result = await this.roomRemoteDataSourceService.updateRoom(data) - - if(result.isOk()) { - const localList = await this.roomLocalDataSourceService.getRoomList() - // const { roomsToDelete, roomsToInsert, roomsToUpdate } = roomListDetermineChanges([result.value.data], localList) - - // for( const roomData of roomsToUpdate) { - // if(!roomData.chatRoom.createdBy?.wxUserId) { - // delete roomData.chatRoom.createdBy; - // } - - // this.roomLocalDataSourceService.updateRoom(roomData.chatRoom) - // } - - } - - return result - } - - @captureAndReraiseAsync('RoomRepositoryService/getRoomById') - async getRoomById(id: RoomByIdInputDTO) { - const result = await this.roomRemoteDataSourceService.getRoom(id) - - if(result.isOk()) { - - const localListRoom = await this.roomLocalDataSourceService.getRoomList() - const object = { - chatRoom: result.value.data - } - const { roomsToDelete, roomsToInsert, roomsToUpdate } = roomListDetermineChanges([object], localListRoom) - - for( const roomData of roomsToUpdate) { - this.roomLocalDataSourceService.updateRoom(roomData.chatRoom) - } - - // ============================ - const localList = await this.roomLocalDataSourceService.getRoomMemberById(id) - - const { membersToInsert, membersToUpdate, membersToDelete } = roomMemberListDetermineChanges(result.value.data.members, localList, id) - - for (const user of membersToInsert) { - await this.roomLocalDataSourceService.addMember(MemberListMapper(user, id)) - } - - for (const user of membersToUpdate) { - await this.roomLocalDataSourceService.updateMemberRole(MemberListMapper(user, id)) - } - - for(const user of membersToDelete) { - await this.roomLocalDataSourceService.removeMemberFromRoom(user.$roomIdUserId) - } - - } else if (isHttpResponse(result.error) ) { - if(result.error.status == 404) { - await this.roomLocalDataSourceService.deleteRoomById(id) - } - // this.httpErrorHandle.httpStatusHandle(result.error) - } - - return result - } - - @captureAndReraiseAsync('RoomRepositoryService/deleteRoomById') - async deleteRoomById(id: RoomByIdInputDTO) { - const result = await this.roomRemoteDataSourceService.deleteRoom(id) - - if(result.isOk()) { - - const result = await this.roomLocalDataSourceService.deleteRoomById(id) - // this.messageLiveDataSourceService.sendMessage({ - // type: 'createRoom', - // payload: {a: '5'} - // }) - - return result - } else if (isHttpResponse(result.error)) { - if(result.error.status == 404) { - await this.roomLocalDataSourceService.deleteRoomById(id) - } - // this.httpErrorHandle.httpStatusHandle(result.error) - } - - return result - } - - @captureAndReraiseAsync('RoomRepositoryService/create') - async create(data: RoomInputDTO) { - - const result = await this.roomRemoteDataSourceService.createRoom(data) - if(result.isOk()) { - - if(!result.value.data.createdBy) { - - let dataObject; - - result.value.data.createdBy = { - wxeMail: SessionStore.user.Email, - wxFullName: SessionStore.user.FullName, - wxUserId: SessionStore.user.UserId, - } - - dataObject = result.value.data - dataObject.lastMessage = { - sentAt: date(new Date()), - message: "", - sender: { - wxUserId: "", - wxFullName: "", - }, - } - } - - // this.roomMemoryDataSourceService.dispatch(addRoom(result.value)) - const localResult = await this.roomLocalDataSourceService.createRoom(result.value.data) - - // this.messageLiveDataSourceService.sendMessage({ - // type: 'createRoom', - // payload: {a: '5'} - // }) - - return localResult.map(e => result.value) - } - - return result - } - - - @captureAndReraiseAsync('RoomRepositoryService/addMemberToRoom') - async addMemberToRoom(data: AddMemberToRoomInputDTO) { - - // return this.roomLiveSignalRDataSourceService.addMemberToRoom(data) - - const result = await this.roomRemoteDataSourceService.addMemberToRoom(data) - - return result - } - - async updateMemberStatus(data: MemberListUPdateStatusInputDTO) { - const result = await this.roomLocalDataSourceService.updateMembersStatus(data) - - return result - } - - - @captureAndReraiseAsync('RoomRepositoryService/removeMemberToRoom') - async removeMemberToRoom(data: UserRemoveListInputDTO) { - const result = await this.roomRemoteDataSourceService.removeMemberFromRoom(data) - - return result - } - - setAdmin(input: MemberSetAdminDTO) { - return this.roomRemoteDataSourceService.setAmin(input); - } - - - - async leaveRoom(data: UserRemoveListInputDTO) { - const result = await this.roomRemoteDataSourceService.removeMemberFromRoom(data) - - if(result.isOk()) { - this.roomLocalDataSourceService.leaveRoom(data.id) - } else if (isHttpResponse(result.error)) { - if(result.error.status == 404) { - await this.roomLocalDataSourceService.deleteRoomById(data.id) - - } - // this.httpErrorHandle.httpStatusHandle(result.error) - } - - return result - } - - getItemsLive() { - return this.roomLocalDataSourceService.getItemsLive() - } - - getItemByIdLive(id: any) { - return this.roomLocalDataSourceService.getRoomByIdLive(id) - } - - - getRoomMemberByIdLive(roomId: any) { - return this.roomLocalDataSourceService.getRoomMemberByIdLive(roomId) - } - - getRoomMemberById(roomId: any) { - return this.roomLocalDataSourceService.getRoomMemberById(roomId) - } - - - getRoomStatus(roomId:string) { - return this.roomLocalDataSourceService.allMemberOnline(roomId); - } - - - getRoomMemberNoneAdminByIdLive(roomId) { - return this.roomLocalDataSourceService.getRoomMemberNoneAdminByIdLive(roomId) - } - - - get find() { - return this.roomLocalDataSourceService.find - } - - get findAll() { - return this.roomLocalDataSourceService.findAll - } - -} diff --git a/src/app/module/chat/domain/chat-service.service.ts b/src/app/module/chat/domain/chat-service.service.ts index a7328fb8a..a3343cae9 100644 --- a/src/app/module/chat/domain/chat-service.service.ts +++ b/src/app/module/chat/domain/chat-service.service.ts @@ -1,26 +1,38 @@ import { Injectable } from '@angular/core'; -import { MessageDeleteLiveUseCaseService, MessageDeleteInputDTO } from 'src/app/module/chat/domain/use-case/message-delete-live-use-case.service' +import { MessageDeleteLiveUseCaseService } from 'src/app/module/chat/domain/use-case/message-delete-by-id-live-use-case.service' import { SessionStore } from 'src/app/store/session.service'; -import { MessageReactionInput, MessageReactionUseCaseService } from 'src/app/module/chat/domain/use-case/message-reaction-use-case.service'; -import { MessageUpdateInput, MessageUpdateUseCaseService } from 'src/app/module/chat/domain/use-case/message-update-use-case.service'; +import { MessageReactionInput, MessageReactionUseCaseService } from 'src/app/module/chat/domain/use-case/message-reaction-by-id-use-case.service'; +import { MessageUpdateInput, MessageUpdateUseCaseService } from 'src/app/module/chat/domain/use-case/message-update-by-id-use-case.service'; import { MemberAdminUseCaseService, MemberSetAdminDTO } from 'src/app/module/chat/domain/use-case/member-admin-use-case.service'; import { MessageCreateUseCaseService } from 'src/app/module/chat/domain/use-case/message-create-use-case.service'; import { SignalRService } from '../infra/socket/signal-r.service'; import { SocketMessageDeleteUseCaseService } from 'src/app/module/chat/domain/use-case/socket/socket-message-delete-use-case.service'; import { SocketMessageUpdateUseCaseService } from 'src/app/module/chat/domain/use-case/socket/socket-message-update-use-case.service'; import { SocketMessageCreateUseCaseService } from 'src/app/module/chat/domain/use-case/socket/socket-message-create-use-case.service'; -import { DownloadMessageAttachmentUserCaseService } from 'src/app/module/chat/domain/use-case/download-message-attachment-user-case.service'; +import { DownloadMessageAttachmentUserCaseService } from 'src/app/module/chat/domain/use-case/message-download-attachment-user-case.service'; import { ListenMessageByRoomIdNewUseCase } from 'src/app/module/chat/domain/use-case/listen-message-by-roomId.service'; 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 { GetRoomByIdUseCaseService } from './use-case/room-get-by-id-use-case.service'; +import { DeleteRoomUseCaseService } from './use-case/room-delete-by-id-use-case.service'; +import { CreateRoomUseCaseService } from './use-case/room-create-use-case.service'; +import { RoomLeaveUseCase } from './use-case/room-leave-by-id-use-case.service'; import { SyncAllRoomMessagesService } from './use-case/sync-all-room-messages.service'; import { ListenSendMessageUseCase } from './use-case/listen-send-message.service' -import { GetMessageAttachmentLocallyUseCaseService } from 'src/app/module/chat/domain/use-case/get-message-attachment-localy-use-case.service'; +import { RemoveMemberUseCaseService } from './use-case/member/-use-case.service' +import { AddMemberUseCaseService } from './use-case/member-add-use-case.service' +import { UpdateRoomByIdUseCaseService } from './use-case/room-update-by-id-use-case.service' +import { GetMessageAttachmentLocallyUseCaseService } from 'src/app/module/chat/domain/use-case/message-get-attachment-localy-use-case.service'; +import { GetRoomListUseCaseService } from 'src/app/module/chat/domain/use-case/room-get-list-use-case.service'; import { filter } from 'rxjs/operators'; import { v4 as uuidv4 } from 'uuid' import { MessageEntity } from './entity/message'; import { MessageAttachmentByMessageIdInput, MessageAttachmentByMessageIdUseCase } from './use-case/message-attachment-by-message-id.service'; +import { RoomInputDTO } from '../data/dto/room/roomInputDTO'; +import { UserRemoveListInputDTO } from '../data/dto/room/userRemoveListInputDTO'; +import { AddMemberToRoomInputDTO } from '../data/dto/room/addMemberToRoomInputDto'; +import { RoomUpdateInputDTO } from '../data/dto/room/roomUpdateInputDTO'; export const InstanceId = uuidv4(); @@ -48,7 +60,15 @@ export class ChatServiceService { private MessageAttachmentByMessageIdService: MessageAttachmentByMessageIdUseCase, private SyncAllRoomMessagesService: SyncAllRoomMessagesService, private DownloadMessageAttachmentUserCaseService: DownloadMessageAttachmentUserCaseService, - private GetMessageAttachmentLocallyUseCaseService: GetMessageAttachmentLocallyUseCaseService + private GetMessageAttachmentLocallyUseCaseService: GetMessageAttachmentLocallyUseCaseService, + private GetRoomListUseCaseService: GetRoomListUseCaseService, + private GetRoomByIdUseCaseService: GetRoomByIdUseCaseService, + private DeleteRoomUseCaseService: DeleteRoomUseCaseService, + private CreateRoomUseCaseService: CreateRoomUseCaseService, + private RoomLeaveUseCase: RoomLeaveUseCase, + private AddMemberUseCaseService: AddMemberUseCaseService, + private UpdateRoomByIdUseCaseService: UpdateRoomByIdUseCaseService, + private RemoveMemberUseCaseService: RemoveMemberUseCaseService ) { this.messageLiveSignalRDataSourceService.getMessageDelete() .pipe() @@ -76,13 +96,10 @@ export class ChatServiceService { return !message?.requestId?.startsWith(InstanceId) }) ).subscribe(async (message) => { - if(message?.id) { console.log('create message') this.SocketMessageCreateUseCaseService.execute(message) } - - }) this.messageLiveSignalRDataSourceService.getData().pipe( @@ -99,6 +116,15 @@ export class ChatServiceService { } + async start() { + await this.getRoomList(); + this.asyncAllRoomMessage(); + } + + removeMemberToRoom(data: UserRemoveListInputDTO) { + return this.RemoveMemberUseCaseService.execute(data) + } + messageDelete(data: {roomId, messageId}) { const params = { @@ -142,6 +168,39 @@ export class ChatServiceService { } + getRoomList() { + return this.GetRoomListUseCaseService.execute() + } + + getRoomById(id: string) { + return this.GetRoomByIdUseCaseService.execute(id) + } + + + deleteRoomById(id: string) { + return this.DeleteRoomUseCaseService.execute(id) + } + + createRoom(data: RoomInputDTO) { + return this.CreateRoomUseCaseService.execute(data) + } + + leaveRoom(data: UserRemoveListInputDTO) { + return this.RoomLeaveUseCase.execute(data) + } + + addMemberToRoom(data: AddMemberToRoomInputDTO) { + return this.AddMemberUseCaseService.execute(data) + } + + updateRoomById(data: RoomUpdateInputDTO) { + return this.UpdateRoomByIdUseCaseService.execute(data) + } + + removeMember() { + + } + listenToIncomingMessage(roomId:string) { return this.ListenMessageByRoomIdNewUseCase.execute({roomId}) } diff --git a/src/app/module/chat/domain/use-case/member-add-use-case.service.ts b/src/app/module/chat/domain/use-case/member-add-use-case.service.ts new file mode 100644 index 000000000..319d37809 --- /dev/null +++ b/src/app/module/chat/domain/use-case/member-add-use-case.service.ts @@ -0,0 +1,27 @@ +import { Injectable } from '@angular/core'; +import { captureAndReraiseAsync } from 'src/app/services/decorators/captureAndReraiseAsync'; +import { AddMemberToRoomInputDTO } from '../../data/dto/room/addMemberToRoomInputDto'; +import { RoomRemoteDataSourceService } from '../../data/repository/room-remote-repository.service'; + +@Injectable({ + providedIn: 'root' +}) +export class AddMemberUseCaseService { + + constructor( + private roomRemoteDataSourceService: RoomRemoteDataSourceService, + ) { } + + + + @captureAndReraiseAsync('RoomRepositoryService/addMemberToRoom') + async execute(data: AddMemberToRoomInputDTO) { + + // return this.roomLiveSignalRDataSourceService.addMemberToRoom(data) + + const result = await this.roomRemoteDataSourceService.addMemberToRoom(data) + + return result + } + +} diff --git a/src/app/module/chat/domain/use-case/member-admin-use-case.service.ts b/src/app/module/chat/domain/use-case/member-admin-use-case.service.ts index 929aab4bd..4f810fc62 100644 --- a/src/app/module/chat/domain/use-case/member-admin-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/member-admin-use-case.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { z } from "zod"; -import { RoomRepositoryService } from '../../data/repository/room-repository.service'; import { ValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; +import { RoomRemoteDataSourceService } from '../../data/repository/room-remote-repository.service'; // Define the schema for the entire response const MemberSetAdminDTOSchema = z.object({ @@ -18,12 +18,12 @@ export type MemberSetAdminDTO = z.infer export class MemberAdminUseCaseService { constructor( - public repository: RoomRepositoryService + public repository: RoomRemoteDataSourceService ) { } @ValidateSchema(MemberSetAdminDTOSchema) execute(input: MemberSetAdminDTO) { - return this.repository.setAdmin(input) + return this.repository.setAmin(input) } } diff --git a/src/app/module/chat/domain/use-case/member/-use-case.service.ts b/src/app/module/chat/domain/use-case/member/-use-case.service.ts new file mode 100644 index 000000000..864742f6b --- /dev/null +++ b/src/app/module/chat/domain/use-case/member/-use-case.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; +import { captureAndReraiseAsync } from 'src/app/services/decorators/captureAndReraiseAsync'; +import { UserRemoveListInputDTO } from '../../../data/dto/room/userRemoveListInputDTO'; +import { RoomRemoteDataSourceService } from '../../../data/repository/room-remote-repository.service'; + +@Injectable({ + providedIn: 'root' +}) +export class RemoveMemberUseCaseService { + + constructor( + private roomRemoteDataSourceService: RoomRemoteDataSourceService, + ) { } + + + @captureAndReraiseAsync('RoomRepositoryService/removeMemberToRoom') + async execute(data: UserRemoveListInputDTO) { + const result = await this.roomRemoteDataSourceService.removeMemberFromRoom(data) + + return result + } +} diff --git a/src/app/module/chat/domain/use-case/message-create-use-case.service.ts b/src/app/module/chat/domain/use-case/message-create-use-case.service.ts index 80d1f1406..76111d8fb 100644 --- a/src/app/module/chat/domain/use-case/message-create-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/message-create-use-case.service.ts @@ -8,7 +8,12 @@ import { InstanceId } from '../chat-service.service'; import { createDataURL } from 'src/app/utils/ToBase64'; import { zodSafeValidation } from 'src/app/utils/zodValidation'; import { Logger } from 'src/app/services/logger/main/service'; -import { MessageAttachmentSource } from '../../data/dto/message/messageOutputDTO'; +import { MessageAttachmentSource, MessageOutPutDataDTO } from '../../data/dto/message/messageOutputDTO'; +import { MessageLocalDataSourceService } from '../../data/data-source/message/message-local-data-source.service'; +import { err } from 'neverthrow'; +import { MessageTable } from '../../infra/database/dexie/schema/message'; +import { MessageMapper } from '../mapper/messageMapper'; +import { SignalRService } from '../../infra/socket/signal-r.service'; const MessageInputUseCaseSchema = z.object({ memberId: z.number(), @@ -26,6 +31,8 @@ export class MessageCreateUseCaseService { constructor( private MessageRepositoryService: MessageRepositoryService, private AttachmentRepositoryService: AttachmentRepositoryService, + private messageLocalDataSourceService: MessageLocalDataSourceService, + private messageLiveSignalRDataSourceService: SignalRService, ) { } @@ -38,9 +45,13 @@ export class MessageCreateUseCaseService { message.requestId = InstanceId +'@'+ uuidv4(); - const createMessageLocally = await this.MessageRepositoryService.createMessageLocally(message) + + const createMessageLocally = await this.messageLocalDataSourceService.sendMessage(message) if(createMessageLocally.isOk()) { + + message.$id = createMessageLocally.value + if(message.hasAttachment) { for (const attachment of message.attachments) { @@ -48,7 +59,7 @@ export class MessageCreateUseCaseService { if(attachment.source != MessageAttachmentSource.Webtrix) { this.AttachmentRepositoryService.create({ - $messageId: createMessageLocally.value.$id, + $messageId: createMessageLocally.value, file: createDataURL(attachment.file, attachment.mimeType), fileType: attachment.fileType, source: attachment.source, @@ -72,20 +83,36 @@ export class MessageCreateUseCaseService { } - const sendToServer = await this.MessageRepositoryService.sendMessage(message) + //==================== + message.sending = true - if(!sendToServer.isOk()) { + const DTO = MessageMapper.fromDomain(message, message.requestId) + const sendMessageResult = await this.messageLiveSignalRDataSourceService.sendMessage(DTO) + // return this sendMessageResult + + if(sendMessageResult.isOk()) { + + if(sendMessageResult.value.sender == undefined || sendMessageResult.value.sender == null) { + + delete sendMessageResult.value.sender + } + + let clone: MessageTable = { + ...sendMessageResult.value, + id: sendMessageResult.value.id, + $id : message.$id + } + + return this.messageLocalDataSourceService.update(message.$id, {...clone, sending: false, roomId: message.roomId}) + } else { Logger.error('failed to send message to the server', { - error: sendToServer.error + error: sendMessageResult.error }) + await this.messageLocalDataSourceService.update(message.$id, {sending: false, $id: message.$id}) + return err('no connection') } - - return sendToServer + } - - const result = await this.MessageRepositoryService.sendMessage(message) - - return result } else { if(validation.error.formErrors.fieldErrors.attachments) { diff --git a/src/app/module/chat/domain/use-case/message-delete-live-use-case.service.ts b/src/app/module/chat/domain/use-case/message-delete-by-id-live-use-case.service.ts similarity index 100% rename from src/app/module/chat/domain/use-case/message-delete-live-use-case.service.ts rename to src/app/module/chat/domain/use-case/message-delete-by-id-live-use-case.service.ts diff --git a/src/app/module/chat/domain/use-case/download-message-attachment-user-case.service.ts b/src/app/module/chat/domain/use-case/message-download-attachment-user-case.service.ts similarity index 100% rename from src/app/module/chat/domain/use-case/download-message-attachment-user-case.service.ts rename to src/app/module/chat/domain/use-case/message-download-attachment-user-case.service.ts diff --git a/src/app/module/chat/domain/use-case/get-message-attachment-localy-use-case.service.ts b/src/app/module/chat/domain/use-case/message-get-attachment-localy-use-case.service.ts similarity index 100% rename from src/app/module/chat/domain/use-case/get-message-attachment-localy-use-case.service.ts rename to src/app/module/chat/domain/use-case/message-get-attachment-localy-use-case.service.ts diff --git a/src/app/module/chat/domain/use-case/message-reaction-use-case.service.ts b/src/app/module/chat/domain/use-case/message-reaction-by-id-use-case.service.ts similarity index 100% rename from src/app/module/chat/domain/use-case/message-reaction-use-case.service.ts rename to src/app/module/chat/domain/use-case/message-reaction-by-id-use-case.service.ts diff --git a/src/app/module/chat/domain/use-case/message-update-use-case.service.ts b/src/app/module/chat/domain/use-case/message-update-by-id-use-case.service.ts similarity index 100% rename from src/app/module/chat/domain/use-case/message-update-use-case.service.ts rename to src/app/module/chat/domain/use-case/message-update-by-id-use-case.service.ts diff --git a/src/app/module/chat/domain/use-case/send-local-messages-use-case.service.ts b/src/app/module/chat/domain/use-case/messages-send-offline-use-case.service.ts similarity index 100% rename from src/app/module/chat/domain/use-case/send-local-messages-use-case.service.ts rename to src/app/module/chat/domain/use-case/messages-send-offline-use-case.service.ts diff --git a/src/app/module/chat/domain/use-case/room-create-use-case.service.ts b/src/app/module/chat/domain/use-case/room-create-use-case.service.ts new file mode 100644 index 000000000..5c00a5686 --- /dev/null +++ b/src/app/module/chat/domain/use-case/room-create-use-case.service.ts @@ -0,0 +1,47 @@ +import { Injectable } from '@angular/core'; +import { create } from 'domain'; +import { SessionStore } from 'src/app/store/session.service'; +import { RoomRemoteDataSourceService } from '../../data/repository/room-remote-repository.service'; +import { captureAndReraiseAsync } from 'src/app/services/decorators/captureAndReraiseAsync'; +import { RoomInputDTO } from '../../data/dto/room/roomInputDTO'; +import { RoomLocalRepository } from '../../data/repository/room-local-repository.service'; + +@Injectable({ + providedIn: 'root' +}) +export class CreateRoomUseCaseService { + + constructor( + private roomRemoteDataSourceService: RoomRemoteDataSourceService, + private roomLocalDataSourceService: RoomLocalRepository, + ) { } + + + @captureAndReraiseAsync('RoomRepositoryService/create') + async execute(data: RoomInputDTO) { + + const result = await this.roomRemoteDataSourceService.createRoom(data) + if(result.isOk()) { + + if(!result.value.data.createdBy) { + + let dataObject; + + result.value.data.createdBy = { + wxeMail: SessionStore.user.Email, + wxFullName: SessionStore.user.FullName, + wxUserId: SessionStore.user.UserId, + } + + dataObject = result.value.data + } + + + const localResult = await this.roomLocalDataSourceService.createRoom(result.value.data) + return localResult.map(e => result.value) + } + + return result + } + +} diff --git a/src/app/module/chat/domain/use-case/room-delete-by-id-use-case.service.ts b/src/app/module/chat/domain/use-case/room-delete-by-id-use-case.service.ts new file mode 100644 index 000000000..2d419d797 --- /dev/null +++ b/src/app/module/chat/domain/use-case/room-delete-by-id-use-case.service.ts @@ -0,0 +1,42 @@ +import { Injectable } from '@angular/core'; +import { captureAndReraiseAsync } from 'src/app/services/decorators/captureAndReraiseAsync'; +import { isHttpResponse } from 'src/app/services/http.service'; +import { RoomByIdInputDTO } from '../../data/dto/room/roomByIdInputDTO'; +import { RoomRemoteDataSourceService } from '../../data/repository/room-remote-repository.service'; +import { RoomLocalRepository } from '../../data/repository/room-local-repository.service'; + +@Injectable({ + providedIn: 'root' +}) +export class DeleteRoomUseCaseService { + + constructor( + private roomRemoteDataSourceService: RoomRemoteDataSourceService, + // private roomMemoryDataSourceService: Store, + private roomLocalDataSourceService: RoomLocalRepository, + ) { } + + + @captureAndReraiseAsync('RoomRepositoryService/deleteRoomById') + async execute(id: RoomByIdInputDTO) { + const result = await this.roomRemoteDataSourceService.deleteRoom(id) + + if(result.isOk()) { + + const result = await this.roomLocalDataSourceService.deleteRoomById(id) + // this.messageLiveDataSourceService.sendMessage({ + // type: 'createRoom', + // payload: {a: '5'} + // }) + + return result + } else if (isHttpResponse(result.error)) { + if(result.error.status == 404) { + await this.roomLocalDataSourceService.deleteRoomById(id) + } + // this.httpErrorHandle.httpStatusHandle(result.error) + } + + return result + } +} diff --git a/src/app/module/chat/domain/use-case/room-get-by-id-use-case.service.ts b/src/app/module/chat/domain/use-case/room-get-by-id-use-case.service.ts new file mode 100644 index 000000000..162904ab7 --- /dev/null +++ b/src/app/module/chat/domain/use-case/room-get-by-id-use-case.service.ts @@ -0,0 +1,69 @@ +import { Injectable } from '@angular/core'; +import { id } from 'date-fns/locale'; +import { isHttpResponse } from 'src/app/services/http.service'; +import { roomListDetermineChanges } from '../../data/async/list/rooms/roomListChangeDetector'; +import { roomMemberListDetermineChanges } from '../../data/async/list/rooms/roomMembersChangeDetector'; +import { RoomRemoteDataSourceService } from '../../data/repository/room-remote-repository.service'; +import { RoomLocalRepository } from '../../data/repository/room-local-repository.service'; +import { MemberListLocalRepository } from '../../data/repository/member-list-local-repository.service'; +import { MemberListMapper } from '../mapper/memberLIstMapper'; +import { captureAndReraiseAsync } from 'src/app/services/decorators/captureAndReraiseAsync'; + +@Injectable({ + providedIn: 'root' +}) +export class GetRoomByIdUseCaseService { + + constructor( + private roomRemoteDataSourceService: RoomRemoteDataSourceService, + // private roomMemoryDataSourceService: Store, + private roomLocalDataSourceService: RoomLocalRepository, + private MemberListLocalRepository: MemberListLocalRepository + ) { } + + @captureAndReraiseAsync('RoomRepositoryService/getRoomById') + async execute(id: string) { + const result = await this.roomRemoteDataSourceService.getRoom(id) + + if(result.isOk()) { + + const localListRoom = await this.roomLocalDataSourceService.getRoomList() + if(localListRoom.isOk()) { + const object = { + chatRoom: result.value.data + } + const { roomsToDelete, roomsToInsert, roomsToUpdate } = roomListDetermineChanges([object], localListRoom.value) + + for( const roomData of roomsToUpdate) { + this.roomLocalDataSourceService.updateRoom(roomData.chatRoom) + } + + // ============================ + const localList = await this.MemberListLocalRepository.getRoomMemberById(id) + + const { membersToInsert, membersToUpdate, membersToDelete } = roomMemberListDetermineChanges(result.value.data.members, localList, id) + + for (const user of membersToInsert) { + await this.MemberListLocalRepository.addMember(MemberListMapper(user, id)) + } + + for (const user of membersToUpdate) { + await this.MemberListLocalRepository.updateMemberRole(MemberListMapper(user, id)) + } + + for(const user of membersToDelete) { + await this.MemberListLocalRepository.removeMemberFromRoom(user.$roomIdUserId) + } + } + + + } else if (isHttpResponse(result.error) ) { + if(result.error.status == 404) { + await this.roomLocalDataSourceService.deleteRoomById(id) + } + // this.httpErrorHandle.httpStatusHandle(result.error) + } + + return result + } +} diff --git a/src/app/module/chat/domain/use-case/room-get-list-use-case.service.ts b/src/app/module/chat/domain/use-case/room-get-list-use-case.service.ts new file mode 100644 index 000000000..5908166b5 --- /dev/null +++ b/src/app/module/chat/domain/use-case/room-get-list-use-case.service.ts @@ -0,0 +1,47 @@ +import { Injectable } from '@angular/core'; +import { roomListDetermineChanges } from '../../data/async/list/rooms/roomListChangeDetector'; +import { RoomRemoteDataSourceService } from '../../data/repository/room-remote-repository.service'; +import { RoomLocalRepository } from '../../data/repository/room-local-repository.service'; +import { captureAndReraiseAsync } from 'src/app/services/decorators/captureAndReraiseAsync'; +import { isHttpResponse } from 'src/app/services/http.service'; + +@Injectable({ + providedIn: 'root' +}) +export class GetRoomListUseCaseService { + + constructor( + private roomRemoteDataSourceService: RoomRemoteDataSourceService, + // private roomMemoryDataSourceService: Store, + private roomLocalDataSourceService: RoomLocalRepository, + ) { } + + @captureAndReraiseAsync('RoomRepositoryService/list') + async execute() { + const result = await this.roomRemoteDataSourceService.getRoomList() + + const localList = await this.roomLocalDataSourceService.getRoomList() + + if(localList.isOk()) { + if(result.isOk()) { + const { roomsToDelete, roomsToInsert, roomsToUpdate } = roomListDetermineChanges(result.value.data, localList.value) + + for( const roomData of roomsToInsert) { + this.roomLocalDataSourceService.createRoom(roomData.chatRoom) + } + + for( const roomData of roomsToUpdate) { + this.roomLocalDataSourceService.updateRoom(roomData.chatRoom) + } + + for( const roomData of roomsToDelete) { + this.roomLocalDataSourceService.deleteRoomById(roomData.id) + } + + } + } + + return result + } + +} diff --git a/src/app/module/chat/domain/use-case/room-leave-by-id-use-case.service.ts b/src/app/module/chat/domain/use-case/room-leave-by-id-use-case.service.ts new file mode 100644 index 000000000..deef734c5 --- /dev/null +++ b/src/app/module/chat/domain/use-case/room-leave-by-id-use-case.service.ts @@ -0,0 +1,34 @@ +import { Injectable } from '@angular/core'; +import { UserRemoveListInputDTO } from '../../data/dto/room/userRemoveListInputDTO'; +import { isHttpResponse } from 'src/app/services/http.service'; +import { RoomRemoteDataSourceService } from '../../data/repository/room-remote-repository.service'; +import { RoomLocalRepository } from '../../data/repository/room-local-repository.service'; + +@Injectable({ + providedIn: 'root' +}) +export class RoomLeaveUseCase { + + constructor( + private roomRemoteDataSourceService: RoomRemoteDataSourceService, + private roomLocalDataSourceService: RoomLocalRepository, + ) { } + + + + async execute(data: UserRemoveListInputDTO) { + const result = await this.roomRemoteDataSourceService.removeMemberFromRoom(data) + + if(result.isOk()) { + this.roomLocalDataSourceService.leaveRoom(data.id) + } else if (isHttpResponse(result.error)) { + if(result.error.status == 404) { + await this.roomLocalDataSourceService.deleteRoomById(data.id) + + } + // this.httpErrorHandle.httpStatusHandle(result.error) + } + + return result + } +} diff --git a/src/app/module/chat/domain/use-case/room-update-by-id-use-case.service.ts b/src/app/module/chat/domain/use-case/room-update-by-id-use-case.service.ts new file mode 100644 index 000000000..b68a93dac --- /dev/null +++ b/src/app/module/chat/domain/use-case/room-update-by-id-use-case.service.ts @@ -0,0 +1,39 @@ +import { Injectable } from '@angular/core'; +import { captureAndReraiseAsync } from 'src/app/services/decorators/captureAndReraiseAsync'; +import { RoomUpdateInputDTO } from '../../data/dto/room/roomUpdateInputDTO'; +import { RoomRemoteDataSourceService } from '../../data/repository/room-remote-repository.service'; +import { RoomLocalRepository } from '../../data/repository/room-local-repository.service'; + +@Injectable({ + providedIn: 'root' +}) +export class UpdateRoomByIdUseCaseService { + + constructor( + private roomRemoteDataSourceService: RoomRemoteDataSourceService, + private roomLocalDataSourceService: RoomLocalRepository, + ) { } + + + @captureAndReraiseAsync('RoomRepositoryService/updateRoomBy') + async execute(data: RoomUpdateInputDTO) { + + const result = await this.roomRemoteDataSourceService.updateRoom(data) + + if(result.isOk()) { + const localList = await this.roomLocalDataSourceService.getRoomList() + // const { roomsToDelete, roomsToInsert, roomsToUpdate } = roomListDetermineChanges([result.value.data], localList) + + // for( const roomData of roomsToUpdate) { + // if(!roomData.chatRoom.createdBy?.wxUserId) { + // delete roomData.chatRoom.createdBy; + // } + + // this.roomLocalDataSourceService.updateRoom(roomData.chatRoom) + // } + + } + + return result + } +} diff --git a/src/app/module/chat/domain/use-case/socket/member-list-update-status-use-case.service.ts b/src/app/module/chat/domain/use-case/socket/member-list-update-status-use-case.service.ts index 41223f4b6..d141979e3 100644 --- a/src/app/module/chat/domain/use-case/socket/member-list-update-status-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/socket/member-list-update-status-use-case.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { z } from 'zod'; -import { RoomRepositoryService } from 'src/app/module/chat/data/repository/room-repository.service' import { ValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; +import { MemberListLocalRepository } from 'src/app/module/chat/data/repository/member-list-local-repository.service' export const MemberListUPdateStatus = z.object({ key: z.string(), @@ -19,13 +19,12 @@ export type MemberListUPdateStatusInputDTO = z.infer import('./component/edit-group/edit-group.module').then( m => m.EditGroupPageModule) }, + { + path: 'set-room-owner', + loadChildren: () => import('./modal/set-room-owner/set-room-owner.module').then( m => m.SetRoomOwnerPageModule) + }, ]; diff --git a/src/app/ui/chat/chat.page.ts b/src/app/ui/chat/chat.page.ts index 7072a79f8..c77c2f326 100644 --- a/src/app/ui/chat/chat.page.ts +++ b/src/app/ui/chat/chat.page.ts @@ -13,11 +13,13 @@ import { TimeService } from 'src/app/services/functions/time.service'; import { ThemeService } from 'src/app/services/theme.service' import { DataService } from 'src/app/services/data.service'; import { RouteService } from 'src/app/services/route.service'; -import { RoomRemoteDataSourceState } from 'src/app/module/chat/data/data-source/room/room-memory-data-source'; +// import { RoomRemoteDataSourceState } from 'src/app/module/chat/data/repository/room-memory-data-source'; import { RoomListOutPutDTO } from 'src/app/module/chat/data/dto/room/roomListOutputDTO'; -import { RoomRepositoryService } from 'src/app/module/chat/data/repository/room-repository.service' + import { Observable as DexieObservable } from 'Dexie'; import { EditGroupPage } from './modal/edit-group/edit-group.page'; +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service' +import { RoomLocalRepository } from 'src/app/module/chat/data/repository/room-local-repository.service' @Component({ selector: 'app-chat', @@ -49,7 +51,7 @@ export class ChatPage implements OnInit { routerSubscription - count$: Observable; + // count$: Observable; items$!: DexieObservable; constructor( @@ -59,7 +61,8 @@ export class ChatPage implements OnInit { private dataService: DataService, private router: Router, public RouteService: RouteService, - private RoomRepositoryService: RoomRepositoryService, + private ChatServiceService: ChatServiceService, + private roomLocalDataSourceService: RoomLocalRepository, ) { @@ -78,8 +81,8 @@ export class ChatPage implements OnInit { ngOnInit() { - this.items$ = this.RoomRepositoryService.getItemsLive() - this.RoomRepositoryService.list(); + this.items$ = this.roomLocalDataSourceService.getItemsLive() + this.ChatServiceService.getRoomList() this.hideRefreshButton(); @@ -93,7 +96,7 @@ export class ChatPage implements OnInit { this.routerSubscription = this.router.events.subscribe((event) => { if (event instanceof NavigationEnd && event.url.startsWith('/home/chat')) { this.routeCheck() - this.RoomRepositoryService.list(); + this.ChatServiceService.getRoomList() } }); diff --git a/src/app/ui/chat/component/edit-group/edit-group.page.ts b/src/app/ui/chat/component/edit-group/edit-group.page.ts index 5421d01eb..d36e8fb92 100644 --- a/src/app/ui/chat/component/edit-group/edit-group.page.ts +++ b/src/app/ui/chat/component/edit-group/edit-group.page.ts @@ -7,7 +7,8 @@ import { HttpResponse } from '@microsoft/signalr'; import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; import { ToastService } from 'src/app/services/toast.service'; import { ZodError } from 'zod'; -import { RoomRepositoryService } from 'src/app/module/chat/data/repository/room-repository.service' + +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service'; @Component({ @@ -33,9 +34,9 @@ export class EditGroupPage implements OnInit { private modalController: ModalController, private pickerController: PickerController, public ThemeService: ThemeService, - private RoomRepositoryService: RoomRepositoryService, private httpErrorHandle: HttpErrorHandle, private toastService: ToastService, + private chatServiceService: ChatServiceService, ) { this.loggedUser = SessionStore.user.ChatData['data']; } @@ -67,7 +68,7 @@ export class EditGroupPage implements OnInit { async changeGroupName() { this.showLoader = true - const result = await this.RoomRepositoryService.updateRoomBy({ + const result = await this.chatServiceService.updateRoomById({ roomId: this.roomId, roomName: this.groupName, roomType: 0 diff --git a/src/app/ui/chat/component/group-messages/group-contacts/group-contacts.page.ts b/src/app/ui/chat/component/group-messages/group-contacts/group-contacts.page.ts index 612194de2..3ab2de666 100644 --- a/src/app/ui/chat/component/group-messages/group-contacts/group-contacts.page.ts +++ b/src/app/ui/chat/component/group-messages/group-contacts/group-contacts.page.ts @@ -2,14 +2,14 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { ThemeService } from 'src/app/services/theme.service' import { ContactRepositoryService } from 'src/app/services/Repositorys/contacts/repository/contacts-repository.service'; import { UserContacts } from 'src/app/services/Repositorys/contacts/data-source/contacts-data-source.service'; -import { RoomRepositoryService } from 'src/app/module/chat/data/repository/room-repository.service' - import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; import { SessionStore } from 'src/app/store/session.service'; import { HttpRequest } from '@angular/common/http'; import { ZodError } from 'zod'; import { HttpResponse } from '@microsoft/signalr'; import { ToastService } from 'src/app/services/toast.service'; +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service'; +import { MemberListLocalRepository } from 'src/app/module/chat/data/repository/member-list-local-repository.service' @Component({ selector: 'app-group-contacts', @@ -35,9 +35,10 @@ export class GroupContactsPage implements OnInit { constructor( public ThemeService: ThemeService, private contactsRepositoryService: ContactRepositoryService, - private RoomRepositoryService: RoomRepositoryService, private httpErrorHandle: HttpErrorHandle, private toastService: ToastService, + private chatServiceService: ChatServiceService, + private MemberListLocalRepository: MemberListLocalRepository, ){} ngOnInit(): void { @@ -52,7 +53,7 @@ export class GroupContactsPage implements OnInit { if(this.hasMemberToUpload) { this.showLoader = true; - const addMembers = await this.RoomRepositoryService.addMemberToRoom({ + const addMembers = await this.chatServiceService.addMemberToRoom({ id: this.roomId, members: this.selectedUsers }) @@ -62,7 +63,7 @@ export class GroupContactsPage implements OnInit { console.log('addMembers', addMembers) // this.addContacts(this.roomId); this.openGroupMessage.emit(this.roomId); - this.RoomRepositoryService.getRoomById(this.roomId); + this.chatServiceService.getRoomById(this.roomId); } else if(addMembers.error instanceof HttpRequest) { this.httpErrorHandle.httpStatusHandle(addMembers.error) } @@ -80,7 +81,7 @@ export class GroupContactsPage implements OnInit { async loadUsers() { const getallChatUsers = await this.contactsRepositoryService.getUsers() - const getRoomById = await this.RoomRepositoryService.getRoomById(this.roomId) + const getRoomById = await this.chatServiceService.getRoomById(this.roomId) console.log({getallChatUsers, getRoomById}) @@ -96,7 +97,7 @@ export class GroupContactsPage implements OnInit { return 0; }); - const currentMemberToMap = await this.RoomRepositoryService.getRoomMemberById(this.roomId) + const currentMemberToMap = await this.MemberListLocalRepository.getRoomMemberById(this.roomId) console.log({currentMemberToMap}) @@ -195,7 +196,7 @@ export class GroupContactsPage implements OnInit { async deleteMember(user: UserContacts) { this.showLoader = true; - const result = await this.RoomRepositoryService.removeMemberToRoom({ + const result = await this.chatServiceService.removeMemberToRoom({ id: this.roomId, members: [ user.wxUserId] }) diff --git a/src/app/ui/chat/component/messages/contacts/contacts.page.ts b/src/app/ui/chat/component/messages/contacts/contacts.page.ts index 85da91fef..49417da07 100644 --- a/src/app/ui/chat/component/messages/contacts/contacts.page.ts +++ b/src/app/ui/chat/component/messages/contacts/contacts.page.ts @@ -7,10 +7,12 @@ import { ThemeService } from 'src/app/services/theme.service' import { SessionStore } from 'src/app/store/session.service'; import { ContactRepositoryService } from 'src/app/services/Repositorys/contacts/repository/contacts-repository.service'; import { UserContacts } from 'src/app/services/Repositorys/contacts/data-source/contacts-data-source.service'; -import { RoomRepositoryService } from 'src/app/module/chat/data/repository/room-repository.service' + import { HttpErrorResponse } from '@angular/common/http'; import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; import { ToastService } from 'src/app/services/toast.service'; +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service' + class UserToSelect { @@ -48,9 +50,9 @@ export class ContactsPage implements OnInit { public ThemeService: ThemeService, // public ChatSystemService: ChatSystemService, private contactsRepositoryService: ContactRepositoryService, - private roomRepositoryService: RoomRepositoryService, private httpErrorHandle: HttpErrorHandle, private toastService: ToastService, + private ChatServiceService: ChatServiceService ) { this.loggedUser = SessionStore.user.ChatData['data']; this.textSearch = ""; @@ -152,7 +154,7 @@ export class ContactsPage implements OnInit { } async createRoom(username: string, wxUserId: number) { - const result = await this.roomRepositoryService.create({ + const result = await this.ChatServiceService.createRoom({ roomName: username, createdBy: SessionStore.user.UserId, roomType: 0, diff --git a/src/app/ui/chat/component/messages/messages.page.ts b/src/app/ui/chat/component/messages/messages.page.ts index 9d83e219b..73f384593 100644 --- a/src/app/ui/chat/component/messages/messages.page.ts +++ b/src/app/ui/chat/component/messages/messages.page.ts @@ -23,7 +23,8 @@ import { PermissionService } from 'src/app/services/permission.service'; import { Observable as DexieObservable } from 'Dexie'; import { Subscription } from 'rxjs'; import { MessageRepositoryService } from 'src/app/module/chat/data/repository/message-respository.service' -import { RoomRepositoryService } from 'src/app/module/chat/data/repository/room-repository.service' +import { RoomLocalRepository } from 'src/app/module/chat/data/repository/room-local-repository.service' +import { MemberListLocalRepository } from 'src/app/module/chat/data/repository/member-list-local-repository.service' import { MessageTable } from 'src/app/module/chat/infra/database/dexie/schema/message'; import { RoomListItemOutPutDTO } from 'src/app/module/chat/data/dto/room/roomListOutputDTO'; import { UserTypingServiceRepository } from 'src/app/module/chat/data/repository/user-typing-repository.service'; @@ -148,7 +149,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy private platform: Platform, private fileOpener: FileOpener, public p: PermissionService, - private roomRepositoryService: RoomRepositoryService, + private MemberListLocalRepository: MemberListLocalRepository, private messageRepositoryService: MessageRepositoryService, private userTypingServiceRepository: UserTypingServiceRepository, private chatServiceService: ChatServiceService, @@ -156,6 +157,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy private FilePickerWebService: FilePickerWebService, private FilePickerService: FilePickerService, private SpeakerService: SpeakerService, + private RoomLocalRepository: RoomLocalRepository ) { // update this.checkAudioPermission() @@ -164,7 +166,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy ngOnChanges(changes: SimpleChanges): void { - this.roomData$ = this.roomRepositoryService.getItemByIdLive(this.roomId) + this.roomData$ = this.RoomLocalRepository.getRoomByIdLive(this.roomId) this.getMessages(); this.listenToIncomingMessage(); this.listenToDeleteMessage(); @@ -172,9 +174,9 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy this.listenToSendMessage() // this.roomMessage$ = this.messageRepositoryService.getItemsLive(this.roomId) - this.roomMembers$ = this.roomRepositoryService.getRoomMemberByIdLive(this.roomId) as any - this.roomStatus$ = this.roomRepositoryService.getRoomStatus(this.roomId) - this.roomRepositoryService.getRoomById(this.roomId) + this.roomMembers$ = this.MemberListLocalRepository.getRoomMemberByIdLive(this.roomId) as any + this.roomStatus$ = this.MemberListLocalRepository.allMemberOnline(this.roomId) + this.chatServiceService.getRoomById(this.roomId) this.userTypingServiceRepository.getUserTypingLive().subscribe((e) => { const arrayNames = e.map(e => e.userName) @@ -194,7 +196,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy this.messages1[this.roomId] = [] this.messages1[this.roomId] = messages - + this.messages1[this.roomId].push(LastMessage) this.loadAttachment() @@ -212,8 +214,8 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy message.attachments[0].safeFile = result.value } }) - } - + } + } } } @@ -229,7 +231,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy this.messages1[this.roomId].splice(index, 1); } } - + async onImageError() {} diff --git a/src/app/ui/chat/component/new-group/new-group.page.ts b/src/app/ui/chat/component/new-group/new-group.page.ts index 721d0c534..e97668cd7 100644 --- a/src/app/ui/chat/component/new-group/new-group.page.ts +++ b/src/app/ui/chat/component/new-group/new-group.page.ts @@ -7,8 +7,9 @@ import { SessionStore } from 'src/app/store/session.service'; import { ThemeService } from 'src/app/services/theme.service'; import { RouteService } from 'src/app/services/route.service'; import { HttpErrorResponse } from '@angular/common/http'; -import { RoomRepositoryService } from 'src/app/module/chat/data/repository/room-repository.service' + import { HttpErrorHandle } from 'src/app/services/http-error-handle.service' +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service' @Component({ selector: 'app-new-group', @@ -50,8 +51,8 @@ export class NewGroupPage implements OnInit{ public ThemeService: ThemeService, private RouteService: RouteService, private viewContainerRef: ViewContainerRef, - private roomRepositoryService: RoomRepositoryService, private httpErrorHandle: HttpErrorHandle, + private ChatServiceService: ChatServiceService ) { this.loggedUserChat = SessionStore.user.ChatData['data']; @@ -119,7 +120,7 @@ export class NewGroupPage implements OnInit{ } async createGroup1() { - const result = await this.roomRepositoryService.create({ + const result = await this.ChatServiceService.createRoom({ roomName: this.groupName, createdBy: SessionStore.user.UserId, roomType: 0, diff --git a/src/app/ui/chat/modal/chat-popover/chat-popover.page.ts b/src/app/ui/chat/modal/chat-popover/chat-popover.page.ts index 0b5765ed9..8bb9fa0ed 100644 --- a/src/app/ui/chat/modal/chat-popover/chat-popover.page.ts +++ b/src/app/ui/chat/modal/chat-popover/chat-popover.page.ts @@ -2,12 +2,13 @@ import { Component, OnInit } from '@angular/core'; import { ModalController, NavParams, PopoverController } from '@ionic/angular'; import { ToastService } from 'src/app/services/toast.service'; import { ThemeService } from 'src/app/services/theme.service' -import { SetRoomOwnerPage } from 'src/app/modals/set-room-owner/set-room-owner.page'; +import { SetRoomOwnerPage } from 'src/app/ui/chat/modal/set-room-owner/set-room-owner.page'; import { SessionStore } from 'src/app/store/session.service'; import { ZodError } from 'zod'; import { isHttpResponse } from 'src/app/services/http.service'; import { MessageRepositoryService } from 'src/app/module/chat/data/repository/message-respository.service' -import { RoomRepositoryService } from 'src/app/module/chat/data/repository/room-repository.service' + +import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service' @Component({ selector: 'app-chat-popover', @@ -27,7 +28,7 @@ export class ChatPopoverPage implements OnInit { private navParams: NavParams, private toastService: ToastService, public ThemeService: ThemeService, - private RoomRepositoryService: RoomRepositoryService + private ChatServiceService: ChatServiceService ) { this.roomId = this.navParams.get('roomId'); this.isAdmin = this.navParams.get('isAdmin'); @@ -84,7 +85,7 @@ export class ChatPopoverPage implements OnInit { //this.setRoomOwner(); this.showLoader = true - const result = await this.RoomRepositoryService.leaveRoom({ + const result = await this.ChatServiceService.leaveRoom({ id: this.roomId, members: [SessionStore.user.UserId] }) @@ -112,7 +113,8 @@ export class ChatPopoverPage implements OnInit { //Delete async deleteGroup() { this.showLoader = true - const result = await this.RoomRepositoryService.deleteRoomById(this.roomId) + + const result = await this.ChatServiceService.deleteRoomById(this.roomId) if(result.isOk()) { diff --git a/src/app/ui/chat/modal/messages/contacts/contacts.page.ts b/src/app/ui/chat/modal/messages/contacts/contacts.page.ts index 057e32318..a4bd7932f 100644 --- a/src/app/ui/chat/modal/messages/contacts/contacts.page.ts +++ b/src/app/ui/chat/modal/messages/contacts/contacts.page.ts @@ -3,7 +3,6 @@ import { ModalController } from '@ionic/angular'; import { ThemeService } from 'src/app/services/theme.service' import { SessionStore } from 'src/app/store/session.service'; import { ContactRepositoryService } from 'src/app/services/Repositorys/contacts/repository/contacts-repository.service'; -import { RoomRepositoryService } from 'src/app/module/chat/data/repository/room-repository.service' import { UserContacts } from 'src/app/services/Repositorys/contacts/data-source/contacts-data-source.service'; import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; import { ToastService } from 'src/app/services/toast.service'; @@ -37,7 +36,6 @@ export class ContactsPage implements OnInit { private modalController: ModalController, public ThemeService: ThemeService, private contactsRepositoryService: ContactRepositoryService, - private RoomRepositoryService: RoomRepositoryService, private httpErrorHandle: HttpErrorHandle, private toastService: ToastService, ) diff --git a/src/app/ui/chat/modal/messages/messages.page.ts b/src/app/ui/chat/modal/messages/messages.page.ts index 4907e2ef9..382499144 100644 --- a/src/app/ui/chat/modal/messages/messages.page.ts +++ b/src/app/ui/chat/modal/messages/messages.page.ts @@ -22,7 +22,6 @@ import { ViewMediaPage } from 'src/app/modals/view-media/view-media.page'; import { Observable as DexieObservable } from 'Dexie'; import { Subscription } from 'rxjs'; import { MessageRepositoryService } from 'src/app/module/chat/data/repository/message-respository.service' -import { RoomRepositoryService } from 'src/app/module/chat/data/repository/room-repository.service' import { MessageTable } from 'src/app/module/chat/infra/database/dexie/schema/message'; import { RoomListItemOutPutDTO } from 'src/app/module/chat/data/dto/room/roomListOutputDTO'; import { UserTypingServiceRepository } from 'src/app/module/chat/data/repository/user-typing-repository.service'; @@ -43,6 +42,8 @@ import { FilePickerMobileService } from 'src/app/infra/file-picker/mobile/file-p import { FilePickerWebService } from 'src/app/infra/file-picker/web/file-picker-web.service' import { allowedDocExtension } from 'src/app/utils/allowedDocExtension'; import { JSFileToDataUrl } from 'src/app/utils/ToBase64'; +import { RoomLocalRepository } from 'src/app/module/chat/data/repository/room-local-repository.service' +import { MemberListLocalRepository } from 'src/app/module/chat/data/repository/member-list-local-repository.service' const IMAGE_DIR = 'stored-images'; @Component({ @@ -137,21 +138,22 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { private platform: Platform, private storage: Storage, private sanitiser: DomSanitizer, - private roomRepositoryService: RoomRepositoryService, private messageRepositoryService: MessageRepositoryService, private userTypingServiceRepository: UserTypingServiceRepository, private chatServiceService: ChatServiceService, private FilePickerService: FilePickerService, private CameraService: CameraService, private FilePickerMobileService: FilePickerMobileService, - private FilePickerWebService: FilePickerWebService + private FilePickerWebService: FilePickerWebService, + private RoomLocalRepository: RoomLocalRepository, + private MemberListLocalRepository: MemberListLocalRepository, ) { this.roomId = this.navParams.get('roomId'); - this.roomData$ = this.roomRepositoryService.getItemByIdLive(this.roomId) + this.roomData$ = this.RoomLocalRepository.getRoomByIdLive(this.roomId) this.getMessages(); this.listenToIncomingMessage(); @@ -161,8 +163,8 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { // this.roomMessage$ = this.messageRepositoryService.getItemsLive(this.roomId) - this.roomMembers$ = this.roomRepositoryService.getRoomMemberByIdLive(this.roomId) as any - this.roomStatus$ = this.roomRepositoryService.getRoomStatus(this.roomId) + this.roomMembers$ = this.MemberListLocalRepository.getRoomMemberByIdLive(this.roomId) as any + this.roomStatus$ = this.MemberListLocalRepository.allMemberOnline(this.roomId) // this.roomRepositoryService.getRoomById(this.roomId) this.userTypingServiceRepository.getUserTypingLive().subscribe((e) => { diff --git a/src/app/modals/set-room-owner/set-room-owner-routing.module.ts b/src/app/ui/chat/modal/set-room-owner/set-room-owner-routing.module.ts similarity index 100% rename from src/app/modals/set-room-owner/set-room-owner-routing.module.ts rename to src/app/ui/chat/modal/set-room-owner/set-room-owner-routing.module.ts diff --git a/src/app/modals/set-room-owner/set-room-owner.module.ts b/src/app/ui/chat/modal/set-room-owner/set-room-owner.module.ts similarity index 100% rename from src/app/modals/set-room-owner/set-room-owner.module.ts rename to src/app/ui/chat/modal/set-room-owner/set-room-owner.module.ts diff --git a/src/app/modals/set-room-owner/set-room-owner.page.html b/src/app/ui/chat/modal/set-room-owner/set-room-owner.page.html similarity index 100% rename from src/app/modals/set-room-owner/set-room-owner.page.html rename to src/app/ui/chat/modal/set-room-owner/set-room-owner.page.html diff --git a/src/app/modals/set-room-owner/set-room-owner.page.scss b/src/app/ui/chat/modal/set-room-owner/set-room-owner.page.scss similarity index 100% rename from src/app/modals/set-room-owner/set-room-owner.page.scss rename to src/app/ui/chat/modal/set-room-owner/set-room-owner.page.scss diff --git a/src/app/modals/set-room-owner/set-room-owner.page.spec.ts b/src/app/ui/chat/modal/set-room-owner/set-room-owner.page.spec.ts similarity index 100% rename from src/app/modals/set-room-owner/set-room-owner.page.spec.ts rename to src/app/ui/chat/modal/set-room-owner/set-room-owner.page.spec.ts diff --git a/src/app/modals/set-room-owner/set-room-owner.page.ts b/src/app/ui/chat/modal/set-room-owner/set-room-owner.page.ts similarity index 83% rename from src/app/modals/set-room-owner/set-room-owner.page.ts rename to src/app/ui/chat/modal/set-room-owner/set-room-owner.page.ts index acb9316aa..9b93b2441 100644 --- a/src/app/modals/set-room-owner/set-room-owner.page.ts +++ b/src/app/ui/chat/modal/set-room-owner/set-room-owner.page.ts @@ -1,12 +1,13 @@ import { Component, OnInit } from '@angular/core'; import { ModalController, NavParams } from '@ionic/angular'; -import { RoomRepositoryService } from 'src/app/module/chat/data/repository/room-repository.service'; +; import { ThemeService } from 'src/app/services/theme.service' import { ToastService } from 'src/app/services/toast.service'; import { Observable as DexieObservable } from 'Dexie'; import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service'; import { MemberTable } from 'src/app/module/chat/infra/database/dexie/schema/members'; +import { MemberListLocalRepository } from 'src/app/module/chat/data/repository/member-list-local-repository.service' @Component({ selector: 'app-set-room-owner', @@ -25,8 +26,8 @@ export class SetRoomOwnerPage implements OnInit { private navParams: NavParams, public ThemeService: ThemeService, private toastService: ToastService, - private roomRepositoryService: RoomRepositoryService, - private chatServiceService: ChatServiceService + private chatServiceService: ChatServiceService, + private MemberListLocalRepository: MemberListLocalRepository ) { this.roomId = this.navParams.get('roomId'); this.members = this.navParams.get('members'); @@ -34,7 +35,7 @@ export class SetRoomOwnerPage implements OnInit { ngOnInit() { // this.chatService.refreshtoken(); - this.roomMembers$ = this.roomRepositoryService.getRoomMemberNoneAdminByIdLive(this.roomId) as any + this.roomMembers$ = this.MemberListLocalRepository.getRoomMemberNoneAdminByIdLive(this.roomId) as any } async close() { @@ -67,7 +68,7 @@ export class SetRoomOwnerPage implements OnInit { }); if(result.isOk()) { - this.roomRepositoryService.getRoomById(this.roomId) + this.chatServiceService.getRoomById(this.roomId); // this.modalController.dismiss('success'); } else { this.toastService._badRequest('Não foi possível completar a ação, por favor tente novamente.');