Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 13 additions & 9 deletions backend/src/room/room.gateway.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ const EVENT_NAME = {
ROOM_FINISHED: "room_finished",
} as const;


/**
* 연결과 관련된 에러를 처리
*
* 보다 연결과 관련된 코드가 존재
*/
@WebSocketGateway({
cors: {
origin: "*", // CORS 설정
Expand All @@ -41,7 +47,7 @@ export class RoomGateway implements OnGatewayConnection, OnGatewayDisconnect {

async handleDisconnect(client: Socket) {
console.log(`Client disconnected in room: ${client.id}`);
await this.roomService.leaveRoom(client.id);
await this.handleLeaveRoom(client);
}

@SubscribeMessage(EVENT_NAME.CREATE_ROOM)
Expand All @@ -53,11 +59,10 @@ export class RoomGateway implements OnGatewayConnection, OnGatewayDisconnect {
client.id,
nickname ?? "Master"
);
this.server.emit(EVENT_NAME.ROOM_CREATED, { roomId });
return roomId;
client.join(roomId);
this.server.to(roomId).emit(EVENT_NAME.ROOM_CREATED, { roomId });
} catch (error) {
console.error(error);
return null;
}
}

Expand Down Expand Up @@ -89,16 +94,15 @@ export class RoomGateway implements OnGatewayConnection, OnGatewayDisconnect {
const result = await this.roomService.leaveRoom(client.id);
const roomId = result.roomId;

if (Object.keys(result).length === 0) {
this.server
.to(roomId)
.emit(EVENT_NAME.USER_EXIT, { socketId: client.id });
} else {
if (Object.keys(result).length > 0) {
this.server.to(roomId).emit(EVENT_NAME.MASTER_CHANGED, {
masterSocketId: result.socketId,
masterNickname: result.nickname,
});
}
this.server
.to(roomId)
.emit(EVENT_NAME.USER_EXIT, { socketId: client.id });
}

@SubscribeMessage(EVENT_NAME.FINISH_ROOM)
Expand Down
8 changes: 3 additions & 5 deletions backend/src/room/room.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,14 @@ export class RoomRepository {
{} as Record<string, MemberConnection>
);
}

async checkHost(socketId: string) {
const roomId = await this.findMyRoomId(socketId);
const isHost = await this.redisService.getHashValueByField(
const hostId = await this.redisService.getHashValueByField(
`room:${roomId}:${socketId}`,
"isHost"
"host"
);
return isHost;
return socketId === hostId;
}

async getRoomById(roomId: string) {
const room = JSON.stringify(
await this.redisService.get(`room:${roomId}`)
Expand Down
38 changes: 17 additions & 21 deletions backend/src/room/room.service.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { Injectable } from "@nestjs/common";
import { Room } from "./room.model";
import { RoomRepository } from "./room.repository";

import { generateRoomId } from "../utils/generateRoomId";
import { HOUR } from "../utils/time";

/**
* 비즈니스 로직 처리를 좀 더 하게 하기 위한 클래스로 설정
* 예외 처리 (로직, 더 밑단 에러 처리 - redis 에러 등) 도 이곳에서 이루어질 예정
* redis 와 관련된 부분은 모르도록 하려고 합니다.
*/
@Injectable()
export class RoomService {
private static MAX_MEMBERS = 5;
Expand All @@ -22,6 +23,7 @@ export class RoomService {
socketId,
});
await this.roomRepository.addUser(roomId, socketId, nickname, true);
return roomId;
}

async joinRoom(socketId: string, roomId: string, nickname: string) {
Expand Down Expand Up @@ -56,29 +58,23 @@ export class RoomService {
return { roomId: null };
}

// 퇴장 로직
// 0 방에 유저가 본인만 남음 -> (master이던 말던) 방 삭제 -> return 0(인원수)
// 1 해당 유저가 master인지 확인
// 1.1 master라면? -> 유저 퇴장 -> 새로운 Master 정해주기 -> return 새로운 master socketId -> master_changed 이벤트 발생
// 1.2 master가 아니라면? -> 유저 퇴장 -> return 인원수 -> gateway에서 user_exit 이벤트 발생
const roomMemberCount =
await this.roomRepository.getRoomMemberCount(roomId);
if (roomMemberCount === 1) {
await this.roomRepository.deleteRoom(roomId);
return { roomId };
} else {
const isHost = await this.roomRepository.checkHost(socketId);
await this.roomRepository.deleteUser(socketId);
if (isHost === "true") {
const newHost = await this.roomRepository.getNewHost(roomId);
await this.roomRepository.setNewHost(roomId, newHost.socketId);
return {
roomId,
socketId: newHost.socketId,
nickname: newHost.nickname,
};
} else return { roomId };
}
const isHost = await this.roomRepository.checkHost(socketId);
await this.roomRepository.deleteUser(socketId);

if (isHost) return { roomId };
const newHost = await this.roomRepository.getNewHost(roomId);
await this.roomRepository.setNewHost(roomId, newHost.socketId);
return {
roomId,
socketId: newHost.socketId,
nickname: newHost.nickname,
};
}

async finishRoom(socketId: string) {
Expand Down