Spaces:
Paused
Paused
File size: 2,453 Bytes
a0fda44 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
const {
checkMembersOffUndeliveredListInMessage,
} = require("../controllers/chatRoomController");
const User = require("../models/User");
exports.getSocketDetails = async (userId) => {
// Get user model
userModel = await User.findById(userId);
// Get all rooms
allRoomsUserIn = userModel.chatRooms.map((room) => room.toString());
return { userModel, allRoomsUserIn };
};
exports.onlineController = (io, socket) => {
socket.on("user:online", async (userId) => {
socket.userId = userId;
// Get user detaiils
const { userModel, allRoomsUserIn } = await this.getSocketDetails(userId);
// Make user join rooms
socket.join(allRoomsUserIn);
// Update database on status
userModel.status = {
online: true,
lastSeen: undefined,
};
for (let properties of userModel.undeliveredMessages) {
await checkMembersOffUndeliveredListInMessage({
membersId: [userId],
io,
...properties,
});
}
userModel.undeliveredMessages = [];
// Save user model
await userModel.save({ validateBeforeSave: false });
// Emit user online status in all rooms user is in
socket.to(allRoomsUserIn).emit("user:online", userId);
});
};
exports.offlineController = (io, socket) => {
socket.on("user:offline", async () => {
const { userId } = socket;
// Get user detaiils
const { userModel, allRoomsUserIn } = await this.getSocketDetails(userId);
const time = new Date(Date.now()).toISOString();
userModel.status = {
online: false,
lastSeen: time,
};
await userModel.save({ validateBeforeSave: false });
socket
.to(allRoomsUserIn)
.emit("user:offline", { userId: userModel._id, time });
});
};
// socket disconnection
exports.disconnectingController = (io, socket) => {
socket.on("disconnecting", async () => {
if (!socket.userId) return;
// Get user detaiils
const { userModel, allRoomsUserIn } = await this.getSocketDetails(
socket.userId
);
const time = new Date(Date.now()).toISOString();
userModel.status = {
online: false,
lastSeen: time,
};
await userModel.save({ validateBeforeSave: false });
socket
.to(allRoomsUserIn)
.emit("user:offline", { userId: userModel._id, time });
});
};
exports.joinRoomController = (io, socket) => {
socket.on("user:joinRooms", ({ rooms }) => {
socket.join(rooms);
});
};
|