119 lines
3.3 KiB
JavaScript
119 lines
3.3 KiB
JavaScript
const client = require("../graphql-client/graphql-client").client;
|
|
const { UPDATE_MESSAGE_STATUS, MARK_MESSAGES_AS_READ } = require("../graphql-client/queries");
|
|
const logger = require("../utils/logger");
|
|
|
|
/**
|
|
* Handle the status of an SMS message
|
|
* @param req
|
|
* @param res
|
|
* @returns {Promise<*>}
|
|
*/
|
|
const status = async (req, res) => {
|
|
const { SmsSid, SmsStatus } = req.body;
|
|
const {
|
|
ioRedis,
|
|
ioHelpers: { getBodyshopRoom, getBodyshopConversationRoom }
|
|
} = req;
|
|
|
|
try {
|
|
// Ignore status 'queued'
|
|
if (SmsStatus === "queued") {
|
|
return res.status(200).json({ message: "Status 'queued' disregarded." });
|
|
}
|
|
|
|
// Update message status in the database
|
|
const response = await client.request(UPDATE_MESSAGE_STATUS, {
|
|
msid: SmsSid,
|
|
fields: { status: SmsStatus }
|
|
});
|
|
|
|
const message = response.update_messages.returning[0];
|
|
|
|
if (message) {
|
|
logger.log("sms-status-update", "DEBUG", "api", null, {
|
|
msid: SmsSid,
|
|
fields: { status: SmsStatus }
|
|
});
|
|
|
|
// Emit WebSocket event to notify the change in message status
|
|
const conversationRoom = getBodyshopConversationRoom({
|
|
bodyshopId: message.conversation.bodyshopid,
|
|
conversationId: message.conversationid
|
|
});
|
|
|
|
ioRedis.to(conversationRoom).emit("message-changed", {
|
|
...message,
|
|
status: SmsStatus,
|
|
type: "status-changed"
|
|
});
|
|
} else {
|
|
logger.log("sms-status-update-warning", "WARN", "api", null, {
|
|
msid: SmsSid,
|
|
fields: { status: SmsStatus },
|
|
warning: "No message returned from the database update."
|
|
});
|
|
}
|
|
|
|
res.sendStatus(200);
|
|
} catch (error) {
|
|
logger.log("sms-status-update-error", "ERROR", "api", null, {
|
|
msid: SmsSid,
|
|
fields: { status: SmsStatus },
|
|
stack: error.stack,
|
|
message: error.message
|
|
});
|
|
res.status(500).json({ error: "Failed to update message status." });
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Mark a conversation as read
|
|
* @param req
|
|
* @param res
|
|
* @returns {Promise<*>}
|
|
*/
|
|
const markConversationRead = async (req, res) => {
|
|
const {
|
|
ioRedis,
|
|
ioHelpers: { getBodyshopRoom, getBodyshopConversationRoom }
|
|
} = req;
|
|
const { conversation, imexshopid, bodyshopid } = req.body;
|
|
|
|
// Alternatively, support both payload formats
|
|
const conversationId = conversation?.id || req.body.conversationId;
|
|
|
|
if (!conversationId || !imexshopid || !bodyshopid) {
|
|
return res.status(400).json({ error: "Invalid conversation data provided." });
|
|
}
|
|
|
|
try {
|
|
const response = await client.request(MARK_MESSAGES_AS_READ, {
|
|
conversationId
|
|
});
|
|
|
|
const updatedMessageIds = response.update_messages.returning.map((message) => message.id);
|
|
|
|
const broadcastRoom = getBodyshopRoom(bodyshopid);
|
|
|
|
ioRedis.to(broadcastRoom).emit("conversation-changed", {
|
|
type: "conversation-marked-read",
|
|
conversationId,
|
|
affectedMessages: response.update_messages.affected_rows,
|
|
messageIds: updatedMessageIds
|
|
});
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
message: "Conversation marked as read."
|
|
});
|
|
} catch (error) {
|
|
console.error("Error marking conversation as read:", error);
|
|
res.status(500).json({ error: "Failed to mark conversation as read." });
|
|
}
|
|
};
|
|
|
|
module.exports = {
|
|
status,
|
|
markConversationRead
|
|
};
|