diff --git a/src/app/core/chat/repository/attachment/attachment-local-repository.ts b/src/app/core/chat/repository/attachment/attachment-local-repository.ts index ea114ba43..e5047ab56 100644 --- a/src/app/core/chat/repository/attachment/attachment-local-repository.ts +++ b/src/app/core/chat/repository/attachment/attachment-local-repository.ts @@ -3,7 +3,8 @@ import { DexieRepository } from "src/app/infra/repository/dexie/dexie-repository import { MessageEntity } from "../../entity/message"; import { Observable as DexieObservable, PromiseExtended } from 'Dexie'; import { AttachmentTable } from "src/app/infra/database/dexie/instance/chat/schema/attachment"; +import { TypingTable } from "src/app/infra/database/dexie/instance/chat/schema/typing"; -export abstract class IAttachmentLocalRepository extends DexieRepository { +export abstract class ITypingLocalRepository extends DexieRepository { } \ No newline at end of file diff --git a/src/app/core/chat/repository/member/member-local-repository.ts b/src/app/core/chat/repository/member/member-local-repository.ts index dae1a7b4b..b0ff5c519 100644 --- a/src/app/core/chat/repository/member/member-local-repository.ts +++ b/src/app/core/chat/repository/member/member-local-repository.ts @@ -3,7 +3,40 @@ import { DexieRepository } from "src/app/infra/repository/dexie/dexie-repository import { MessageEntity } from "../../entity/message"; import { Observable as DexieObservable, PromiseExtended } from 'Dexie'; import { AttachmentTable } from "src/app/infra/database/dexie/instance/chat/schema/attachment"; +import { Result } from "neverthrow"; +import { MemberTable, MemberTableSchema } from "src/app/infra/database/dexie/instance/chat/schema/members"; +import { RepositoryResult } from "src/app/infra/repository"; +import { z } from "zod"; +import { MemberListUPdateStatusInputDTO } from "src/app/module/chat/domain/use-case/socket/member-list-update-status-use-case.service"; +import { Observable } from "rxjs"; + +export const DirectMemberInput = MemberTableSchema.pick({ + roomId: true, +}).extend({ + currentUserId: z.number(), +}) + +export type IDirectMemberInput = z.infer + +export const GetMemberLiveInput = MemberTableSchema.pick({ + wxUserId: true, + roomId: true, +}) + +export type IGetMemberLive = z.infer export abstract class IMemberLocalRepository extends DexieRepository { + abstract directMember(input:IDirectMemberInput): Promise> + abstract addMember(data: MemberTable): Promise> + abstract updateMemberRole(data: MemberTable): Promise> + abstract updateMembersStatus(data: MemberListUPdateStatusInputDTO): Promise> + abstract allMemberOnline(roomId:string): DexieObservable + abstract removeMemberFromRoom(roomId:string): Promise> + + abstract getMemberLive(input: IGetMemberLive): DexieObservable + abstract getRoomMemberById(roomId:string): Promise + abstract getRoomMemberByIdLive(roomId:string): Observable + abstract getRoomMemberNoneAdminByIdLive(roomId:string): DexieObservable + } \ No newline at end of file diff --git a/src/app/core/chat/repository/member/member-remote-repository.ts b/src/app/core/chat/repository/member/member-remote-repository.ts index 6ba60ec16..54ff89303 100644 --- a/src/app/core/chat/repository/member/member-remote-repository.ts +++ b/src/app/core/chat/repository/member/member-remote-repository.ts @@ -1,10 +1,12 @@ import { DataSourceReturn } from "src/app/services/Repositorys/type"; import { Result } from "neverthrow"; -import { UserRemoveListInputDTO } from "src/app/module/chat/data/dto/room/userRemoveListInputDTO"; import { AddMemberToRoomInputDTO } from "src/app/module/chat/domain/use-case/member/member-add-use-case.service"; +import { MemberSetAdminDTO } from "src/app/module/chat/domain/use-case/member/member-admin-use-case.service"; +import { UserRemoveListInputDTO } from "src/app/module/chat/domain/use-case/room/room-leave-by-id-use-case.service"; export abstract class IMemberRemoteRepository { abstract addMemberToRoom(data: AddMemberToRoomInputDTO): DataSourceReturn - abstract removeMemberFromRoom(data: UserRemoveListInputDTO): Promise> + abstract removeMemberFromRoom(data: UserRemoveListInputDTO): Promise> + abstract setAmin(data: MemberSetAdminDTO): Promise> } \ No newline at end of file diff --git a/src/app/core/chat/repository/room/room-local-repository.ts b/src/app/core/chat/repository/room/room-local-repository.ts new file mode 100644 index 000000000..6d80479ec --- /dev/null +++ b/src/app/core/chat/repository/room/room-local-repository.ts @@ -0,0 +1,12 @@ +import { MessageTable } from "src/app/infra/database/dexie/instance/chat/schema/message"; +import { DexieRepository } from "src/app/infra/repository/dexie/dexie-repository.service"; +import { MessageEntity } from "../../entity/message"; +import { Observable as DexieObservable, PromiseExtended } from 'Dexie'; +import { AttachmentTable } from "src/app/infra/database/dexie/instance/chat/schema/attachment"; +import { RoomTable } from "src/app/infra/database/dexie/instance/chat/schema/room"; +import { Observable } from "rxjs"; + +export abstract class IRoomLocalRepository extends DexieRepository { + abstract getItemsLive(): Observable + abstract getRoomByIdLive(id: any) : DexieObservable +} \ No newline at end of file diff --git a/src/app/core/chat/repository/room/room-remote-repository.ts b/src/app/core/chat/repository/room/room-remote-repository.ts new file mode 100644 index 000000000..7e000d29d --- /dev/null +++ b/src/app/core/chat/repository/room/room-remote-repository.ts @@ -0,0 +1,17 @@ +import { DataSourceReturn } from "src/app/services/Repositorys/type"; +import { IMessageGetAllByRoomIdOutPut } from "../../usecase/message/message-get-all-by-room-Id"; +import { CreateRoomInputDTO, RoomOutPutDTO } from "src/app/module/chat/domain/use-case/room/room-create-use-case.service"; +import { RoomByIdInputDTO, RoomByIdOutputDTO } from "src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service"; +import { RoomUpdateInputDTO, RoomUpdateOutputDTO } from "src/app/module/chat/domain/use-case/room/room-update-by-id-use-case.service"; +import { Result } from "neverthrow"; +import { AddMemberToRoomInputDTO } from "src/app/module/chat/domain/use-case/member/member-add-use-case.service"; +import { RoomListOutPutDTO } from "src/app/module/chat/domain/use-case/room/room-get-list-use-case.service"; + +export abstract class IRoomRemoteRepository { + abstract createRoom(data: CreateRoomInputDTO): DataSourceReturn + abstract getRoomList(): Promise> + abstract getRoom(id: RoomByIdInputDTO): DataSourceReturn + abstract updateRoom(data: RoomUpdateInputDTO): Promise> + abstract deleteRoom(id: string): Promise> + abstract addMemberToRoomSocket(data: AddMemberToRoomInputDTO): Promise> +} \ No newline at end of file diff --git a/src/app/core/chat/repository/room/room-socket-repository.ts b/src/app/core/chat/repository/room/room-socket-repository.ts new file mode 100644 index 000000000..7d231c79f --- /dev/null +++ b/src/app/core/chat/repository/room/room-socket-repository.ts @@ -0,0 +1,17 @@ +import { HubConnection } from "@microsoft/signalr"; +import { Result } from "neverthrow"; +import { MessageInputDTO } from '../dto/messageInputDtO' +import { Observable } from "rxjs"; +import { ListenToDeleteRoomInput, RoomSocketOutPutDTO } from "src/app/module/chat/data/repository/room/room-socket-repository.service"; +import { CreateRoomInputDTO } from "src/app/module/chat/domain/use-case/room/room-create-use-case.service"; + +export abstract class IRoomSocketRepository { + + + abstract CreateGroup(data: CreateRoomInputDTO): Promise> + + abstract listenToCreateRoom(): Observable + abstract listenToDeleteRoom(): Observable + + +} \ No newline at end of file diff --git a/src/app/core/chat/repository/typing/typing-local-repository.ts b/src/app/core/chat/repository/typing/typing-local-repository.ts new file mode 100644 index 000000000..ea114ba43 --- /dev/null +++ b/src/app/core/chat/repository/typing/typing-local-repository.ts @@ -0,0 +1,9 @@ +import { MessageTable } from "src/app/infra/database/dexie/instance/chat/schema/message"; +import { DexieRepository } from "src/app/infra/repository/dexie/dexie-repository.service"; +import { MessageEntity } from "../../entity/message"; +import { Observable as DexieObservable, PromiseExtended } from 'Dexie'; +import { AttachmentTable } from "src/app/infra/database/dexie/instance/chat/schema/attachment"; + +export abstract class IAttachmentLocalRepository extends DexieRepository { + +} \ No newline at end of file diff --git a/src/app/core/chat/repository/typing/typing-remote-repository.ts b/src/app/core/chat/repository/typing/typing-remote-repository.ts new file mode 100644 index 000000000..a68359a1f --- /dev/null +++ b/src/app/core/chat/repository/typing/typing-remote-repository.ts @@ -0,0 +1,10 @@ +import { DataSourceReturn } from "src/app/services/Repositorys/type"; +import { IMessageGetAllByRoomIdOutPut } from "../../usecase/message/message-get-all-by-room-Id"; +import { Observable } from "rxjs"; +import { Result } from "neverthrow"; +import { UserTypingDTO } from "src/app/module/chat/data/repository/typing/user-typing-live-data-source.service"; + +export abstract class ITypingRemoteRepository { + abstract sendTyping(roomId: string): Promise> + abstract listenToTyping(): Observable +} \ No newline at end of file diff --git a/src/app/core/chat/usecase/message/message-get-all-by-room-Id.ts b/src/app/core/chat/usecase/message/message-get-all-by-room-Id.ts index df06cee5e..9e772c5e0 100644 --- a/src/app/core/chat/usecase/message/message-get-all-by-room-Id.ts +++ b/src/app/core/chat/usecase/message/message-get-all-by-room-Id.ts @@ -4,8 +4,8 @@ import { Result } from "neverthrow"; import { Observable } from "rxjs"; import { filter, map } from "rxjs/operators"; import { HttpAdapter } from "src/app/infra/http/adapter"; -import { MessageAttachmentFileType, MessageAttachmentSource } from "src/app/module/chat/data/dto/message/messageOutputDTO"; import { z } from "zod"; +import { MessageAttachmentFileType, MessageAttachmentSource } from "../../entity/message"; export const MessageGetAllByRoomIdUseCaseOutputSchema = z.object({ success: z.boolean(), diff --git a/src/app/infra/database/dexie/instance/chat/schema/attachment.ts b/src/app/infra/database/dexie/instance/chat/schema/attachment.ts index 9daa9b257..095798d62 100644 --- a/src/app/infra/database/dexie/instance/chat/schema/attachment.ts +++ b/src/app/infra/database/dexie/instance/chat/schema/attachment.ts @@ -1,7 +1,7 @@ import { z } from "zod"; import { EntityTable } from 'Dexie'; import { zodDataUrlSchema } from "src/app/utils/zod"; -import { MessageAttachmentFileType, MessageAttachmentSource } from "src/app/module/chat/data/dto/message/messageOutputDTO"; +import { MessageAttachmentFileType, MessageAttachmentSource } from "src/app/core/chat/entity/message"; export const AttachmentTableSchema = z.object({ $id: z.number().optional(), // local id diff --git a/src/app/infra/database/dexie/instance/chat/schema/message.ts b/src/app/infra/database/dexie/instance/chat/schema/message.ts index 09bf14716..20e2ec27a 100644 --- a/src/app/infra/database/dexie/instance/chat/schema/message.ts +++ b/src/app/infra/database/dexie/instance/chat/schema/message.ts @@ -1,5 +1,5 @@ import { EntityTable } from 'Dexie'; -import { MessageAttachmentFileType, MessageAttachmentSource } from "src/app/module/chat/data/dto/message/messageOutputDTO"; +import { MessageAttachmentFileType, MessageAttachmentSource } from 'src/app/core/chat/entity/message'; import { z } from 'zod'; export const MessageTableSchema = z.object({ diff --git a/src/app/infra/socket/signalR/signal-r.service.ts b/src/app/infra/socket/signalR/signal-r.service.ts index c6315b19e..ae9197bc5 100644 --- a/src/app/infra/socket/signalR/signal-r.service.ts +++ b/src/app/infra/socket/signalR/signal-r.service.ts @@ -6,7 +6,6 @@ import { Plugins } from '@capacitor/core'; import { filter, map, skip, switchMap } from 'rxjs/operators'; import { Result } from 'neverthrow'; import { HubConnection } from '@microsoft/signalr'; -import { UserTypingDTO } from 'src/app/module/chat/data/dto/typing/typingInputDTO'; import { ISignalRInput } from '../type'; const { App } = Plugins; diff --git a/src/app/infra/socket/signalR/signalR.ts b/src/app/infra/socket/signalR/signalR.ts index 5e433edd1..806592fd7 100644 --- a/src/app/infra/socket/signalR/signalR.ts +++ b/src/app/infra/socket/signalR/signalR.ts @@ -4,8 +4,8 @@ import { ok, Result, err } from 'neverthrow'; import { SessionStore } from 'src/app/store/session.service'; import { filter, first } from 'rxjs/operators'; import { v4 as uuidv4 } from 'uuid' -import { MessageOutPutDataDTO } from 'src/app/module/chat/data/dto/message/messageOutputDTO'; import { ISignalRInput } from '../type'; +import { MessageOutPutDataDTO } from 'src/app/core/chat/repository/dto/messageOutputDTO'; export interface SocketMessage { method: string, diff --git a/src/app/module/chat/data/async/list/rooms/messageListChangedetector.ts b/src/app/module/chat/data/async/list/rooms/messageListChangedetector.ts index e7009b478..4dc8474c1 100644 --- a/src/app/module/chat/data/async/list/rooms/messageListChangedetector.ts +++ b/src/app/module/chat/data/async/list/rooms/messageListChangedetector.ts @@ -1,5 +1,4 @@ import { MessageTable } from "src/app/infra/database/dexie/instance/chat/schema/message"; -import { RoomListItemOutPutDTO, RoomListOutPutDTO } from "../../../dto/room/roomListOutputDTO"; export function messageListDetermineChanges(serverList: MessageTable[], localList: MessageTable[]) { diff --git a/src/app/module/chat/data/async/list/rooms/roomListChangeDetector.ts b/src/app/module/chat/data/async/list/rooms/roomListChangeDetector.ts index bfea7d058..673a275d2 100644 --- a/src/app/module/chat/data/async/list/rooms/roomListChangeDetector.ts +++ b/src/app/module/chat/data/async/list/rooms/roomListChangeDetector.ts @@ -1,5 +1,5 @@ import { RoomTable } from "src/app/infra/database/dexie/instance/chat/schema/room"; -import { RoomListItemOutPutDTO, RoomListOutPutDTO } from "../../../dto/room/roomListOutputDTO"; +import { RoomListItemOutPutDTO } from "src/app/module/chat/domain/use-case/room/room-get-list-use-case.service"; export function roomListDetermineChanges(serverRooms: RoomListItemOutPutDTO[], localRooms: RoomTable[]) { const serverRoomMap = new Map(serverRooms.map(room => [room.chatRoom.id, room])); diff --git a/src/app/module/chat/data/async/list/rooms/roomMembersChangeDetector.ts b/src/app/module/chat/data/async/list/rooms/roomMembersChangeDetector.ts index 49fa9aaa7..a521e9df2 100644 --- a/src/app/module/chat/data/async/list/rooms/roomMembersChangeDetector.ts +++ b/src/app/module/chat/data/async/list/rooms/roomMembersChangeDetector.ts @@ -1,5 +1,5 @@ import { MemberTable } from "src/app/infra/database/dexie/instance/chat/schema/members"; -import { RoomByIdMemberItemOutputDTO } from "../../../dto/room/roomByIdOutputDTO"; +import { RoomByIdMemberItemOutputDTO } from "src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service"; export function roomMemberListDetermineChanges(____serverRooms: RoomByIdMemberItemOutputDTO[], localRooms: MemberTable[], roomId: string) { diff --git a/src/app/module/chat/data/dto/message/messageDeleteInputDTO.ts b/src/app/module/chat/data/dto/message/messageDeleteInputDTO.ts deleted file mode 100644 index 77cc1e899..000000000 --- a/src/app/module/chat/data/dto/message/messageDeleteInputDTO.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { z } from "zod"; - -export const MessageDeleteInputDTOSchema = z.object({ - requestId: z.string(), - roomId: z.string(), - messageId: z.string(), - senderId: z.number(), -}); - -export type MessageDeleteInputDTO = z.infer diff --git a/src/app/module/chat/data/dto/message/messageInputDtO.ts b/src/app/module/chat/data/dto/message/messageInputDtO.ts deleted file mode 100644 index d3eb18c64..000000000 --- a/src/app/module/chat/data/dto/message/messageInputDtO.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { z } from "zod"; -import { MessageAttachmentFileType, MessageAttachmentSource } from "./messageOutputDTO"; -import { base64Schema } from "src/app/utils/zod"; - -export const MessageInputDTOSchema = z.object({ - roomId: z.string().uuid().optional(), - receiverId: z.number().optional(), - senderId: z.number(), - message: z.string().nullable().optional(), - messageType: z.number(), - canEdit: z.boolean(), - oneShot: z.boolean(), - requireUnlock: z.boolean(), - requestId: z.string(), - attachment: z.object({ - fileType: z.nativeEnum(MessageAttachmentFileType), - source: z.nativeEnum(MessageAttachmentSource), - file: base64Schema.optional(), - fileName: z.string().optional(), - applicationId: z.number().optional(), - docId: z.number().optional(), - mimeType: z.string().optional() - }).optional() -}); - - -export type MessageInputDTO = z.infer diff --git a/src/app/module/chat/data/dto/message/messageListInputDTO.ts b/src/app/module/chat/data/dto/message/messageListInputDTO.ts deleted file mode 100644 index f69ff3a2b..000000000 --- a/src/app/module/chat/data/dto/message/messageListInputDTO.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { z } from "zod" - -const MessageListInputDTOSchema = z.object({ - roomId: z.string(), -}); - -export type MessageListInputDTO = z.infer diff --git a/src/app/module/chat/data/dto/message/messageOutputDTO.ts b/src/app/module/chat/data/dto/message/messageOutputDTO.ts deleted file mode 100644 index b4a980e16..000000000 --- a/src/app/module/chat/data/dto/message/messageOutputDTO.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { z } from "zod" - -export enum MessageAttachmentSource { - Webtrix = 1, - Device, -} - -export enum MessageAttachmentFileType { - Doc = 1, - Image , - Audio , - Video -} - -export const MessageOutPutDataDTOSchema = z.object({ - id: z.string(), - roomId: z.string(), - sender: z.object({ - wxUserId: z.number(), - wxFullName: z.string(), - wxeMail: z.string(), - userPhoto: z.string().optional() - }), - message: z.string().nullable().optional(), - messageType: z.number(), - sentAt: z.string(), - canEdit: z.boolean(), - oneShot: z.boolean(), - requireUnlock: z.boolean(), - requestId: z.string().optional().nullable(), - reactions: z.object({ - id: z.string(), - reactedAt: z.string(), - reaction: z.string(), - sender: z.object({}), - }).array(), - info: z.array(z.object({ - memberId: z.number(), - readAt: z.string().nullable(), - deliverAt: z.string().nullable() - })), - attachments: z.array(z.object({ - fileType: z.nativeEnum(MessageAttachmentFileType), - source: z.nativeEnum(MessageAttachmentSource), - file: z.string().optional(), - fileName: z.string().optional(), - applicationId: z.number().optional(), - docId: z.string().optional(), - id: z.string().optional() - })) -}); - -export type MessageOutPutDataDTO = z.infer diff --git a/src/app/module/chat/data/dto/room/outPut.ts b/src/app/module/chat/data/dto/room/outPut.ts deleted file mode 100644 index 5de5f8d24..000000000 --- a/src/app/module/chat/data/dto/room/outPut.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { z } from "zod"; - -const OutPutDTOSchema = z.object({ - success: z.string(), - message: z.string(), - data: z.any() -}); - -export type OutPutDTO = z.infer diff --git a/src/app/module/chat/data/dto/room/roomByIdInputDTO.ts b/src/app/module/chat/data/dto/room/roomByIdInputDTO.ts deleted file mode 100644 index c8e15d6f3..000000000 --- a/src/app/module/chat/data/dto/room/roomByIdInputDTO.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { z } from "zod"; - -export const RoomByIdInputDTOSchema = z.string() - - -export type RoomByIdInputDTO = z.infer diff --git a/src/app/module/chat/data/dto/room/roomByIdOutputDTO.ts b/src/app/module/chat/data/dto/room/roomByIdOutputDTO.ts deleted file mode 100644 index 58ec40c50..000000000 --- a/src/app/module/chat/data/dto/room/roomByIdOutputDTO.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { z } from "zod"; - -const UserSchema = z.object({ - wxUserId: z.number(), - wxFullName: z.string(), - wxeMail: z.string(), - userPhoto: z.string().nullable(), -}); - -const MemberSchema = z.object({ - id: z.string(), - user: UserSchema, - joinAt: z.string(), - isAdmin: z.boolean() -}); - -export const RoomByIdOutputDTOSchema = z.object({ - success: z.boolean(), - message: z.string(), - data: z.object({ - id: z.string(), - roomName: z.string(), - createdBy: UserSchema, - createdAt: z.string(), - expirationDate: z.string().nullable(), - roomType: z.number(), - members: z.array(MemberSchema), - }), -}) - -export type RoomByIdMemberItemOutputDTO = z.infer -export type RoomByIdOutputDTO = z.infer \ No newline at end of file diff --git a/src/app/module/chat/data/dto/room/roomInputDTO.ts b/src/app/module/chat/data/dto/room/roomInputDTO.ts deleted file mode 100644 index 1f1716a3b..000000000 --- a/src/app/module/chat/data/dto/room/roomInputDTO.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { z } from "zod"; - -export const RoomInputDTOSchema = z.object({ - roomName: z.string(), - createdBy: z.number(), - roomType: z.number(), - expirationDate: z.string().nullable().optional(), - members: z.array(z.number()) -}); - - -export type RoomInputDTO = z.infer diff --git a/src/app/module/chat/data/dto/room/roomListOutputDTO.ts b/src/app/module/chat/data/dto/room/roomListOutputDTO.ts deleted file mode 100644 index 70a563372..000000000 --- a/src/app/module/chat/data/dto/room/roomListOutputDTO.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { z } from "zod"; - -const CreatedBySchema = z.object({ - wxUserId: z.number(), - wxFullName: z.string(), - wxeMail: z.string().email(), - userPhoto: z.string().nullable()// api check -}); - -const RoomListItemOutPutDTOSchema = z.object({ - - chatRoom: z.object({ - id: z.string(), - roomName: z.string(), - createdBy: CreatedBySchema, - createdAt: z.string(), - expirationDate: z.string().nullable(), // api check - roomType: z.number() - }), - joinAt: z.string() -}) - - -// Define the schema for the entire response -export const RoomListOutPutDTOSchema = z.object({ - success: z.boolean(), - message: z.string(), - data: z.array(RoomListItemOutPutDTOSchema), -}); - -export type RoomListItemOutPutDTO = z.infer - -export type RoomListOutPutDTO = z.infer diff --git a/src/app/module/chat/data/dto/room/roomOutputDTO.ts b/src/app/module/chat/data/dto/room/roomOutputDTO.ts deleted file mode 100644 index a704a70b3..000000000 --- a/src/app/module/chat/data/dto/room/roomOutputDTO.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { z } from "zod"; - -export const RoomOutPutDTOSchema = z.object({ - success: z.boolean(), - message: z.string(), - data: z.object({ - id: z.string(), - roomName: z.string(), - createdBy: z.any().nullable(), - createdAt: z.string(), - expirationDate: z.string().nullable(), - roomType: z.any() - }) -}); - -export type RoomOutPutDTO = z.infer diff --git a/src/app/module/chat/data/dto/room/roomUpdateInputDTO.ts b/src/app/module/chat/data/dto/room/roomUpdateInputDTO.ts deleted file mode 100644 index e6d5e5676..000000000 --- a/src/app/module/chat/data/dto/room/roomUpdateInputDTO.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { z } from "zod"; - -export const RoomUpdateInputDTOSchema = z.object({ - roomName: z.string(), - roomId: z.string(), - roomType: z.number(), -}); - -export type RoomUpdateInputDTO = z.infer diff --git a/src/app/module/chat/data/dto/room/roomUpdateOutputDTO.ts b/src/app/module/chat/data/dto/room/roomUpdateOutputDTO.ts deleted file mode 100644 index 6dff2efb4..000000000 --- a/src/app/module/chat/data/dto/room/roomUpdateOutputDTO.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { z } from "zod"; - -const UserSchema = z.object({ - wxUserId: z.number(), - wxFullName: z.string(), - wxeMail: z.string(), - userPhoto: z.string().nullable(), -}); - -const MemberSchema = z.object({ - id: z.string(), - user: UserSchema, - joinAt: z.string(), -}); - -export const RoomUpdateOutputDTOSchema = z.object({ - success: z.boolean(), - message: z.string(), - data: z.object({ - id: z.string(), - roomName: z.string(), - createdBy: UserSchema, - createdAt: z.string(), - expirationDate: z.string().nullable(), - roomType: z.number(), - members: z.array(MemberSchema), - }), -}); - -export type RoomUpdateOutputDTO = z.infer diff --git a/src/app/module/chat/data/dto/room/userRemoveListInputDTO.ts b/src/app/module/chat/data/dto/room/userRemoveListInputDTO.ts deleted file mode 100644 index 9c3ce6ec5..000000000 --- a/src/app/module/chat/data/dto/room/userRemoveListInputDTO.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { z } from "zod"; - -// Define the schema for the entire response -export const UserRemoveListInputDTOSchema = z.object({ - id: z.string(), - members: z.array(z.number()) -}); - -export type UserRemoveListInputDTO = z.infer diff --git a/src/app/module/chat/data/dto/typing/typingInputDTO.ts b/src/app/module/chat/data/dto/typing/typingInputDTO.ts deleted file mode 100644 index 057c6dc68..000000000 --- a/src/app/module/chat/data/dto/typing/typingInputDTO.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { z } from "zod" - -export const UserTypingDTOSchema = z.object({ - requestId: z.string(), - roomId: z.string(), - userId: z.number(), - userName: z.string() -}) -export type UserTypingDTO = z.infer - - diff --git a/src/app/module/chat/data/dto/typing/typingOutputDTO.ts b/src/app/module/chat/data/dto/typing/typingOutputDTO.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/app/module/chat/data/repository/attachment/attachment-local-repository.service.ts b/src/app/module/chat/data/repository/attachment/attachment-local-repository.service.ts index 72e46f8bb..587a71806 100644 --- a/src/app/module/chat/data/repository/attachment/attachment-local-repository.service.ts +++ b/src/app/module/chat/data/repository/attachment/attachment-local-repository.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { Subject } from 'rxjs'; -import { IAttachmentLocalRepository } from 'src/app/core/chat/repository/attachment/attachment-local-repository'; +import { IAttachmentLocalRepository } from 'src/app/core/chat/repository/typing/typing-local-repository'; import { AttachmentTable, AttachmentTableSchema } from 'src/app/infra/database/dexie/instance/chat/schema/attachment'; import { chatDatabase } from 'src/app/infra/database/dexie/service'; import { DexieRepository } from 'src/app/infra/repository/dexie/dexie-repository.service'; diff --git a/src/app/module/chat/data/repository/member/member-list-local-repository.service.ts b/src/app/module/chat/data/repository/member/member-list-local-repository.service.ts index 74e031aa1..3bd3d1572 100644 --- a/src/app/module/chat/data/repository/member/member-list-local-repository.service.ts +++ b/src/app/module/chat/data/repository/member/member-list-local-repository.service.ts @@ -8,7 +8,7 @@ import { MemberListUPdateStatusInputDTO } from '../../../domain/use-case/socket/ import { from } from 'rxjs'; import { MemberTable, MemberTableSchema } from 'src/app/infra/database/dexie/instance/chat/schema/members'; import { chatDatabase } from 'src/app/infra/database/dexie/service'; -import { IMemberLocalRepository } from 'src/app/core/chat/repository/member/member-local-repository'; +import { IDirectMemberInput, IGetMemberLive, IMemberLocalRepository } from 'src/app/core/chat/repository/member/member-local-repository'; @Injectable({ providedIn: 'root' @@ -20,14 +20,14 @@ export class MemberListLocalRepository extends DexieRepository message.wxUserId !== currentUserId) .first() - return ok(a) + return ok(a as MemberTable) } catch (e) { return err(e) } @@ -51,7 +51,7 @@ export class MemberListLocalRepository extends DexieRepository> { try { await chatDatabase.members.toCollection().modify({ status: 'offline' }); for (const item of data) { @@ -93,9 +93,9 @@ export class MemberListLocalRepository extends DexieRepository chatDatabase.members.get($roomIdUserId)) as any; + return liveQuery(() => chatDatabase.members.get($roomIdUserId)); } async getRoomMemberById(roomId: any) { diff --git a/src/app/module/chat/data/repository/member/member-list-remote-repository.service.ts b/src/app/module/chat/data/repository/member/member-list-remote-repository.service.ts index a66f02f2f..ccf5104dd 100644 --- a/src/app/module/chat/data/repository/member/member-list-remote-repository.service.ts +++ b/src/app/module/chat/data/repository/member/member-list-remote-repository.service.ts @@ -4,8 +4,9 @@ import { ValidateSchema } from 'src/app/services/decorators/validate-schema.deco import { HttpService } from 'src/app/services/http.service'; import { DataSourceReturn } from 'src/app/services/Repositorys/type'; import { IMemberRemoteRepository } from 'src/app/core/chat/repository/member/member-remote-repository'; -import { UserRemoveListInputDTO, UserRemoveListInputDTOSchema } from "src/app/module/chat/data/dto/room/userRemoveListInputDTO"; import { AddMemberToRoomInputDTO, AddMemberToRoomInputDTOSchema } from '../../../domain/use-case/member/member-add-use-case.service'; +import { MemberSetAdminDTO } from '../../../domain/use-case/member/member-admin-use-case.service'; +import { UserRemoveListInputDTOSchema, UserRemoveListInputDTO } from '../../../domain/use-case/room/room-leave-by-id-use-case.service'; @Injectable({ providedIn: 'root' }) @@ -27,4 +28,8 @@ export class MemberListRemoteRepository implements IMemberRemoteRepository { return await this.httpService.delete(`${this.baseUrl}/Room/${data.id}/Member`, {members:data.members}); } + async setAmin(data: MemberSetAdminDTO): Promise> { + return await this.httpService.patch(`${this.baseUrl}/Room/${data.roomId}/Member/${data.memberId}/admin`); + } + } diff --git a/src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts b/src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts index b06f381c6..e83955d52 100644 --- a/src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts +++ b/src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts @@ -1,9 +1,7 @@ import { Injectable } from '@angular/core'; -import { MessageDeleteInputDTO } from '../../dto/message/messageDeleteInputDTO'; import { v4 as uuidv4 } from 'uuid' import { InstanceId } from '../../../domain/chat-service.service'; import { MessageUpdateInput } from '../../../domain/use-case/message/message-update-by-id-use-case.service'; -import { MessageOutPutDataDTO } from '../../dto/message/messageOutputDTO'; import { MessageReactionInput } from '../../../domain/use-case/message/message-reaction-by-id-use-case.service'; import { SignalRService } from 'src/app/infra/socket/signalR/signal-r.service'; import { filter, map } from 'rxjs/operators'; @@ -12,6 +10,8 @@ import { IMessageSocketRepository } from 'src/app/core/chat/repository/message/m import { MessageCreateOutPutDataDTO } from '../../../domain/use-case/message/message-create-use-case.service'; import { MessageInputDTO } from 'src/app/core/chat/repository/dto/messageInputDtO' import { MessageMarkAsReadInput } from '../../../domain/use-case/message/message-mark-as-read-use-case.service'; +import { MessageOutPutDataDTO } from 'src/app/core/chat/repository/dto/messageOutputDTO'; +import { MessageDeleteInputDTO } from '../../../domain/use-case/message/message-delete-by-id-live-use-case.service'; interface sendDeliverAt { diff --git a/src/app/module/chat/data/repository/room/room-local-repository.service.ts b/src/app/module/chat/data/repository/room/room-local-repository.service.ts index c993b3692..9abf60e7e 100644 --- a/src/app/module/chat/data/repository/room/room-local-repository.service.ts +++ b/src/app/module/chat/data/repository/room/room-local-repository.service.ts @@ -4,17 +4,18 @@ import { DexieRepository } from 'src/app/infra/repository/dexie/dexie-repository import { from } from 'rxjs'; import { RoomTable, RoomTableSchema } from 'src/app/infra/database/dexie/instance/chat/schema/room'; import { chatDatabase } from 'src/app/infra/database/dexie/service'; +import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; @Injectable({ providedIn: 'root' }) -export class RoomLocalRepository extends DexieRepository { +export class RoomLocalRepository extends DexieRepository implements IRoomLocalRepository { constructor() { super(chatDatabase.room, RoomTableSchema) } - getItemsLive(){ + getItemsLive() { return from (liveQuery(() => chatDatabase.room.toArray())); } diff --git a/src/app/module/chat/data/repository/room/room-remote-repository.service.ts b/src/app/module/chat/data/repository/room/room-remote-repository.service.ts index 1302fec07..901572be2 100644 --- a/src/app/module/chat/data/repository/room/room-remote-repository.service.ts +++ b/src/app/module/chat/data/repository/room/room-remote-repository.service.ts @@ -1,27 +1,24 @@ 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 '../../../domain/use-case/member/member-add-use-case.service'; 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 { 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 { DataSourceReturn } from 'src/app/services/Repositorys/type'; import { SessionStore } from 'src/app/store/session.service'; import { MemberSetAdminDTO } from '../../../domain/use-case/member/member-admin-use-case.service'; import { SignalRService } from 'src/app/infra/socket/signalR/signal-r.service'; import { v4 as uuidv4 } from 'uuid' +import { CreateRoomInputDTOSchema, CreateRoomInputDTO, RoomOutPutDTOSchema, RoomOutPutDTO } from '../../../domain/use-case/room/room-create-use-case.service'; +import { IRoomRemoteRepository } from 'src/app/core/chat/repository/room/room-remote-repository'; +import { RoomByIdInputDTO, RoomByIdInputDTOSchema, RoomByIdOutputDTO, RoomByIdOutputDTOSchema } from 'src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service'; +import { RoomUpdateInputDTO, RoomUpdateInputDTOSchema, RoomUpdateOutputDTO } from 'src/app/module/chat/domain/use-case/room/room-update-by-id-use-case.service'; +import { RoomListOutPutDTO, RoomListOutPutDTOSchema } from '../../../domain/use-case/room/room-get-list-use-case.service'; @Injectable({ providedIn: 'root' }) -export class RoomRemoteDataSourceService { +export class RoomRemoteDataSourceService implements IRoomRemoteRepository { private baseUrl = 'https://gdapi-dev.dyndns.info/stage/api/v2/Chat'; // Your base URL @@ -31,9 +28,9 @@ export class RoomRemoteDataSourceService { ) {} - @ValidateSchema(RoomInputDTOSchema) + @ValidateSchema(CreateRoomInputDTOSchema) @APIReturn(RoomOutPutDTOSchema, 'post/Room') - async createRoom(data: RoomInputDTO): DataSourceReturn { + async createRoom(data: CreateRoomInputDTO): DataSourceReturn { return await this.httpService.post(`${this.baseUrl}/Room`, data); } @@ -61,21 +58,6 @@ export class RoomRemoteDataSourceService { return await this.httpService.delete(`${this.baseUrl}/Room/${id}`, {}); } - @ValidateSchema(AddMemberToRoomInputDTOSchema) - async addMemberToRoom(data: AddMemberToRoomInputDTO): DataSourceReturn { - return await this.httpService.post(`${this.baseUrl}/Room/${data.id}/Member`, { members:data.members }); - } - - - @ValidateSchema(UserRemoveListInputDTOSchema) - async removeMemberFromRoom(data: UserRemoveListInputDTO): Promise> { - return await this.httpService.delete(`${this.baseUrl}/Room/${data.id}/Member`, {members:data.members}); - } - - async setAmin(data: MemberSetAdminDTO): Promise> { - return await this.httpService.patch(`${this.baseUrl}/Room/${data.roomId}/Member/${data.memberId}/admin`); - } - async addMemberToRoomSocket(data: AddMemberToRoomInputDTO) { diff --git a/src/app/module/chat/data/repository/room/room-socket-repository.service.ts b/src/app/module/chat/data/repository/room/room-socket-repository.service.ts index 77dbc39fd..9071513e9 100644 --- a/src/app/module/chat/data/repository/room/room-socket-repository.service.ts +++ b/src/app/module/chat/data/repository/room/room-socket-repository.service.ts @@ -3,9 +3,9 @@ import { SignalRService } from 'src/app/infra/socket/signalR/signal-r.service'; import { filter, map } from 'rxjs/operators'; import { z } from 'zod'; import { SocketMessage } from 'src/app/infra/socket/signalR/signalR'; -import { RoomInputDTO } from '../../dto/room/roomInputDTO'; -import { RoomOutPutDTO } from '../../dto/room/roomOutputDTO'; import { v4 as uuidv4 } from 'uuid' +import { IRoomSocketRepository } from 'src/app/core/chat/repository/room/room-socket-repository'; +import { CreateRoomInputDTO } from '../../../domain/use-case/room/room-create-use-case.service'; const listenToDeleteRoomInputSchema = z.object({ roomId: z.string() @@ -29,14 +29,14 @@ export type ListenToDeleteRoomInput = z.infer({ method: 'CreateGroup', data: { diff --git a/src/app/module/chat/data/repository/typing/user-typing-live-data-source.service.ts b/src/app/module/chat/data/repository/typing/user-typing-live-data-source.service.ts index cc91edd5f..85f372c5b 100644 --- a/src/app/module/chat/data/repository/typing/user-typing-live-data-source.service.ts +++ b/src/app/module/chat/data/repository/typing/user-typing-live-data-source.service.ts @@ -3,12 +3,23 @@ import { SignalRService } from 'src/app/infra/socket/signalR/signal-r.service'; import { SessionStore } from 'src/app/store/session.service'; import { filter, map } from 'rxjs/operators'; import { SocketMessage } from 'src/app/infra/socket/signalR/signalR'; -import { UserTypingDTO } from '../../dto/typing/typingInputDTO'; +import { ITypingRemoteRepository } from 'src/app/core/chat/repository/typing/typing-remote-repository'; +import { z } from "zod" + +export const UserTypingDTOSchema = z.object({ + requestId: z.string(), + roomId: z.string(), + userId: z.number(), + userName: z.string() +}) +export type UserTypingDTO = z.infer + + @Injectable({ providedIn: 'root' }) -export class UserTypingRemoteRepositoryService { +export class UserTypingRemoteRepositoryService implements ITypingRemoteRepository { constructor( private socket: SignalRService diff --git a/src/app/module/chat/data/repository/typing/user-typing-local-data-source.service.ts b/src/app/module/chat/data/repository/typing/user-typing-local-data-source.service.ts index f3cef32cd..e12b71e6e 100644 --- a/src/app/module/chat/data/repository/typing/user-typing-local-data-source.service.ts +++ b/src/app/module/chat/data/repository/typing/user-typing-local-data-source.service.ts @@ -3,16 +3,19 @@ import { z } from 'zod'; import { Dexie, EntityTable, liveQuery, Observable } from 'Dexie'; import { err, ok } from 'neverthrow'; import { chatDatabase } from 'src/app/infra/database/dexie/service'; -import { TypingTable } from 'src/app/infra/database/dexie/instance/chat/schema/typing'; +import { TypingTable, TypingTableSchema } from 'src/app/infra/database/dexie/instance/chat/schema/typing'; +import { ITypingLocalRepository } from 'src/app/core/chat/repository/attachment/attachment-local-repository'; +import { DexieRepository } from 'src/app/infra/repository/dexie/dexie-repository.service'; @Injectable({ providedIn: 'root' }) -export class UserTypingLocalRepository { +export class UserTypingLocalRepository extends DexieRepository implements ITypingLocalRepository { constructor() { + super(chatDatabase.typing, TypingTableSchema) this.clear(); } diff --git a/src/app/module/chat/domain/chat-service.service.ts b/src/app/module/chat/domain/chat-service.service.ts index 2a66024d7..6edfd1ee9 100644 --- a/src/app/module/chat/domain/chat-service.service.ts +++ b/src/app/module/chat/domain/chat-service.service.ts @@ -16,14 +16,14 @@ import { ListenMessageDeleteByRoomIdService } from './use-case/message/listene-m import { ListenMessageUpdateByRoomIdUseCase } from './use-case/message/listen-message-update-by-roomId.service'; import { GetRoomByIdUseCaseService } from './use-case/room/room-get-by-id-use-case.service'; import { DeleteRoomUseCaseService } from './use-case/room/room-delete-by-id-use-case.service'; -import { CreateRoomUseCaseService } from './use-case/room/room-create-use-case.service'; -import { RoomLeaveUseCase } from './use-case/room/room-leave-by-id-use-case.service'; +import { CreateRoomInputDTO, CreateRoomUseCaseService } from './use-case/room/room-create-use-case.service'; +import { RoomLeaveUseCase, UserRemoveListInputDTO } from './use-case/room/room-leave-by-id-use-case.service'; import { SyncAllRoomMessagesService } from './use-case/message/sync-all-room-messages.service'; import { ListenSendMessageUseCase } from './use-case/message/listen-send-message.service' import { SendLocalMessagesUseCaseService } from './use-case/message/messages-send-offline-use-case.service' import { RemoveMemberUseCaseService } from './use-case/member/-use-case.service' import { AddMemberUseCaseService } from './use-case/member/member-add-use-case.service' -import { UpdateRoomByIdUseCaseService } from './use-case/room/room-update-by-id-use-case.service' +import { RoomUpdateInputDTO, UpdateRoomByIdUseCaseService } from './use-case/room/room-update-by-id-use-case.service' import { SocketConnectUseCaseService } from './use-case/socket-connect-use-case.service' import { MessageMarkAsReadUseCaseService } from './use-case/message/message-mark-as-read-use-case.service' import { MessageMarkAllMessageAsReadByRoomIdInputSchema, MessageMarkAllMessageAsReadByRoomIdService } from './use-case/message/message-mark-all-message-as-read-by-room-id.service' @@ -33,10 +33,7 @@ import { filter } from 'rxjs/operators'; import { v4 as uuidv4 } from 'uuid' import { MessageEntity } from '../../../core/chat/entity/message'; import { MessageAttachmentByMessageIdInput, MessageAttachmentByMessageIdUseCase } from './use-case/message/message-attachment-by-message-id.service'; -import { RoomInputDTO } from '../data/dto/room/roomInputDTO'; -import { UserRemoveListInputDTO } from '../data/dto/room/userRemoveListInputDTO'; import { AddMemberToRoomInputDTO, AddMemberToRoomInputDTOSchema } from '../domain/use-case/member/member-add-use-case.service'; -import { RoomUpdateInputDTO } from '../data/dto/room/roomUpdateInputDTO'; import { RoomType } from "src/app/core/chat/entity/group"; import { HttpListenToMessageLoadHistoryAdapter } from './adapter' import { HttpListenToMessageLoadHistoryUseCaseInput } from 'src/app/core/chat/usecase/message/http-listen-to-message-load-history-use-case'; @@ -203,7 +200,7 @@ export class ChatServiceService { return this.DeleteRoomUseCaseService.execute(id) } - createRoom(data: RoomInputDTO) { + createRoom(data: CreateRoomInputDTO) { return this.CreateRoomUseCaseService.execute(data) } diff --git a/src/app/module/chat/domain/mapper/memberLIstMapper.ts b/src/app/module/chat/domain/mapper/memberLIstMapper.ts index afe9c399a..953912f2c 100644 --- a/src/app/module/chat/domain/mapper/memberLIstMapper.ts +++ b/src/app/module/chat/domain/mapper/memberLIstMapper.ts @@ -1,6 +1,6 @@ import { MemberTable } from "src/app/infra/database/dexie/instance/chat/schema/members"; -import { RoomByIdMemberItemOutputDTO } from "../../data/dto/room/roomByIdOutputDTO"; +import { RoomByIdMemberItemOutputDTO } from "../use-case/room/room-get-by-id-use-case.service"; export function MemberListMapper(outputDto: RoomByIdMemberItemOutputDTO, roomId: string): MemberTable { return { diff --git a/src/app/module/chat/domain/mapper/messageMapper.ts b/src/app/module/chat/domain/mapper/messageMapper.ts index f5097e49f..a12487fb6 100644 --- a/src/app/module/chat/domain/mapper/messageMapper.ts +++ b/src/app/module/chat/domain/mapper/messageMapper.ts @@ -1,6 +1,6 @@ -import { MessageInputDTO } from "../../data/dto/message/messageInputDtO"; -import { MessageOutPutDataDTO } from "../../data/dto/message/messageOutputDTO"; +import { MessageInputDTO } from "src/app/core/chat/repository/dto/messageInputDtO"; import { MessageEntity } from "../../../../core/chat/entity/message"; +import { MessageOutPutDataDTO } from "src/app/core/chat/repository/dto/messageOutputDTO"; export class MessageMapper { static toDomain(DTO: MessageOutPutDataDTO) : MessageEntity { 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 index 6e1f4a7a2..ff2f5bdbe 100644 --- 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 @@ -1,7 +1,8 @@ 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/room-remote-repository.service'; +import { MemberListRemoteRepository } from '../../../data/repository/member/member-list-remote-repository.service'; +import { UserRemoveListInputDTO } from '../room/room-leave-by-id-use-case.service'; @Injectable({ providedIn: 'root' @@ -9,13 +10,13 @@ import { RoomRemoteDataSourceService } from '../../../data/repository/room/room- export class RemoveMemberUseCaseService { constructor( - private roomRemoteDataSourceService: RoomRemoteDataSourceService, + private memberRemoteDataSourceService: MemberListRemoteRepository, ) { } @captureAndReraiseAsync('RoomRepositoryService/removeMemberToRoom') async execute(data: UserRemoveListInputDTO) { - const result = await this.roomRemoteDataSourceService.removeMemberFromRoom(data) + const result = await this.memberRemoteDataSourceService.removeMemberFromRoom(data) return result } diff --git a/src/app/module/chat/domain/use-case/member/member-add-use-case.service.ts b/src/app/module/chat/domain/use-case/member/member-add-use-case.service.ts index 1d2a4768b..456e69c77 100644 --- a/src/app/module/chat/domain/use-case/member/member-add-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/member/member-add-use-case.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'; import { captureAndReraiseAsync } from 'src/app/services/decorators/captureAndReraiseAsync'; import { RoomRemoteDataSourceService } from '../../../data/repository/room/room-remote-repository.service'; import { z } from 'zod'; +import { MemberListRemoteRepository } from '../../../data/repository/member/member-list-remote-repository.service'; export const AddMemberToRoomInputDTOSchema = z.object({ @@ -18,7 +19,7 @@ export type AddMemberToRoomInputDTO = z.infer export class MemberAdminUseCaseService { constructor( - public repository: RoomRemoteDataSourceService + public repository: MemberListRemoteRepository ) { } @ValidateSchema(MemberSetAdminDTOSchema) diff --git a/src/app/module/chat/domain/use-case/message/message-create-use-case.service.ts b/src/app/module/chat/domain/use-case/message/message-create-use-case.service.ts index 79a19b2a8..e0698077a 100644 --- a/src/app/module/chat/domain/use-case/message/message-create-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/message/message-create-use-case.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { MessageEntity, MessageEntitySchema, } from '../../../../../core/chat/entity/message'; +import { MessageAttachmentSource, MessageEntity, MessageEntitySchema, } from '../../../../../core/chat/entity/message'; import { AttachmentLocalDataSource } from "src/app/module/chat/data/repository/attachment/attachment-local-repository.service"; import { z } from 'zod'; import { v4 as uuidv4 } from 'uuid'; @@ -7,7 +7,6 @@ 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, MessageOutPutDataDTO } from '../../../data/dto/message/messageOutputDTO'; import { MessageLocalDataSourceService } from '../../../data/repository/message/message-local-data-source.service'; import { MessageSocketRepositoryService } from '../../../data/repository/message/message-live-signalr-data-source.service'; import { err, Result } from 'neverthrow'; @@ -17,7 +16,7 @@ import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelem import { MemberListLocalRepository } from 'src/app/module/chat/data/repository/member/member-list-local-repository.service' import { SessionStore } from 'src/app/store/session.service'; import { MessageTable } from 'src/app/infra/database/dexie/instance/chat/schema/message'; -import { MessageAttachmentFileType } from 'src/app/core/chat/repository/dto/messageOutputDTO'; +import { MessageAttachmentFileType, MessageOutPutDataDTO } from 'src/app/core/chat/repository/dto/messageOutputDTO'; export enum MessageEnum { diff --git a/src/app/module/chat/domain/use-case/message/message-delete-by-id-live-use-case.service.ts b/src/app/module/chat/domain/use-case/message/message-delete-by-id-live-use-case.service.ts index 61f6d162d..38ed7cd07 100644 --- a/src/app/module/chat/domain/use-case/message/message-delete-by-id-live-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/message/message-delete-by-id-live-use-case.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'; import { z } from 'zod'; import { MessageSocketRepositoryService } from '../../../data/repository/message/message-live-signalr-data-source.service'; import { XTracerAsync, TracingType } from 'src/app/services/monitoring/opentelemetry/tracer'; + export const MessageDeleteInputDTOSchema = z.object({ requestId: z.string().optional(), roomId: z.string(), diff --git a/src/app/module/chat/domain/use-case/message/messages-send-offline-use-case.service.ts b/src/app/module/chat/domain/use-case/message/messages-send-offline-use-case.service.ts index df0d97184..658633511 100644 --- a/src/app/module/chat/domain/use-case/message/messages-send-offline-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/message/messages-send-offline-use-case.service.ts @@ -10,8 +10,8 @@ import { MemberListLocalRepository } from 'src/app/module/chat/data/repository/m import { Result } from 'neverthrow'; import { RoomType } from 'src/app/core/chat/entity/group'; import { SessionStore } from 'src/app/store/session.service'; -import { MessageOutPutDataDTO } from '../../../data/dto/message/messageOutputDTO'; import { MessageTable } from 'src/app/infra/database/dexie/instance/chat/schema/message'; +import { MessageOutPutDataDTO } from 'src/app/core/chat/repository/dto/messageOutputDTO'; @Injectable({ providedIn: 'root' diff --git a/src/app/module/chat/domain/use-case/room/room-create-use-case.service.ts b/src/app/module/chat/domain/use-case/room/room-create-use-case.service.ts index 600eef630..0868c8864 100644 --- a/src/app/module/chat/domain/use-case/room/room-create-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/room/room-create-use-case.service.ts @@ -13,10 +13,23 @@ export const CreateRoomInputDTOSchema = z.object({ expirationDate: z.string().nullable().optional(), members: z.array(z.number()) }); - - export type CreateRoomInputDTO = z.infer + +export const RoomOutPutDTOSchema = z.object({ + success: z.boolean(), + message: z.string(), + data: z.object({ + id: z.string(), + roomName: z.string(), + createdBy: z.any().nullable(), + createdAt: z.string(), + expirationDate: z.string().nullable(), + roomType: z.any() + }) +}); +export type RoomOutPutDTO = z.infer + @Injectable({ providedIn: 'root' }) diff --git a/src/app/module/chat/domain/use-case/room/room-delete-by-id-use-case.service.ts b/src/app/module/chat/domain/use-case/room/room-delete-by-id-use-case.service.ts index 27ddbc449..0c0fdef13 100644 --- a/src/app/module/chat/domain/use-case/room/room-delete-by-id-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/room/room-delete-by-id-use-case.service.ts @@ -1,9 +1,13 @@ 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/room-remote-repository.service'; import { RoomLocalRepository } from '../../../data/repository/room/room-local-repository.service'; +import { z } from "zod"; + +export const DeleteRoomByIdInputDTOSchema = z.string() +export type DeleteRoomByIdInputDTO = z.infer + @Injectable({ providedIn: 'root' @@ -18,7 +22,7 @@ export class DeleteRoomUseCaseService { @captureAndReraiseAsync('RoomRepositoryService/deleteRoomById') - async execute(id: RoomByIdInputDTO) { + async execute(id: DeleteRoomByIdInputDTO) { const result = await this.roomRemoteDataSourceService.deleteRoom(id) if(result.isOk()) { diff --git a/src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service.ts b/src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service.ts index a51b60aee..f2fb95e13 100644 --- a/src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/room/room-get-by-id-use-case.service.ts @@ -8,6 +8,45 @@ import { RoomLocalRepository } from '../../../data/repository/room/room-local-re import { MemberListLocalRepository } from '../../../data/repository/member/member-list-local-repository.service'; import { MemberListMapper } from '../../mapper/memberLIstMapper'; import { captureAndReraiseAsync } from 'src/app/services/decorators/captureAndReraiseAsync'; +import { z } from 'zod'; + +const UserSchema = z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string().nullable(), +}); + +const MemberSchema = z.object({ + id: z.string(), + user: UserSchema, + joinAt: z.string(), + isAdmin: z.boolean() +}); + +export const RoomByIdOutputDTOSchema = z.object({ + success: z.boolean(), + message: z.string(), + data: z.object({ + id: z.string(), + roomName: z.string(), + createdBy: UserSchema, + createdAt: z.string(), + expirationDate: z.string().nullable(), + roomType: z.number(), + members: z.array(MemberSchema), + }), +}) + +export type RoomByIdMemberItemOutputDTO = z.infer +export type RoomByIdOutputDTO = z.infer + + + +export const RoomByIdInputDTOSchema = z.string() + + +export type RoomByIdInputDTO = z.infer @Injectable({ providedIn: 'root' diff --git a/src/app/module/chat/domain/use-case/room/room-get-list-use-case.service.ts b/src/app/module/chat/domain/use-case/room/room-get-list-use-case.service.ts index 43df95e5c..569ccc96b 100644 --- a/src/app/module/chat/domain/use-case/room/room-get-list-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/room/room-get-list-use-case.service.ts @@ -4,6 +4,42 @@ import { RoomRemoteDataSourceService } from '../../../data/repository/room/room- import { RoomLocalRepository } from '../../../data/repository/room/room-local-repository.service'; import { captureAndReraiseAsync } from 'src/app/services/decorators/captureAndReraiseAsync'; import { CronJobService } from 'src/app/utils/task-scheduler' +import { z } from "zod"; + + +const CreatedBySchema = z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string().email(), + userPhoto: z.string().nullable()// api check +}); + +const RoomListItemOutPutDTOSchema = z.object({ + + chatRoom: z.object({ + id: z.string(), + roomName: z.string(), + createdBy: CreatedBySchema, + createdAt: z.string(), + expirationDate: z.string().nullable(), // api check + roomType: z.number() + }), + joinAt: z.string() +}) + + +// Define the schema for the entire response +export const RoomListOutPutDTOSchema = z.object({ + success: z.boolean(), + message: z.string(), + data: z.array(RoomListItemOutPutDTOSchema), +}); + +export type RoomListItemOutPutDTO = z.infer + +export type RoomListOutPutDTO = z.infer + + @Injectable({ providedIn: 'root' }) diff --git a/src/app/module/chat/domain/use-case/room/room-leave-by-id-use-case.service.ts b/src/app/module/chat/domain/use-case/room/room-leave-by-id-use-case.service.ts index 88c33ebac..42253064d 100644 --- a/src/app/module/chat/domain/use-case/room/room-leave-by-id-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/room/room-leave-by-id-use-case.service.ts @@ -1,8 +1,17 @@ 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/room-remote-repository.service'; import { RoomLocalRepository } from '../../../data/repository/room/room-local-repository.service'; +import { MemberListRemoteRepository } from '../../../data/repository/member/member-list-remote-repository.service'; +import { z } from "zod"; + +// Define the schema for the entire response +export const UserRemoveListInputDTOSchema = z.object({ + id: z.string(), + members: z.array(z.number()) +}); + +export type UserRemoveListInputDTO = z.infer + @Injectable({ providedIn: 'root' @@ -10,14 +19,14 @@ import { RoomLocalRepository } from '../../../data/repository/room/room-local-re export class RoomLeaveUseCase { constructor( - private roomRemoteDataSourceService: RoomRemoteDataSourceService, + private memberRemoteDataSourceService: MemberListRemoteRepository, private roomLocalDataSourceService: RoomLocalRepository, ) { } async execute(data: UserRemoveListInputDTO) { - const result = await this.roomRemoteDataSourceService.removeMemberFromRoom(data) + const result = await this.memberRemoteDataSourceService.removeMemberFromRoom(data) if(result.isOk()) { this.roomLocalDataSourceService.delete(data.id) diff --git a/src/app/module/chat/domain/use-case/room/room-update-by-id-use-case.service.ts b/src/app/module/chat/domain/use-case/room/room-update-by-id-use-case.service.ts index 9ce515560..bb02bb9f3 100644 --- a/src/app/module/chat/domain/use-case/room/room-update-by-id-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/room/room-update-by-id-use-case.service.ts @@ -1,8 +1,45 @@ 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/room-remote-repository.service'; import { RoomLocalRepository } from '../../../data/repository/room/room-local-repository.service'; +import { z } from "zod"; + +export const RoomUpdateInputDTOSchema = z.object({ + roomName: z.string(), + roomId: z.string(), + roomType: z.number(), +}); +export type RoomUpdateInputDTO = z.infer + + + +const UserSchema = z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string().nullable(), +}); +const MemberSchema = z.object({ + id: z.string(), + user: UserSchema, + joinAt: z.string(), +}); + +export const RoomUpdateOutputDTOSchema = z.object({ + success: z.boolean(), + message: z.string(), + data: z.object({ + id: z.string(), + roomName: z.string(), + createdBy: UserSchema, + createdAt: z.string(), + expirationDate: z.string().nullable(), + roomType: z.number(), + members: z.array(MemberSchema), + }), +}); +export type RoomUpdateOutputDTO = z.infer + @Injectable({ providedIn: 'root' diff --git a/src/app/module/chat/domain/use-case/socket/socket-message-update-use-case.service.ts b/src/app/module/chat/domain/use-case/socket/socket-message-update-use-case.service.ts index 3093d90c8..2975bb71b 100644 --- a/src/app/module/chat/domain/use-case/socket/socket-message-update-use-case.service.ts +++ b/src/app/module/chat/domain/use-case/socket/socket-message-update-use-case.service.ts @@ -1,11 +1,11 @@ import { Injectable } from '@angular/core'; import { MessageLocalDataSourceService } from '../../../data/repository/message/message-local-data-source.service'; -import { MessageOutPutDataDTO, MessageOutPutDataDTOSchema } from '../../../data/dto/message/messageOutputDTO'; import { ParamsValidation, SafeValidateSchema, ValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; import { MessageEntitySchema } from 'src/app/core/chat/entity/message'; import { z } from 'zod'; import { MessageTable } from 'src/app/infra/database/dexie/instance/chat/schema/message'; +import { MessageOutPutDataDTOSchema } from 'src/app/core/chat/repository/dto/messageOutputDTO'; const SocketMessageUpdateOutputSchema = MessageEntitySchema.pick({ diff --git a/src/app/ui/chat/chat.module.ts b/src/app/ui/chat/chat.module.ts index a89c67b48..8593b0b8a 100644 --- a/src/app/ui/chat/chat.module.ts +++ b/src/app/ui/chat/chat.module.ts @@ -20,6 +20,7 @@ import { GroupMessagesPageModule } from './component/group-messages/group-messag import { MessagesPageModule } from './component/messages/messages.module'; import { ContactsPageModule } from './component/contacts/contacts.module'; import { NewGroupPageModule } from './component/new-group/new-group.module'; +import { ChatModule } from 'src/app/module/chat/chat.module'; @NgModule({ imports: [ @@ -40,6 +41,7 @@ import { NewGroupPageModule } from './component/new-group/new-group.module'; NewEventPageModule, ImageCropperModule, AttendeeModalPageModule, + ChatModule ], declarations: [ ChatPage diff --git a/src/app/ui/chat/chat.page.ts b/src/app/ui/chat/chat.page.ts index 28eb5e041..1d12e244a 100644 --- a/src/app/ui/chat/chat.page.ts +++ b/src/app/ui/chat/chat.page.ts @@ -14,7 +14,6 @@ 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/repository/room-memory-data-source'; -import { RoomListOutPutDTO } from 'src/app/module/chat/data/dto/room/roomListOutputDTO'; import { Observable as DexieObservable } from 'Dexie'; import { EditGroupPage } from './modal/edit-group/edit-group.page'; diff --git a/src/app/ui/chat/component/messages/messages.page.ts b/src/app/ui/chat/component/messages/messages.page.ts index 2a0ae0b71..cbe4b5b47 100644 --- a/src/app/ui/chat/component/messages/messages.page.ts +++ b/src/app/ui/chat/component/messages/messages.page.ts @@ -26,8 +26,7 @@ import { RoomLocalRepository } from 'src/app/module/chat/data/repository/room/ro import { MemberListLocalRepository } from 'src/app/module/chat/data/repository/member/member-list-local-repository.service' import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service'; import { EditMessagePage } from 'src/app/modals/edit-message/edit-message.page'; -import { MessageEntity } from 'src/app/core/chat/entity/message'; -import { MessageAttachmentFileType, MessageAttachmentSource } from 'src/app/module/chat/data/dto/message/messageOutputDTO'; +import { MessageAttachmentFileType, MessageAttachmentSource, MessageEntity } from 'src/app/core/chat/entity/message'; import { JSFileToDataUrl } from 'src/app/utils/ToBase64'; import { CameraService } from 'src/app/infra/camera/camera.service' import { FilePickerWebService } from 'src/app/infra/file-picker/web/file-picker-web.service' diff --git a/src/app/ui/chat/modal/messages/messages.page.ts b/src/app/ui/chat/modal/messages/messages.page.ts index 3e620c290..3ef66988c 100644 --- a/src/app/ui/chat/modal/messages/messages.page.ts +++ b/src/app/ui/chat/modal/messages/messages.page.ts @@ -22,13 +22,11 @@ import { ViewMediaPage } from 'src/app/modals/view-media/view-media.page'; import { Observable as DexieObservable } from 'Dexie'; import { Subscription } from 'rxjs'; import { MessageTable } from 'src/app/infra/database/dexie/instance/chat/schema/message'; -import { RoomListItemOutPutDTO } from 'src/app/module/chat/data/dto/room/roomListOutputDTO'; import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service'; import { EditMessagePage } from 'src/app/modals/edit-message/edit-message.page'; -import { MessageEntity } from 'src/app/core/chat/entity/message'; +import { MessageAttachmentFileType, MessageAttachmentSource, MessageEntity } from 'src/app/core/chat/entity/message'; import { MemberTable } from 'src/app/infra/database/dexie/instance/chat/schema/members'; import { TypingTable } from 'src/app/infra/database/dexie/instance/chat/schema/typing'; -import { MessageAttachmentFileType, MessageAttachmentSource } from 'src/app/module/chat/data/dto/message/messageOutputDTO'; import { compressImageBase64 } from 'src/app/utils/imageCompressore'; import { FilePickerService } from 'src/app/infra/file-picker/file-picker.service' import { RecordingData } from 'capacitor-voice-recorder'; diff --git a/src/app/ui/chat/store/model/message.ts b/src/app/ui/chat/store/model/message.ts index 7fdc79e4b..a14a2efae 100644 --- a/src/app/ui/chat/store/model/message.ts +++ b/src/app/ui/chat/store/model/message.ts @@ -1,6 +1,5 @@ import { SafeResourceUrl } from "@angular/platform-browser"; -import { MessageAttachmentFileType, MessageAttachmentSource } from "src/app/module/chat/data/dto/message/messageOutputDTO"; -import { MessageEntity } from "src/app/core/chat/entity/message"; +import { MessageAttachmentFileType, MessageAttachmentSource, MessageEntity } from "src/app/core/chat/entity/message"; export class MessageViewModal { $id!: number diff --git a/src/app/ui/chat/utils/lastMessage.ts b/src/app/ui/chat/utils/lastMessage.ts index e24646a01..a394a688f 100644 --- a/src/app/ui/chat/utils/lastMessage.ts +++ b/src/app/ui/chat/utils/lastMessage.ts @@ -1,5 +1,4 @@ -import { MessageAttachmentFileType, MessageAttachmentSource } from "src/app/module/chat/data/dto/message/messageOutputDTO"; -import { MessageEntity } from "src/app/core/chat/entity/message"; +import { MessageAttachmentFileType, MessageAttachmentSource, MessageEntity } from "src/app/core/chat/entity/message"; import { SessionStore } from "src/app/store/session.service"; export const LastMessage = new MessageEntity()