Skip to content

Commit 61e8228

Browse files
author
Ahad-webdev-90
committed
Chatify
1 parent a38215f commit 61e8228

File tree

1 file changed

+139
-131
lines changed

1 file changed

+139
-131
lines changed

server/socket/index.js

Lines changed: 139 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -188,165 +188,173 @@
188188

189189

190190

191-
const express = require('express')
192-
const { Server } = require('socket.io')
193-
const http = require('http')
194-
const getUserDetailsFromToken = require('../helpers/getUserDetailsFromToken')
195-
const UserModel = require('../models/UserModel')
196-
const { ConversationModel, MessageModel } = require('../models/ConversationModel')
197-
const getConversation = require('../helpers/getConversation')
198-
199-
const app = express()
200-
201-
/***socket connection */
202-
const server = http.createServer(app)
191+
const express = require('express');
192+
const { Server } = require('socket.io');
193+
const http = require('http');
194+
const getUserDetailsFromToken = require('../helpers/getUserDetailsFromToken');
195+
const UserModel = require('../models/UserModel');
196+
const { ConversationModel, MessageModel } = require('../models/ConversationModel');
197+
const getConversation = require('../helpers/getConversation');
198+
199+
const app = express();
200+
201+
// Create server and configure Socket.IO
202+
const server = http.createServer(app);
203203
const io = new Server(server, {
204204
cors: {
205-
origin: "https://chatify-ahkg.vercel.app", // Trailing slash removed
205+
origin: "https://chatify-ahkg.vercel.app", // Ensure this matches exactly
206206
methods: ["GET", "POST"],
207207
credentials: true
208208
}
209-
})
209+
});
210210

211-
/***
212-
* socket running at http://localhost:8080/
213-
*/
214-
215-
//online user
216-
const onlineUser = new Set()
211+
// Track online users
212+
const onlineUser = new Set();
217213

218214
io.on('connection', async (socket) => {
219-
console.log("connect User ", socket.id)
220-
221-
const token = socket.handshake.auth.token
215+
console.log("User connected:", socket.id);
222216

223-
//current user details
224-
const user = await getUserDetailsFromToken(token)
217+
const token = socket.handshake.auth.token;
225218

219+
// Authenticate user
220+
const user = await getUserDetailsFromToken(token);
226221
if (!user) {
227222
socket.disconnect(); // Disconnect if user is not authenticated
228223
return;
229224
}
230225

231-
//create a room
232-
socket.join(user?._id.toString())
233-
onlineUser.add(user?._id?.toString())
226+
// Join room and add to online users
227+
socket.join(user._id.toString());
228+
onlineUser.add(user._id.toString());
234229

235-
io.emit('onlineUser', Array.from(onlineUser))
230+
io.emit('onlineUser', Array.from(onlineUser));
236231

237232
socket.on('message-page', async (userId) => {
238-
console.log('userId', userId)
239-
const userDetails = await UserModel.findById(userId).select("-password")
240-
241-
const payload = {
242-
_id: userDetails?._id,
243-
name: userDetails?.name,
244-
email: userDetails?.email,
245-
profile_pic: userDetails?.profile_pic,
246-
online: onlineUser.has(userId)
233+
try {
234+
const userDetails = await UserModel.findById(userId).select("-password");
235+
236+
const payload = {
237+
_id: userDetails?._id,
238+
name: userDetails?.name,
239+
email: userDetails?.email,
240+
profile_pic: userDetails?.profile_pic,
241+
online: onlineUser.has(userId)
242+
};
243+
socket.emit('message-user', payload);
244+
245+
// Get previous messages
246+
const getConversationMessage = await ConversationModel.findOne({
247+
"$or": [
248+
{ sender: user._id, receiver: userId },
249+
{ sender: userId, receiver: user._id }
250+
]
251+
}).populate('messages').sort({ updatedAt: -1 });
252+
253+
socket.emit('message', getConversationMessage?.messages || []);
254+
} catch (err) {
255+
console.error('Error in message-page:', err);
256+
socket.emit('error', 'An error occurred while retrieving messages.');
247257
}
248-
socket.emit('message-user', payload)
249-
250-
//get previous message
251-
const getConversationMessage = await ConversationModel.findOne({
252-
"$or": [
253-
{ sender: user?._id, receiver: userId },
254-
{ sender: userId, receiver: user?._id }
255-
]
256-
}).populate('messages').sort({ updatedAt: -1 })
257-
258-
socket.emit('message', getConversationMessage?.messages || [])
259-
})
258+
});
260259

261-
//new message
262260
socket.on('new message', async (data) => {
263-
//check conversation is available both user
264-
let conversation = await ConversationModel.findOne({
265-
"$or": [
266-
{ sender: data?.sender, receiver: data?.receiver },
267-
{ sender: data?.receiver, receiver: data?.sender }
268-
]
269-
})
270-
271-
//if conversation is not available
272-
if (!conversation) {
273-
const createConversation = await ConversationModel({
274-
sender: data?.sender,
275-
receiver: data?.receiver
276-
})
277-
conversation = await createConversation.save()
261+
try {
262+
let conversation = await ConversationModel.findOne({
263+
"$or": [
264+
{ sender: data.sender, receiver: data.receiver },
265+
{ sender: data.receiver, receiver: data.sender }
266+
]
267+
});
268+
269+
if (!conversation) {
270+
const createConversation = new ConversationModel({
271+
sender: data.sender,
272+
receiver: data.receiver
273+
});
274+
conversation = await createConversation.save();
275+
}
276+
277+
const message = new MessageModel({
278+
text: data.text,
279+
imageUrl: data.imageUrl,
280+
videoUrl: data.videoUrl,
281+
msgByUserId: data.msgByUserId,
282+
});
283+
const saveMessage = await message.save();
284+
285+
await ConversationModel.updateOne({ _id: conversation._id }, {
286+
"$push": { messages: saveMessage._id }
287+
});
288+
289+
const getConversationMessage = await ConversationModel.findOne({
290+
"$or": [
291+
{ sender: data.sender, receiver: data.receiver },
292+
{ sender: data.receiver, receiver: data.sender }
293+
]
294+
}).populate('messages').sort({ updatedAt: -1 });
295+
296+
io.to(data.sender).emit('message', getConversationMessage?.messages || []);
297+
io.to(data.receiver).emit('message', getConversationMessage?.messages || []);
298+
299+
// Send updated conversations
300+
const conversationSender = await getConversation(data.sender);
301+
const conversationReceiver = await getConversation(data.receiver);
302+
303+
io.to(data.sender).emit('conversation', conversationSender);
304+
io.to(data.receiver).emit('conversation', conversationReceiver);
305+
} catch (err) {
306+
console.error('Error in new message:', err);
307+
socket.emit('error', 'An error occurred while sending the message.');
278308
}
279-
280-
const message = new MessageModel({
281-
text: data.text,
282-
imageUrl: data.imageUrl,
283-
videoUrl: data.videoUrl,
284-
msgByUserId: data?.msgByUserId,
285-
})
286-
const saveMessage = await message.save()
287-
288-
await ConversationModel.updateOne({ _id: conversation?._id }, {
289-
"$push": { messages: saveMessage?._id }
290-
})
291-
292-
const getConversationMessage = await ConversationModel.findOne({
293-
"$or": [
294-
{ sender: data?.sender, receiver: data?.receiver },
295-
{ sender: data?.receiver, receiver: data?.sender }
296-
]
297-
}).populate('messages').sort({ updatedAt: -1 })
298-
299-
io.to(data?.sender).emit('message', getConversationMessage?.messages || [])
300-
io.to(data?.receiver).emit('message', getConversationMessage?.messages || [])
301-
302-
//send conversation
303-
const conversationSender = await getConversation(data?.sender)
304-
const conversationReceiver = await getConversation(data?.receiver)
305-
306-
io.to(data?.sender).emit('conversation', conversationSender)
307-
io.to(data?.receiver).emit('conversation', conversationReceiver)
308-
})
309-
310-
//sidebar
311-
socket.on('sidebar', async (currentUserId) => {
312-
console.log("current user", currentUserId)
313-
314-
const conversation = await getConversation(currentUserId)
309+
});
315310

316-
socket.emit('conversation', conversation)
317-
})
311+
socket.on('sidebar', async (currentUserId) => {
312+
try {
313+
const conversation = await getConversation(currentUserId);
314+
socket.emit('conversation', conversation);
315+
} catch (err) {
316+
console.error('Error in sidebar:', err);
317+
socket.emit('error', 'An error occurred while retrieving sidebar data.');
318+
}
319+
});
318320

319321
socket.on('seen', async (msgByUserId) => {
320-
let conversation = await ConversationModel.findOne({
321-
"$or": [
322-
{ sender: user?._id, receiver: msgByUserId },
323-
{ sender: msgByUserId, receiver: user?._id }
324-
]
325-
})
326-
327-
const conversationMessageId = conversation?.messages || []
328-
329-
await MessageModel.updateMany(
330-
{ _id: { "$in": conversationMessageId }, msgByUserId: msgByUserId },
331-
{ "$set": { seen: true } }
332-
)
333-
334-
//send conversation
335-
const conversationSender = await getConversation(user?._id?.toString())
336-
const conversationReceiver = await getConversation(msgByUserId)
337-
338-
io.to(user?._id?.toString()).emit('conversation', conversationSender)
339-
io.to(msgByUserId).emit('conversation', conversationReceiver)
340-
})
322+
try {
323+
const conversation = await ConversationModel.findOne({
324+
"$or": [
325+
{ sender: user._id, receiver: msgByUserId },
326+
{ sender: msgByUserId, receiver: user._id }
327+
]
328+
});
329+
330+
const conversationMessageId = conversation?.messages || [];
331+
332+
await MessageModel.updateMany(
333+
{ _id: { "$in": conversationMessageId }, msgByUserId: msgByUserId },
334+
{ "$set": { seen: true } }
335+
);
336+
337+
// Send updated conversations
338+
const conversationSender = await getConversation(user._id.toString());
339+
const conversationReceiver = await getConversation(msgByUserId);
340+
341+
io.to(user._id.toString()).emit('conversation', conversationSender);
342+
io.to(msgByUserId).emit('conversation', conversationReceiver);
343+
} catch (err) {
344+
console.error('Error in seen:', err);
345+
socket.emit('error', 'An error occurred while marking messages as seen.');
346+
}
347+
});
341348

342-
//disconnect
349+
// Handle disconnection
343350
socket.on('disconnect', () => {
344-
onlineUser.delete(user?._id?.toString())
345-
console.log('disconnect user ', socket.id)
346-
})
347-
})
351+
onlineUser.delete(user._id.toString());
352+
console.log('User disconnected:', socket.id);
353+
});
354+
});
348355

349356
module.exports = {
350357
app,
351358
server
352-
}
359+
};
360+

0 commit comments

Comments
 (0)