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 { // 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(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, 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." }); } }; exports.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(queries.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." }); } };