const path = require("path"); require("dotenv").config({ path: path.resolve(process.cwd(), `.env.${process.env.NODE_ENV || "development"}`) }); const client = require("../graphql-client/graphql-client").client; const queries = require("../graphql-client/queries"); const logger = require("../utils/logger"); exports.status = async (req, res) => { const { SmsSid, SmsStatus } = req.body; const { ioRedis, ioHelpers: { getBodyshopRoom, getBodyshopConversationRoom } } = req; try { // Update message status in the database const response = await client.request(queries.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 }); } 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 }, error }); res.status(500).json({ error: "Failed to update message status." }); } }; exports.markConversationRead = async (req, res) => { const { conversationid, imexshopid, bodyshopid } = req.body; const { ioRedis, ioHelpers: { getBodyshopRoom, getBodyshopConversationRoom } } = req; try { // Mark messages in the conversation as read const response = await client.request(queries.MARK_MESSAGES_AS_READ, { conversationId: conversationid }); const updatedMessages = response.update_messages.affected_rows; logger.log("conversation-mark-read", "DEBUG", "api", null, { conversationid, imexshopid, bodyshopid, updatedMessages }); const broadcastRoom = getBodyshopRoom(bodyshopid); const conversationRoom = getBodyshopConversationRoom({ bodyshopId: bodyshopid, conversationId: conversationid }); ioRedis.to(broadcastRoom).emit("conversation-changed", { type: "conversation-marked-read", conversationId: conversationid }); ioRedis.to(conversationRoom).emit("message-changed", { type: "all-messages-marked-read", conversationId: conversationid }); res.status(200).json({ success: true, message: "Conversation marked as read." }); } catch (error) { logger.log("conversation-mark-read-error", "ERROR", "api", null, { conversationid, imexshopid, error }); res.status(500).json({ error: "Failed to mark conversation as read." }); } };