Files
doneit-web/src/app/module/chat/domain/use-case/message-create-use-case.service.ts
T

145 lines
4.9 KiB
TypeScript
Raw Normal View History

import { Injectable } from '@angular/core';
2024-08-15 14:29:11 +01:00
import { MessageEntity, MessageEntitySchema, } from '../entity/message';
2024-08-18 15:40:43 +01:00
import { AttachmentLocalDataSource } from "src/app/module/chat/data/repository/attachment-local-repository.service";
2024-08-16 14:21:01 +01:00
import { z } from 'zod';
import { v4 as uuidv4 } from 'uuid';
2024-08-13 10:52:35 +01:00
import { InstanceId } from '../chat-service.service';
2024-08-13 17:05:46 +01:00
import { createDataURL } from 'src/app/utils/ToBase64';
2024-08-15 14:29:11 +01:00
import { zodSafeValidation } from 'src/app/utils/zodValidation';
2024-08-16 12:24:26 +01:00
import { Logger } from 'src/app/services/logger/main/service';
2024-08-18 13:27:57 +01:00
import { MessageAttachmentSource, MessageOutPutDataDTO } from '../../data/dto/message/messageOutputDTO';
2024-08-19 16:01:58 +01:00
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';
2024-08-18 13:27:57 +01:00
import { MessageTable } from '../../infra/database/dexie/schema/message';
import { MessageMapper } from '../mapper/messageMapper';
import { SignalRService } from '../../infra/socket/signal-r.service';
2024-08-19 16:45:29 +01:00
import { RoomType } from "src/app/module/chat/domain/entity/group";
const MessageInputUseCaseSchema = z.object({
memberId: z.number(),
roomId: z.string(),
message: z.string()
})
2024-08-19 16:01:58 +01:00
export enum MessageEnum {
Direct = 1,
group = 2
}
export type MessageInputUseCase = z.infer< typeof MessageInputUseCaseSchema>
@Injectable({
providedIn: 'root'
})
export class MessageCreateUseCaseService {
constructor(
2024-08-18 15:40:43 +01:00
private AttachmentLocalRepositoryService: AttachmentLocalDataSource,
2024-08-18 13:27:57 +01:00
private messageLocalDataSourceService: MessageLocalDataSourceService,
private messageLiveSignalRDataSourceService: SignalRService,
2024-08-19 16:01:58 +01:00
private messageSocketRepositoryService: MessageSocketRepositoryService
) { }
2024-08-19 16:45:29 +01:00
async execute(message: MessageEntity, messageEnum: RoomType) {
2024-08-15 14:29:11 +01:00
const validation = zodSafeValidation<MessageEntity>(MessageEntitySchema, message)
2024-08-15 14:29:11 +01:00
if(validation.isOk()) {
message.sendAttemp++;
2024-08-13 10:52:35 +01:00
2024-08-15 14:29:11 +01:00
message.requestId = InstanceId +'@'+ uuidv4();
2024-08-13 17:05:46 +01:00
2024-08-18 13:27:57 +01:00
const createMessageLocally = await this.messageLocalDataSourceService.sendMessage(message)
2024-08-14 15:29:16 +01:00
2024-08-15 14:29:11 +01:00
if(createMessageLocally.isOk()) {
2024-08-18 13:27:57 +01:00
message.$id = createMessageLocally.value
2024-08-15 14:29:11 +01:00
if(message.hasAttachment) {
2024-08-14 15:29:16 +01:00
2024-08-15 14:29:11 +01:00
for (const attachment of message.attachments) {
2024-08-16 12:24:26 +01:00
if(attachment.source != MessageAttachmentSource.Webtrix) {
2024-08-18 15:40:43 +01:00
this.AttachmentLocalRepositoryService.insert({
2024-08-18 13:27:57 +01:00
$messageId: createMessageLocally.value,
2024-08-17 22:05:57 +01:00
file: createDataURL(attachment.file, attachment.mimeType),
fileType: attachment.fileType,
source: attachment.source,
fileName: attachment.fileName,
applicationId: attachment.applicationId,
docId: attachment.docId,
mimeType: attachment.mimeType,
2024-08-16 12:24:26 +01:00
}).then((e) => {
if(e.isErr()) {
Logger.error('failed to create attachment locally on send message', {
error: e.error,
data: createDataURL(attachment.file, attachment.mimeType).slice(0, 100) +'...'
})
}
})
2024-08-15 14:29:11 +01:00
2024-08-16 12:24:26 +01:00
attachment.safeFile = createDataURL(attachment.file, attachment.mimeType)
}
2024-08-15 14:29:11 +01:00
}
2024-08-13 17:05:46 +01:00
}
2024-08-14 15:29:16 +01:00
2024-08-18 13:27:57 +01:00
//====================
message.sending = true
const DTO = MessageMapper.fromDomain(message, message.requestId)
2024-08-19 16:01:58 +01:00
let sendMessageResult: Result<MessageOutPutDataDTO, any>
2024-08-19 16:45:29 +01:00
if(messageEnum == RoomType.Group) {
2024-08-19 16:01:58 +01:00
sendMessageResult = await this.messageLiveSignalRDataSourceService.sendMessage<MessageOutPutDataDTO>(DTO)
} else {
sendMessageResult = await this.messageSocketRepositoryService.sendDirectMessage(DTO)
}
2024-08-18 13:27:57 +01:00
// return this sendMessageResult
2024-08-15 14:29:11 +01:00
2024-08-18 13:27:57 +01:00
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
}
2024-08-19 16:01:58 +01:00
this.messageLocalDataSourceService.update(message.$id, {...clone, sending: false, roomId: message.roomId})
return sendMessageResult
2024-08-18 13:27:57 +01:00
} else {
2024-08-16 12:24:26 +01:00
Logger.error('failed to send message to the server', {
2024-08-18 13:27:57 +01:00
error: sendMessageResult.error
2024-08-16 12:24:26 +01:00
})
2024-08-18 13:27:57 +01:00
await this.messageLocalDataSourceService.update(message.$id, {sending: false, $id: message.$id})
return err('no connection')
2024-08-15 14:29:11 +01:00
}
2024-08-18 13:27:57 +01:00
2024-08-14 15:29:16 +01:00
}
2024-08-15 14:29:11 +01:00
} else {
if(validation.error.formErrors.fieldErrors.attachments) {
2024-08-16 12:24:26 +01:00
Logger.error('failed to send message doe to invalid attachment', {
zodErrorList: validation.error.errors,
data: message.attachments
})
2024-08-15 14:29:11 +01:00
}
2024-08-13 17:05:46 +01:00
}
}
}