Skip to content

Commit f5e84e5

Browse files
Merge pull request #315 from Trendyol/credentials-error
fix: credentials infinite loop error
2 parents 52a1165 + 646920f commit f5e84e5

File tree

9 files changed

+181
-117
lines changed

9 files changed

+181
-117
lines changed

gurubu-backend/controllers/roomController.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ exports.createRoom = async (req, res) => {
2424
exports.joinRoom = async (req, res) => {
2525
const roomID = req.params.roomId;
2626
const nickName = req.body.nickName;
27+
const isAdmin = req.body.isAdmin;
2728

28-
const result = handleJoinRoom(nickName, roomID);
29+
const result = handleJoinRoom(nickName, roomID, isAdmin);
2930

3031
if(!result){
3132
return res.status(404).json({ message: "Room not found" });

gurubu-backend/sockets/groomingSocket.js

+42-10
Original file line numberDiff line numberDiff line change
@@ -30,40 +30,72 @@ module.exports = (io) => {
3030

3131
socket.on("userVote", (data, roomID, credentials) => {
3232
joinRoomMiddleware(socket, roomID, credentials);
33-
io.to(roomID).emit("voteSent", updateParticipantsVote(data, credentials, roomID, socket));
33+
const result = updateParticipantsVote(data, credentials, roomID, socket);
34+
if(result?.isSuccess === false){
35+
io.to(socket.id).emit("encounteredError", result);
36+
return;
37+
}
38+
io.to(roomID).emit("voteSent", result);
3439
});
3540

3641
socket.on("showResults", (roomID, credentials) => {
3742
joinRoomMiddleware(socket, roomID, credentials);
38-
io.to(roomID).emit("showResults", getResults(credentials, roomID, socket));
43+
const result = getResults(credentials, roomID, socket);
44+
if(result?.isSuccess === false){
45+
io.to(socket.id).emit("encounteredError", result);
46+
return;
47+
}
48+
io.to(roomID).emit("showResults", result);
3949
});
4050

4151
socket.on("resetVotes", (roomID, credentials) => {
4252
joinRoomMiddleware(socket, roomID, credentials);
43-
io.to(roomID).emit("resetVotes", resetVotes(credentials, roomID, socket));
53+
const result = resetVotes(credentials, roomID, socket);
54+
if(result?.isSuccess === false){
55+
io.to(socket.id).emit("encounteredError", result);
56+
return;
57+
}
58+
io.to(roomID).emit("resetVotes", result);
4459
});
4560

4661
socket.on("updateNickName", (roomID, newNickName, credentials) => {
4762
joinRoomMiddleware(socket, roomID, credentials);
48-
io.to(roomID).emit(
49-
"updateNickName",
50-
updateNickName(credentials, newNickName, roomID, socket)
51-
);
63+
const result = updateNickName(credentials, newNickName, roomID, socket);
64+
if(result?.isSuccess === false){
65+
io.to(socket.id).emit("encounteredError", result);
66+
return;
67+
}
68+
io.to(roomID).emit("updateNickName", result);
5269
});
5370

5471
socket.on("setIssues", (roomID, data, credentials) => {
5572
joinRoomMiddleware(socket, roomID, credentials);
56-
io.to(roomID).emit("setIssues", setIssues(data, credentials, roomID, socket));
73+
const result = setIssues(data, credentials, roomID, socket);
74+
if(result?.isSuccess === false){
75+
io.to(socket.id).emit("encounteredError", result);
76+
return;
77+
}
78+
io.to(roomID).emit("setIssues", result);
5779
});
5880

5981
socket.on("updateTimer", (roomID, data, credentials) => {
6082
joinRoomMiddleware(socket, roomID, credentials);
61-
io.to(roomID).emit("updateTimer", updateTimer(data, credentials, roomID, socket));
83+
const result = updateTimer(data, credentials, roomID, socket);
84+
if(result?.isSuccess === false){
85+
io.to(socket.id).emit("encounteredError", result);
86+
return;
87+
}
88+
io.to(roomID).emit("updateTimer", result);
6289
});
6390

6491
socket.on("updateAvatar", (roomID, data, credentials) => {
6592
joinRoomMiddleware(socket, roomID, credentials);
66-
io.to(roomID).emit("updateAvatar", updateAvatar(data, credentials, roomID, socket));
93+
const result = updateAvatar(data, credentials, roomID, socket);
94+
if(result?.isSuccess === false){
95+
io.to(socket.id).emit("encounteredError", result);
96+
return;
97+
}
98+
io.to(roomID).emit("updateAvatar", result);
6799
});
68100

69101
socket.on("disconnect", (reason) => {

gurubu-backend/utils/groomings.js

+51-32
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ const groomingMode = {
6363
],
6464
};
6565

66-
const rooms = [];
66+
let rooms = [];
6767
const groomings = {};
6868

6969
const handleErrors = (errorFunctionName, roomID, socket) => {
@@ -72,25 +72,30 @@ const handleErrors = (errorFunctionName, roomID, socket) => {
7272
return null;
7373
}
7474
if (rooms && !rooms.some(room => room.roomID === roomID)) {
75-
console.log("Room is deleted, error shown to the user.", errorFunctionName, roomID, rooms);
76-
return socket.emit("encounteredError", {
75+
console.log("Room is deleted, info shown to the user.", errorFunctionName, roomID);
76+
socket.emit("encounteredError", {
7777
id: 1,
7878
message:
79-
"Room is not exist. Rooms are available for only 6 hours after they are created. You can continue by creating new one.",
79+
"Room is expired, if you think this is an error, please contact Armağan Dalkıran.",
8080
});
81+
return {
82+
isSuccess: false,
83+
message: "Room is expired, if you think this is an error, please contact Armağan Dalkıran."
84+
};
8185
}
8286

83-
console.log("User lost connection but popup shown.", errorFunctionName, roomID, rooms);
87+
console.log("Something unexpected happen!");
8488

85-
return socket.emit("encounteredError", {
86-
id: 2,
87-
message: "Your connection is lost. Connect again",
88-
});
89+
return {
90+
id: 3,
91+
isSuccess: false,
92+
message: "Your connection is lost. Connect again"
93+
}
8994
};
9095

9196
const generateNewRoom = (nickName, groomingType) => {
9297
const currentTime = new Date().getTime();
93-
const expireTime = currentTime + 6 * 60 * 60 * 1000;
98+
const expireTime = currentTime + 12 * 60 * 60 * 1000; // 12 hours
9499
const roomID = uuid.v4();
95100

96101
const user = userJoin(nickName, roomID);
@@ -131,7 +136,7 @@ const generateNewRoom = (nickName, groomingType) => {
131136
};
132137
};
133138

134-
const handleJoinRoom = (nickName, roomID) => {
139+
const handleJoinRoom = (nickName, roomID, isAdmin) => {
135140
const user = userJoin(nickName, roomID);
136141
if (!user) {
137142
return handleErrors("handleJoinRoom", roomID);
@@ -140,9 +145,13 @@ const handleJoinRoom = (nickName, roomID) => {
140145
user.isAdmin = false;
141146
user.connected = true;
142147

148+
if(isAdmin){
149+
user.isAdmin = isAdmin
150+
}
151+
143152
groomings[roomID] = {
144153
...groomings[roomID],
145-
totalParticipants: user.userID + 1,
154+
totalParticipants: Object.keys(groomings[roomID].participants).length + 1,
146155
};
147156

148157
const { credentials, ...userWithoutCredentials } = user;
@@ -191,11 +200,11 @@ const removeUserFromOngoingGrooming = (roomID, userID) => {
191200
}
192201

193202
delete groomings[roomID].participants[userID];
194-
groomings[roomID].totalParticipants--;
203+
groomings[roomID].totalParticipants = groomings[roomID].totalParticipants - 1;
195204
};
196205

197206
const updateParticipantsVote = (data, credentials, roomID, socket) => {
198-
const user = getCurrentUser(credentials);
207+
const user = getCurrentUser(credentials, socket);
199208
if (!user) {
200209
return handleErrors("updateParticipantsVote", roomID, socket);
201210
}
@@ -322,7 +331,7 @@ const calculateScore = (mode, participants, roomID) => {
322331
};
323332

324333
const getResults = (credentials, roomID, socket) => {
325-
const user = getCurrentUser(credentials);
334+
const user = getCurrentUser(credentials, socket);
326335
if (!user) {
327336
return handleErrors("getResults", roomID, socket);
328337
}
@@ -334,7 +343,7 @@ const getResults = (credentials, roomID, socket) => {
334343

335344

336345
const setIssues = (data, credentials, roomID, socket) => {
337-
const user = getCurrentUser(credentials);
346+
const user = getCurrentUser(credentials, socket);
338347
if (!user) {
339348
return handleErrors("setIssues", roomID, socket);
340349
}
@@ -345,7 +354,7 @@ const setIssues = (data, credentials, roomID, socket) => {
345354
};
346355

347356
const updateTimer = (data, credentials, roomID, socket) => {
348-
const user = getCurrentUser(credentials);
357+
const user = getCurrentUser(credentials, socket);
349358
if (!user) {
350359
return handleErrors("updateTimer", roomID, socket);
351360
}
@@ -356,7 +365,7 @@ const updateTimer = (data, credentials, roomID, socket) => {
356365
};
357366

358367
const updateAvatar = (data, credentials, roomID, socket) => {
359-
const user = getCurrentUser(credentials);
368+
const user = getCurrentUser(credentials, socket);
360369
if (!user) {
361370
return handleErrors("updateAvatar", roomID, socket);
362371
}
@@ -374,7 +383,7 @@ const updateAvatar = (data, credentials, roomID, socket) => {
374383
};
375384

376385
const resetVotes = (credentials, roomID, socket) => {
377-
const user = getCurrentUser(credentials);
386+
const user = getCurrentUser(credentials, socket);
378387
if (!user) {
379388
return handleErrors("resetVotes", roomID, socket);
380389
}
@@ -396,6 +405,12 @@ const getRooms = () => {
396405
return rooms;
397406
};
398407

408+
const logRooms = () => {
409+
setInterval(() => {
410+
console.log(rooms);
411+
}, 10000);
412+
}
413+
399414
const checkRoomExistance = (roomId) => {
400415
return rooms.some((room) => room.roomID === roomId);
401416
};
@@ -431,22 +446,25 @@ function findClosestFibonacci(number) {
431446

432447
const cleanRoomsAndUsers = () => {
433448
setInterval(() => {
434-
const currentTime = new Date().getTime();
435-
rooms.forEach((room) => {
436-
if (room.expiredAt < currentTime) {
437-
const indexToRemove = rooms.findIndex(
438-
(indexToRemoveRoom) => indexToRemoveRoom.roomID === room.roomID
439-
);
440-
rooms.splice(indexToRemove, 1);
441-
delete groomings[room.roomID];
442-
clearUser(room.roomID);
443-
}
444-
});
445-
}, 60000 * 60 * 3); // work every 3 hours
449+
const currentTime = Date.now();
450+
451+
// Get expired room IDs before modifying arrays
452+
const expiredRoomIDs = rooms.filter(room => room.expiredAt < currentTime).map(room => room.roomID);
453+
454+
// Remove expired rooms safely
455+
rooms = rooms.filter(room => room.expiredAt >= currentTime);
456+
457+
// Remove expired rooms from `groomings`
458+
expiredRoomIDs.forEach(roomID => delete groomings[roomID]);
459+
460+
// Remove users in expired rooms
461+
expiredRoomIDs.forEach(clearUser);
462+
console.log("Rooms and users cleaned!");
463+
}, 1000 * 60 * 60 * 12); // work every 12 hours
446464
};
447465

448466
const updateNickName = (credentials, newNickName, roomID, socket) => {
449-
const user = getCurrentUser(credentials);
467+
const user = getCurrentUser(credentials, socket);
450468
if (!user) {
451469
return handleErrors("updateNickName", roomID, socket);
452470
}
@@ -465,6 +483,7 @@ module.exports = {
465483
checkRoomExistance,
466484
generateNewRoom,
467485
getRooms,
486+
logRooms,
468487
handleJoinRoom,
469488
getGrooming,
470489
leaveUserFromGrooming,

gurubu-backend/utils/users.js

+17-10
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const uuid = require("uuid");
22
const { tokenizeNickname } = require("../utils/tokenizeNickname");
33

4-
const users = [];
4+
let users = [];
55

66
// Join user to grooming room
77
function userJoin(nickname, roomID) {
@@ -39,8 +39,20 @@ function updateUserSocket(credentials, socketID) {
3939
}
4040

4141
// Get current user
42-
function getCurrentUser(credentials) {
43-
return users.find((user) => user.credentials === credentials);
42+
function getCurrentUser(credentials, socket) {
43+
let user = users.find((user) => user.credentials === credentials);
44+
if (user) {
45+
return user;
46+
}
47+
console.log("This user could not found with credentials", credentials, users);
48+
if (socket) {
49+
user = getCurrentUserWithSocket(socket.id);
50+
if(user){
51+
console.log("This user found with socket id.", user);
52+
}
53+
return user;
54+
}
55+
return undefined;
4456
}
4557

4658
function getCurrentUserWithSocket(socketID) {
@@ -72,18 +84,13 @@ function getRoomUsers(roomID) {
7284
}
7385

7486
function clearUser(roomId) {
75-
users.forEach(() => {
76-
const indexToRemove = users.findIndex(
77-
(indexToRemoveUser) => indexToRemoveUser.roomID === roomId
78-
);
79-
users.splice(indexToRemove, 1);
80-
});
87+
users = users.filter(user => user.roomID !== roomId);
8188
}
8289

8390
function logUsers() {
8491
setInterval(() => {
8592
console.log(users);
86-
}, 3000);
93+
}, 10000);
8794
}
8895

8996
module.exports = {

gurubu-client/src/app/components/room/grooming-board/grooming-board-error-popup.tsx

+19-1
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,33 @@ import classNames from "classnames";
22
import { useGroomingRoom } from "@/contexts/GroomingRoomContext";
33
import { useSocket } from "@/contexts/SocketContext";
44
import { getCurrentLobby } from "@/shared/helpers/lobbyStorage";
5+
import { ENCOUTERED_ERROR_TYPE } from "@/shared/enums";
6+
import { handleRoomJoin } from "@/shared/helpers/roomJoin";
57

68
interface IProps {
79
title: string;
810
roomId: string;
911
}
1012
const GroomingBoardErrorPopup = ({ title, roomId }: IProps) => {
1113
const socket = useSocket();
12-
const { showErrorPopup, setShowErrorPopup } = useGroomingRoom();
14+
const { showErrorPopup, setShowErrorPopup, encounteredError, userInfo } = useGroomingRoom();
15+
16+
const handleRemoveUser = () => {
17+
localStorage.removeItem("lobby");
18+
socket.emit(
19+
"removeUser",
20+
roomId,
21+
userInfo.lobby.userID,
22+
userInfo.lobby.credentials
23+
);
24+
};
25+
1326
const handleClick = () => {
27+
if(encounteredError.id === ENCOUTERED_ERROR_TYPE.CREDENTIALS_ERROR){
28+
handleRemoveUser();
29+
handleRoomJoin(userInfo.nickname, true, roomId, userInfo.lobby.isAdmin)
30+
return;
31+
}
1432
const nickname = localStorage.getItem("nickname");
1533
const lobby = getCurrentLobby(roomId);
1634
socket.emit("joinRoom", {

gurubu-client/src/app/components/room/grooming-board/grooming-board.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ const GroomingBoard = ({
7676
if (data.id === ENCOUTERED_ERROR_TYPE.CONNECTION_ERROR) {
7777
setShowErrorPopup(true);
7878
}
79+
if (data.id === ENCOUTERED_ERROR_TYPE.CREDENTIALS_ERROR) {
80+
setShowErrorPopup(true);
81+
}
7982
setEncounteredError(data);
8083
};
8184

0 commit comments

Comments
 (0)