add interface

This commit is contained in:
Peter Maquiran
2024-08-27 20:29:57 +01:00
parent 6c0a15fb7c
commit ee30dd2d5b
43 changed files with 470 additions and 221 deletions
+14 -1
View File
@@ -1,7 +1,20 @@
import { z } from "zod";
import { MessageAttachmentFileType, MessageAttachmentSource } from "../../../module/chat/data/dto/message/messageOutputDTO";
import { base64Schema } from "src/app/utils/zod";
export enum MessageAttachmentSource {
Webtrix = 1,
Device,
}
export enum MessageAttachmentFileType {
Doc = 1,
Image ,
Audio ,
Video
}
export const MessageEntitySchema = z.object({
$id: z.any().optional(),
id: z.string().optional(),
@@ -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<AttachmentTable, AttachmentTable> {
}
@@ -0,0 +1,6 @@
import { DataSourceReturn } from "src/app/services/Repositorys/type";
import { IMessageGetAllByRoomIdOutPut } from "../../usecase/message/message-get-all-by-room-Id";
export abstract class IAttachmentRemoteRepository {
abstract getAttachment(id: string | number): DataSourceReturn<Blob>
}
@@ -0,0 +1,27 @@
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<typeof MessageInputDTOSchema>
@@ -0,0 +1,53 @@
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<typeof MessageOutPutDataDTOSchema>
@@ -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 IMemberLocalRepository extends DexieRepository<AttachmentTable, AttachmentTable> {
}
@@ -0,0 +1,10 @@
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";
export abstract class IMemberRemoteRepository {
abstract addMemberToRoom(data: AddMemberToRoomInputDTO): DataSourceReturn<AddMemberToRoomInputDTO>
abstract removeMemberFromRoom(data: UserRemoveListInputDTO): Promise<Result<any ,any>>
}
@@ -0,0 +1,11 @@
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';
export abstract class IMessageLocalRepository extends DexieRepository<MessageTable, MessageEntity> {
abstract setAllSenderToFalse(): void
abstract getItems(roomId: string): PromiseExtended<MessageEntity[]>
abstract getItemsLive(roomId: string): DexieObservable<MessageEntity[]>
abstract getOfflineMessages(): Promise<MessageEntity[]>
}
@@ -0,0 +1,6 @@
import { DataSourceReturn } from "src/app/services/Repositorys/type";
import { IMessageGetAllByRoomIdOutPut } from "../../usecase/message/message-get-all-by-room-Id";
export abstract class IMessageRemoteRepository {
abstract getMessagesFromRoom(id: string): DataSourceReturn<IMessageGetAllByRoomIdOutPut>
}
@@ -0,0 +1,29 @@
import { HubConnection } from "@microsoft/signalr";
import { Result } from "neverthrow";
import { MessageInputDTO } from '../dto/messageInputDtO'
import { MessageCreateOutPutDataDTO } from "src/app/module/chat/domain/use-case/message/message-create-use-case.service";
import { MessageMarkAsReadInput } from "src/app/module/chat/domain/use-case/message/message-mark-as-read-use-case.service";
import { MessageDeleteInputDTO } from "src/app/module/chat/domain/use-case/message/message-delete-by-id-live-use-case.service";
import { MessageOutPutDataDTO } from "../dto/messageOutputDTO";
import { Observable } from "rxjs";
import { MessageReactionInput } from "src/app/module/chat/domain/use-case/message/message-reaction-by-id-use-case.service";
import { MessageUpdateInput } from "src/app/module/chat/domain/use-case/message/message-update-by-id-use-case.service";
export abstract class IMessageSocketRepository {
abstract connect(): Promise<Result<HubConnection, false>>
abstract sendGroupMessage(data: MessageInputDTO): Promise<Result<MessageCreateOutPutDataDTO, any>>
abstract sendDirectMessage(data: MessageInputDTO): Promise<Result<MessageCreateOutPutDataDTO, any>>
// abstract sendDeliverAt(): Promise<Result<any, any>>
abstract sendReadAt(data: MessageMarkAsReadInput): Promise<Result<any, any>>
abstract sendDelete(data: MessageDeleteInputDTO): Promise<Result<any, any>>
abstract listenToMessages(): Observable<MessageOutPutDataDTO>
abstract listenToDeleteMessages(): Observable<MessageOutPutDataDTO>
abstract listenToUpdateMessages(): Observable<MessageOutPutDataDTO>
abstract reactToMessageSocket(data: MessageReactionInput): void
abstract updateMessage(input: MessageUpdateInput): void
abstract sendMessageDelete(data: MessageDeleteInputDTO): Promise<Result<any, any>>
}
@@ -1,17 +1,16 @@
import { HttpErrorResponse } from "@angular/common/http";
import { Injectable } from "@angular/core";
import { Result } from "neverthrow";
import { Observable } from "rxjs";
import { filter, map } from "rxjs/operators";
import { HttpAdapter } from "src/app/infra/http/adapter";
import { MessageOutPutDTO } from "src/app/module/chat/data/dto/message/messageOutputDTO";
import { z } from "zod";
import { IMessageGetAllByRoomIdOutPut } from "./message-get-all-by-room-Id";
const HttpListenToMessageLoadHistoryUseCaseInputSchema = z.object({
roomId: z.string()
})
export type HttpListenToMessageLoadHistoryUseCaseInput = z.infer<typeof HttpListenToMessageLoadHistoryUseCaseInputSchema>
export type HttpListenToMessageLoadHistoryUseCaseInput = z.infer<typeof HttpListenToMessageLoadHistoryUseCaseInputSchema>
@Injectable({
providedIn: 'root'
@@ -22,13 +21,13 @@ export class HttpListenToMessageLoadHistoryUseCase{
private http: HttpAdapter
) {}
execute(input: HttpListenToMessageLoadHistoryUseCaseInput): Observable<MessageOutPutDTO> {
execute(input: HttpListenToMessageLoadHistoryUseCaseInput): Observable<IMessageGetAllByRoomIdOutPut> {
return this.http.listen().pipe(
filter((response)=> response.isOk()),
filter((response: any)=> {
return response.value.url.includes(`Room/${input.roomId}/Messages`)
}),
map((response: any) => response.value.data as MessageOutPutDTO)
map((response: any) => response.value.data as IMessageGetAllByRoomIdOutPut)
)
}
}
}
@@ -0,0 +1,64 @@
import { HttpErrorResponse } from "@angular/common/http";
import { Injectable } from "@angular/core";
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";
export const MessageGetAllByRoomIdUseCaseOutputSchema = z.object({
success: z.boolean(),
message: z.string(),
data: z.object({
id: z.string(),
roomId: z.string(),
sender: z.object({
wxUserId: z.number(),
wxFullName: z.string(),
wxeMail: z.string(),
userPhoto: z.string().nullable().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()
}))
}).array()
})
export type IMessageGetAllByRoomIdOutPut = z.infer<typeof MessageGetAllByRoomIdUseCaseOutputSchema>
@Injectable({
providedIn: 'root'
})
export class MessageGetAllByRoomIdUseCase{
constructor(
private http: HttpAdapter
) {}
execute(input: any) {}
}