feature/IO-3000-Migrate-MSG-to-Sockets - Major Progress
Signed-off-by: Dave Richer <dave@imexsystems.ca>
This commit is contained in:
@@ -2544,3 +2544,69 @@ exports.GET_JOBS_BY_PKS = `query GET_JOBS_BY_PKS($ids: [uuid!]!) {
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
exports.GET_CONVERSATIONS = `query GET_CONVERSATIONS($bodyshopId: uuid!) {
|
||||
conversations(
|
||||
where: { bodyshopid: { _eq: $bodyshopId }, archived: { _eq: false } },
|
||||
order_by: { updated_at: desc },
|
||||
limit: 50
|
||||
) {
|
||||
phone_num
|
||||
id
|
||||
updated_at
|
||||
unreadcnt
|
||||
archived
|
||||
label
|
||||
messages_aggregate(where: { read: { _eq: false }, isoutbound: { _eq: false } }) {
|
||||
aggregate {
|
||||
count
|
||||
}
|
||||
}
|
||||
job_conversations {
|
||||
job {
|
||||
id
|
||||
ro_number
|
||||
ownr_fn
|
||||
ownr_ln
|
||||
ownr_co_nm
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
exports.MARK_MESSAGES_AS_READ = `mutation MARK_MESSAGES_AS_READ($conversationId: uuid!) {
|
||||
update_messages(where: { conversationid: { _eq: $conversationId } }, _set: { read: true }) {
|
||||
affected_rows
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
exports.GET_CONVERSATION_DETAILS = `
|
||||
query GET_CONVERSATION_DETAILS($conversationId: uuid!) {
|
||||
conversation: conversations_by_pk(id: $conversationId) {
|
||||
id
|
||||
phone_num
|
||||
updated_at
|
||||
label
|
||||
job_conversations {
|
||||
job {
|
||||
id
|
||||
ro_number
|
||||
ownr_fn
|
||||
ownr_ln
|
||||
ownr_co_nm
|
||||
}
|
||||
}
|
||||
}
|
||||
messages: messages(where: { conversationid: { _eq: $conversationId } }, order_by: { created_at: asc }) {
|
||||
id
|
||||
text
|
||||
created_at
|
||||
read
|
||||
isoutbound
|
||||
userid
|
||||
image_path
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
@@ -12,6 +12,7 @@ const InstanceManager = require("../utils/instanceMgr").default;
|
||||
|
||||
exports.receive = async (req, res) => {
|
||||
//Perform request validation
|
||||
const { ioRedis } = req;
|
||||
|
||||
logger.log("sms-inbound", "DEBUG", "api", null, {
|
||||
msid: req.body.SmsMessageSid,
|
||||
@@ -108,6 +109,11 @@ exports.receive = async (req, res) => {
|
||||
newMessage,
|
||||
fcmresp
|
||||
});
|
||||
|
||||
// Broadcast new message to the conversation room
|
||||
const room = `conversation-${newMessage.conversationid}`;
|
||||
ioRedis.to(room).emit("new-message", newMessage);
|
||||
|
||||
res.status(200).send("");
|
||||
} catch (e2) {
|
||||
logger.log("sms-inbound-error", "ERROR", "api", null, {
|
||||
|
||||
@@ -14,6 +14,7 @@ const gqlClient = require("../graphql-client/graphql-client").client;
|
||||
|
||||
exports.send = (req, res) => {
|
||||
const { to, messagingServiceSid, body, conversationid, selectedMedia, imexshopid } = req.body;
|
||||
const { ioRedis } = req;
|
||||
|
||||
logger.log("sms-outbound", "DEBUG", req.user.email, null, {
|
||||
messagingServiceSid: messagingServiceSid,
|
||||
@@ -59,6 +60,13 @@ exports.send = (req, res) => {
|
||||
conversationid: newMessage.conversationid || ""
|
||||
};
|
||||
|
||||
// TODO Verify
|
||||
// const messageData = response.insert_messages.returning[0];
|
||||
|
||||
// Broadcast new message to conversation room
|
||||
const room = `conversation-${conversationid}`;
|
||||
ioRedis.to(room).emit("new-message", newMessage);
|
||||
|
||||
admin.messaging().send({
|
||||
topic: `${imexshopid}-messaging`,
|
||||
data
|
||||
|
||||
@@ -11,6 +11,7 @@ const { admin } = require("../firebase/firebase-handler");
|
||||
|
||||
exports.status = (req, res) => {
|
||||
const { SmsSid, SmsStatus } = req.body;
|
||||
const { ioRedis } = req;
|
||||
client
|
||||
.request(queries.UPDATE_MESSAGE_STATUS, {
|
||||
msid: SmsSid,
|
||||
@@ -21,6 +22,12 @@ exports.status = (req, res) => {
|
||||
msid: SmsSid,
|
||||
fields: { status: SmsStatus }
|
||||
});
|
||||
// TODO Verify
|
||||
const conversationId = response.update_messages.returning[0].conversationid;
|
||||
ioRedis.to(`conversation-${conversationId}`).emit("message-status-updated", {
|
||||
messageId: SmsSid,
|
||||
status: SmsStatus
|
||||
});
|
||||
})
|
||||
.catch((error) => {
|
||||
logger.log("sms-status-update-error", "ERROR", "api", null, {
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
const { admin } = require("../firebase/firebase-handler");
|
||||
const { MARK_MESSAGES_AS_READ, GET_CONVERSATIONS, GET_CONVERSATION_DETAILS } = require("../graphql-client/queries");
|
||||
const client = require("../graphql-client/graphql-client").client;
|
||||
|
||||
const redisSocketEvents = ({
|
||||
io,
|
||||
@@ -113,6 +115,7 @@ const redisSocketEvents = ({
|
||||
socket.on("leave-bodyshop-room", leaveBodyshopRoom);
|
||||
socket.on("broadcast-to-bodyshop", broadcastToBodyshopRoom);
|
||||
};
|
||||
|
||||
// Disconnect Events
|
||||
const registerDisconnectEvents = (socket) => {
|
||||
const disconnect = () => {
|
||||
@@ -129,10 +132,57 @@ const redisSocketEvents = ({
|
||||
|
||||
socket.on("disconnect", disconnect);
|
||||
};
|
||||
// Messaging Events
|
||||
const registerMessagingEvents = (socket) => {
|
||||
const broadcastNewMessage = async (message) => {
|
||||
const room = `conversation-${message.conversationId}`;
|
||||
io.to(room).emit("new-message", message);
|
||||
};
|
||||
|
||||
const openMessaging = async (bodyshopUUID) => {
|
||||
try {
|
||||
const conversations = await client.request(GET_CONVERSATIONS, { bodyshopId: bodyshopUUID });
|
||||
socket.emit("messaging-list", { conversations });
|
||||
} catch (error) {
|
||||
console.dir(error);
|
||||
logger.log("error", "Failed to fetch conversations", error);
|
||||
socket.emit("error", { message: "Failed to fetch conversations" });
|
||||
}
|
||||
};
|
||||
|
||||
const joinConversation = async (conversationId) => {
|
||||
try {
|
||||
const room = `conversation-${conversationId}`;
|
||||
socket.join(room);
|
||||
|
||||
// Fetch conversation details and messages
|
||||
const data = await client.request(GET_CONVERSATION_DETAILS, { conversationId });
|
||||
socket.emit("conversation-details", data); // Send data to the client
|
||||
} catch (error) {
|
||||
logger.log("error", "Failed to join conversation", error);
|
||||
socket.emit("error", { message: "Failed to join conversation" });
|
||||
}
|
||||
};
|
||||
|
||||
const markAsRead = async ({ conversationId, userId }) => {
|
||||
try {
|
||||
await client.request(MARK_MESSAGES_AS_READ, { conversationId, userId });
|
||||
io.to(`conversation-${conversationId}`).emit("read-updated", { conversationId });
|
||||
} catch (error) {
|
||||
logger.log("error", "Failed to mark messages as read", error);
|
||||
socket.emit("error", { message: "Failed to mark messages as read" });
|
||||
}
|
||||
};
|
||||
// Mark Messages as Read
|
||||
socket.on("mark-as-read", markAsRead);
|
||||
socket.on("join-conversation", joinConversation);
|
||||
socket.on("open-messaging", openMessaging);
|
||||
};
|
||||
|
||||
// Call Handlers
|
||||
registerRoomAndBroadcastEvents(socket);
|
||||
registerUpdateEvents(socket);
|
||||
registerMessagingEvents(socket);
|
||||
registerDisconnectEvents(socket);
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user