diff --git a/apps/server/src/domains/room/RoomHandler.ts b/apps/server/src/domains/room/RoomHandler.ts index 91f4dec..6cb4672 100644 --- a/apps/server/src/domains/room/RoomHandler.ts +++ b/apps/server/src/domains/room/RoomHandler.ts @@ -2,24 +2,28 @@ import { RoomManager } from "./RoomManager"; import { protocol } from "@repo/shared"; import type { roomTypes } from "@repo/shared"; +import { executeJoinRoomUseCase } from "./application/useCases/executeJoinRoomUseCase"; +import { executeRoomDisconnectUseCase } from "./application/useCases/executeRoomDisconnectUseCase"; export const registerRoomHandlers = (io: Server, socket: Socket, roomManager: RoomManager) => { socket.on(protocol.SocketEvents.JOIN_ROOM, (data: roomTypes.JoinRoomPayload) => { - const { roomId, playerName } = data; - console.log("[RoomHandler] JOIN_ROOM received", { roomId, socketId: socket.id, playerName }); + const { roomId } = data; socket.join(roomId); - // RoomManagerにデータ操作を依頼 - const room = roomManager.addPlayerToRoom(roomId, socket.id, playerName); + executeJoinRoomUseCase({ + roomManager, + socketId: socket.id, + data, + emitToRoom: (targetRoomId, event, payload) => { + if (payload === undefined) { + io.to(targetRoomId).emit(event); + return; + } - // ルーム内全員向け最新状態配信 - io.to(roomId).emit(protocol.SocketEvents.ROOM_UPDATE, room); - console.log("[RoomHandler] ROOM_UPDATE emitted", { - roomId, - ownerId: room.ownerId, - totalPlayers: room.players.length + io.to(targetRoomId).emit(event, payload); + }, }); }); @@ -29,20 +33,16 @@ * 切断時のルームクリーンアップ処理 */ export const handleRoomDisconnect = (io: Server, socket: Socket, roomManager: RoomManager) => { - // ルームからの除外処理 - const updatedRooms = roomManager.removePlayer(socket.id); - console.log("[RoomHandler] disconnect cleanup", { + executeRoomDisconnectUseCase({ + roomManager, socketId: socket.id, - updatedRoomCount: updatedRooms.length - }); - - // 更新があったルーム(オーナー変更など)にのみ通知を飛ばす - updatedRooms.forEach(room => { - io.to(room.roomId).emit(protocol.SocketEvents.ROOM_UPDATE, room); - console.log("[RoomHandler] ROOM_UPDATE emitted", { - roomId: room.roomId, - ownerId: room.ownerId, - totalPlayers: room.players.length - }); + emitToRoom: (roomId, event, payload) => { + if (payload === undefined) { + io.to(roomId).emit(event); + return; + } + + io.to(roomId).emit(event, payload); + }, }); }; \ No newline at end of file diff --git a/apps/server/src/domains/room/application/useCases/executeJoinRoomUseCase.ts b/apps/server/src/domains/room/application/useCases/executeJoinRoomUseCase.ts new file mode 100644 index 0000000..284f07b --- /dev/null +++ b/apps/server/src/domains/room/application/useCases/executeJoinRoomUseCase.ts @@ -0,0 +1,31 @@ +import { protocol } from "@repo/shared"; +import type { roomTypes } from "@repo/shared"; +import { RoomManager } from "@server/domains/room/RoomManager"; + +type EmitToRoom = (roomId: string, event: string, payload?: unknown) => void; + +type ExecuteJoinRoomUseCaseParams = { + roomManager: RoomManager; + socketId: string; + data: roomTypes.JoinRoomPayload; + emitToRoom: EmitToRoom; +}; + +export const executeJoinRoomUseCase = ({ + roomManager, + socketId, + data, + emitToRoom, +}: ExecuteJoinRoomUseCaseParams) => { + const { roomId, playerName } = data; + console.log("[RoomHandler] JOIN_ROOM received", { roomId, socketId, playerName }); + + const room = roomManager.addPlayerToRoom(roomId, socketId, playerName); + + emitToRoom(roomId, protocol.SocketEvents.ROOM_UPDATE, room); + console.log("[RoomHandler] ROOM_UPDATE emitted", { + roomId, + ownerId: room.ownerId, + totalPlayers: room.players.length, + }); +}; diff --git a/apps/server/src/domains/room/application/useCases/executeRoomDisconnectUseCase.ts b/apps/server/src/domains/room/application/useCases/executeRoomDisconnectUseCase.ts new file mode 100644 index 0000000..1b05af1 --- /dev/null +++ b/apps/server/src/domains/room/application/useCases/executeRoomDisconnectUseCase.ts @@ -0,0 +1,31 @@ +import { protocol } from "@repo/shared"; +import { RoomManager } from "@server/domains/room/RoomManager"; + +type EmitToRoom = (roomId: string, event: string, payload?: unknown) => void; + +type ExecuteRoomDisconnectUseCaseParams = { + roomManager: RoomManager; + socketId: string; + emitToRoom: EmitToRoom; +}; + +export const executeRoomDisconnectUseCase = ({ + roomManager, + socketId, + emitToRoom, +}: ExecuteRoomDisconnectUseCaseParams) => { + const updatedRooms = roomManager.removePlayer(socketId); + console.log("[RoomHandler] disconnect cleanup", { + socketId, + updatedRoomCount: updatedRooms.length, + }); + + updatedRooms.forEach((room) => { + emitToRoom(room.roomId, protocol.SocketEvents.ROOM_UPDATE, room); + console.log("[RoomHandler] ROOM_UPDATE emitted", { + roomId: room.roomId, + ownerId: room.ownerId, + totalPlayers: room.players.length, + }); + }); +};