diff --git a/backend/routes/socketRoutes.js b/backend/routes/socketRoutes.js index 98a6af5..0df3226 100644 --- a/backend/routes/socketRoutes.js +++ b/backend/routes/socketRoutes.js @@ -7,6 +7,7 @@ class SocketRoutes { this.roomController = null; this.videoCallController = null; } + // Initialize socket event handlers initializeSocketHandlers(io) { // Initialize controllers with io instance @@ -14,177 +15,167 @@ class SocketRoutes { this.videoCallController = new VideoCallController(io); io.on("connection", (socket) => { - console.log("A user connected", socket.id); - - // File management events - socket.on("createFile", (data) => { - const result = this.roomController.handleCreateFile(socket, data); - if (!result.success) { - console.error("Create file error:", result.error); - socket.emit("error", { type: "createFile", message: result.error }); - } - }); - - socket.on("deleteFile", (data) => { - const result = this.roomController.handleDeleteFile(socket, data); - if (!result.success) { - console.error("Delete file error:", result.error); - socket.emit("error", { type: "deleteFile", message: result.error }); - } - }); - - socket.on("renameFile", (data) => { - const result = this.roomController.handleRenameFile(socket, data); - if (!result.success) { - console.error("Rename file error:", result.error); - socket.emit("error", { type: "renameFile", message: result.error }); - } - }); + console.log("User connected:", socket.id); - socket.on("switchFile", (data) => { - const result = this.roomController.handleSwitchFile(socket, data); - if (!result.success) { - console.error("Switch file error:", result.error); - socket.emit("error", { type: "switchFile", message: result.error }); - } - }); - - socket.on("getFiles", (data) => { - const result = this.roomController.handleGetFiles(socket, data); - if (!result.success) { - console.error("Get files error:", result.error); - } - }); - - socket.on("fileCodeChange", (data) => { - const result = this.roomController.handleFileCodeChange(socket, data); - if (!result.success) { - console.error("File code change error:", result.error); - } - }); + // Register grouped event handlers + this.registerFileEvents(socket); + this.registerRoomEvents(socket); + this.registerChatEvents(socket); + this.registerVideoCallEvents(socket); - socket.on("fileLanguageChange", (data) => { - const result = this.roomController.handleFileLanguageChange( + // Disconnect handling + socket.on("disconnect", () => { + this.handleResult( socket, - data + this.roomController.handleDisconnect(socket), + "disconnect" ); - if (!result.success) { - console.error("File language change error:", result.error); - } - }); - - // Legacy filename change event - socket.on("filenameChange", (data) => { - const result = this.roomController.handleFilenameChange(socket, data); - if (!result.success) { - console.error("Filename change error:", result.error); - } - }); - - // Room-related events - socket.on("join_room", (data) => { - const result = this.roomController.handleJoinRoom(socket, data); - if (!result.success) { - console.error("Join room error:", result.error); - } + this.handleResult( + socket, + this.videoCallController.handleDisconnect(socket), + "disconnect" + ); + console.log("User disconnected:", socket.id); }); + }); + } - socket.on("codeChange", (data) => { - const result = this.roomController.handleCodeChange(socket, data); - if (!result.success) { - console.error("Code change error:", result.error); - } - }); + /** + * Handles controller results and emits standardized error events. + */ + handleResult(socket, result, eventType) { + if (!result.success) { + console.error(`${eventType} error:`, result.error); + socket.emit("error", { type: eventType, message: result.error }); + } + } - socket.on("languageChange", (data) => { - const result = this.roomController.handleLanguageChange(socket, data); - if (!result.success) { - console.error("Language change error:", result.error); + /** + * File management socket events + */ + registerFileEvents(socket) { + const events = [ + "createFile", + "deleteFile", + "renameFile", + "switchFile", + "getFiles", + "fileCodeChange", + "fileLanguageChange", + ]; + + events.forEach((event) => { + socket.on(event, (data) => { + const methodName = `handle${this.capitalize(event)}`; + if (typeof this.roomController[methodName] === "function") { + const result = this.roomController[methodName](socket, data); + this.handleResult(socket, result, event); + } else { + console.warn(`No handler for ${event}`); } }); + }); + } - socket.on("leaveRoom", () => { - const result = this.roomController.handleLeaveRoom(socket); - if (!result.success) { - console.error("Leave room error:", result.error); - } - }); + /** + * Room-related events + */ + registerRoomEvents(socket) { + socket.on("join-room", (data) => { + this.handleResult( + socket, + this.roomController.handleJoinRoom(socket, data), + "join-room" + ); + }); - socket.on("typing", (data) => { - const result = this.roomController.handleTyping(socket, data); - if (!result.success) { - console.error("Typing error:", result.error); - } - }); + socket.on("leave-room", () => { + this.handleResult( + socket, + this.roomController.handleLeaveRoom(socket), + "leave-room" + ); + }); + } - socket.on("chatMessage", (data) => { - const result = this.roomController.handleChatMessage(socket, data); - if (!result.success) { - console.error("Chat message error:", result.error); - } - }); - // it shows who is typing!! - socket.on("typing", ({ roomId, user }) => { - socket.to(roomId).emit("userTyping", { user }); - }); + /** + * Chat-related events + */ + registerChatEvents(socket) { + socket.on("chatMessage", (data) => { + this.handleResult( + socket, + this.roomController.handleChatMessage(socket, data), + "chatMessage" + ); + }); - socket.on("stopTyping", ({ roomId, user }) => { - socket.to(roomId).emit("userStopTyping", { user }); - }); + socket.on("typing", ({ roomId, user }) => { + socket.to(roomId).emit("userTyping", { user }); + }); - // Video call events - socket.on("join-call", (data) => { - const result = this.videoCallController.handleJoinCall(socket, data); - if (!result.success) { - console.error("Join call error:", result.error); - } - }); + socket.on("stopTyping", ({ roomId, user }) => { + socket.to(roomId).emit("userStopTyping", { user }); + }); + } - socket.on("signal", (data) => { - const result = this.videoCallController.handleSignal(socket, data); - if (!result.success) { - console.error("Signal error:", result.error); - } - }); + /** + * Video call events + */ + registerVideoCallEvents(socket) { + socket.on("join-call", (data) => { + this.handleResult( + socket, + this.videoCallController.handleJoinCall(socket, data), + "join-call" + ); + }); - socket.on("leave-call", (data) => { - const result = this.videoCallController.handleLeaveCall(socket, data); - if (!result.success) { - console.error("Leave call error:", result.error); - } - }); + socket.on("leave-call", (data) => { + this.handleResult( + socket, + this.videoCallController.handleLeaveCall(socket, data), + "leave-call" + ); + }); - socket.on("toggle-camera", () => { - const result = this.videoCallController.handleToggleCamera(socket); - if (!result.success) { - console.error("Toggle camera error:", result.error); - } - }); + socket.on("signal", (data) => { + this.handleResult( + socket, + this.videoCallController.handleSignal(socket, data), + "signal" + ); + }); - socket.on("toggle-microphone", () => { - const result = this.videoCallController.handleToggleMicrophone(socket); - if (!result.success) { - console.error("Toggle microphone error:", result.error); - } - }); + socket.on("toggle-camera", () => { + this.handleResult( + socket, + this.videoCallController.handleToggleCamera(socket), + "toggle-camera" + ); + }); - // Disconnect event - socket.on("disconnect", () => { - const result = this.roomController.handleDisconnect(socket); - if (!result.success) { - console.error("Disconnect error:", result.error); - } - console.log("A user disconnected", socket.id); - }); + socket.on("toggle-microphone", () => { + this.handleResult( + socket, + this.videoCallController.handleToggleMicrophone(socket), + "toggle-microphone" + ); }); } - // Get room statistics (for admin/analytics) + /** + * Utility: Capitalize event names for method mapping + */ + capitalize(str) { + return str.charAt(0).toUpperCase() + str.slice(1); + } + + // Analytics getRoomStats() { return this.roomController ? this.roomController.getRoomStats() : null; } - // Get call statistics (for admin/analytics) getCallStats() { return this.videoCallController ? this.videoCallController.getCallStats()