78 lines
1.9 KiB
TypeScript
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;
|