projeto-hit/backend/src/services/MessageServices/CreateMessageService.ts

78 lines
1.9 KiB
TypeScript

import AppError from "../../errors/AppError";
import { updateTicketCacheByTicketId } from "../../helpers/TicketCache";
import { getIO } from "../../libs/socket";
import Message from "../../models/Message";
import Ticket from "../../models/Ticket";
interface MessageData {
id: string;
ticketId: number;
body: string;
contactId?: number;
fromMe?: boolean;
read?: boolean;
mediaType?: string;
mediaUrl?: string;
fromAgent?: boolean;
}
interface Request {
messageData: MessageData;
}
const CreateMessageService = async ({
messageData
}: Request): Promise<Message> => {
try {
await Message.upsert(messageData);
const message = await Message.findByPk(messageData.id, {
include: [
"contact",
{
model: Ticket,
as: "ticket",
include: ["contact", "queue"]
},
{
model: Message,
as: "quotedMsg",
include: ["contact"]
}
]
});
if (!message) {
throw new Error("ERR_CREATING_MESSAGE");
}
if (message.ticket.status != "queueChoice") {
await updateTicketCacheByTicketId(message.ticket.id, {
lastMessage: message.body,
updatedAt: new Date(message.ticket.updatedAt).toISOString(),
"contact.profilePicUrl": message.ticket.contact.profilePicUrl,
unreadMessages: message.ticket.unreadMessages
});
const io = getIO();
io.to(message.ticketId.toString())
.to(message.ticket.status)
.to("notification")
.emit("appMessage", {
action: "create",
message,
ticket: message.ticket,
contact: message.ticket.contact
});
}
return message;
} catch (error: any) {
console.error("===> Error on CreateMessageService.ts file: \n", error);
throw new AppError(error.message);
}
};
export default CreateMessageService;