From 6e4cbe4b8c5ebcadee66d0683ac0abfa3e2d3b0d Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Mon, 16 Sep 2024 21:38:33 +0900 Subject: [PATCH 01/40] =?UTF-8?q?Draw-348=20refactor:=20SessionUseCase=20?= =?UTF-8?q?=EC=9D=B4=EA=B4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xorker/draw/websocket/EmptyObject.kt | 3 -- .../draw/websocket/MainWebSocketHandler.kt | 5 ++- .../draw/websocket/WebSocketController.kt | 1 + .../xorker/draw/websocket/WebSocketRouter.kt | 5 ++- .../broker/SimpleSessionMessageBroker.kt | 12 +++--- .../draw/websocket/log/WebSocketLogger.kt | 6 +-- .../websocket/{ => session}/SessionFactory.kt | 6 ++- .../draw/websocket/session/SessionManager.kt | 42 ++++++++++--------- .../xorker/draw/websocket/SessionUseCase.kt | 10 ----- 9 files changed, 44 insertions(+), 46 deletions(-) delete mode 100644 app/websocket/src/main/kotlin/com/xorker/draw/websocket/EmptyObject.kt rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/{ => session}/SessionFactory.kt (87%) rename core/src/main/kotlin/com/xorker/draw/websocket/SessionService.kt => app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt (72%) delete mode 100644 core/src/main/kotlin/com/xorker/draw/websocket/SessionUseCase.kt diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/EmptyObject.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/EmptyObject.kt deleted file mode 100644 index 44fba0af..00000000 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/EmptyObject.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.xorker.draw.websocket - -object EmptyObject diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt index 343caa23..eb1c6931 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt @@ -7,6 +7,7 @@ import com.xorker.draw.support.metric.MetricManager import com.xorker.draw.websocket.exception.WebSocketExceptionHandler import com.xorker.draw.websocket.log.WebSocketLogger import com.xorker.draw.websocket.parser.WebSocketRequestParser +import com.xorker.draw.websocket.session.SessionManager import org.springframework.stereotype.Component import org.springframework.web.socket.CloseStatus import org.springframework.web.socket.TextMessage @@ -15,7 +16,7 @@ import org.springframework.web.socket.handler.TextWebSocketHandler @Component internal class MainWebSocketHandler( - private val sessionUseCase: SessionUseCase, + private val sessionManager: SessionManager, private val waitingQueueSessionUseCase: WaitingQueueSessionUseCase, private val router: WebSocketRouter, private val requestParser: WebSocketRequestParser, @@ -58,7 +59,7 @@ internal class MainWebSocketHandler( return } - val sessionDto = sessionUseCase.getSession(SessionId(session.id)) + val sessionDto = sessionManager.getSession(SessionId(session.id)) ?: return logger.error(InvalidWebSocketStatusException.message, InvalidWebSocketStatusException) when (status) { diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt index e05b5333..d82e5477 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt @@ -11,6 +11,7 @@ import com.xorker.draw.mafia.phase.MafiaPhaseUseCase import com.xorker.draw.room.RoomId import com.xorker.draw.websocket.message.request.WaitingQueueSessionWrapper import com.xorker.draw.websocket.message.request.toSessionWrapper +import com.xorker.draw.websocket.session.SessionFactory import org.springframework.context.event.EventListener import org.springframework.stereotype.Component import org.springframework.web.socket.WebSocketSession diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt index 77d4361f..d0500d00 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt @@ -11,6 +11,7 @@ import com.xorker.draw.websocket.message.request.dto.WebSocketRequest import com.xorker.draw.websocket.message.request.dto.game.MafiaGameInferAnswerRequest import com.xorker.draw.websocket.message.request.dto.game.MafiaGameReactionRequest import com.xorker.draw.websocket.message.request.dto.game.MafiaGameVoteMafiaRequest +import com.xorker.draw.websocket.session.SessionManager import org.slf4j.MDC import org.springframework.stereotype.Component import org.springframework.web.socket.WebSocketSession @@ -19,7 +20,7 @@ import org.springframework.web.socket.WebSocketSession internal class WebSocketRouter( private val objectMapper: ObjectMapper, private val webSocketController: WebSocketController, - private val sessionUseCase: SessionUseCase, + private val sessionManager: SessionManager, private val mafiaPhaseUseCase: MafiaPhaseUseCase, private val mafiaGameUseCase: MafiaGameUseCase, ) { @@ -35,7 +36,7 @@ internal class WebSocketRouter( return } - val sessionDto = sessionUseCase.getSession(SessionId(session.id)) ?: throw InvalidRequestValueException + val sessionDto = sessionManager.getSession(SessionId(session.id)) ?: throw InvalidRequestValueException MDC.put("roomId", sessionDto.roomId.value) when (request.action) { diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt index 0b730e55..f1fcc63f 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt @@ -6,16 +6,16 @@ import com.xorker.draw.websocket.BranchedBroadcastEvent import com.xorker.draw.websocket.BroadcastEvent import com.xorker.draw.websocket.RespectiveBroadcastEvent import com.xorker.draw.websocket.SessionMessageBroker -import com.xorker.draw.websocket.SessionUseCase import com.xorker.draw.websocket.UnicastEvent import com.xorker.draw.websocket.WaitingQueueSessionUseCase import com.xorker.draw.websocket.parser.WebSocketResponseParser +import com.xorker.draw.websocket.session.SessionManager import org.springframework.context.event.EventListener import org.springframework.stereotype.Component @Component internal class SimpleSessionMessageBroker( - private val sessionUseCase: SessionUseCase, + private val sessionManager: SessionManager, private val waitingQueueSessionUseCase: WaitingQueueSessionUseCase, private val roomRepository: RoomRepository, private val parser: WebSocketResponseParser, @@ -25,7 +25,7 @@ internal class SimpleSessionMessageBroker( override fun unicast(event: UnicastEvent) { val userId = event.userId - val session = sessionUseCase.getSession(userId) + val session = sessionManager.getSession(userId) if (session == null) { val waitingQueueSession = waitingQueueSessionUseCase.getSession(userId) @@ -54,7 +54,7 @@ internal class SimpleSessionMessageBroker( room.players.forEach { player -> val userId = player.userId - sessionUseCase.getSession(userId)?.send(response) + sessionManager.getSession(userId)?.send(response) } } } @@ -75,7 +75,7 @@ internal class SimpleSessionMessageBroker( room.players.forEach { player -> val userId = player.userId - sessionUseCase.getSession(userId)?.let { + sessionManager.getSession(userId)?.let { if (userId in branched) { it.send(branchedResponse) } else { @@ -96,7 +96,7 @@ internal class SimpleSessionMessageBroker( room.players.forEach { player -> val userId = player.userId - sessionUseCase.getSession(userId)?.let { + sessionManager.getSession(userId)?.let { val response = parser.parse(messages[userId] ?: throw InvalidBroadcastException) it.send(response) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt index 0a8fab26..79c8be65 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt @@ -6,9 +6,9 @@ import com.xorker.draw.support.logging.logger import com.xorker.draw.support.logging.registerRequestId import com.xorker.draw.websocket.SessionId import com.xorker.draw.websocket.SessionInitializeRequest -import com.xorker.draw.websocket.SessionUseCase import com.xorker.draw.websocket.message.request.RequestAction import com.xorker.draw.websocket.message.request.dto.WebSocketRequest +import com.xorker.draw.websocket.session.SessionManager import org.slf4j.MDC import org.springframework.stereotype.Component import org.springframework.web.socket.CloseStatus @@ -16,7 +16,7 @@ import org.springframework.web.socket.WebSocketSession @Component internal class WebSocketLogger( - private val sessionUseCase: SessionUseCase, + private val sessionManager: SessionManager, private val objectMapper: ObjectMapper, ) { private val logger = logger() @@ -80,7 +80,7 @@ internal class WebSocketLogger( } private fun injectDefaultSessionInfo(sessionId: SessionId, data: MutableMap) { - val sessionDto = sessionUseCase.getSession(sessionId) + val sessionDto = sessionManager.getSession(sessionId) if (sessionDto != null) { data["userId"] = sessionDto.user.id.value data["roomId"] = sessionDto.roomId diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/SessionFactory.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt similarity index 87% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/SessionFactory.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt index 9ae7434b..b0d129c4 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/SessionFactory.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket +package com.xorker.draw.websocket.session import com.xorker.draw.auth.token.TokenUseCase import com.xorker.draw.exception.UnAuthenticationException @@ -6,6 +6,10 @@ import com.xorker.draw.room.RoomId import com.xorker.draw.room.RoomRepository import com.xorker.draw.user.User import com.xorker.draw.user.UserId +import com.xorker.draw.websocket.MafiaGameRandomMatchingRequest +import com.xorker.draw.websocket.Session +import com.xorker.draw.websocket.SessionInitializeRequest +import com.xorker.draw.websocket.WaitingQueueSession import com.xorker.draw.websocket.message.request.SessionWrapper import com.xorker.draw.websocket.message.request.WaitingQueueSessionWrapper import org.slf4j.MDC diff --git a/core/src/main/kotlin/com/xorker/draw/websocket/SessionService.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt similarity index 72% rename from core/src/main/kotlin/com/xorker/draw/websocket/SessionService.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt index 01262516..bb5b4b01 100644 --- a/core/src/main/kotlin/com/xorker/draw/websocket/SessionService.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt @@ -1,6 +1,10 @@ -package com.xorker.draw.websocket +package com.xorker.draw.websocket.session import com.xorker.draw.user.UserId +import com.xorker.draw.websocket.Session +import com.xorker.draw.websocket.SessionEventListener +import com.xorker.draw.websocket.SessionId +import com.xorker.draw.websocket.SessionInitializeRequest import java.util.concurrent.ConcurrentHashMap import org.springframework.core.Ordered import org.springframework.core.annotation.Order @@ -8,30 +12,15 @@ import org.springframework.stereotype.Service @Order(Ordered.HIGHEST_PRECEDENCE) @Service -internal class SessionService : SessionUseCase, SessionEventListener { +internal class SessionManager : SessionEventListener { private val sessionMap: ConcurrentHashMap = ConcurrentHashMap() private val userIdMap: ConcurrentHashMap = ConcurrentHashMap() - override fun registerSession(session: Session) { - if (sessionMap.contains(session.id)) { - // Init을 중복으로 호출 하면 기존 데이터를 Unregister 하고 Init 한다. - unregisterSession(session.id) - } - - sessionMap[session.id] = session - userIdMap[session.user.id] = session - } - - override fun unregisterSession(sessionId: SessionId) { - val session = sessionMap.remove(sessionId) - userIdMap.remove(session?.user?.id) - } - - override fun getSession(sessionId: SessionId): Session? { + fun getSession(sessionId: SessionId): Session? { return sessionMap[sessionId] } - override fun getSession(userId: UserId): Session? { + fun getSession(userId: UserId): Session? { return userIdMap[userId] } @@ -50,4 +39,19 @@ internal class SessionService : SessionUseCase, SessionEventListener { override fun exitSession(session: Session) { unregisterSession(session.id) } + + private fun registerSession(session: Session) { + if (sessionMap.contains(session.id)) { + // Init을 중복으로 호출 하면 기존 데이터를 Unregister 하고 Init 한다. + unregisterSession(session.id) + } + + sessionMap[session.id] = session + userIdMap[session.user.id] = session + } + + private fun unregisterSession(sessionId: SessionId) { + val session = sessionMap.remove(sessionId) + userIdMap.remove(session?.user?.id) + } } diff --git a/core/src/main/kotlin/com/xorker/draw/websocket/SessionUseCase.kt b/core/src/main/kotlin/com/xorker/draw/websocket/SessionUseCase.kt deleted file mode 100644 index 1f184b86..00000000 --- a/core/src/main/kotlin/com/xorker/draw/websocket/SessionUseCase.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.xorker.draw.websocket - -import com.xorker.draw.user.UserId - -interface SessionUseCase { - fun registerSession(session: Session) - fun unregisterSession(sessionId: SessionId) - fun getSession(sessionId: SessionId): Session? - fun getSession(userId: UserId): Session? -} From a0d9be9f424ac1a5c8a02ec2a90e047b0f95acef Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Mon, 16 Sep 2024 22:42:37 +0900 Subject: [PATCH 02/40] =?UTF-8?q?DRAW-348=20refactor:=20Request=20Dto=20?= =?UTF-8?q?=EC=9D=B4=EA=B4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xorker/draw/websocket/WebSocketController.kt | 12 +++++++----- .../xorker/draw/websocket/log/WebSocketLogger.kt | 2 +- .../dto/game}/MafiaGameRandomMatchingRequest.kt | 2 +- .../request/dto/game}/SessionInitializeRequest.kt | 2 +- .../xorker/draw/websocket/session/SessionFactory.kt | 4 ++-- .../xorker/draw/websocket/session/SessionManager.kt | 5 +++-- .../com/xorker/draw/mafia/MafiaGameRoomService.kt | 12 ++++++------ domain/src/main/kotlin/com/xorker/draw/room/Room.kt | 13 ++++++++++++- .../xorker/draw/websocket/SessionEventListener.kt | 4 +++- 9 files changed, 36 insertions(+), 20 deletions(-) rename {domain/src/main/kotlin/com/xorker/draw/websocket => app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game}/MafiaGameRandomMatchingRequest.kt (67%) rename {domain/src/main/kotlin/com/xorker/draw/websocket => app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game}/SessionInitializeRequest.kt (70%) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt index d82e5477..433825c9 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt @@ -10,6 +10,8 @@ import com.xorker.draw.mafia.event.MafiaGameRandomMatchingEvent import com.xorker.draw.mafia.phase.MafiaPhaseUseCase import com.xorker.draw.room.RoomId import com.xorker.draw.websocket.message.request.WaitingQueueSessionWrapper +import com.xorker.draw.websocket.message.request.dto.game.MafiaGameRandomMatchingRequest +import com.xorker.draw.websocket.message.request.dto.game.SessionInitializeRequest import com.xorker.draw.websocket.message.request.toSessionWrapper import com.xorker.draw.websocket.session.SessionFactory import org.springframework.context.event.EventListener @@ -35,21 +37,21 @@ internal class WebSocketController( fun initializeSession(session: WebSocketSession, request: SessionInitializeRequest) { val sessionDto = sessionFactory.create(session, request) - val roomId = request.roomId + val roomId = RoomId(request.roomId) val joinedRoomId = mafiaGameUseCase.getGameInfo(sessionDto.user.id)?.room?.id - if (joinedRoomId != null && roomId != joinedRoomId.value) { + if (joinedRoomId != null && roomId != joinedRoomId) { throw InvalidRequestOtherPlayingException } if (roomId == null) { sessionEventListener.forEach { - it.connectSession(sessionDto, request) + it.connectSession(sessionDto, roomId, request.nickname, request.locale) } return } - val gameInfo = mafiaGameUseCase.getGameInfo(RoomId(roomId)) ?: throw NotFoundRoomException + val gameInfo = mafiaGameUseCase.getGameInfo(roomId) ?: throw NotFoundRoomException synchronized(gameInfo) { if (gameInfo.phase != MafiaPhase.Wait && gameInfo.room.players.any { it.userId == sessionDto.user.id }.not()) { @@ -61,7 +63,7 @@ internal class WebSocketController( } sessionEventListener.forEach { - it.connectSession(sessionDto, request) + it.connectSession(sessionDto, roomId, request.nickname, request.locale) } } } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt index 79c8be65..7b2a466f 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt @@ -5,9 +5,9 @@ import com.xorker.draw.support.logging.defaultApiJsonMap import com.xorker.draw.support.logging.logger import com.xorker.draw.support.logging.registerRequestId import com.xorker.draw.websocket.SessionId -import com.xorker.draw.websocket.SessionInitializeRequest import com.xorker.draw.websocket.message.request.RequestAction import com.xorker.draw.websocket.message.request.dto.WebSocketRequest +import com.xorker.draw.websocket.message.request.dto.game.SessionInitializeRequest import com.xorker.draw.websocket.session.SessionManager import org.slf4j.MDC import org.springframework.stereotype.Component diff --git a/domain/src/main/kotlin/com/xorker/draw/websocket/MafiaGameRandomMatchingRequest.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/MafiaGameRandomMatchingRequest.kt similarity index 67% rename from domain/src/main/kotlin/com/xorker/draw/websocket/MafiaGameRandomMatchingRequest.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/MafiaGameRandomMatchingRequest.kt index cd79260c..637a23ee 100644 --- a/domain/src/main/kotlin/com/xorker/draw/websocket/MafiaGameRandomMatchingRequest.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/MafiaGameRandomMatchingRequest.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket +package com.xorker.draw.websocket.message.request.dto.game data class MafiaGameRandomMatchingRequest( val accessToken: String, diff --git a/domain/src/main/kotlin/com/xorker/draw/websocket/SessionInitializeRequest.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/SessionInitializeRequest.kt similarity index 70% rename from domain/src/main/kotlin/com/xorker/draw/websocket/SessionInitializeRequest.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/SessionInitializeRequest.kt index 2063c8b4..8eab1579 100644 --- a/domain/src/main/kotlin/com/xorker/draw/websocket/SessionInitializeRequest.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/SessionInitializeRequest.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket +package com.xorker.draw.websocket.message.request.dto.game data class SessionInitializeRequest( val accessToken: String, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt index b0d129c4..4a74e23a 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt @@ -6,12 +6,12 @@ import com.xorker.draw.room.RoomId import com.xorker.draw.room.RoomRepository import com.xorker.draw.user.User import com.xorker.draw.user.UserId -import com.xorker.draw.websocket.MafiaGameRandomMatchingRequest import com.xorker.draw.websocket.Session -import com.xorker.draw.websocket.SessionInitializeRequest import com.xorker.draw.websocket.WaitingQueueSession import com.xorker.draw.websocket.message.request.SessionWrapper import com.xorker.draw.websocket.message.request.WaitingQueueSessionWrapper +import com.xorker.draw.websocket.message.request.dto.game.MafiaGameRandomMatchingRequest +import com.xorker.draw.websocket.message.request.dto.game.SessionInitializeRequest import org.slf4j.MDC import org.springframework.stereotype.Component import org.springframework.web.socket.WebSocketSession diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt index bb5b4b01..01121778 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt @@ -1,10 +1,11 @@ package com.xorker.draw.websocket.session +import com.xorker.draw.room.RoomId import com.xorker.draw.user.UserId import com.xorker.draw.websocket.Session import com.xorker.draw.websocket.SessionEventListener import com.xorker.draw.websocket.SessionId -import com.xorker.draw.websocket.SessionInitializeRequest +import com.xorker.draw.websocket.message.request.dto.game.SessionInitializeRequest import java.util.concurrent.ConcurrentHashMap import org.springframework.core.Ordered import org.springframework.core.annotation.Order @@ -24,7 +25,7 @@ internal class SessionManager : SessionEventListener { return userIdMap[userId] } - override fun connectSession(session: Session, request: SessionInitializeRequest) { + override fun connectSession(session: Session, roomId: RoomId?, nickname: String, locale: String) { registerSession(session) } diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt index 18ee6a2f..f963cb10 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt @@ -3,9 +3,9 @@ package com.xorker.draw.mafia import com.xorker.draw.exception.InvalidRequestValueException import com.xorker.draw.exception.NotFoundRoomException import com.xorker.draw.room.Room +import com.xorker.draw.room.RoomId import com.xorker.draw.websocket.Session import com.xorker.draw.websocket.SessionEventListener -import com.xorker.draw.websocket.SessionInitializeRequest import org.springframework.stereotype.Service @Service @@ -15,20 +15,20 @@ internal class MafiaGameRoomService( private val mafiaPhaseMessenger: MafiaPhaseMessenger, ) : SessionEventListener { - override fun connectSession(session: Session, request: SessionInitializeRequest) { + override fun connectSession(session: Session, roomId: RoomId?, nickname: String, locale: String) { var gameInfo = mafiaGameRepository.getGameInfo(session.roomId) val userId = session.user.id if (gameInfo == null) { - if (request.roomId != null) throw NotFoundRoomException - val player = MafiaPlayer(userId, request.nickname, generateColor(null)) - gameInfo = createGameInfo(session, request.locale, player) + if (roomId != null) throw NotFoundRoomException + val player = MafiaPlayer(userId, nickname, generateColor(null)) + gameInfo = createGameInfo(session, locale, player) } else { val player = gameInfo.findPlayer(userId) if (player != null) { player.connect() } else { - gameInfo.room.add(MafiaPlayer(userId, request.nickname, generateColor(gameInfo))) + gameInfo.room.add(MafiaPlayer(userId, nickname, generateColor(gameInfo))) } } diff --git a/domain/src/main/kotlin/com/xorker/draw/room/Room.kt b/domain/src/main/kotlin/com/xorker/draw/room/Room.kt index 3829a8ca..5dabddd3 100644 --- a/domain/src/main/kotlin/com/xorker/draw/room/Room.kt +++ b/domain/src/main/kotlin/com/xorker/draw/room/Room.kt @@ -5,7 +5,18 @@ import com.xorker.draw.exception.MaxRoomException import com.xorker.draw.user.UserId @JvmInline -value class RoomId(val value: String) +value class RoomId private constructor(val value: String) { + companion object { + operator fun invoke(value: String): RoomId { + return RoomId(value) + } + + operator fun invoke(value: String?): RoomId? { + if (value == null) return null + return RoomId(value) + } + } +} interface Room

{ val id: RoomId diff --git a/domain/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt b/domain/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt index 568c90ec..15043827 100644 --- a/domain/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt +++ b/domain/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt @@ -1,7 +1,9 @@ package com.xorker.draw.websocket +import com.xorker.draw.room.RoomId + interface SessionEventListener { - fun connectSession(session: Session, request: SessionInitializeRequest) + fun connectSession(session: Session, roomId: RoomId?, nickname: String, locale: String) fun connectSession(session: Session, locale: String) fun disconnectSession(session: Session) fun exitSession(session: Session) From 50dee78d1b2d9ec339ac27f0c26dcfdedf4d0967 Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Mon, 16 Sep 2024 22:48:04 +0900 Subject: [PATCH 03/40] =?UTF-8?q?DRAW-348=20refactor:=20Message=20Broker?= =?UTF-8?q?=20=EC=9D=B4=EA=B4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../draw/websocket/broker/SessionMessageBroker.kt | 13 +++++++++++++ .../websocket/broker/SimpleSessionMessageBroker.kt | 9 ++++----- .../draw/websocket/broker/WebSocketBroadcaster.kt | 8 ++++---- .../broker/event}/BranchedBroadcastEvent.kt | 3 ++- .../draw/websocket/broker/event}/BroadcastEvent.kt | 3 ++- .../broker/event}/RespectiveBroadcastEvent.kt | 3 ++- .../draw/websocket/broker/event}/UnicastEvent.kt | 3 ++- .../xorker/draw/websocket/session/SessionManager.kt | 1 - .../xorker/draw/websocket/SessionMessageBroker.kt | 8 -------- 9 files changed, 29 insertions(+), 22 deletions(-) create mode 100644 app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SessionMessageBroker.kt rename {domain/src/main/kotlin/com/xorker/draw/websocket => app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event}/BranchedBroadcastEvent.kt (71%) rename {domain/src/main/kotlin/com/xorker/draw/websocket => app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event}/BroadcastEvent.kt (56%) rename {domain/src/main/kotlin/com/xorker/draw/websocket => app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event}/RespectiveBroadcastEvent.kt (65%) rename {domain/src/main/kotlin/com/xorker/draw/websocket => app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event}/UnicastEvent.kt (56%) delete mode 100644 core/src/main/kotlin/com/xorker/draw/websocket/SessionMessageBroker.kt diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SessionMessageBroker.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SessionMessageBroker.kt new file mode 100644 index 00000000..094243f4 --- /dev/null +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SessionMessageBroker.kt @@ -0,0 +1,13 @@ +package com.xorker.draw.websocket.broker + +import com.xorker.draw.websocket.broker.event.BranchedBroadcastEvent +import com.xorker.draw.websocket.broker.event.BroadcastEvent +import com.xorker.draw.websocket.broker.event.RespectiveBroadcastEvent +import com.xorker.draw.websocket.broker.event.UnicastEvent + +interface SessionMessageBroker { + fun unicast(event: UnicastEvent) + fun broadcast(event: BroadcastEvent) + fun broadcast(event: BranchedBroadcastEvent) + fun broadcast(event: RespectiveBroadcastEvent) +} diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt index f1fcc63f..26acbda3 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt @@ -2,12 +2,11 @@ package com.xorker.draw.websocket.broker import com.xorker.draw.exception.InvalidBroadcastException import com.xorker.draw.room.RoomRepository -import com.xorker.draw.websocket.BranchedBroadcastEvent -import com.xorker.draw.websocket.BroadcastEvent -import com.xorker.draw.websocket.RespectiveBroadcastEvent -import com.xorker.draw.websocket.SessionMessageBroker -import com.xorker.draw.websocket.UnicastEvent import com.xorker.draw.websocket.WaitingQueueSessionUseCase +import com.xorker.draw.websocket.broker.event.BranchedBroadcastEvent +import com.xorker.draw.websocket.broker.event.BroadcastEvent +import com.xorker.draw.websocket.broker.event.RespectiveBroadcastEvent +import com.xorker.draw.websocket.broker.event.UnicastEvent import com.xorker.draw.websocket.parser.WebSocketResponseParser import com.xorker.draw.websocket.session.SessionManager import org.springframework.context.event.EventListener diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/WebSocketBroadcaster.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/WebSocketBroadcaster.kt index 435a89fe..0afba745 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/WebSocketBroadcaster.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/WebSocketBroadcaster.kt @@ -2,11 +2,11 @@ package com.xorker.draw.websocket.broker import com.xorker.draw.room.RoomId import com.xorker.draw.user.UserId -import com.xorker.draw.websocket.BranchedBroadcastEvent -import com.xorker.draw.websocket.BroadcastEvent -import com.xorker.draw.websocket.RespectiveBroadcastEvent import com.xorker.draw.websocket.SessionMessage -import com.xorker.draw.websocket.UnicastEvent +import com.xorker.draw.websocket.broker.event.BranchedBroadcastEvent +import com.xorker.draw.websocket.broker.event.BroadcastEvent +import com.xorker.draw.websocket.broker.event.RespectiveBroadcastEvent +import com.xorker.draw.websocket.broker.event.UnicastEvent import org.springframework.context.ApplicationEventPublisher import org.springframework.stereotype.Component diff --git a/domain/src/main/kotlin/com/xorker/draw/websocket/BranchedBroadcastEvent.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/BranchedBroadcastEvent.kt similarity index 71% rename from domain/src/main/kotlin/com/xorker/draw/websocket/BranchedBroadcastEvent.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/BranchedBroadcastEvent.kt index e6c6fa72..466039d9 100644 --- a/domain/src/main/kotlin/com/xorker/draw/websocket/BranchedBroadcastEvent.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/BranchedBroadcastEvent.kt @@ -1,7 +1,8 @@ -package com.xorker.draw.websocket +package com.xorker.draw.websocket.broker.event import com.xorker.draw.room.RoomId import com.xorker.draw.user.UserId +import com.xorker.draw.websocket.SessionMessage data class BranchedBroadcastEvent( val roomId: RoomId, diff --git a/domain/src/main/kotlin/com/xorker/draw/websocket/BroadcastEvent.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/BroadcastEvent.kt similarity index 56% rename from domain/src/main/kotlin/com/xorker/draw/websocket/BroadcastEvent.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/BroadcastEvent.kt index e6645363..f1ef7753 100644 --- a/domain/src/main/kotlin/com/xorker/draw/websocket/BroadcastEvent.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/BroadcastEvent.kt @@ -1,6 +1,7 @@ -package com.xorker.draw.websocket +package com.xorker.draw.websocket.broker.event import com.xorker.draw.room.RoomId +import com.xorker.draw.websocket.SessionMessage data class BroadcastEvent( val roomId: RoomId, diff --git a/domain/src/main/kotlin/com/xorker/draw/websocket/RespectiveBroadcastEvent.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/RespectiveBroadcastEvent.kt similarity index 65% rename from domain/src/main/kotlin/com/xorker/draw/websocket/RespectiveBroadcastEvent.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/RespectiveBroadcastEvent.kt index 88342529..5f596f3a 100644 --- a/domain/src/main/kotlin/com/xorker/draw/websocket/RespectiveBroadcastEvent.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/RespectiveBroadcastEvent.kt @@ -1,7 +1,8 @@ -package com.xorker.draw.websocket +package com.xorker.draw.websocket.broker.event import com.xorker.draw.room.RoomId import com.xorker.draw.user.UserId +import com.xorker.draw.websocket.SessionMessage data class RespectiveBroadcastEvent( val roomId: RoomId, diff --git a/domain/src/main/kotlin/com/xorker/draw/websocket/UnicastEvent.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/UnicastEvent.kt similarity index 56% rename from domain/src/main/kotlin/com/xorker/draw/websocket/UnicastEvent.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/UnicastEvent.kt index bff200ba..f3b34ab5 100644 --- a/domain/src/main/kotlin/com/xorker/draw/websocket/UnicastEvent.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/UnicastEvent.kt @@ -1,6 +1,7 @@ -package com.xorker.draw.websocket +package com.xorker.draw.websocket.broker.event import com.xorker.draw.user.UserId +import com.xorker.draw.websocket.SessionMessage data class UnicastEvent( val userId: UserId, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt index 01121778..23653916 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt @@ -5,7 +5,6 @@ import com.xorker.draw.user.UserId import com.xorker.draw.websocket.Session import com.xorker.draw.websocket.SessionEventListener import com.xorker.draw.websocket.SessionId -import com.xorker.draw.websocket.message.request.dto.game.SessionInitializeRequest import java.util.concurrent.ConcurrentHashMap import org.springframework.core.Ordered import org.springframework.core.annotation.Order diff --git a/core/src/main/kotlin/com/xorker/draw/websocket/SessionMessageBroker.kt b/core/src/main/kotlin/com/xorker/draw/websocket/SessionMessageBroker.kt deleted file mode 100644 index 2371e394..00000000 --- a/core/src/main/kotlin/com/xorker/draw/websocket/SessionMessageBroker.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.xorker.draw.websocket - -interface SessionMessageBroker { - fun unicast(event: UnicastEvent) - fun broadcast(event: BroadcastEvent) - fun broadcast(event: BranchedBroadcastEvent) - fun broadcast(event: RespectiveBroadcastEvent) -} From e5e595ba82aec58902b107d6b187518e947a87a7 Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Mon, 16 Sep 2024 22:56:32 +0900 Subject: [PATCH 04/40] =?UTF-8?q?DRAW-348=20refactor:=20Domain=EC=97=90=20?= =?UTF-8?q?=EC=9E=88=EB=8A=94=20=EA=B0=9D=EC=B2=B4=20Core=EB=A1=9C=20?= =?UTF-8?q?=EC=9E=84=EC=8B=9C=20=EC=9D=B4=EA=B4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xorker/draw/websocket/broker/WebSocketBroadcaster.kt | 2 +- .../draw/websocket/broker/event/BranchedBroadcastEvent.kt | 2 +- .../com/xorker/draw/websocket/broker/event/BroadcastEvent.kt | 2 +- .../draw/websocket/broker/event/RespectiveBroadcastEvent.kt | 2 +- .../com/xorker/draw/websocket/broker/event/UnicastEvent.kt | 2 +- .../com/xorker/draw/websocket/exception/ExceptionMessage.kt | 2 +- .../websocket/message/response/MafiaPhaseMessengerImpl.kt | 1 - .../xorker/draw/websocket/message/response}/ResponseAction.kt | 2 +- .../xorker/draw/websocket/message/response}/SessionMessage.kt | 2 +- .../message/response/dto/game/MafiaGameAnswerMessage.kt | 4 ++-- .../message/response/dto/game/MafiaGameDrawMessage.kt | 4 ++-- .../message/response/dto/game/MafiaGamePlayerListMessage.kt | 4 ++-- .../message/response/dto/game/MafiaGameReactionMessage.kt | 4 ++-- .../message/response/dto/game/MafiaGameTurnInfoMessage.kt | 4 ++-- .../message/response/dto/game/MafiaGameVoteStatusMessage.kt | 4 ++-- .../message/response/dto/game/MafiaRandomMatchingMessage.kt | 4 ++-- .../message/response/dto/phase/MafiaGameInfoMessage.kt | 4 ++-- .../message/response/dto/phase/MafiaPhaseEndMessage.kt | 4 ++-- .../response/dto/phase/MafiaPhaseInferAnswerMessage.kt | 4 ++-- .../message/response/dto/phase/MafiaPhasePlayingMessage.kt | 4 ++-- .../message/response/dto/phase/MafiaPhaseReadyMessage.kt | 4 ++-- .../message/response/dto/phase/MafiaPhaseVoteMessage.kt | 4 ++-- .../message/response/dto/phase/MafiaPhaseWaitMessage.kt | 4 ++-- .../xorker/draw/websocket/parser/WebSocketResponseParser.kt | 2 +- .../kotlin/com/xorker/draw/websocket/SessionEventListener.kt | 0 .../xorker/draw/websocket/WaitingQueueSessionEventListener.kt | 0 26 files changed, 37 insertions(+), 38 deletions(-) rename {domain/src/main/kotlin/com/xorker/draw/websocket => app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response}/ResponseAction.kt (92%) rename {domain/src/main/kotlin/com/xorker/draw/websocket => app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response}/SessionMessage.kt (75%) rename {domain => core}/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt (100%) rename {domain => core}/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionEventListener.kt (100%) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/WebSocketBroadcaster.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/WebSocketBroadcaster.kt index 0afba745..e408d5dc 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/WebSocketBroadcaster.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/WebSocketBroadcaster.kt @@ -2,11 +2,11 @@ package com.xorker.draw.websocket.broker import com.xorker.draw.room.RoomId import com.xorker.draw.user.UserId -import com.xorker.draw.websocket.SessionMessage import com.xorker.draw.websocket.broker.event.BranchedBroadcastEvent import com.xorker.draw.websocket.broker.event.BroadcastEvent import com.xorker.draw.websocket.broker.event.RespectiveBroadcastEvent import com.xorker.draw.websocket.broker.event.UnicastEvent +import com.xorker.draw.websocket.message.response.SessionMessage import org.springframework.context.ApplicationEventPublisher import org.springframework.stereotype.Component diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/BranchedBroadcastEvent.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/BranchedBroadcastEvent.kt index 466039d9..984029f8 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/BranchedBroadcastEvent.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/BranchedBroadcastEvent.kt @@ -2,7 +2,7 @@ package com.xorker.draw.websocket.broker.event import com.xorker.draw.room.RoomId import com.xorker.draw.user.UserId -import com.xorker.draw.websocket.SessionMessage +import com.xorker.draw.websocket.message.response.SessionMessage data class BranchedBroadcastEvent( val roomId: RoomId, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/BroadcastEvent.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/BroadcastEvent.kt index f1ef7753..f93d68c1 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/BroadcastEvent.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/BroadcastEvent.kt @@ -1,7 +1,7 @@ package com.xorker.draw.websocket.broker.event import com.xorker.draw.room.RoomId -import com.xorker.draw.websocket.SessionMessage +import com.xorker.draw.websocket.message.response.SessionMessage data class BroadcastEvent( val roomId: RoomId, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/RespectiveBroadcastEvent.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/RespectiveBroadcastEvent.kt index 5f596f3a..edcde968 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/RespectiveBroadcastEvent.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/RespectiveBroadcastEvent.kt @@ -2,7 +2,7 @@ package com.xorker.draw.websocket.broker.event import com.xorker.draw.room.RoomId import com.xorker.draw.user.UserId -import com.xorker.draw.websocket.SessionMessage +import com.xorker.draw.websocket.message.response.SessionMessage data class RespectiveBroadcastEvent( val roomId: RoomId, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/UnicastEvent.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/UnicastEvent.kt index f3b34ab5..e84e8195 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/UnicastEvent.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/event/UnicastEvent.kt @@ -1,7 +1,7 @@ package com.xorker.draw.websocket.broker.event import com.xorker.draw.user.UserId -import com.xorker.draw.websocket.SessionMessage +import com.xorker.draw.websocket.message.response.SessionMessage data class UnicastEvent( val userId: UserId, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/exception/ExceptionMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/exception/ExceptionMessage.kt index 5bbdc744..2b477aa0 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/exception/ExceptionMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/exception/ExceptionMessage.kt @@ -1,8 +1,8 @@ package com.xorker.draw.websocket.exception import com.xorker.draw.exception.ExceptionResponse -import com.xorker.draw.websocket.SessionMessage import com.xorker.draw.websocket.message.request.RequestAction +import com.xorker.draw.websocket.message.response.SessionMessage internal class ExceptionMessage( val action: RequestAction, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaPhaseMessengerImpl.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaPhaseMessengerImpl.kt index 8fbddc24..bf445f8d 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaPhaseMessengerImpl.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaPhaseMessengerImpl.kt @@ -8,7 +8,6 @@ import com.xorker.draw.mafia.MafiaPhaseMessenger import com.xorker.draw.mafia.MafiaPlayer import com.xorker.draw.room.RoomId import com.xorker.draw.user.UserId -import com.xorker.draw.websocket.SessionMessage import com.xorker.draw.websocket.broker.WebSocketBroadcaster import com.xorker.draw.websocket.message.response.dto.game.toResponse import com.xorker.draw.websocket.message.response.dto.phase.MafiaGameInfoBody diff --git a/domain/src/main/kotlin/com/xorker/draw/websocket/ResponseAction.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/ResponseAction.kt similarity index 92% rename from domain/src/main/kotlin/com/xorker/draw/websocket/ResponseAction.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/ResponseAction.kt index 8dec0ea9..373f426d 100644 --- a/domain/src/main/kotlin/com/xorker/draw/websocket/ResponseAction.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/ResponseAction.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket +package com.xorker.draw.websocket.message.response enum class ResponseAction( description: String, diff --git a/domain/src/main/kotlin/com/xorker/draw/websocket/SessionMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/SessionMessage.kt similarity index 75% rename from domain/src/main/kotlin/com/xorker/draw/websocket/SessionMessage.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/SessionMessage.kt index 94672d0f..7051bb4d 100644 --- a/domain/src/main/kotlin/com/xorker/draw/websocket/SessionMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/SessionMessage.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket +package com.xorker.draw.websocket.message.response interface SessionMessage { val action: ResponseAction diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameAnswerMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameAnswerMessage.kt index a49e8280..512bc7b1 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameAnswerMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameAnswerMessage.kt @@ -1,7 +1,7 @@ package com.xorker.draw.websocket.message.response.dto.game -import com.xorker.draw.websocket.ResponseAction -import com.xorker.draw.websocket.SessionMessage +import com.xorker.draw.websocket.message.response.ResponseAction +import com.xorker.draw.websocket.message.response.SessionMessage data class MafiaGameAnswerMessage( override val body: MafiaGameAnswerBody, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameDrawMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameDrawMessage.kt index e23eeb33..2c1f8634 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameDrawMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameDrawMessage.kt @@ -1,7 +1,7 @@ package com.xorker.draw.websocket.message.response.dto.game -import com.xorker.draw.websocket.ResponseAction -import com.xorker.draw.websocket.SessionMessage +import com.xorker.draw.websocket.message.response.ResponseAction +import com.xorker.draw.websocket.message.response.SessionMessage data class MafiaGameDrawMessage( override val body: MafiaGameDrawBody, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGamePlayerListMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGamePlayerListMessage.kt index a820a8aa..353ef11b 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGamePlayerListMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGamePlayerListMessage.kt @@ -2,8 +2,8 @@ package com.xorker.draw.websocket.message.response.dto.game import com.xorker.draw.mafia.MafiaPlayer import com.xorker.draw.user.UserId -import com.xorker.draw.websocket.ResponseAction -import com.xorker.draw.websocket.SessionMessage +import com.xorker.draw.websocket.message.response.ResponseAction +import com.xorker.draw.websocket.message.response.SessionMessage data class MafiaGamePlayerListMessage( override val body: MafiaGamePlayerListBody, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameReactionMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameReactionMessage.kt index c406e2dd..d5a45991 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameReactionMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameReactionMessage.kt @@ -1,7 +1,7 @@ package com.xorker.draw.websocket.message.response.dto.game -import com.xorker.draw.websocket.ResponseAction -import com.xorker.draw.websocket.SessionMessage +import com.xorker.draw.websocket.message.response.ResponseAction +import com.xorker.draw.websocket.message.response.SessionMessage data class MafiaGameReactionMessage( override val body: MafiaGameReactionBody, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameTurnInfoMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameTurnInfoMessage.kt index 3d0e5447..f957ad8f 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameTurnInfoMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameTurnInfoMessage.kt @@ -1,8 +1,8 @@ package com.xorker.draw.websocket.message.response.dto.game import com.xorker.draw.user.UserId -import com.xorker.draw.websocket.ResponseAction -import com.xorker.draw.websocket.SessionMessage +import com.xorker.draw.websocket.message.response.ResponseAction +import com.xorker.draw.websocket.message.response.SessionMessage import java.time.LocalDateTime data class MafiaGameTurnInfoMessage( diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameVoteStatusMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameVoteStatusMessage.kt index 3cc95577..713036d7 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameVoteStatusMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameVoteStatusMessage.kt @@ -1,8 +1,8 @@ package com.xorker.draw.websocket.message.response.dto.game import com.xorker.draw.user.UserId -import com.xorker.draw.websocket.ResponseAction -import com.xorker.draw.websocket.SessionMessage +import com.xorker.draw.websocket.message.response.ResponseAction +import com.xorker.draw.websocket.message.response.SessionMessage data class MafiaGameVoteStatusMessage( override val body: MafiaGameVoteStatusBody, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaRandomMatchingMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaRandomMatchingMessage.kt index 2ed618ce..c8f9f20f 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaRandomMatchingMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaRandomMatchingMessage.kt @@ -1,7 +1,7 @@ package com.xorker.draw.websocket.message.response.dto.game -import com.xorker.draw.websocket.ResponseAction -import com.xorker.draw.websocket.SessionMessage +import com.xorker.draw.websocket.message.response.ResponseAction +import com.xorker.draw.websocket.message.response.SessionMessage data class MafiaRandomMatchingMessage( override val body: MafiaRandomMatchingBody, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaGameInfoMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaGameInfoMessage.kt index 9f09b408..b85065ac 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaGameInfoMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaGameInfoMessage.kt @@ -4,8 +4,8 @@ import com.xorker.draw.mafia.MafiaGameOption import com.xorker.draw.mafia.MafiaPlayer import com.xorker.draw.room.RoomId import com.xorker.draw.user.UserId -import com.xorker.draw.websocket.ResponseAction -import com.xorker.draw.websocket.SessionMessage +import com.xorker.draw.websocket.message.response.ResponseAction +import com.xorker.draw.websocket.message.response.SessionMessage data class MafiaGameInfoMessage( override val body: MafiaGameInfoBody, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseEndMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseEndMessage.kt index 04beddbc..2c7a410c 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseEndMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseEndMessage.kt @@ -1,7 +1,7 @@ package com.xorker.draw.websocket.message.response.dto.phase -import com.xorker.draw.websocket.ResponseAction -import com.xorker.draw.websocket.SessionMessage +import com.xorker.draw.websocket.message.response.ResponseAction +import com.xorker.draw.websocket.message.response.SessionMessage import java.time.LocalDateTime data class MafiaPhaseEndMessage( diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseInferAnswerMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseInferAnswerMessage.kt index 75d53011..3af152b4 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseInferAnswerMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseInferAnswerMessage.kt @@ -1,7 +1,7 @@ package com.xorker.draw.websocket.message.response.dto.phase -import com.xorker.draw.websocket.ResponseAction -import com.xorker.draw.websocket.SessionMessage +import com.xorker.draw.websocket.message.response.ResponseAction +import com.xorker.draw.websocket.message.response.SessionMessage import java.time.LocalDateTime data class MafiaPhaseInferAnswerMessage( diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhasePlayingMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhasePlayingMessage.kt index 8f2ee8db..c91c30fb 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhasePlayingMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhasePlayingMessage.kt @@ -1,7 +1,7 @@ package com.xorker.draw.websocket.message.response.dto.phase -import com.xorker.draw.websocket.ResponseAction -import com.xorker.draw.websocket.SessionMessage +import com.xorker.draw.websocket.message.response.ResponseAction +import com.xorker.draw.websocket.message.response.SessionMessage import java.time.LocalDateTime data class MafiaPhasePlayingMessage( diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseReadyMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseReadyMessage.kt index 095c4aee..f9c62209 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseReadyMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseReadyMessage.kt @@ -1,7 +1,7 @@ package com.xorker.draw.websocket.message.response.dto.phase -import com.xorker.draw.websocket.ResponseAction -import com.xorker.draw.websocket.SessionMessage +import com.xorker.draw.websocket.message.response.ResponseAction +import com.xorker.draw.websocket.message.response.SessionMessage import java.time.LocalDateTime data class MafiaPhaseReadyMessage( diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseVoteMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseVoteMessage.kt index 0bb64fcf..3d58ec65 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseVoteMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseVoteMessage.kt @@ -1,8 +1,8 @@ package com.xorker.draw.websocket.message.response.dto.phase import com.xorker.draw.user.UserId -import com.xorker.draw.websocket.ResponseAction -import com.xorker.draw.websocket.SessionMessage +import com.xorker.draw.websocket.message.response.ResponseAction +import com.xorker.draw.websocket.message.response.SessionMessage import java.time.LocalDateTime data class MafiaPhaseVoteMessage( diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseWaitMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseWaitMessage.kt index 735b1a27..0fc4dc09 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseWaitMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseWaitMessage.kt @@ -1,8 +1,8 @@ package com.xorker.draw.websocket.message.response.dto.phase import com.xorker.draw.room.RoomId -import com.xorker.draw.websocket.ResponseAction -import com.xorker.draw.websocket.SessionMessage +import com.xorker.draw.websocket.message.response.ResponseAction +import com.xorker.draw.websocket.message.response.SessionMessage import com.xorker.draw.websocket.message.response.dto.game.MafiaPlayerResponse data class MafiaPhaseWaitMessage( diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/parser/WebSocketResponseParser.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/parser/WebSocketResponseParser.kt index 7fd1e8df..77012687 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/parser/WebSocketResponseParser.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/parser/WebSocketResponseParser.kt @@ -1,8 +1,8 @@ package com.xorker.draw.websocket.parser import com.fasterxml.jackson.databind.ObjectMapper -import com.xorker.draw.websocket.SessionMessage import com.xorker.draw.websocket.exception.ExceptionMessage +import com.xorker.draw.websocket.message.response.SessionMessage import org.springframework.stereotype.Component @Component diff --git a/domain/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt b/core/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt similarity index 100% rename from domain/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt rename to core/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt diff --git a/domain/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionEventListener.kt b/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionEventListener.kt similarity index 100% rename from domain/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionEventListener.kt rename to core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionEventListener.kt From e54a267fbb314b6efa0ff45272069344d903d4bc Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Mon, 16 Sep 2024 23:23:28 +0900 Subject: [PATCH 05/40] =?UTF-8?q?DRAW-350=20fix:=20Package=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../draw/websocket/MainWebSocketHandler.kt | 2 +- .../draw/websocket/WebSocketController.kt | 8 ++--- .../xorker/draw/websocket/WebSocketRouter.kt | 8 ++--- .../broker/SimpleSessionMessageBroker.kt | 2 +- .../exception/WebSocketExceptionHandler.kt | 2 +- .../draw/websocket/log/WebSocketLogger.kt | 4 +-- .../message/request/WebSocketRequest.kt | 6 ++++ .../request}/WebSocketRequestParser.kt | 4 +-- .../message/request/dto/WebSocketRequest.kt | 8 ----- .../MafiaGameInferAnswerRequest.kt | 2 +- .../MafiaGameRandomMatchingRequest.kt | 2 +- .../MafiaGameReactionRequest.kt | 2 +- .../MafiaGameStartGameRequest.kt | 2 +- .../MafiaGameVoteMafiaRequest.kt | 2 +- .../SessionInitializeRequest.kt | 2 +- .../response/MafiaGameMessengerImpl.kt | 28 ++++++++--------- .../response/MafiaPhaseMessengerImpl.kt | 31 +++++++++---------- .../response}/WebSocketResponseParser.kt | 3 +- .../game => mafia}/MafiaGameAnswerMessage.kt | 2 +- .../game => mafia}/MafiaGameDrawMessage.kt | 2 +- .../phase => mafia}/MafiaGameInfoMessage.kt | 2 +- .../MafiaGamePlayerListMessage.kt | 2 +- .../MafiaGameReactionMessage.kt | 2 +- .../MafiaGameTurnInfoMessage.kt | 2 +- .../MafiaGameVoteStatusMessage.kt | 2 +- .../phase => mafia}/MafiaPhaseEndMessage.kt | 2 +- .../MafiaPhaseInferAnswerMessage.kt | 2 +- .../MafiaPhasePlayingMessage.kt | 2 +- .../phase => mafia}/MafiaPhaseReadyMessage.kt | 2 +- .../phase => mafia}/MafiaPhaseVoteMessage.kt | 2 +- .../phase => mafia}/MafiaPhaseWaitMessage.kt | 3 +- .../MafiaRandomMatchingMessage.kt | 2 +- .../draw/websocket/session/SessionFactory.kt | 6 ++-- .../request => session}/SessionWrapper.kt | 2 +- 34 files changed, 73 insertions(+), 82 deletions(-) create mode 100644 app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/WebSocketRequest.kt rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/{parser => message/request}/WebSocketRequestParser.kt (72%) delete mode 100644 app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/WebSocketRequest.kt rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/{dto/game => mafia}/MafiaGameInferAnswerRequest.kt (53%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/{dto/game => mafia}/MafiaGameRandomMatchingRequest.kt (67%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/{dto/game => mafia}/MafiaGameReactionRequest.kt (52%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/{dto/game => mafia}/MafiaGameStartGameRequest.kt (52%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/{dto/game => mafia}/MafiaGameVoteMafiaRequest.kt (51%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/{dto/game => mafia}/SessionInitializeRequest.kt (70%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/{parser => message/response}/WebSocketResponseParser.kt (89%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/{dto/game => mafia}/MafiaGameAnswerMessage.kt (86%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/{dto/game => mafia}/MafiaGameDrawMessage.kt (89%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/{dto/phase => mafia}/MafiaGameInfoMessage.kt (96%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/{dto/game => mafia}/MafiaGamePlayerListMessage.kt (93%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/{dto/game => mafia}/MafiaGameReactionMessage.kt (87%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/{dto/game => mafia}/MafiaGameTurnInfoMessage.kt (91%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/{dto/game => mafia}/MafiaGameVoteStatusMessage.kt (88%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/{dto/phase => mafia}/MafiaPhaseEndMessage.kt (90%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/{dto/phase => mafia}/MafiaPhaseInferAnswerMessage.kt (90%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/{dto/phase => mafia}/MafiaPhasePlayingMessage.kt (91%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/{dto/phase => mafia}/MafiaPhaseReadyMessage.kt (88%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/{dto/phase => mafia}/MafiaPhaseVoteMessage.kt (90%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/{dto/phase => mafia}/MafiaPhaseWaitMessage.kt (79%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/{dto/game => mafia}/MafiaRandomMatchingMessage.kt (86%) rename app/websocket/src/main/kotlin/com/xorker/draw/websocket/{message/request => session}/SessionWrapper.kt (96%) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt index eb1c6931..ce2b5cd0 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt @@ -6,7 +6,7 @@ import com.xorker.draw.support.logging.logger import com.xorker.draw.support.metric.MetricManager import com.xorker.draw.websocket.exception.WebSocketExceptionHandler import com.xorker.draw.websocket.log.WebSocketLogger -import com.xorker.draw.websocket.parser.WebSocketRequestParser +import com.xorker.draw.websocket.message.request.WebSocketRequestParser import com.xorker.draw.websocket.session.SessionManager import org.springframework.stereotype.Component import org.springframework.web.socket.CloseStatus diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt index 433825c9..7844a8db 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt @@ -9,11 +9,11 @@ import com.xorker.draw.mafia.MafiaPhase import com.xorker.draw.mafia.event.MafiaGameRandomMatchingEvent import com.xorker.draw.mafia.phase.MafiaPhaseUseCase import com.xorker.draw.room.RoomId -import com.xorker.draw.websocket.message.request.WaitingQueueSessionWrapper -import com.xorker.draw.websocket.message.request.dto.game.MafiaGameRandomMatchingRequest -import com.xorker.draw.websocket.message.request.dto.game.SessionInitializeRequest -import com.xorker.draw.websocket.message.request.toSessionWrapper +import com.xorker.draw.websocket.message.request.mafia.MafiaGameRandomMatchingRequest +import com.xorker.draw.websocket.message.request.mafia.SessionInitializeRequest import com.xorker.draw.websocket.session.SessionFactory +import com.xorker.draw.websocket.session.WaitingQueueSessionWrapper +import com.xorker.draw.websocket.session.toSessionWrapper import org.springframework.context.event.EventListener import org.springframework.stereotype.Component import org.springframework.web.socket.WebSocketSession diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt index d0500d00..e331814c 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt @@ -7,10 +7,10 @@ import com.xorker.draw.mafia.MafiaGameUseCase import com.xorker.draw.mafia.phase.MafiaPhaseUseCase import com.xorker.draw.user.UserId import com.xorker.draw.websocket.message.request.RequestAction -import com.xorker.draw.websocket.message.request.dto.WebSocketRequest -import com.xorker.draw.websocket.message.request.dto.game.MafiaGameInferAnswerRequest -import com.xorker.draw.websocket.message.request.dto.game.MafiaGameReactionRequest -import com.xorker.draw.websocket.message.request.dto.game.MafiaGameVoteMafiaRequest +import com.xorker.draw.websocket.message.request.WebSocketRequest +import com.xorker.draw.websocket.message.request.mafia.MafiaGameInferAnswerRequest +import com.xorker.draw.websocket.message.request.mafia.MafiaGameReactionRequest +import com.xorker.draw.websocket.message.request.mafia.MafiaGameVoteMafiaRequest import com.xorker.draw.websocket.session.SessionManager import org.slf4j.MDC import org.springframework.stereotype.Component diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt index 26acbda3..c3645292 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt @@ -7,7 +7,7 @@ import com.xorker.draw.websocket.broker.event.BranchedBroadcastEvent import com.xorker.draw.websocket.broker.event.BroadcastEvent import com.xorker.draw.websocket.broker.event.RespectiveBroadcastEvent import com.xorker.draw.websocket.broker.event.UnicastEvent -import com.xorker.draw.websocket.parser.WebSocketResponseParser +import com.xorker.draw.websocket.message.response.WebSocketResponseParser import com.xorker.draw.websocket.session.SessionManager import org.springframework.context.event.EventListener import org.springframework.stereotype.Component diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/exception/WebSocketExceptionHandler.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/exception/WebSocketExceptionHandler.kt index 6f2c5a3a..a8dbbbe8 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/exception/WebSocketExceptionHandler.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/exception/WebSocketExceptionHandler.kt @@ -6,7 +6,7 @@ import com.xorker.draw.exception.XorkerException import com.xorker.draw.exception.XorkerExceptionHandler import com.xorker.draw.support.logging.logger import com.xorker.draw.websocket.message.request.RequestAction -import com.xorker.draw.websocket.parser.WebSocketResponseParser +import com.xorker.draw.websocket.message.response.WebSocketResponseParser import org.springframework.stereotype.Component import org.springframework.web.socket.TextMessage import org.springframework.web.socket.WebSocketSession diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt index 7b2a466f..fd2bc608 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt @@ -6,8 +6,8 @@ import com.xorker.draw.support.logging.logger import com.xorker.draw.support.logging.registerRequestId import com.xorker.draw.websocket.SessionId import com.xorker.draw.websocket.message.request.RequestAction -import com.xorker.draw.websocket.message.request.dto.WebSocketRequest -import com.xorker.draw.websocket.message.request.dto.game.SessionInitializeRequest +import com.xorker.draw.websocket.message.request.WebSocketRequest +import com.xorker.draw.websocket.message.request.mafia.SessionInitializeRequest import com.xorker.draw.websocket.session.SessionManager import org.slf4j.MDC import org.springframework.stereotype.Component diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/WebSocketRequest.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/WebSocketRequest.kt new file mode 100644 index 00000000..0f56dc4e --- /dev/null +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/WebSocketRequest.kt @@ -0,0 +1,6 @@ +package com.xorker.draw.websocket.message.request + +data class WebSocketRequest( + val action: RequestAction, + val body: String?, +) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/parser/WebSocketRequestParser.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/WebSocketRequestParser.kt similarity index 72% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/parser/WebSocketRequestParser.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/WebSocketRequestParser.kt index 70c629b5..db533266 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/parser/WebSocketRequestParser.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/WebSocketRequestParser.kt @@ -1,7 +1,5 @@ -package com.xorker.draw.websocket.parser +package com.xorker.draw.websocket.message.request -import com.xorker.draw.websocket.message.request.RequestAction -import com.xorker.draw.websocket.message.request.dto.WebSocketRequest import org.springframework.stereotype.Component @Component diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/WebSocketRequest.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/WebSocketRequest.kt deleted file mode 100644 index 5b1270ef..00000000 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/WebSocketRequest.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.xorker.draw.websocket.message.request.dto - -import com.xorker.draw.websocket.message.request.RequestAction - -data class WebSocketRequest( - val action: RequestAction, - val body: String?, -) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/MafiaGameInferAnswerRequest.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/mafia/MafiaGameInferAnswerRequest.kt similarity index 53% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/MafiaGameInferAnswerRequest.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/mafia/MafiaGameInferAnswerRequest.kt index 05fa46aa..343165f2 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/MafiaGameInferAnswerRequest.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/mafia/MafiaGameInferAnswerRequest.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.request.dto.game +package com.xorker.draw.websocket.message.request.mafia data class MafiaGameInferAnswerRequest( val answer: String, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/MafiaGameRandomMatchingRequest.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/mafia/MafiaGameRandomMatchingRequest.kt similarity index 67% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/MafiaGameRandomMatchingRequest.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/mafia/MafiaGameRandomMatchingRequest.kt index 637a23ee..fecce7b2 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/MafiaGameRandomMatchingRequest.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/mafia/MafiaGameRandomMatchingRequest.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.request.dto.game +package com.xorker.draw.websocket.message.request.mafia data class MafiaGameRandomMatchingRequest( val accessToken: String, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/MafiaGameReactionRequest.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/mafia/MafiaGameReactionRequest.kt similarity index 52% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/MafiaGameReactionRequest.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/mafia/MafiaGameReactionRequest.kt index 7aab98f5..de8fd15d 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/MafiaGameReactionRequest.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/mafia/MafiaGameReactionRequest.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.request.dto.game +package com.xorker.draw.websocket.message.request.mafia data class MafiaGameReactionRequest( val reaction: String, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/MafiaGameStartGameRequest.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/mafia/MafiaGameStartGameRequest.kt similarity index 52% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/MafiaGameStartGameRequest.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/mafia/MafiaGameStartGameRequest.kt index d66973d9..b5b6f9da 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/MafiaGameStartGameRequest.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/mafia/MafiaGameStartGameRequest.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.request.dto.game +package com.xorker.draw.websocket.message.request.mafia data class MafiaGameStartGameRequest( val roomId: String?, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/MafiaGameVoteMafiaRequest.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/mafia/MafiaGameVoteMafiaRequest.kt similarity index 51% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/MafiaGameVoteMafiaRequest.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/mafia/MafiaGameVoteMafiaRequest.kt index edbc6b3a..c0d8d131 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/MafiaGameVoteMafiaRequest.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/mafia/MafiaGameVoteMafiaRequest.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.request.dto.game +package com.xorker.draw.websocket.message.request.mafia data class MafiaGameVoteMafiaRequest( val userId: Long, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/SessionInitializeRequest.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/mafia/SessionInitializeRequest.kt similarity index 70% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/SessionInitializeRequest.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/mafia/SessionInitializeRequest.kt index 8eab1579..02eb74f7 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/dto/game/SessionInitializeRequest.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/mafia/SessionInitializeRequest.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.request.dto.game +package com.xorker.draw.websocket.message.request.mafia data class SessionInitializeRequest( val accessToken: String, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaGameMessengerImpl.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaGameMessengerImpl.kt index eb7dbc7f..2b236a73 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaGameMessengerImpl.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaGameMessengerImpl.kt @@ -9,20 +9,20 @@ import com.xorker.draw.mafia.assertIs import com.xorker.draw.room.RoomId import com.xorker.draw.user.UserId import com.xorker.draw.websocket.broker.WebSocketBroadcaster -import com.xorker.draw.websocket.message.response.dto.game.MafiaGameAnswerBody -import com.xorker.draw.websocket.message.response.dto.game.MafiaGameAnswerMessage -import com.xorker.draw.websocket.message.response.dto.game.MafiaGameDrawMessage -import com.xorker.draw.websocket.message.response.dto.game.MafiaGamePlayerListBody -import com.xorker.draw.websocket.message.response.dto.game.MafiaGamePlayerListMessage -import com.xorker.draw.websocket.message.response.dto.game.MafiaGameReactionBody -import com.xorker.draw.websocket.message.response.dto.game.MafiaGameReactionMessage -import com.xorker.draw.websocket.message.response.dto.game.MafiaGameTurnInfoBody -import com.xorker.draw.websocket.message.response.dto.game.MafiaGameTurnInfoMessage -import com.xorker.draw.websocket.message.response.dto.game.MafiaGameVoteStatusBody -import com.xorker.draw.websocket.message.response.dto.game.MafiaGameVoteStatusMessage -import com.xorker.draw.websocket.message.response.dto.game.MafiaRandomMatchingBody -import com.xorker.draw.websocket.message.response.dto.game.MafiaRandomMatchingMessage -import com.xorker.draw.websocket.message.response.dto.game.toResponse +import com.xorker.draw.websocket.message.response.mafia.MafiaGameAnswerBody +import com.xorker.draw.websocket.message.response.mafia.MafiaGameAnswerMessage +import com.xorker.draw.websocket.message.response.mafia.MafiaGameDrawMessage +import com.xorker.draw.websocket.message.response.mafia.MafiaGamePlayerListBody +import com.xorker.draw.websocket.message.response.mafia.MafiaGamePlayerListMessage +import com.xorker.draw.websocket.message.response.mafia.MafiaGameReactionBody +import com.xorker.draw.websocket.message.response.mafia.MafiaGameReactionMessage +import com.xorker.draw.websocket.message.response.mafia.MafiaGameTurnInfoBody +import com.xorker.draw.websocket.message.response.mafia.MafiaGameTurnInfoMessage +import com.xorker.draw.websocket.message.response.mafia.MafiaGameVoteStatusBody +import com.xorker.draw.websocket.message.response.mafia.MafiaGameVoteStatusMessage +import com.xorker.draw.websocket.message.response.mafia.MafiaRandomMatchingBody +import com.xorker.draw.websocket.message.response.mafia.MafiaRandomMatchingMessage +import com.xorker.draw.websocket.message.response.mafia.toResponse import org.springframework.stereotype.Component @Component diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaPhaseMessengerImpl.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaPhaseMessengerImpl.kt index bf445f8d..aaa2719d 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaPhaseMessengerImpl.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaPhaseMessengerImpl.kt @@ -9,22 +9,21 @@ import com.xorker.draw.mafia.MafiaPlayer import com.xorker.draw.room.RoomId import com.xorker.draw.user.UserId import com.xorker.draw.websocket.broker.WebSocketBroadcaster -import com.xorker.draw.websocket.message.response.dto.game.toResponse -import com.xorker.draw.websocket.message.response.dto.phase.MafiaGameInfoBody -import com.xorker.draw.websocket.message.response.dto.phase.MafiaGameInfoMessage -import com.xorker.draw.websocket.message.response.dto.phase.MafiaPhaseEndBody -import com.xorker.draw.websocket.message.response.dto.phase.MafiaPhaseEndMessage -import com.xorker.draw.websocket.message.response.dto.phase.MafiaPhaseInferAnswerBody -import com.xorker.draw.websocket.message.response.dto.phase.MafiaPhaseInferAnswerMessage -import com.xorker.draw.websocket.message.response.dto.phase.MafiaPhasePlayingBody -import com.xorker.draw.websocket.message.response.dto.phase.MafiaPhasePlayingMessage -import com.xorker.draw.websocket.message.response.dto.phase.MafiaPhaseReadyBody -import com.xorker.draw.websocket.message.response.dto.phase.MafiaPhaseReadyMessage -import com.xorker.draw.websocket.message.response.dto.phase.MafiaPhaseVoteBody -import com.xorker.draw.websocket.message.response.dto.phase.MafiaPhaseVoteMessage -import com.xorker.draw.websocket.message.response.dto.phase.MafiaPhaseWaitBody -import com.xorker.draw.websocket.message.response.dto.phase.MafiaPhaseWaitMessage -import com.xorker.draw.websocket.message.response.dto.phase.toResponse +import com.xorker.draw.websocket.message.response.mafia.MafiaGameInfoBody +import com.xorker.draw.websocket.message.response.mafia.MafiaGameInfoMessage +import com.xorker.draw.websocket.message.response.mafia.MafiaPhaseEndBody +import com.xorker.draw.websocket.message.response.mafia.MafiaPhaseEndMessage +import com.xorker.draw.websocket.message.response.mafia.MafiaPhaseInferAnswerBody +import com.xorker.draw.websocket.message.response.mafia.MafiaPhaseInferAnswerMessage +import com.xorker.draw.websocket.message.response.mafia.MafiaPhasePlayingBody +import com.xorker.draw.websocket.message.response.mafia.MafiaPhasePlayingMessage +import com.xorker.draw.websocket.message.response.mafia.MafiaPhaseReadyBody +import com.xorker.draw.websocket.message.response.mafia.MafiaPhaseReadyMessage +import com.xorker.draw.websocket.message.response.mafia.MafiaPhaseVoteBody +import com.xorker.draw.websocket.message.response.mafia.MafiaPhaseVoteMessage +import com.xorker.draw.websocket.message.response.mafia.MafiaPhaseWaitBody +import com.xorker.draw.websocket.message.response.mafia.MafiaPhaseWaitMessage +import com.xorker.draw.websocket.message.response.mafia.toResponse import org.springframework.stereotype.Component @Component diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/parser/WebSocketResponseParser.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/WebSocketResponseParser.kt similarity index 89% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/parser/WebSocketResponseParser.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/WebSocketResponseParser.kt index 77012687..3cc50c18 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/parser/WebSocketResponseParser.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/WebSocketResponseParser.kt @@ -1,8 +1,7 @@ -package com.xorker.draw.websocket.parser +package com.xorker.draw.websocket.message.response import com.fasterxml.jackson.databind.ObjectMapper import com.xorker.draw.websocket.exception.ExceptionMessage -import com.xorker.draw.websocket.message.response.SessionMessage import org.springframework.stereotype.Component @Component diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameAnswerMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGameAnswerMessage.kt similarity index 86% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameAnswerMessage.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGameAnswerMessage.kt index 512bc7b1..1c88b2a4 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameAnswerMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGameAnswerMessage.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.response.dto.game +package com.xorker.draw.websocket.message.response.mafia import com.xorker.draw.websocket.message.response.ResponseAction import com.xorker.draw.websocket.message.response.SessionMessage diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameDrawMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGameDrawMessage.kt similarity index 89% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameDrawMessage.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGameDrawMessage.kt index 2c1f8634..320b741f 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameDrawMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGameDrawMessage.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.response.dto.game +package com.xorker.draw.websocket.message.response.mafia import com.xorker.draw.websocket.message.response.ResponseAction import com.xorker.draw.websocket.message.response.SessionMessage diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaGameInfoMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGameInfoMessage.kt similarity index 96% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaGameInfoMessage.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGameInfoMessage.kt index b85065ac..a3d90032 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaGameInfoMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGameInfoMessage.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.response.dto.phase +package com.xorker.draw.websocket.message.response.mafia import com.xorker.draw.mafia.MafiaGameOption import com.xorker.draw.mafia.MafiaPlayer diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGamePlayerListMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGamePlayerListMessage.kt similarity index 93% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGamePlayerListMessage.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGamePlayerListMessage.kt index 353ef11b..b37e61a0 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGamePlayerListMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGamePlayerListMessage.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.response.dto.game +package com.xorker.draw.websocket.message.response.mafia import com.xorker.draw.mafia.MafiaPlayer import com.xorker.draw.user.UserId diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameReactionMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGameReactionMessage.kt similarity index 87% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameReactionMessage.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGameReactionMessage.kt index d5a45991..60cd59e0 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameReactionMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGameReactionMessage.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.response.dto.game +package com.xorker.draw.websocket.message.response.mafia import com.xorker.draw.websocket.message.response.ResponseAction import com.xorker.draw.websocket.message.response.SessionMessage diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameTurnInfoMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGameTurnInfoMessage.kt similarity index 91% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameTurnInfoMessage.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGameTurnInfoMessage.kt index f957ad8f..a8d659fe 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameTurnInfoMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGameTurnInfoMessage.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.response.dto.game +package com.xorker.draw.websocket.message.response.mafia import com.xorker.draw.user.UserId import com.xorker.draw.websocket.message.response.ResponseAction diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameVoteStatusMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGameVoteStatusMessage.kt similarity index 88% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameVoteStatusMessage.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGameVoteStatusMessage.kt index 713036d7..79972d81 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaGameVoteStatusMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaGameVoteStatusMessage.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.response.dto.game +package com.xorker.draw.websocket.message.response.mafia import com.xorker.draw.user.UserId import com.xorker.draw.websocket.message.response.ResponseAction diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseEndMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaPhaseEndMessage.kt similarity index 90% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseEndMessage.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaPhaseEndMessage.kt index 2c7a410c..3b159ab6 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseEndMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaPhaseEndMessage.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.response.dto.phase +package com.xorker.draw.websocket.message.response.mafia import com.xorker.draw.websocket.message.response.ResponseAction import com.xorker.draw.websocket.message.response.SessionMessage diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseInferAnswerMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaPhaseInferAnswerMessage.kt similarity index 90% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseInferAnswerMessage.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaPhaseInferAnswerMessage.kt index 3af152b4..55b8a478 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseInferAnswerMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaPhaseInferAnswerMessage.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.response.dto.phase +package com.xorker.draw.websocket.message.response.mafia import com.xorker.draw.websocket.message.response.ResponseAction import com.xorker.draw.websocket.message.response.SessionMessage diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhasePlayingMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaPhasePlayingMessage.kt similarity index 91% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhasePlayingMessage.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaPhasePlayingMessage.kt index c91c30fb..2144550e 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhasePlayingMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaPhasePlayingMessage.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.response.dto.phase +package com.xorker.draw.websocket.message.response.mafia import com.xorker.draw.websocket.message.response.ResponseAction import com.xorker.draw.websocket.message.response.SessionMessage diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseReadyMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaPhaseReadyMessage.kt similarity index 88% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseReadyMessage.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaPhaseReadyMessage.kt index f9c62209..5e088d77 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseReadyMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaPhaseReadyMessage.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.response.dto.phase +package com.xorker.draw.websocket.message.response.mafia import com.xorker.draw.websocket.message.response.ResponseAction import com.xorker.draw.websocket.message.response.SessionMessage diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseVoteMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaPhaseVoteMessage.kt similarity index 90% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseVoteMessage.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaPhaseVoteMessage.kt index 3d58ec65..1bfd3ce8 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseVoteMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaPhaseVoteMessage.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.response.dto.phase +package com.xorker.draw.websocket.message.response.mafia import com.xorker.draw.user.UserId import com.xorker.draw.websocket.message.response.ResponseAction diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseWaitMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaPhaseWaitMessage.kt similarity index 79% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseWaitMessage.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaPhaseWaitMessage.kt index 0fc4dc09..2f713963 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/phase/MafiaPhaseWaitMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaPhaseWaitMessage.kt @@ -1,9 +1,8 @@ -package com.xorker.draw.websocket.message.response.dto.phase +package com.xorker.draw.websocket.message.response.mafia import com.xorker.draw.room.RoomId import com.xorker.draw.websocket.message.response.ResponseAction import com.xorker.draw.websocket.message.response.SessionMessage -import com.xorker.draw.websocket.message.response.dto.game.MafiaPlayerResponse data class MafiaPhaseWaitMessage( override val body: MafiaPhaseWaitBody, diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaRandomMatchingMessage.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaRandomMatchingMessage.kt similarity index 86% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaRandomMatchingMessage.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaRandomMatchingMessage.kt index c8f9f20f..9ec11157 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/dto/game/MafiaRandomMatchingMessage.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/mafia/MafiaRandomMatchingMessage.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.response.dto.game +package com.xorker.draw.websocket.message.response.mafia import com.xorker.draw.websocket.message.response.ResponseAction import com.xorker.draw.websocket.message.response.SessionMessage diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt index 4a74e23a..99355d3a 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt @@ -8,10 +8,8 @@ import com.xorker.draw.user.User import com.xorker.draw.user.UserId import com.xorker.draw.websocket.Session import com.xorker.draw.websocket.WaitingQueueSession -import com.xorker.draw.websocket.message.request.SessionWrapper -import com.xorker.draw.websocket.message.request.WaitingQueueSessionWrapper -import com.xorker.draw.websocket.message.request.dto.game.MafiaGameRandomMatchingRequest -import com.xorker.draw.websocket.message.request.dto.game.SessionInitializeRequest +import com.xorker.draw.websocket.message.request.mafia.MafiaGameRandomMatchingRequest +import com.xorker.draw.websocket.message.request.mafia.SessionInitializeRequest import org.slf4j.MDC import org.springframework.stereotype.Component import org.springframework.web.socket.WebSocketSession diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/SessionWrapper.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt similarity index 96% rename from app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/SessionWrapper.kt rename to app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt index 62f182c0..029d9ba5 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/SessionWrapper.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket.message.request +package com.xorker.draw.websocket.session import com.xorker.draw.room.RoomId import com.xorker.draw.user.User From d6cdb525fb7d5544e6a8ef7cd43d629f9d544af8 Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Tue, 17 Sep 2024 11:31:41 +0900 Subject: [PATCH 06/40] =?UTF-8?q?DrAW-351=20refactor:=20SessionEventListen?= =?UTF-8?q?er=EC=97=90=EC=84=9C=20Session=20=EA=B0=9D=EC=B2=B4=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../draw/websocket/MainWebSocketHandler.kt | 4 +- .../draw/websocket/WebSocketController.kt | 18 +++++--- .../draw/websocket/session/SessionManager.kt | 24 ++-------- .../xorker/draw/mafia/MafiaGameRoomService.kt | 45 +++++++++---------- .../draw/websocket/SessionEventListener.kt | 10 +++-- 5 files changed, 43 insertions(+), 58 deletions(-) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt index ce2b5cd0..a387f2e9 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt @@ -65,12 +65,12 @@ internal class MainWebSocketHandler( when (status) { CloseStatus.NORMAL -> sessionEventListener.forEach { - it.exitSession(sessionDto) + it.exitSession(sessionDto.user.id, sessionDto.roomId) } else -> sessionEventListener.forEach { - it.disconnectSession(sessionDto) + it.disconnectSession(sessionDto.user.id, sessionDto.roomId) } } } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt index 7844a8db..dcd39fce 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt @@ -12,6 +12,7 @@ import com.xorker.draw.room.RoomId import com.xorker.draw.websocket.message.request.mafia.MafiaGameRandomMatchingRequest import com.xorker.draw.websocket.message.request.mafia.SessionInitializeRequest import com.xorker.draw.websocket.session.SessionFactory +import com.xorker.draw.websocket.session.SessionManager import com.xorker.draw.websocket.session.WaitingQueueSessionWrapper import com.xorker.draw.websocket.session.toSessionWrapper import org.springframework.context.event.EventListener @@ -23,6 +24,7 @@ internal class WebSocketController( private val sessionFactory: SessionFactory, private val waitingQueueSessionEventListener: List, private val sessionEventListener: List, + private val sessionManager: SessionManager, private val mafiaGameUseCase: MafiaGameUseCase, private val mafiaPhaseUseCase: MafiaPhaseUseCase, ) { @@ -37,21 +39,21 @@ internal class WebSocketController( fun initializeSession(session: WebSocketSession, request: SessionInitializeRequest) { val sessionDto = sessionFactory.create(session, request) - val roomId = RoomId(request.roomId) val joinedRoomId = mafiaGameUseCase.getGameInfo(sessionDto.user.id)?.room?.id - if (joinedRoomId != null && roomId != joinedRoomId) { + if (joinedRoomId != null && request.roomId != joinedRoomId.value) { throw InvalidRequestOtherPlayingException } - if (roomId == null) { + if (request.roomId == null) { + sessionManager.registerSession(sessionDto) sessionEventListener.forEach { - it.connectSession(sessionDto, roomId, request.nickname, request.locale) + it.connectSession(sessionDto.user.id, sessionDto.roomId, request.nickname, request.locale) } return } - val gameInfo = mafiaGameUseCase.getGameInfo(roomId) ?: throw NotFoundRoomException + val gameInfo = mafiaGameUseCase.getGameInfo(sessionDto.roomId) ?: throw NotFoundRoomException synchronized(gameInfo) { if (gameInfo.phase != MafiaPhase.Wait && gameInfo.room.players.any { it.userId == sessionDto.user.id }.not()) { @@ -62,8 +64,9 @@ internal class WebSocketController( throw MaxRoomException } + sessionManager.registerSession(sessionDto) sessionEventListener.forEach { - it.connectSession(sessionDto, roomId, request.nickname, request.locale) + it.connectSession(sessionDto.user.id, sessionDto.roomId, request.nickname, request.locale) } } } @@ -78,8 +81,9 @@ internal class WebSocketController( if (it is WaitingQueueSessionWrapper) { val sessionDto = it.toSessionWrapper(roomId) + sessionManager.registerSession(sessionDto) sessionEventListener.forEach { eventListener -> - eventListener.connectSession(sessionDto, it.locale) + eventListener.connectSession(sessionDto.user, sessionDto.roomId, it.locale) } waitingQueueSessionEventListener.forEach { eventListener -> diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt index 23653916..6b8a72ff 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt @@ -1,9 +1,7 @@ package com.xorker.draw.websocket.session -import com.xorker.draw.room.RoomId import com.xorker.draw.user.UserId import com.xorker.draw.websocket.Session -import com.xorker.draw.websocket.SessionEventListener import com.xorker.draw.websocket.SessionId import java.util.concurrent.ConcurrentHashMap import org.springframework.core.Ordered @@ -12,7 +10,7 @@ import org.springframework.stereotype.Service @Order(Ordered.HIGHEST_PRECEDENCE) @Service -internal class SessionManager : SessionEventListener { +internal class SessionManager { private val sessionMap: ConcurrentHashMap = ConcurrentHashMap() private val userIdMap: ConcurrentHashMap = ConcurrentHashMap() @@ -24,23 +22,7 @@ internal class SessionManager : SessionEventListener { return userIdMap[userId] } - override fun connectSession(session: Session, roomId: RoomId?, nickname: String, locale: String) { - registerSession(session) - } - - override fun connectSession(session: Session, locale: String) { - registerSession(session) - } - - override fun disconnectSession(session: Session) { - unregisterSession(session.id) - } - - override fun exitSession(session: Session) { - unregisterSession(session.id) - } - - private fun registerSession(session: Session) { + fun registerSession(session: Session) { if (sessionMap.contains(session.id)) { // Init을 중복으로 호출 하면 기존 데이터를 Unregister 하고 Init 한다. unregisterSession(session.id) @@ -50,7 +32,7 @@ internal class SessionManager : SessionEventListener { userIdMap[session.user.id] = session } - private fun unregisterSession(sessionId: SessionId) { + fun unregisterSession(sessionId: SessionId) { val session = sessionMap.remove(sessionId) userIdMap.remove(session?.user?.id) } diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt index f963cb10..3fbbf755 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt @@ -1,10 +1,10 @@ package com.xorker.draw.mafia import com.xorker.draw.exception.InvalidRequestValueException -import com.xorker.draw.exception.NotFoundRoomException import com.xorker.draw.room.Room import com.xorker.draw.room.RoomId -import com.xorker.draw.websocket.Session +import com.xorker.draw.user.User +import com.xorker.draw.user.UserId import com.xorker.draw.websocket.SessionEventListener import org.springframework.stereotype.Service @@ -15,14 +15,12 @@ internal class MafiaGameRoomService( private val mafiaPhaseMessenger: MafiaPhaseMessenger, ) : SessionEventListener { - override fun connectSession(session: Session, roomId: RoomId?, nickname: String, locale: String) { - var gameInfo = mafiaGameRepository.getGameInfo(session.roomId) - val userId = session.user.id + override fun connectSession(userId: UserId, roomId: RoomId, nickname: String, locale: String) { + var gameInfo = mafiaGameRepository.getGameInfo(roomId) if (gameInfo == null) { - if (roomId != null) throw NotFoundRoomException val player = MafiaPlayer(userId, nickname, generateColor(null)) - gameInfo = createGameInfo(session, locale, player) + gameInfo = createGameInfo(roomId, locale, player) } else { val player = gameInfo.findPlayer(userId) if (player != null) { @@ -33,18 +31,17 @@ internal class MafiaGameRoomService( } mafiaGameRepository.saveGameInfo(gameInfo) - mafiaPhaseMessenger.unicastPhase(session.user.id, gameInfo) + mafiaPhaseMessenger.unicastPhase(userId, gameInfo) mafiaGameMessenger.broadcastPlayerList(gameInfo) } - override fun connectSession(session: Session, locale: String) { - var gameInfo = mafiaGameRepository.getGameInfo(session.roomId) - val user = session.user + override fun connectSession(user: User, roomId: RoomId, locale: String) { + var gameInfo = mafiaGameRepository.getGameInfo(roomId) if (gameInfo == null) { val player = MafiaPlayer(user.id, user.name, generateColor(null)) - gameInfo = createGameInfo(session, locale, player, true) + gameInfo = createGameInfo(roomId, locale, player, true) } else { val room = gameInfo.room @@ -54,15 +51,15 @@ internal class MafiaGameRoomService( mafiaGameRepository.saveGameInfo(gameInfo) } - override fun disconnectSession(session: Session) { - val gameInfo = mafiaGameRepository.getGameInfo(session.roomId) ?: return + override fun disconnectSession(userId: UserId, roomId: RoomId) { + val gameInfo = mafiaGameRepository.getGameInfo(roomId) ?: return if (gameInfo.phase == MafiaPhase.Wait) { - exitSession(session) + exitSession(userId, roomId) return } - val player = gameInfo.findPlayer(session.user.id) ?: return + val player = gameInfo.findPlayer(userId) ?: return player.disconnect() @@ -74,15 +71,15 @@ internal class MafiaGameRoomService( } } - override fun exitSession(session: Session) { - val gameInfo = mafiaGameRepository.getGameInfo(session.roomId) ?: return + override fun exitSession(userId: UserId, roomId: RoomId) { + val gameInfo = mafiaGameRepository.getGameInfo(roomId) ?: return if (gameInfo.phase != MafiaPhase.Wait) { - disconnectSession(session) + disconnectSession(userId, roomId) return } - val player = gameInfo.findPlayer(session.user.id) ?: return + val player = gameInfo.findPlayer(userId) ?: return gameInfo.room.remove(player) @@ -108,8 +105,8 @@ internal class MafiaGameRoomService( .first() } - private fun createGameInfo(session: Session, locale: String, player: MafiaPlayer, isRandomMatching: Boolean = false): MafiaGameInfo { - val room = createRoom(session, locale, player, isRandomMatching) + private fun createGameInfo(roomId: RoomId, locale: String, player: MafiaPlayer, isRandomMatching: Boolean = false): MafiaGameInfo { + val room = createRoom(roomId, locale, player, isRandomMatching) return MafiaGameInfo( room = room, phase = MafiaPhase.Wait, @@ -117,14 +114,14 @@ internal class MafiaGameRoomService( ) } - private fun createRoom(session: Session, locale: String, player: MafiaPlayer, isRandomMatching: Boolean): Room { + private fun createRoom(roomId: RoomId, locale: String, player: MafiaPlayer, isRandomMatching: Boolean): Room { val language = locale.lowercase() if (language !in languages) { throw InvalidRequestValueException } val room = Room( - id = session.roomId, + id = roomId, locale = language, owner = player, maxMemberNum = 10, diff --git a/core/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt b/core/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt index 15043827..5d4f7e99 100644 --- a/core/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt +++ b/core/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt @@ -1,10 +1,12 @@ package com.xorker.draw.websocket import com.xorker.draw.room.RoomId +import com.xorker.draw.user.User +import com.xorker.draw.user.UserId interface SessionEventListener { - fun connectSession(session: Session, roomId: RoomId?, nickname: String, locale: String) - fun connectSession(session: Session, locale: String) - fun disconnectSession(session: Session) - fun exitSession(session: Session) + fun connectSession(userId: UserId, roomId: RoomId, nickname: String, locale: String) + fun connectSession(user: User, roomId: RoomId, locale: String) + fun disconnectSession(userId: UserId, roomId: RoomId) + fun exitSession(userId: UserId, roomId: RoomId) } From 7596e601d9d4ad46734dc4a54656dd8a30886965 Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Tue, 17 Sep 2024 11:48:42 +0900 Subject: [PATCH 07/40] =?UTF-8?q?DrAW-351=20refactor:=20MafiaGameUseCase?= =?UTF-8?q?=EC=97=90=EC=84=9C=20Session=20=EA=B0=9D=EC=B2=B4=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xorker/draw/room/RoomController.kt | 2 +- .../draw/websocket/WebSocketController.kt | 4 +- .../xorker/draw/websocket/WebSocketRouter.kt | 12 ++--- .../mafia/MafiaGameRandomMatchingService.kt | 2 +- .../com/xorker/draw/mafia/MafiaGameService.kt | 47 +++++++++---------- .../com/xorker/draw/mafia/MafiaGameUseCase.kt | 18 +++---- 6 files changed, 41 insertions(+), 44 deletions(-) diff --git a/app/api/src/main/kotlin/com/xorker/draw/room/RoomController.kt b/app/api/src/main/kotlin/com/xorker/draw/room/RoomController.kt index aaaa9c33..cfcfe821 100644 --- a/app/api/src/main/kotlin/com/xorker/draw/room/RoomController.kt +++ b/app/api/src/main/kotlin/com/xorker/draw/room/RoomController.kt @@ -20,7 +20,7 @@ class RoomController( fun getPlayingRoom( @Parameter(hidden = true) user: PrincipalUser, ): PlayingRoomResponse { - val gameInfo = mafiaGameUseCase.getGameInfo(user.userId) ?: return PlayingRoomResponse() + val gameInfo = mafiaGameUseCase.getGameInfoByUserId(user.userId) ?: return PlayingRoomResponse() return PlayingRoomResponse(gameInfo.room.id) } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt index dcd39fce..b4a2e797 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt @@ -40,7 +40,7 @@ internal class WebSocketController( fun initializeSession(session: WebSocketSession, request: SessionInitializeRequest) { val sessionDto = sessionFactory.create(session, request) - val joinedRoomId = mafiaGameUseCase.getGameInfo(sessionDto.user.id)?.room?.id + val joinedRoomId = mafiaGameUseCase.getGameInfoByUserId(sessionDto.user.id)?.room?.id if (joinedRoomId != null && request.roomId != joinedRoomId.value) { throw InvalidRequestOtherPlayingException } @@ -53,7 +53,7 @@ internal class WebSocketController( return } - val gameInfo = mafiaGameUseCase.getGameInfo(sessionDto.roomId) ?: throw NotFoundRoomException + val gameInfo = mafiaGameUseCase.getGameInfoByRoomId(sessionDto.roomId) ?: throw NotFoundRoomException synchronized(gameInfo) { if (gameInfo.phase != MafiaPhase.Wait && gameInfo.room.players.any { it.userId == sessionDto.user.id }.not()) { diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt index e331814c..219007e4 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt @@ -46,31 +46,31 @@ internal class WebSocketRouter( mafiaPhaseUseCase.startGame(sessionDto.roomId) } - RequestAction.DRAW -> mafiaGameUseCase.draw(sessionDto, request.extractBody()) - RequestAction.END_TURN -> mafiaGameUseCase.nextTurnByUser(sessionDto) + RequestAction.DRAW -> mafiaGameUseCase.draw(sessionDto.user, request.extractBody()) + RequestAction.END_TURN -> mafiaGameUseCase.nextTurnByUser(sessionDto.user) RequestAction.VOTE -> { val requestDto = request.extractBody() - mafiaGameUseCase.voteMafia(sessionDto, UserId(requestDto.userId)) + mafiaGameUseCase.voteMafia(sessionDto.user, UserId(requestDto.userId)) } RequestAction.ANSWER -> { val requestDto = request.extractBody() - mafiaGameUseCase.inferAnswer(sessionDto, requestDto.answer) + mafiaGameUseCase.inferAnswer(sessionDto.user, requestDto.answer) } RequestAction.DECIDE_ANSWER -> { val requestDto = request.extractBody() - mafiaGameUseCase.decideAnswer(sessionDto, requestDto.answer) + mafiaGameUseCase.decideAnswer(sessionDto.user, requestDto.answer) } RequestAction.REACTION -> { val requestDto = request.extractBody() - mafiaGameUseCase.react(sessionDto, requestDto.reaction) + mafiaGameUseCase.react(sessionDto.user, requestDto.reaction) } } } diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt index bcbf225e..81dde104 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt @@ -15,7 +15,7 @@ internal class MafiaGameRandomMatchingService( override fun connectSession(session: WaitingQueueSession) { val user = session.user - mafiaGameUseCase.getGameInfo(user.id)?.let { + mafiaGameUseCase.getGameInfoByUserId(user.id)?.let { throw InvalidRequestOtherPlayingException } diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameService.kt b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameService.kt index d9fa121b..8fb6f414 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameService.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameService.kt @@ -9,7 +9,6 @@ import com.xorker.draw.mafia.phase.MafiaPhaseService import com.xorker.draw.room.RoomId import com.xorker.draw.user.User import com.xorker.draw.user.UserId -import com.xorker.draw.websocket.Session import java.util.* import org.springframework.stereotype.Service import kotlin.contracts.ExperimentalContracts @@ -24,35 +23,35 @@ internal class MafiaGameService( private val mafiaGameMessenger: MafiaGameMessenger, ) : MafiaGameUseCase { - override fun getGameInfo(userId: UserId): MafiaGameInfo? { + override fun getGameInfoByUserId(userId: UserId): MafiaGameInfo? { return mafiaGameRepository.getGameInfo(userId) } - override fun getGameInfo(roomId: RoomId?): MafiaGameInfo? { + override fun getGameInfoByRoomId(roomId: RoomId?): MafiaGameInfo? { if (roomId == null) return null return mafiaGameRepository.getGameInfo(roomId) } - override fun draw(session: Session, request: DrawRequest) { - val gameInfo = session.getGameInfo() + override fun draw(user: User, request: DrawRequest) { + val gameInfo = user.getGameInfo() val phase = gameInfo.phase - assertTurn(phase, session.user.id) + assertTurn(phase, user.id) val drawData = phase.drawData.lastOrNull() - if (drawData != null && drawData.first == session.user.id) { + if (drawData != null && drawData.first == user.id) { phase.drawData.removeLast() } - phase.drawData.add(Pair(session.user.id, request.drawData)) + phase.drawData.add(Pair(user.id, request.drawData)) mafiaGameRepository.saveGameInfo(gameInfo) mafiaGameMessenger.broadcastDraw(gameInfo.room.id, request.drawData) } - override fun nextTurnByUser(session: Session) { - val gameInfo = session.getGameInfo() + override fun nextTurnByUser(user: User) { + val gameInfo = user.getGameInfo() val phase = gameInfo.phase - assertTurn(phase, session.user.id) + assertTurn(phase, user.id) phase.job.cancel() @@ -61,34 +60,32 @@ internal class MafiaGameService( } } - override fun voteMafia(session: Session, targetUserId: UserId) { - val gameInfo = session.getGameInfo() - - val voter = session.user + override fun voteMafia(user: User, targetUserId: UserId) { + val gameInfo = mafiaGameRepository.getGameInfo(user.id) ?: throw InvalidRequestValueException val phase = gameInfo.phase assertIs(phase) - vote(phase.players, voter, targetUserId) + vote(phase.players, user, targetUserId) mafiaGameMessenger.broadcastVoteStatus(gameInfo) } - override fun inferAnswer(session: Session, answer: String) { - val gameInfo = session.getGameInfo() + override fun inferAnswer(user: User, answer: String) { + val gameInfo = mafiaGameRepository.getGameInfo(user.id) ?: throw InvalidRequestValueException val phase = gameInfo.phase assertIs(phase) - validateIsMafia(session.user, phase.mafiaPlayer) + validateIsMafia(user, phase.mafiaPlayer) phase.answer = answer mafiaGameMessenger.broadcastAnswer(gameInfo, answer) } - override fun decideAnswer(session: Session, answer: String) { - val gameInfo = session.getGameInfo() + override fun decideAnswer(user: User, answer: String) { + val gameInfo = user.getGameInfo() val phase = gameInfo.phase assertIs(phase) @@ -103,8 +100,8 @@ internal class MafiaGameService( } } - override fun react(session: Session, reaction: String) { - val gameInfo = session.getGameInfo() + override fun react(user: User, reaction: String) { + val gameInfo = user.getGameInfo() val phase = gameInfo.phase assertIs(phase) @@ -139,8 +136,8 @@ internal class MafiaGameService( } } - private fun Session.getGameInfo(): MafiaGameInfo = - mafiaGameRepository.getGameInfo(roomId) ?: throw InvalidRequestValueException + private fun User.getGameInfo(): MafiaGameInfo = + mafiaGameRepository.getGameInfo(this.id) ?: throw InvalidRequestValueException @OptIn(ExperimentalContracts::class) private fun assertTurn(phase: MafiaPhase, userId: UserId) { diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameUseCase.kt b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameUseCase.kt index 8361026a..87f01019 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameUseCase.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameUseCase.kt @@ -2,16 +2,16 @@ package com.xorker.draw.mafia import com.xorker.draw.mafia.dto.DrawRequest import com.xorker.draw.room.RoomId +import com.xorker.draw.user.User import com.xorker.draw.user.UserId -import com.xorker.draw.websocket.Session interface MafiaGameUseCase { - fun getGameInfo(userId: UserId): MafiaGameInfo? - fun getGameInfo(roomId: RoomId?): MafiaGameInfo? - fun draw(session: Session, request: DrawRequest) - fun nextTurnByUser(session: Session) - fun voteMafia(session: Session, targetUserId: UserId) - fun inferAnswer(session: Session, answer: String) - fun decideAnswer(session: Session, answer: String) - fun react(session: Session, reaction: String) + fun getGameInfoByUserId(userId: UserId): MafiaGameInfo? + fun getGameInfoByRoomId(roomId: RoomId?): MafiaGameInfo? + fun draw(user: User, request: DrawRequest) + fun nextTurnByUser(user: User) + fun voteMafia(user: User, targetUserId: UserId) + fun inferAnswer(user: User, answer: String) + fun decideAnswer(user: User, answer: String) + fun react(user: User, reaction: String) } From 40efd96aa71a1432919d527aecff3f62d2737867 Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Tue, 17 Sep 2024 11:51:47 +0900 Subject: [PATCH 08/40] =?UTF-8?q?DRAW-351=20refactor:=20Session=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=20WebSocket=EC=9C=BC=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EA=B4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xorker/draw/websocket/session/Session.kt | 12 ++++++++++++ .../xorker/draw/websocket/session/SessionFactory.kt | 1 - .../xorker/draw/websocket/session/SessionManager.kt | 1 - .../xorker/draw/websocket/session/SessionWrapper.kt | 1 - .../main/kotlin/com/xorker/draw/websocket/Session.kt | 8 -------- 5 files changed, 12 insertions(+), 11 deletions(-) create mode 100644 app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt new file mode 100644 index 00000000..2c0e18c4 --- /dev/null +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt @@ -0,0 +1,12 @@ +package com.xorker.draw.websocket.session + +import com.xorker.draw.room.RoomId +import com.xorker.draw.user.User +import com.xorker.draw.websocket.SessionId + +interface Session { + val id: SessionId + val user: User + val roomId: RoomId + fun send(message: String) +} diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt index 99355d3a..0f713e9f 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt @@ -6,7 +6,6 @@ import com.xorker.draw.room.RoomId import com.xorker.draw.room.RoomRepository import com.xorker.draw.user.User import com.xorker.draw.user.UserId -import com.xorker.draw.websocket.Session import com.xorker.draw.websocket.WaitingQueueSession import com.xorker.draw.websocket.message.request.mafia.MafiaGameRandomMatchingRequest import com.xorker.draw.websocket.message.request.mafia.SessionInitializeRequest diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt index 6b8a72ff..cfaffc8e 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt @@ -1,7 +1,6 @@ package com.xorker.draw.websocket.session import com.xorker.draw.user.UserId -import com.xorker.draw.websocket.Session import com.xorker.draw.websocket.SessionId import java.util.concurrent.ConcurrentHashMap import org.springframework.core.Ordered diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt index 029d9ba5..5a4f47f8 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt @@ -2,7 +2,6 @@ package com.xorker.draw.websocket.session import com.xorker.draw.room.RoomId import com.xorker.draw.user.User -import com.xorker.draw.websocket.Session import com.xorker.draw.websocket.SessionId import com.xorker.draw.websocket.WaitingQueueSession import org.springframework.web.socket.TextMessage diff --git a/domain/src/main/kotlin/com/xorker/draw/websocket/Session.kt b/domain/src/main/kotlin/com/xorker/draw/websocket/Session.kt index bd930cf7..2b7dab83 100644 --- a/domain/src/main/kotlin/com/xorker/draw/websocket/Session.kt +++ b/domain/src/main/kotlin/com/xorker/draw/websocket/Session.kt @@ -1,18 +1,10 @@ package com.xorker.draw.websocket -import com.xorker.draw.room.RoomId import com.xorker.draw.user.User @JvmInline value class SessionId(val value: String) -interface Session { - val id: SessionId - val user: User - val roomId: RoomId - fun send(message: String) -} - interface WaitingQueueSession { val id: SessionId val user: User From 9637ae3a09d939647531dd962dcac4656d542d33 Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Tue, 17 Sep 2024 12:09:21 +0900 Subject: [PATCH 09/40] =?UTF-8?q?DRAW-352=20refactor:=20WaitingQueueSessio?= =?UTF-8?q?nEventListener=EC=97=90=EC=84=9C=20Session=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mafia/MafiaGameWaitingQueueAdapter.kt | 20 +++++++------- .../draw/websocket/WebSocketController.kt | 27 ++++++++++--------- .../mafia/MafiaGameRandomMatchingService.kt | 12 ++++----- .../WaitingQueueSessionEventListener.kt | 6 +++-- .../mafia/MafiaGameWaitingQueueRepository.kt | 6 ++--- .../event/MafiaGameRandomMatchingEvent.kt | 5 ++-- 6 files changed, 39 insertions(+), 37 deletions(-) diff --git a/adapter/memory/src/main/kotlin/com/xorker/draw/mafia/MafiaGameWaitingQueueAdapter.kt b/adapter/memory/src/main/kotlin/com/xorker/draw/mafia/MafiaGameWaitingQueueAdapter.kt index 308be5aa..b7736959 100644 --- a/adapter/memory/src/main/kotlin/com/xorker/draw/mafia/MafiaGameWaitingQueueAdapter.kt +++ b/adapter/memory/src/main/kotlin/com/xorker/draw/mafia/MafiaGameWaitingQueueAdapter.kt @@ -2,7 +2,7 @@ package com.xorker.draw.mafia import com.xorker.draw.exception.UnSupportedException import com.xorker.draw.mafia.event.MafiaGameRandomMatchingEvent -import com.xorker.draw.websocket.WaitingQueueSession +import com.xorker.draw.user.User import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentLinkedQueue import org.springframework.context.ApplicationEventPublisher @@ -12,16 +12,16 @@ import org.springframework.stereotype.Component internal class MafiaGameWaitingQueueAdapter( private val eventPublisher: ApplicationEventPublisher, ) : MafiaGameWaitingQueueRepository { - private val waitingQueue: ConcurrentHashMap> = ConcurrentHashMap() + private val waitingQueue: ConcurrentHashMap> = ConcurrentHashMap() - override fun enqueue(size: Int, session: WaitingQueueSession) { - val queue = waitingQueue.getOrPut(session.locale) { ConcurrentLinkedQueue() } + override fun enqueue(size: Int, user: User, locale: String) { + val queue = waitingQueue.getOrPut(locale) { ConcurrentLinkedQueue() } - queue.add(session) + queue.add(user) synchronized(this) { if (queue.size >= size) { - val players = mutableListOf() + val players = mutableListOf() (0 until size).forEach { _ -> queue.poll().let { @@ -29,16 +29,16 @@ internal class MafiaGameWaitingQueueAdapter( } } - val event = MafiaGameRandomMatchingEvent(players) + val event = MafiaGameRandomMatchingEvent(players, locale) eventPublisher.publishEvent(event) } } } - override fun dequeue(session: WaitingQueueSession) { - val queue = waitingQueue[session.locale] ?: throw UnSupportedException + override fun dequeue(user: User, locale: String) { + val queue = waitingQueue[locale] ?: throw UnSupportedException - queue.remove(session) + queue.remove(user) } } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt index b4a2e797..42238248 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt @@ -13,8 +13,7 @@ import com.xorker.draw.websocket.message.request.mafia.MafiaGameRandomMatchingRe import com.xorker.draw.websocket.message.request.mafia.SessionInitializeRequest import com.xorker.draw.websocket.session.SessionFactory import com.xorker.draw.websocket.session.SessionManager -import com.xorker.draw.websocket.session.WaitingQueueSessionWrapper -import com.xorker.draw.websocket.session.toSessionWrapper +import com.xorker.draw.websocket.session.SessionWrapper import org.springframework.context.event.EventListener import org.springframework.stereotype.Component import org.springframework.web.socket.WebSocketSession @@ -33,7 +32,7 @@ internal class WebSocketController( val waitingQueueSessionDto = sessionFactory.create(session, request) waitingQueueSessionEventListener.forEach { - it.connectSession(waitingQueueSessionDto) + it.connectSession(waitingQueueSessionDto.user, waitingQueueSessionDto.locale) } } @@ -77,18 +76,20 @@ internal class WebSocketController( val roomId = RoomId(sessionFactory.generateRoomId()) - players.forEach { - if (it is WaitingQueueSessionWrapper) { - val sessionDto = it.toSessionWrapper(roomId) + players.forEach { user -> + val sessionDto = SessionWrapper( + session = this.session, // TODO: fix + roomId = roomId, + user = user, + ) - sessionManager.registerSession(sessionDto) - sessionEventListener.forEach { eventListener -> - eventListener.connectSession(sessionDto.user, sessionDto.roomId, it.locale) - } + sessionManager.registerSession(sessionDto) + sessionEventListener.forEach { eventListener -> + eventListener.connectSession(sessionDto.user, sessionDto.roomId, event.locale) + } - waitingQueueSessionEventListener.forEach { eventListener -> - eventListener.exitSession(it) - } + waitingQueueSessionEventListener.forEach { eventListener -> + eventListener.exitSession(user, event.locale) } } diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt index 81dde104..5a831567 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt @@ -1,7 +1,7 @@ package com.xorker.draw.mafia import com.xorker.draw.exception.InvalidRequestOtherPlayingException -import com.xorker.draw.websocket.WaitingQueueSession +import com.xorker.draw.user.User import com.xorker.draw.websocket.WaitingQueueSessionEventListener import org.springframework.stereotype.Service @@ -12,19 +12,17 @@ internal class MafiaGameRandomMatchingService( private val mafiaGameMessenger: MafiaGameMessenger, ) : WaitingQueueSessionEventListener { - override fun connectSession(session: WaitingQueueSession) { - val user = session.user - + override fun connectSession(user: User, locale: String) { mafiaGameUseCase.getGameInfoByUserId(user.id)?.let { throw InvalidRequestOtherPlayingException } - mafiaGameWaitingQueueRepository.enqueue(3, session) + mafiaGameWaitingQueueRepository.enqueue(3, user, locale) mafiaGameMessenger.unicastRandomMatching(user.id) } - override fun exitSession(session: WaitingQueueSession) { - mafiaGameWaitingQueueRepository.dequeue(session) + override fun exitSession(user: User, locale: String) { + mafiaGameWaitingQueueRepository.dequeue(user, locale) } } diff --git a/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionEventListener.kt b/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionEventListener.kt index c251dcd7..82ca9b21 100644 --- a/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionEventListener.kt +++ b/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionEventListener.kt @@ -1,6 +1,8 @@ package com.xorker.draw.websocket +import com.xorker.draw.user.User + interface WaitingQueueSessionEventListener { - fun connectSession(session: WaitingQueueSession) - fun exitSession(session: WaitingQueueSession) + fun connectSession(user: User, locale: String) + fun exitSession(user: User, locale: String) } diff --git a/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameWaitingQueueRepository.kt b/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameWaitingQueueRepository.kt index 7e0a1c14..99fc1cad 100644 --- a/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameWaitingQueueRepository.kt +++ b/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameWaitingQueueRepository.kt @@ -1,8 +1,8 @@ package com.xorker.draw.mafia -import com.xorker.draw.websocket.WaitingQueueSession +import com.xorker.draw.user.User interface MafiaGameWaitingQueueRepository { - fun enqueue(size: Int, session: WaitingQueueSession) - fun dequeue(session: WaitingQueueSession) + fun enqueue(size: Int, user: User, locale: String) + fun dequeue(user: User, locale: String) } diff --git a/domain/src/main/kotlin/com/xorker/draw/mafia/event/MafiaGameRandomMatchingEvent.kt b/domain/src/main/kotlin/com/xorker/draw/mafia/event/MafiaGameRandomMatchingEvent.kt index 7d4a5ce5..90767454 100644 --- a/domain/src/main/kotlin/com/xorker/draw/mafia/event/MafiaGameRandomMatchingEvent.kt +++ b/domain/src/main/kotlin/com/xorker/draw/mafia/event/MafiaGameRandomMatchingEvent.kt @@ -1,7 +1,8 @@ package com.xorker.draw.mafia.event -import com.xorker.draw.websocket.WaitingQueueSession +import com.xorker.draw.user.User data class MafiaGameRandomMatchingEvent( - val players: List, + val players: List, + val locale: String, ) From 0e4bdb53d82a0e1fcc7b3a92b0fdda5594812849 Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Tue, 17 Sep 2024 12:31:44 +0900 Subject: [PATCH 10/40] =?UTF-8?q?DRAW-352=20refactor:=20Session=EC=97=90?= =?UTF-8?q?=EC=84=9C=20RoomId=EB=A5=BC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../draw/websocket/MainWebSocketHandler.kt | 6 ++-- .../draw/websocket/WebSocketController.kt | 31 +++++++++++++++---- .../xorker/draw/websocket/WebSocketRouter.kt | 9 +++--- .../draw/websocket/log/WebSocketLogger.kt | 5 +-- .../xorker/draw/websocket/session/Session.kt | 2 -- .../draw/websocket/session/SessionFactory.kt | 22 ------------- .../draw/websocket/session/SessionWrapper.kt | 10 ------ .../xorker/draw/mafia/MafiaGameRoomService.kt | 12 +++---- .../draw/mafia/phase/MafiaPhaseService.kt | 11 +++++++ .../draw/mafia/phase/MafiaPhaseUseCase.kt | 2 ++ .../draw/websocket/SessionEventListener.kt | 4 +-- .../websocket/WaitingQueueSessionService.kt | 9 +++--- 12 files changed, 61 insertions(+), 62 deletions(-) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt index a387f2e9..4dccc8ac 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt @@ -54,7 +54,7 @@ internal class MainWebSocketHandler( if (waitingQueueSessionDto != null) { waitingQueueSessionEventListener.forEach { - it.exitSession(waitingQueueSessionDto) + it.exitSession(waitingQueueSessionDto.user, waitingQueueSessionDto.locale) } return } @@ -65,12 +65,12 @@ internal class MainWebSocketHandler( when (status) { CloseStatus.NORMAL -> sessionEventListener.forEach { - it.exitSession(sessionDto.user.id, sessionDto.roomId) + it.exitSession(sessionDto.user.id) } else -> sessionEventListener.forEach { - it.disconnectSession(sessionDto.user.id, sessionDto.roomId) + it.disconnectSession(sessionDto.user.id) } } } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt index 42238248..e9cf2886 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt @@ -9,11 +9,13 @@ import com.xorker.draw.mafia.MafiaPhase import com.xorker.draw.mafia.event.MafiaGameRandomMatchingEvent import com.xorker.draw.mafia.phase.MafiaPhaseUseCase import com.xorker.draw.room.RoomId +import com.xorker.draw.room.RoomRepository import com.xorker.draw.websocket.message.request.mafia.MafiaGameRandomMatchingRequest import com.xorker.draw.websocket.message.request.mafia.SessionInitializeRequest import com.xorker.draw.websocket.session.SessionFactory import com.xorker.draw.websocket.session.SessionManager import com.xorker.draw.websocket.session.SessionWrapper +import org.slf4j.MDC import org.springframework.context.event.EventListener import org.springframework.stereotype.Component import org.springframework.web.socket.WebSocketSession @@ -24,6 +26,7 @@ internal class WebSocketController( private val waitingQueueSessionEventListener: List, private val sessionEventListener: List, private val sessionManager: SessionManager, + private val roomRepository: RoomRepository, private val mafiaGameUseCase: MafiaGameUseCase, private val mafiaPhaseUseCase: MafiaPhaseUseCase, ) { @@ -44,15 +47,19 @@ internal class WebSocketController( throw InvalidRequestOtherPlayingException } + val roomId = RoomId(request.roomId?.uppercase() ?: generateRoomId()) + // TODO 여기가맞나? + MDC.put("roomId", roomId.value) + if (request.roomId == null) { sessionManager.registerSession(sessionDto) sessionEventListener.forEach { - it.connectSession(sessionDto.user.id, sessionDto.roomId, request.nickname, request.locale) + it.connectSession(sessionDto.user.id, roomId, request.nickname, request.locale) } return } - val gameInfo = mafiaGameUseCase.getGameInfoByRoomId(sessionDto.roomId) ?: throw NotFoundRoomException + val gameInfo = mafiaGameUseCase.getGameInfoByRoomId(roomId) ?: throw NotFoundRoomException synchronized(gameInfo) { if (gameInfo.phase != MafiaPhase.Wait && gameInfo.room.players.any { it.userId == sessionDto.user.id }.not()) { @@ -65,7 +72,7 @@ internal class WebSocketController( sessionManager.registerSession(sessionDto) sessionEventListener.forEach { - it.connectSession(sessionDto.user.id, sessionDto.roomId, request.nickname, request.locale) + it.connectSession(sessionDto.user.id, roomId, request.nickname, request.locale) } } } @@ -74,18 +81,17 @@ internal class WebSocketController( fun initializeSession(event: MafiaGameRandomMatchingEvent) { val players = event.players - val roomId = RoomId(sessionFactory.generateRoomId()) + val roomId = RoomId(generateRoomId()) players.forEach { user -> val sessionDto = SessionWrapper( session = this.session, // TODO: fix - roomId = roomId, user = user, ) sessionManager.registerSession(sessionDto) sessionEventListener.forEach { eventListener -> - eventListener.connectSession(sessionDto.user, sessionDto.roomId, event.locale) + eventListener.connectSession(sessionDto.user, roomId, event.locale) } waitingQueueSessionEventListener.forEach { eventListener -> @@ -95,4 +101,17 @@ internal class WebSocketController( mafiaPhaseUseCase.startGame(roomId) } + + private fun generateRoomId(): String { + var value: String + + do { + val charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + value = (1..6) + .map { charset.random() } + .joinToString("") + } while (roomRepository.getRoom(RoomId(value)) != null) + + return value + } } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt index 219007e4..8d38a76f 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt @@ -11,8 +11,8 @@ import com.xorker.draw.websocket.message.request.WebSocketRequest import com.xorker.draw.websocket.message.request.mafia.MafiaGameInferAnswerRequest import com.xorker.draw.websocket.message.request.mafia.MafiaGameReactionRequest import com.xorker.draw.websocket.message.request.mafia.MafiaGameVoteMafiaRequest +import com.xorker.draw.websocket.session.SessionId import com.xorker.draw.websocket.session.SessionManager -import org.slf4j.MDC import org.springframework.stereotype.Component import org.springframework.web.socket.WebSocketSession @@ -37,14 +37,13 @@ internal class WebSocketRouter( } val sessionDto = sessionManager.getSession(SessionId(session.id)) ?: throw InvalidRequestValueException - MDC.put("roomId", sessionDto.roomId.value) + // TODO 방법 찾기 +// MDC.put("roomId", sessionDto.roomId.value) when (request.action) { RequestAction.INIT -> throw UnSupportedException RequestAction.RANDOM_MATCHING -> throw UnSupportedException - RequestAction.START_GAME -> { - mafiaPhaseUseCase.startGame(sessionDto.roomId) - } + RequestAction.START_GAME -> mafiaPhaseUseCase.startGame(sessionDto.user) RequestAction.DRAW -> mafiaGameUseCase.draw(sessionDto.user, request.extractBody()) RequestAction.END_TURN -> mafiaGameUseCase.nextTurnByUser(sessionDto.user) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt index fd2bc608..445b531b 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt @@ -4,10 +4,10 @@ import com.fasterxml.jackson.databind.ObjectMapper import com.xorker.draw.support.logging.defaultApiJsonMap import com.xorker.draw.support.logging.logger import com.xorker.draw.support.logging.registerRequestId -import com.xorker.draw.websocket.SessionId import com.xorker.draw.websocket.message.request.RequestAction import com.xorker.draw.websocket.message.request.WebSocketRequest import com.xorker.draw.websocket.message.request.mafia.SessionInitializeRequest +import com.xorker.draw.websocket.session.SessionId import com.xorker.draw.websocket.session.SessionManager import org.slf4j.MDC import org.springframework.stereotype.Component @@ -83,7 +83,8 @@ internal class WebSocketLogger( val sessionDto = sessionManager.getSession(sessionId) if (sessionDto != null) { data["userId"] = sessionDto.user.id.value - data["roomId"] = sessionDto.roomId + // TODO 방법 찾기 + // data["roomId"] = sessionDto.roomId } } } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt index 2c0e18c4..fc94f40d 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt @@ -1,12 +1,10 @@ package com.xorker.draw.websocket.session -import com.xorker.draw.room.RoomId import com.xorker.draw.user.User import com.xorker.draw.websocket.SessionId interface Session { val id: SessionId val user: User - val roomId: RoomId fun send(message: String) } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt index 0f713e9f..8263a249 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt @@ -2,21 +2,17 @@ package com.xorker.draw.websocket.session import com.xorker.draw.auth.token.TokenUseCase import com.xorker.draw.exception.UnAuthenticationException -import com.xorker.draw.room.RoomId -import com.xorker.draw.room.RoomRepository import com.xorker.draw.user.User import com.xorker.draw.user.UserId import com.xorker.draw.websocket.WaitingQueueSession import com.xorker.draw.websocket.message.request.mafia.MafiaGameRandomMatchingRequest import com.xorker.draw.websocket.message.request.mafia.SessionInitializeRequest -import org.slf4j.MDC import org.springframework.stereotype.Component import org.springframework.web.socket.WebSocketSession @Component internal class SessionFactory( private val tokenUseCase: TokenUseCase, - private val roomRepository: RoomRepository, ) { fun create(session: WebSocketSession, request: MafiaGameRandomMatchingRequest): WaitingQueueSession { @@ -28,30 +24,12 @@ internal class SessionFactory( } fun create(session: WebSocketSession, request: SessionInitializeRequest): Session { - val roomId = RoomId(request.roomId?.uppercase() ?: generateRoomId()) - - MDC.put("roomId", roomId.value) - return SessionWrapper( session, - roomId, User(getUserId(request.accessToken), request.nickname), ) } - fun generateRoomId(): String { - var value: String - - do { - val charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" - value = (1..6) - .map { charset.random() } - .joinToString("") - } while (roomRepository.getRoom(RoomId(value)) != null) - - return value - } - private fun getUserId(token: String): UserId { return tokenUseCase.getUserId(token) ?: throw UnAuthenticationException } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt index 5a4f47f8..c068ccd8 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt @@ -1,6 +1,5 @@ package com.xorker.draw.websocket.session -import com.xorker.draw.room.RoomId import com.xorker.draw.user.User import com.xorker.draw.websocket.SessionId import com.xorker.draw.websocket.WaitingQueueSession @@ -9,7 +8,6 @@ import org.springframework.web.socket.WebSocketSession internal class SessionWrapper( private val session: WebSocketSession, - override val roomId: RoomId, override val user: User, ) : Session { override val id: SessionId = SessionId(session.id) @@ -34,11 +32,3 @@ internal class WaitingQueueSessionWrapper( } } } - -internal fun WaitingQueueSessionWrapper.toSessionWrapper(roomId: RoomId): Session { - return SessionWrapper( - session = this.session, - roomId = roomId, - user = this.user, - ) -} diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt index 3fbbf755..f935f59e 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt @@ -51,11 +51,11 @@ internal class MafiaGameRoomService( mafiaGameRepository.saveGameInfo(gameInfo) } - override fun disconnectSession(userId: UserId, roomId: RoomId) { - val gameInfo = mafiaGameRepository.getGameInfo(roomId) ?: return + override fun disconnectSession(userId: UserId) { + val gameInfo = mafiaGameRepository.getGameInfo(userId) ?: return if (gameInfo.phase == MafiaPhase.Wait) { - exitSession(userId, roomId) + exitSession(userId) return } @@ -71,11 +71,11 @@ internal class MafiaGameRoomService( } } - override fun exitSession(userId: UserId, roomId: RoomId) { - val gameInfo = mafiaGameRepository.getGameInfo(roomId) ?: return + override fun exitSession(userId: UserId) { + val gameInfo = mafiaGameRepository.getGameInfo(userId) ?: return if (gameInfo.phase != MafiaPhase.Wait) { - disconnectSession(userId, roomId) + disconnectSession(userId) return } diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseService.kt b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseService.kt index ce94bbfb..c6f31ec8 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseService.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseService.kt @@ -1,5 +1,6 @@ package com.xorker.draw.mafia.phase +import com.xorker.draw.exception.InvalidRequestValueException import com.xorker.draw.exception.NotFoundRoomException import com.xorker.draw.mafia.MafiaGameInfo import com.xorker.draw.mafia.MafiaGameRepository @@ -8,6 +9,7 @@ import com.xorker.draw.mafia.MafiaPhaseMessenger import com.xorker.draw.mafia.assert import com.xorker.draw.mafia.assertIs import com.xorker.draw.room.RoomId +import com.xorker.draw.user.User import org.springframework.stereotype.Service @Service @@ -21,9 +23,18 @@ internal class MafiaPhaseService( private val mafiaPhaseMessenger: MafiaPhaseMessenger, ) : MafiaPhaseUseCase { + override fun startGame(user: User): MafiaPhase.Ready { + val gameInfo = mafiaGameRepository.getGameInfo(user.id) ?: throw InvalidRequestValueException + return startGame(gameInfo) + } + override fun startGame(roomId: RoomId): MafiaPhase.Ready { val gameInfo = getGameInfo(roomId) + return startGame(gameInfo) + } + private fun startGame(gameInfo: MafiaGameInfo): MafiaPhase.Ready { + val roomId = gameInfo.room.id val phase = synchronized(gameInfo) { assertIs(gameInfo.phase) mafiaPhaseStartGameProcessor.startMafiaGame(gameInfo) { diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseUseCase.kt b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseUseCase.kt index 142b3c35..254bdc2f 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseUseCase.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseUseCase.kt @@ -2,11 +2,13 @@ package com.xorker.draw.mafia.phase import com.xorker.draw.mafia.MafiaPhase import com.xorker.draw.room.RoomId +import com.xorker.draw.user.User interface MafiaPhaseUseCase { /** * MafiaPhase.Wait -> MafiaPhase.Ready */ + fun startGame(user: User): MafiaPhase.Ready fun startGame(roomId: RoomId): MafiaPhase.Ready /** diff --git a/core/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt b/core/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt index 5d4f7e99..3bf3d695 100644 --- a/core/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt +++ b/core/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt @@ -7,6 +7,6 @@ import com.xorker.draw.user.UserId interface SessionEventListener { fun connectSession(userId: UserId, roomId: RoomId, nickname: String, locale: String) fun connectSession(user: User, roomId: RoomId, locale: String) - fun disconnectSession(userId: UserId, roomId: RoomId) - fun exitSession(userId: UserId, roomId: RoomId) + fun disconnectSession(userId: UserId) + fun exitSession(userId: UserId) } diff --git a/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionService.kt b/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionService.kt index 11bffc3b..87312e4f 100644 --- a/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionService.kt +++ b/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionService.kt @@ -1,5 +1,6 @@ package com.xorker.draw.websocket +import com.xorker.draw.user.User import com.xorker.draw.user.UserId import java.util.concurrent.ConcurrentHashMap import org.springframework.core.Ordered @@ -40,11 +41,11 @@ internal class WaitingQueueSessionService : WaitingQueueSessionUseCase, WaitingQ return userIds[userId] } - override fun connectSession(session: WaitingQueueSession) { - registerSession(session) + override fun connectSession(user: User, locale: String) { +// registerSession(session) } - override fun exitSession(session: WaitingQueueSession) { - unregisterSession(session.id) + override fun exitSession(user: User, locale: String) { +// unregisterSession(session.id) } } From 53e94af3538f4c6f24a44057f7ba653b94766575 Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Tue, 17 Sep 2024 13:13:49 +0900 Subject: [PATCH 11/40] =?UTF-8?q?DRAW-352=20refactor:=20WatingQueueSession?= =?UTF-8?q?=20=EC=9D=84=20Session=20=EC=9C=BC=EB=A1=9C=20=ED=86=B5?= =?UTF-8?q?=EC=9D=BC=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../draw/websocket/MainWebSocketHandler.kt | 17 +++---- .../draw/websocket/WebSocketController.kt | 20 +++----- .../broker/SimpleSessionMessageBroker.kt | 4 +- .../xorker/draw/websocket/session/Session.kt | 6 ++- .../draw/websocket/session/SessionFactory.kt | 6 +-- .../draw/websocket/session/SessionManager.kt | 5 +- .../draw/websocket/session/SessionWrapper.kt | 17 +------ .../websocket/WaitingQueueSessionService.kt | 51 ------------------- .../websocket/WaitingQueueSessionUseCase.kt | 10 ---- .../com/xorker/draw/websocket/Session.kt | 13 ----- 10 files changed, 26 insertions(+), 123 deletions(-) delete mode 100644 core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionService.kt delete mode 100644 core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionUseCase.kt delete mode 100644 domain/src/main/kotlin/com/xorker/draw/websocket/Session.kt diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt index 4dccc8ac..86903625 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt @@ -7,6 +7,7 @@ import com.xorker.draw.support.metric.MetricManager import com.xorker.draw.websocket.exception.WebSocketExceptionHandler import com.xorker.draw.websocket.log.WebSocketLogger import com.xorker.draw.websocket.message.request.WebSocketRequestParser +import com.xorker.draw.websocket.session.SessionId import com.xorker.draw.websocket.session.SessionManager import org.springframework.stereotype.Component import org.springframework.web.socket.CloseStatus @@ -17,7 +18,6 @@ import org.springframework.web.socket.handler.TextWebSocketHandler @Component internal class MainWebSocketHandler( private val sessionManager: SessionManager, - private val waitingQueueSessionUseCase: WaitingQueueSessionUseCase, private val router: WebSocketRouter, private val requestParser: WebSocketRequestParser, private val waitingQueueSessionEventListener: List, @@ -50,18 +50,15 @@ internal class MainWebSocketHandler( metricManager.decreaseWebsocket(session.id) webSocketLogger.afterConnectionClosed(session, status) - val waitingQueueSessionDto = waitingQueueSessionUseCase.getSession(SessionId(session.id)) + val sessionId = SessionId(session.id) - if (waitingQueueSessionDto != null) { - waitingQueueSessionEventListener.forEach { - it.exitSession(waitingQueueSessionDto.user, waitingQueueSessionDto.locale) - } - return - } - - val sessionDto = sessionManager.getSession(SessionId(session.id)) + val sessionDto = sessionManager.unregisterSession(sessionId) ?: return logger.error(InvalidWebSocketStatusException.message, InvalidWebSocketStatusException) + waitingQueueSessionEventListener.forEach { + it.exitSession(sessionDto.user, sessionDto.locale) + } + when (status) { CloseStatus.NORMAL -> sessionEventListener.forEach { diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt index e9cf2886..1e1033d5 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt @@ -14,7 +14,6 @@ import com.xorker.draw.websocket.message.request.mafia.MafiaGameRandomMatchingRe import com.xorker.draw.websocket.message.request.mafia.SessionInitializeRequest import com.xorker.draw.websocket.session.SessionFactory import com.xorker.draw.websocket.session.SessionManager -import com.xorker.draw.websocket.session.SessionWrapper import org.slf4j.MDC import org.springframework.context.event.EventListener import org.springframework.stereotype.Component @@ -32,10 +31,11 @@ internal class WebSocketController( ) { fun initializeWaitingQueueSession(session: WebSocketSession, request: MafiaGameRandomMatchingRequest) { - val waitingQueueSessionDto = sessionFactory.create(session, request) + val sessionDto = sessionFactory.create(session, request) + sessionManager.registerSession(sessionDto) waitingQueueSessionEventListener.forEach { - it.connectSession(waitingQueueSessionDto.user, waitingQueueSessionDto.locale) + it.connectSession(sessionDto.user, sessionDto.locale) } } @@ -84,19 +84,13 @@ internal class WebSocketController( val roomId = RoomId(generateRoomId()) players.forEach { user -> - val sessionDto = SessionWrapper( - session = this.session, // TODO: fix - user = user, - ) - - sessionManager.registerSession(sessionDto) - sessionEventListener.forEach { eventListener -> - eventListener.connectSession(sessionDto.user, roomId, event.locale) - } - waitingQueueSessionEventListener.forEach { eventListener -> eventListener.exitSession(user, event.locale) } + + sessionEventListener.forEach { eventListener -> + eventListener.connectSession(user, roomId, event.locale) + } } mafiaPhaseUseCase.startGame(roomId) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt index c3645292..d534e3d2 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt @@ -2,7 +2,6 @@ package com.xorker.draw.websocket.broker import com.xorker.draw.exception.InvalidBroadcastException import com.xorker.draw.room.RoomRepository -import com.xorker.draw.websocket.WaitingQueueSessionUseCase import com.xorker.draw.websocket.broker.event.BranchedBroadcastEvent import com.xorker.draw.websocket.broker.event.BroadcastEvent import com.xorker.draw.websocket.broker.event.RespectiveBroadcastEvent @@ -15,7 +14,6 @@ import org.springframework.stereotype.Component @Component internal class SimpleSessionMessageBroker( private val sessionManager: SessionManager, - private val waitingQueueSessionUseCase: WaitingQueueSessionUseCase, private val roomRepository: RoomRepository, private val parser: WebSocketResponseParser, ) : SessionMessageBroker { @@ -27,7 +25,7 @@ internal class SimpleSessionMessageBroker( val session = sessionManager.getSession(userId) if (session == null) { - val waitingQueueSession = waitingQueueSessionUseCase.getSession(userId) + val waitingQueueSession = sessionManager.getSession(userId) val response = parser.parse(event.message) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt index fc94f40d..fa05f1bd 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt @@ -1,10 +1,14 @@ package com.xorker.draw.websocket.session import com.xorker.draw.user.User -import com.xorker.draw.websocket.SessionId + +@JvmInline +value class SessionId(val value: String) interface Session { val id: SessionId val user: User + val locale: String + fun send(message: String) } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt index 8263a249..016706b2 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionFactory.kt @@ -4,7 +4,6 @@ import com.xorker.draw.auth.token.TokenUseCase import com.xorker.draw.exception.UnAuthenticationException import com.xorker.draw.user.User import com.xorker.draw.user.UserId -import com.xorker.draw.websocket.WaitingQueueSession import com.xorker.draw.websocket.message.request.mafia.MafiaGameRandomMatchingRequest import com.xorker.draw.websocket.message.request.mafia.SessionInitializeRequest import org.springframework.stereotype.Component @@ -15,8 +14,8 @@ internal class SessionFactory( private val tokenUseCase: TokenUseCase, ) { - fun create(session: WebSocketSession, request: MafiaGameRandomMatchingRequest): WaitingQueueSession { - return WaitingQueueSessionWrapper( + fun create(session: WebSocketSession, request: MafiaGameRandomMatchingRequest): Session { + return SessionWrapper( session, User(getUserId(request.accessToken), request.nickname), request.locale, @@ -27,6 +26,7 @@ internal class SessionFactory( return SessionWrapper( session, User(getUserId(request.accessToken), request.nickname), + request.locale, ) } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt index cfaffc8e..05799156 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt @@ -1,7 +1,6 @@ package com.xorker.draw.websocket.session import com.xorker.draw.user.UserId -import com.xorker.draw.websocket.SessionId import java.util.concurrent.ConcurrentHashMap import org.springframework.core.Ordered import org.springframework.core.annotation.Order @@ -31,8 +30,8 @@ internal class SessionManager { userIdMap[session.user.id] = session } - fun unregisterSession(sessionId: SessionId) { + fun unregisterSession(sessionId: SessionId): Session? { val session = sessionMap.remove(sessionId) - userIdMap.remove(session?.user?.id) + return userIdMap.remove(session?.user?.id) } } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt index c068ccd8..e1959c5e 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt @@ -1,29 +1,14 @@ package com.xorker.draw.websocket.session import com.xorker.draw.user.User -import com.xorker.draw.websocket.SessionId -import com.xorker.draw.websocket.WaitingQueueSession import org.springframework.web.socket.TextMessage import org.springframework.web.socket.WebSocketSession internal class SessionWrapper( private val session: WebSocketSession, override val user: User, -) : Session { - override val id: SessionId = SessionId(session.id) - - override fun send(message: String) { - synchronized(session) { - session.sendMessage(TextMessage(message)) - } - } -} - -internal class WaitingQueueSessionWrapper( - val session: WebSocketSession, - override val user: User, override val locale: String, -) : WaitingQueueSession { +) : Session { override val id: SessionId = SessionId(session.id) override fun send(message: String) { diff --git a/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionService.kt b/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionService.kt deleted file mode 100644 index 87312e4f..00000000 --- a/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionService.kt +++ /dev/null @@ -1,51 +0,0 @@ -package com.xorker.draw.websocket - -import com.xorker.draw.user.User -import com.xorker.draw.user.UserId -import java.util.concurrent.ConcurrentHashMap -import org.springframework.core.Ordered -import org.springframework.core.annotation.Order -import org.springframework.stereotype.Service - -@Order(Ordered.HIGHEST_PRECEDENCE) -@Service -internal class WaitingQueueSessionService : WaitingQueueSessionUseCase, WaitingQueueSessionEventListener { - private val sessions: ConcurrentHashMap = ConcurrentHashMap() - private val userIds: ConcurrentHashMap = ConcurrentHashMap() - - override fun registerSession(session: WaitingQueueSession) { - if (sessions.contains(session.id)) { - unregisterSession(session.id) - } - - val user = session.user - - sessions[session.id] = session - userIds[user.id] = session - } - - override fun unregisterSession(sessionId: SessionId) { - val session = sessions.remove(sessionId) - session?.let { - val user = it.user - - userIds.remove(user.id) - } - } - - override fun getSession(sessionId: SessionId): WaitingQueueSession? { - return sessions[sessionId] - } - - override fun getSession(userId: UserId): WaitingQueueSession? { - return userIds[userId] - } - - override fun connectSession(user: User, locale: String) { -// registerSession(session) - } - - override fun exitSession(user: User, locale: String) { -// unregisterSession(session.id) - } -} diff --git a/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionUseCase.kt b/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionUseCase.kt deleted file mode 100644 index 2aa0bad6..00000000 --- a/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionUseCase.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.xorker.draw.websocket - -import com.xorker.draw.user.UserId - -interface WaitingQueueSessionUseCase { - fun registerSession(session: WaitingQueueSession) - fun unregisterSession(sessionId: SessionId) - fun getSession(sessionId: SessionId): WaitingQueueSession? - fun getSession(userId: UserId): WaitingQueueSession? -} diff --git a/domain/src/main/kotlin/com/xorker/draw/websocket/Session.kt b/domain/src/main/kotlin/com/xorker/draw/websocket/Session.kt deleted file mode 100644 index 2b7dab83..00000000 --- a/domain/src/main/kotlin/com/xorker/draw/websocket/Session.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.xorker.draw.websocket - -import com.xorker.draw.user.User - -@JvmInline -value class SessionId(val value: String) - -interface WaitingQueueSession { - val id: SessionId - val user: User - val locale: String - fun send(message: String) -} From 84d4934c451a9be91f7707274da00ccfcc00f3c2 Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Tue, 17 Sep 2024 15:36:30 +0900 Subject: [PATCH 12/40] =?UTF-8?q?DRAW-352=20refactor:=20=EB=8C=80=EA=B8=B0?= =?UTF-8?q?=EC=97=B4=20Service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mafia/MafiaGameWaitingQueueAdapter.kt | 37 ++++++---------- .../draw/websocket/MainWebSocketHandler.kt | 6 +-- .../draw/websocket/WebSocketController.kt | 10 +---- .../mafia/MafiaGameRandomMatchingService.kt | 42 ++++++++++++++----- .../WaitingQueueSessionEventListener.kt | 8 ---- .../draw/websocket/WaitingQueueUseCase.kt | 8 ++++ .../mafia/MafiaGameWaitingQueueRepository.kt | 6 ++- 7 files changed, 60 insertions(+), 57 deletions(-) delete mode 100644 core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionEventListener.kt create mode 100644 core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueUseCase.kt diff --git a/adapter/memory/src/main/kotlin/com/xorker/draw/mafia/MafiaGameWaitingQueueAdapter.kt b/adapter/memory/src/main/kotlin/com/xorker/draw/mafia/MafiaGameWaitingQueueAdapter.kt index b7736959..33e3cccf 100644 --- a/adapter/memory/src/main/kotlin/com/xorker/draw/mafia/MafiaGameWaitingQueueAdapter.kt +++ b/adapter/memory/src/main/kotlin/com/xorker/draw/mafia/MafiaGameWaitingQueueAdapter.kt @@ -1,44 +1,31 @@ package com.xorker.draw.mafia import com.xorker.draw.exception.UnSupportedException -import com.xorker.draw.mafia.event.MafiaGameRandomMatchingEvent import com.xorker.draw.user.User import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentLinkedQueue -import org.springframework.context.ApplicationEventPublisher import org.springframework.stereotype.Component @Component -internal class MafiaGameWaitingQueueAdapter( - private val eventPublisher: ApplicationEventPublisher, -) : MafiaGameWaitingQueueRepository { +internal class MafiaGameWaitingQueueAdapter : MafiaGameWaitingQueueRepository { private val waitingQueue: ConcurrentHashMap> = ConcurrentHashMap() - override fun enqueue(size: Int, user: User, locale: String) { - val queue = waitingQueue.getOrPut(locale) { ConcurrentLinkedQueue() } + override fun size(locale: String): Int { + return waitingQueue[locale]?.size ?: 0 + } + override fun enqueue(user: User, locale: String) { + val queue = waitingQueue.getOrPut(locale) { ConcurrentLinkedQueue() } queue.add(user) - - synchronized(this) { - if (queue.size >= size) { - val players = mutableListOf() - - (0 until size).forEach { _ -> - queue.poll().let { - players.add(it) - } - } - - val event = MafiaGameRandomMatchingEvent(players, locale) - - eventPublisher.publishEvent(event) - } - } } - override fun dequeue(user: User, locale: String) { + override fun dequeue(locale: String): User { val queue = waitingQueue[locale] ?: throw UnSupportedException - queue.remove(user) + return queue.poll() + } + + override fun remove(user: User, locale: String) { + waitingQueue[locale]?.remove(user) } } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt index 86903625..f206cd97 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt @@ -20,7 +20,7 @@ internal class MainWebSocketHandler( private val sessionManager: SessionManager, private val router: WebSocketRouter, private val requestParser: WebSocketRequestParser, - private val waitingQueueSessionEventListener: List, + private val waitingQueueUseCase: WaitingQueueUseCase, private val sessionEventListener: List, private val webSocketExceptionHandler: WebSocketExceptionHandler, private val metricManager: MetricManager, @@ -55,9 +55,7 @@ internal class MainWebSocketHandler( val sessionDto = sessionManager.unregisterSession(sessionId) ?: return logger.error(InvalidWebSocketStatusException.message, InvalidWebSocketStatusException) - waitingQueueSessionEventListener.forEach { - it.exitSession(sessionDto.user, sessionDto.locale) - } + waitingQueueUseCase.remove(sessionDto.user, sessionDto.locale) when (status) { CloseStatus.NORMAL -> diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt index 1e1033d5..09ac110e 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt @@ -22,7 +22,7 @@ import org.springframework.web.socket.WebSocketSession @Component internal class WebSocketController( private val sessionFactory: SessionFactory, - private val waitingQueueSessionEventListener: List, + private val waitingQueueUseCase: WaitingQueueUseCase, private val sessionEventListener: List, private val sessionManager: SessionManager, private val roomRepository: RoomRepository, @@ -34,9 +34,7 @@ internal class WebSocketController( val sessionDto = sessionFactory.create(session, request) sessionManager.registerSession(sessionDto) - waitingQueueSessionEventListener.forEach { - it.connectSession(sessionDto.user, sessionDto.locale) - } + waitingQueueUseCase.enqueue(sessionDto.user, sessionDto.locale) } fun initializeSession(session: WebSocketSession, request: SessionInitializeRequest) { @@ -84,10 +82,6 @@ internal class WebSocketController( val roomId = RoomId(generateRoomId()) players.forEach { user -> - waitingQueueSessionEventListener.forEach { eventListener -> - eventListener.exitSession(user, event.locale) - } - sessionEventListener.forEach { eventListener -> eventListener.connectSession(user, roomId, event.locale) } diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt index 5a831567..f93eed5f 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt @@ -1,8 +1,10 @@ package com.xorker.draw.mafia import com.xorker.draw.exception.InvalidRequestOtherPlayingException +import com.xorker.draw.mafia.event.MafiaGameRandomMatchingEvent import com.xorker.draw.user.User -import com.xorker.draw.websocket.WaitingQueueSessionEventListener +import com.xorker.draw.websocket.WaitingQueueUseCase +import org.springframework.context.ApplicationEventPublisher import org.springframework.stereotype.Service @Service @@ -10,19 +12,39 @@ internal class MafiaGameRandomMatchingService( private val mafiaGameUseCase: MafiaGameUseCase, private val mafiaGameWaitingQueueRepository: MafiaGameWaitingQueueRepository, private val mafiaGameMessenger: MafiaGameMessenger, -) : WaitingQueueSessionEventListener { + private val eventPublisher: ApplicationEventPublisher, +) : WaitingQueueUseCase { - override fun connectSession(user: User, locale: String) { - mafiaGameUseCase.getGameInfoByUserId(user.id)?.let { - throw InvalidRequestOtherPlayingException - } - - mafiaGameWaitingQueueRepository.enqueue(3, user, locale) + override fun enqueue(user: User, locale: String) { + val gameInfo = mafiaGameUseCase.getGameInfoByUserId(user.id) + if (gameInfo != null) throw InvalidRequestOtherPlayingException + mafiaGameWaitingQueueRepository.enqueue(user, locale) mafiaGameMessenger.unicastRandomMatching(user.id) + + synchronized(this) { + val size = mafiaGameWaitingQueueRepository.size(locale) + + if (size >= MINIMUM_GAME_START) { + val players = mutableListOf() + + (0 until size).forEach { _ -> + val player = mafiaGameWaitingQueueRepository.dequeue(locale) + players.add(player) + } + + val event = MafiaGameRandomMatchingEvent(players, locale) + + eventPublisher.publishEvent(event) + } + } + } + + override fun remove(user: User, locale: String) { + mafiaGameWaitingQueueRepository.remove(user, locale) } - override fun exitSession(user: User, locale: String) { - mafiaGameWaitingQueueRepository.dequeue(user, locale) + companion object { + private const val MINIMUM_GAME_START: Int = 3 } } diff --git a/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionEventListener.kt b/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionEventListener.kt deleted file mode 100644 index 82ca9b21..00000000 --- a/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueSessionEventListener.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.xorker.draw.websocket - -import com.xorker.draw.user.User - -interface WaitingQueueSessionEventListener { - fun connectSession(user: User, locale: String) - fun exitSession(user: User, locale: String) -} diff --git a/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueUseCase.kt b/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueUseCase.kt new file mode 100644 index 00000000..f8235a13 --- /dev/null +++ b/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueUseCase.kt @@ -0,0 +1,8 @@ +package com.xorker.draw.websocket + +import com.xorker.draw.user.User + +interface WaitingQueueUseCase { + fun enqueue(user: User, locale: String) + fun remove(user: User, locale: String) +} diff --git a/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameWaitingQueueRepository.kt b/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameWaitingQueueRepository.kt index 99fc1cad..ddb9b678 100644 --- a/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameWaitingQueueRepository.kt +++ b/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameWaitingQueueRepository.kt @@ -3,6 +3,8 @@ package com.xorker.draw.mafia import com.xorker.draw.user.User interface MafiaGameWaitingQueueRepository { - fun enqueue(size: Int, user: User, locale: String) - fun dequeue(user: User, locale: String) + fun size(locale: String): Int + fun enqueue(user: User, locale: String) + fun dequeue(locale: String): User + fun remove(user: User, locale: String) } From c3a690cf8818843ca8612be81f6706d3fd06076c Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Tue, 17 Sep 2024 13:49:18 +0900 Subject: [PATCH 13/40] =?UTF-8?q?DRAW-353=20fix:=20=EC=9B=B9=EC=86=8C?= =?UTF-8?q?=EC=BC=93=20=EB=A9=94=ED=8A=B8=EB=A6=AD=20SessionManager?= =?UTF-8?q?=EC=97=90=20=EC=A7=81=EC=A0=91=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../draw/websocket/session/SessionManager.kt | 9 ++++++++- .../xorker/draw/support/metric/MetricManager.kt | 17 +++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt index 05799156..3aaa6d30 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt @@ -1,5 +1,6 @@ package com.xorker.draw.websocket.session +import com.xorker.draw.support.metric.MetricManager import com.xorker.draw.user.UserId import java.util.concurrent.ConcurrentHashMap import org.springframework.core.Ordered @@ -8,10 +9,16 @@ import org.springframework.stereotype.Service @Order(Ordered.HIGHEST_PRECEDENCE) @Service -internal class SessionManager { +internal class SessionManager( + private val metricManager: MetricManager, +) { private val sessionMap: ConcurrentHashMap = ConcurrentHashMap() private val userIdMap: ConcurrentHashMap = ConcurrentHashMap() + init { + metricManager.setWebSocketGauge(sessionMap) + } + fun getSession(sessionId: SessionId): Session? { return sessionMap[sessionId] } diff --git a/support/metric/src/main/kotlin/com/xorker/draw/support/metric/MetricManager.kt b/support/metric/src/main/kotlin/com/xorker/draw/support/metric/MetricManager.kt index 4aefb7d9..a0294345 100644 --- a/support/metric/src/main/kotlin/com/xorker/draw/support/metric/MetricManager.kt +++ b/support/metric/src/main/kotlin/com/xorker/draw/support/metric/MetricManager.kt @@ -2,33 +2,26 @@ package com.xorker.draw.support.metric import io.micrometer.core.instrument.Gauge import io.micrometer.core.instrument.MeterRegistry -import java.util.concurrent.CopyOnWriteArraySet import java.util.concurrent.atomic.AtomicInteger import org.springframework.stereotype.Component @Component class MetricManager( - metric: MeterRegistry, + private val metric: MeterRegistry, ) { - private val connectedWebSocketCount: CopyOnWriteArraySet = CopyOnWriteArraySet() private val playingPlayingRoomCount: AtomicInteger = AtomicInteger() init { - Gauge - .builder("connect_websocket_gauge", connectedWebSocketCount) { it.size.toDouble() } - .register(metric) Gauge .builder("playing_game_room_gauge", playingPlayingRoomCount) { it.toDouble() } .register(metric) } - fun increaseWebsocket(sessionId: String) { - connectedWebSocketCount.add(sessionId) - } - - fun decreaseWebsocket(sessionId: String) { - connectedWebSocketCount.remove(sessionId) + fun setWebSocketGauge(socketCollection: Map<*, *>) { + Gauge + .builder("connect_websocket_gauge", socketCollection) { it.size.toDouble() } + .register(metric) } fun increaseGameCount() { From 7e2803e0f88ba8cedb56ea7266e2044552884a3f Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Tue, 17 Sep 2024 16:05:49 +0900 Subject: [PATCH 14/40] =?UTF-8?q?DRAW-353=20feat:=20Event=20=EB=AA=A8?= =?UTF-8?q?=EB=93=88=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 69 ++++++++++++++++++++++++------------------ core/build.gradle.kts | 1 + event/build.gradle.kts | 11 +++++++ settings.gradle.kts | 1 + 4 files changed, 53 insertions(+), 29 deletions(-) create mode 100644 event/build.gradle.kts diff --git a/README.md b/README.md index f2af7dac..558b4a98 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Trouble Painter 🪄 +# Trouble Painter 🪄 ![1](https://github.com/user-attachments/assets/e39f0b35-511d-4499-92a2-043c2239f872) @@ -13,7 +13,7 @@ ## Architecture ✨

- +
@@ -22,18 +22,18 @@ ## Teck Stack ✨ -| IDE | IntelliJ | -|:---|:---| -| Language | Kotlin | -| Framework | Spring Boot 3.2.5, Gradle | +| IDE | IntelliJ | +|:---------------|:-----------------------------------------------| +| Language | Kotlin | +| Framework | Spring Boot 3.2.5, Gradle | | Authentication | Spring Security, JSON Web Tokens, Opaque Token | -| Orm | Spring Data JPA | -| Database | MySQL | -| External | Nginx, Docker, Redis, Kubernetes, ELK | -| Monitoring | Prometheus, Grafana, Sentry | -| CI/CD | ArgoCD, Github Action | -| API Docs | Notion, Swagger | -| Other Tool | Jira, Discord, Postman, Figma | +| Orm | Spring Data JPA | +| Database | MySQL | +| External | Nginx, Docker, Redis, Kubernetes, ELK | +| Monitoring | Prometheus, Grafana, Sentry | +| CI/CD | ArgoCD, Github Action | +| API Docs | Notion, Swagger | +| Other Tool | Jira, Discord, Postman, Figma |
@@ -68,9 +68,9 @@ - 일단 포트 역할하는 인터페이스도 이 모듈에 담는다. ``` -| | app | adapter | core | support | domain | -|-------------|-----|---------|------|---------|--------| -| 사용가능한 모듈 여부 | - | - | - | - | - | +| | app | adapter | core | event | support | domain | +|-------------|-----|---------|------|-------|---------|--------| +| 사용가능한 모듈 여부 | - | - | - | - | - | - | ### support: 서포트 모듈 @@ -79,9 +79,21 @@ - TimeUtis 등 ``` -| | app | adapter | core | support | domain | -|-------------|-----|---------|------|---------|--------| -| 사용가능한 모듈 여부 | - | - | - | - | - | +| | app | adapter | core | event | support | domain | +|-------------|-----|---------|------|-------|---------|--------| +| 사용가능한 모듈 여부 | - | - | - | - | - | - | + +### event: 이벤트 모듈 + +```text +- 이벤트 모듈 +- 객체간 연결을 느슨하게 하기 위한 객체 +- 이벤트 발생 및 전달을 주로 한다 +``` + +| | app | adapter | core | event | support | domain | +|-------------|-----|---------|------|-------|---------|--------| +| 사용가능한 모듈 여부 | - | Runtime | - | - | O | O | ### core: 코어 모듈 @@ -90,10 +102,9 @@ - 웹 통신 / DB 관련 객체는 가급적 사용을 피한다. ``` -| | app | adapter | core | support | domain | -|-------------|---|---------|------|---------|--------| -| 사용가능한 모듈 여부 | - | Runtime | - | O | O | - +| | app | adapter | core | event | support | domain | +|-------------|-----|---------|------|-------|---------|--------| +| 사용가능한 모듈 여부 | - | Runtime | - | O | O | O | ### adapter : 외부 통신 모듈 @@ -102,9 +113,9 @@ - JPA / Kafka Producer / Http 통신 등이 해당 된다. ``` -| | app | adapter | core | support | domain | -|-------------|---|---|------|---------|--------| -| 사용가능한 모듈 여부 | - | - | - | O | O | +| | app | adapter | core | event | support | domain | +|-------------|-----|---------|------|-------|---------|--------| +| 사용가능한 모듈 여부 | - | - | - | O | O | O | ### app : 요청 Receive 모듈 @@ -113,6 +124,6 @@ - Web Controller / Kafka Consumer 등이 해당 된다. ``` -| | app | adapter | core | support | domain | -|-------------|---|---|------|---------|--------| -| 사용가능한 모듈 여부 | - | - | O | O | O | +| | app | adapter | core | event | support | domain | +|-------------|-----|---------|------|-------|---------|--------| +| 사용가능한 모듈 여부 | - | - | O | O | O | O | diff --git a/core/build.gradle.kts b/core/build.gradle.kts index c305b6d6..cc10d4c2 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -6,6 +6,7 @@ plugins { dependencies { api(project(":domain")) + api(project(":event")) implementation(project(":adapter:memory")) implementation(project(":adapter:oauth")) implementation(project(":adapter:rdb")) diff --git a/event/build.gradle.kts b/event/build.gradle.kts new file mode 100644 index 00000000..f0726fec --- /dev/null +++ b/event/build.gradle.kts @@ -0,0 +1,11 @@ +import org.springframework.boot.gradle.tasks.bundling.BootJar + +dependencies { + api(project(":domain")) + implementation("org.springframework.boot:spring-boot-starter:${Versions.SPRING_BOOT}") +} + +tasks { + withType { enabled = true } + withType { enabled = false } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 92bad78d..74af3e0d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,6 +8,7 @@ include( "app:websocket", "domain", "core", + "event", "support:jwt", "support:metric", "support:logging", From 270896b09e656fd203048e8496656f8efc348c08 Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Tue, 17 Sep 2024 17:28:37 +0900 Subject: [PATCH 15/40] =?UTF-8?q?DRAW-353=20refactor:=20=EC=84=B8=EC=85=98?= =?UTF-8?q?=20=EC=A2=85=EB=A3=8C=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../draw/websocket/MainWebSocketHandler.kt | 22 +++++++------------ .../draw/websocket/WebSocketController.kt | 2 +- .../draw/websocket/session/SessionManager.kt | 6 ++--- .../xorker/draw/mafia/MafiaGameRoomService.kt | 17 +++++++------- .../draw/mafia/UserConnectionUseCase.kt | 8 +++++++ 5 files changed, 29 insertions(+), 26 deletions(-) create mode 100644 core/src/main/kotlin/com/xorker/draw/mafia/UserConnectionUseCase.kt diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt index f206cd97..04ce5b4b 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt @@ -2,8 +2,8 @@ package com.xorker.draw.websocket import com.xorker.draw.exception.InvalidWebSocketStatusException import com.xorker.draw.exception.XorkerException +import com.xorker.draw.mafia.UserConnectionUseCase import com.xorker.draw.support.logging.logger -import com.xorker.draw.support.metric.MetricManager import com.xorker.draw.websocket.exception.WebSocketExceptionHandler import com.xorker.draw.websocket.log.WebSocketLogger import com.xorker.draw.websocket.message.request.WebSocketRequestParser @@ -21,16 +21,14 @@ internal class MainWebSocketHandler( private val router: WebSocketRouter, private val requestParser: WebSocketRequestParser, private val waitingQueueUseCase: WaitingQueueUseCase, - private val sessionEventListener: List, private val webSocketExceptionHandler: WebSocketExceptionHandler, - private val metricManager: MetricManager, private val webSocketLogger: WebSocketLogger, + private val userConnectionUseCase: UserConnectionUseCase, ) : TextWebSocketHandler() { private val logger = logger() override fun afterConnectionEstablished(session: WebSocketSession) { - metricManager.increaseWebsocket(session.id) webSocketLogger.afterConnectionEstablished(session) } @@ -47,26 +45,22 @@ internal class MainWebSocketHandler( } override fun afterConnectionClosed(session: WebSocketSession, status: CloseStatus) { - metricManager.decreaseWebsocket(session.id) webSocketLogger.afterConnectionClosed(session, status) val sessionId = SessionId(session.id) - val sessionDto = sessionManager.unregisterSession(sessionId) ?: return logger.error(InvalidWebSocketStatusException.message, InvalidWebSocketStatusException) waitingQueueUseCase.remove(sessionDto.user, sessionDto.locale) when (status) { - CloseStatus.NORMAL -> - sessionEventListener.forEach { - it.exitSession(sessionDto.user.id) - } + CloseStatus.NORMAL -> { + userConnectionUseCase.exitUser(sessionDto.user) + } - else -> - sessionEventListener.forEach { - it.disconnectSession(sessionDto.user.id) - } + else -> { + userConnectionUseCase.disconnectUser(sessionDto.user) + } } } } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt index 09ac110e..d67fefad 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt @@ -44,13 +44,13 @@ internal class WebSocketController( if (joinedRoomId != null && request.roomId != joinedRoomId.value) { throw InvalidRequestOtherPlayingException } + sessionManager.registerSession(sessionDto) val roomId = RoomId(request.roomId?.uppercase() ?: generateRoomId()) // TODO 여기가맞나? MDC.put("roomId", roomId.value) if (request.roomId == null) { - sessionManager.registerSession(sessionDto) sessionEventListener.forEach { it.connectSession(sessionDto.user.id, roomId, request.nickname, request.locale) } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt index 3aaa6d30..1589c48e 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt @@ -10,7 +10,7 @@ import org.springframework.stereotype.Service @Order(Ordered.HIGHEST_PRECEDENCE) @Service internal class SessionManager( - private val metricManager: MetricManager, + metricManager: MetricManager, ) { private val sessionMap: ConcurrentHashMap = ConcurrentHashMap() private val userIdMap: ConcurrentHashMap = ConcurrentHashMap() @@ -38,7 +38,7 @@ internal class SessionManager( } fun unregisterSession(sessionId: SessionId): Session? { - val session = sessionMap.remove(sessionId) - return userIdMap.remove(session?.user?.id) + val session = sessionMap.remove(sessionId) ?: return null + return userIdMap.remove(session.user.id) } } diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt index f935f59e..12167f04 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt @@ -5,7 +5,6 @@ import com.xorker.draw.room.Room import com.xorker.draw.room.RoomId import com.xorker.draw.user.User import com.xorker.draw.user.UserId -import com.xorker.draw.websocket.SessionEventListener import org.springframework.stereotype.Service @Service @@ -13,9 +12,9 @@ internal class MafiaGameRoomService( private val mafiaGameRepository: MafiaGameRepository, private val mafiaGameMessenger: MafiaGameMessenger, private val mafiaPhaseMessenger: MafiaPhaseMessenger, -) : SessionEventListener { +) : UserConnectionUseCase { - override fun connectSession(userId: UserId, roomId: RoomId, nickname: String, locale: String) { + fun connectSession(userId: UserId, roomId: RoomId, nickname: String, locale: String) { var gameInfo = mafiaGameRepository.getGameInfo(roomId) if (gameInfo == null) { @@ -35,7 +34,7 @@ internal class MafiaGameRoomService( mafiaGameMessenger.broadcastPlayerList(gameInfo) } - override fun connectSession(user: User, roomId: RoomId, locale: String) { + fun connectSession(user: User, roomId: RoomId, locale: String) { var gameInfo = mafiaGameRepository.getGameInfo(roomId) if (gameInfo == null) { @@ -51,11 +50,12 @@ internal class MafiaGameRoomService( mafiaGameRepository.saveGameInfo(gameInfo) } - override fun disconnectSession(userId: UserId) { + override fun disconnectUser(user: User) { + val userId = user.id val gameInfo = mafiaGameRepository.getGameInfo(userId) ?: return if (gameInfo.phase == MafiaPhase.Wait) { - exitSession(userId) + exitUser(user) return } @@ -71,11 +71,12 @@ internal class MafiaGameRoomService( } } - override fun exitSession(userId: UserId) { + override fun exitUser(user: User) { + val userId = user.id val gameInfo = mafiaGameRepository.getGameInfo(userId) ?: return if (gameInfo.phase != MafiaPhase.Wait) { - disconnectSession(userId) + disconnectUser(user) return } diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/UserConnectionUseCase.kt b/core/src/main/kotlin/com/xorker/draw/mafia/UserConnectionUseCase.kt new file mode 100644 index 00000000..2be3ccc3 --- /dev/null +++ b/core/src/main/kotlin/com/xorker/draw/mafia/UserConnectionUseCase.kt @@ -0,0 +1,8 @@ +package com.xorker.draw.mafia + +import com.xorker.draw.user.User + +interface UserConnectionUseCase { + fun exitUser(user: User) + fun disconnectUser(user: User) +} From caab4846fc315e501a68d69097740eb3dda3e69a Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Tue, 17 Sep 2024 19:06:50 +0900 Subject: [PATCH 16/40] =?UTF-8?q?DRAW-353=20refactor:=20=EC=84=B8=EC=85=98?= =?UTF-8?q?=20=EC=8B=9C=EC=9E=91=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xorker/draw/mafia/MafiaGameAdapter.kt | 2 +- .../draw/websocket/WebSocketController.kt | 51 +++---------------- .../mafia/MafiaGameRandomMatchingService.kt | 20 +++++--- .../xorker/draw/mafia/MafiaGameRoomService.kt | 50 +++++++++--------- .../draw/mafia/UserConnectionUseCase.kt | 2 + .../xorker/draw/mafia/MafiaGameRepository.kt | 2 +- .../event/MafiaGameRandomMatchingEvent.kt | 8 --- 7 files changed, 51 insertions(+), 84 deletions(-) delete mode 100644 domain/src/main/kotlin/com/xorker/draw/mafia/event/MafiaGameRandomMatchingEvent.kt diff --git a/adapter/memory/src/main/kotlin/com/xorker/draw/mafia/MafiaGameAdapter.kt b/adapter/memory/src/main/kotlin/com/xorker/draw/mafia/MafiaGameAdapter.kt index 08f389eb..87816f3d 100644 --- a/adapter/memory/src/main/kotlin/com/xorker/draw/mafia/MafiaGameAdapter.kt +++ b/adapter/memory/src/main/kotlin/com/xorker/draw/mafia/MafiaGameAdapter.kt @@ -44,7 +44,7 @@ internal class MafiaGameAdapter( data.remove(gameInfo.room.id) } - override fun getGameInfo(roomId: RoomId): MafiaGameInfo? { + override fun getGameInfo(roomId: RoomId?): MafiaGameInfo? { return data[roomId] } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt index d67fefad..64679c02 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt @@ -6,16 +6,12 @@ import com.xorker.draw.exception.MaxRoomException import com.xorker.draw.exception.NotFoundRoomException import com.xorker.draw.mafia.MafiaGameUseCase import com.xorker.draw.mafia.MafiaPhase -import com.xorker.draw.mafia.event.MafiaGameRandomMatchingEvent -import com.xorker.draw.mafia.phase.MafiaPhaseUseCase +import com.xorker.draw.mafia.UserConnectionUseCase import com.xorker.draw.room.RoomId -import com.xorker.draw.room.RoomRepository import com.xorker.draw.websocket.message.request.mafia.MafiaGameRandomMatchingRequest import com.xorker.draw.websocket.message.request.mafia.SessionInitializeRequest import com.xorker.draw.websocket.session.SessionFactory import com.xorker.draw.websocket.session.SessionManager -import org.slf4j.MDC -import org.springframework.context.event.EventListener import org.springframework.stereotype.Component import org.springframework.web.socket.WebSocketSession @@ -23,11 +19,9 @@ import org.springframework.web.socket.WebSocketSession internal class WebSocketController( private val sessionFactory: SessionFactory, private val waitingQueueUseCase: WaitingQueueUseCase, - private val sessionEventListener: List, private val sessionManager: SessionManager, - private val roomRepository: RoomRepository, private val mafiaGameUseCase: MafiaGameUseCase, - private val mafiaPhaseUseCase: MafiaPhaseUseCase, + private val userConnectionUseCase: UserConnectionUseCase, ) { fun initializeWaitingQueueSession(session: WebSocketSession, request: MafiaGameRandomMatchingRequest) { @@ -46,17 +40,15 @@ internal class WebSocketController( } sessionManager.registerSession(sessionDto) - val roomId = RoomId(request.roomId?.uppercase() ?: generateRoomId()) // TODO 여기가맞나? - MDC.put("roomId", roomId.value) + // MDC.put("roomId", roomId.value) if (request.roomId == null) { - sessionEventListener.forEach { - it.connectSession(sessionDto.user.id, roomId, request.nickname, request.locale) - } + userConnectionUseCase.connectUser(sessionDto.user, null, request.locale) return } + val roomId = RoomId(request.roomId.uppercase()) val gameInfo = mafiaGameUseCase.getGameInfoByRoomId(roomId) ?: throw NotFoundRoomException synchronized(gameInfo) { @@ -68,38 +60,7 @@ internal class WebSocketController( throw MaxRoomException } - sessionManager.registerSession(sessionDto) - sessionEventListener.forEach { - it.connectSession(sessionDto.user.id, roomId, request.nickname, request.locale) - } + userConnectionUseCase.connectUser(sessionDto.user, roomId, request.locale) } } - - @EventListener - fun initializeSession(event: MafiaGameRandomMatchingEvent) { - val players = event.players - - val roomId = RoomId(generateRoomId()) - - players.forEach { user -> - sessionEventListener.forEach { eventListener -> - eventListener.connectSession(user, roomId, event.locale) - } - } - - mafiaPhaseUseCase.startGame(roomId) - } - - private fun generateRoomId(): String { - var value: String - - do { - val charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" - value = (1..6) - .map { charset.random() } - .joinToString("") - } while (roomRepository.getRoom(RoomId(value)) != null) - - return value - } } diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt index f93eed5f..b209d9f4 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt @@ -1,10 +1,9 @@ package com.xorker.draw.mafia import com.xorker.draw.exception.InvalidRequestOtherPlayingException -import com.xorker.draw.mafia.event.MafiaGameRandomMatchingEvent +import com.xorker.draw.mafia.phase.MafiaPhaseUseCase import com.xorker.draw.user.User import com.xorker.draw.websocket.WaitingQueueUseCase -import org.springframework.context.ApplicationEventPublisher import org.springframework.stereotype.Service @Service @@ -12,7 +11,8 @@ internal class MafiaGameRandomMatchingService( private val mafiaGameUseCase: MafiaGameUseCase, private val mafiaGameWaitingQueueRepository: MafiaGameWaitingQueueRepository, private val mafiaGameMessenger: MafiaGameMessenger, - private val eventPublisher: ApplicationEventPublisher, + private val mafiaPhaseUseCase: MafiaPhaseUseCase, + private val mafiaGameRoomService: MafiaGameRoomService, ) : WaitingQueueUseCase { override fun enqueue(user: User, locale: String) { @@ -33,13 +33,21 @@ internal class MafiaGameRandomMatchingService( players.add(player) } - val event = MafiaGameRandomMatchingEvent(players, locale) - - eventPublisher.publishEvent(event) + newGameStart(players, locale) } } } + private fun newGameStart(players: List, locale: String) { + val roomId = mafiaGameRoomService.generateRoomId() + + players.forEach { user -> + mafiaGameRoomService.connectGame(user, roomId, locale) + } + + mafiaPhaseUseCase.startGame(roomId) + } + override fun remove(user: User, locale: String) { mafiaGameWaitingQueueRepository.remove(user, locale) } diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt index 12167f04..29397c89 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt @@ -3,8 +3,8 @@ package com.xorker.draw.mafia import com.xorker.draw.exception.InvalidRequestValueException import com.xorker.draw.room.Room import com.xorker.draw.room.RoomId +import com.xorker.draw.room.RoomRepository import com.xorker.draw.user.User -import com.xorker.draw.user.UserId import org.springframework.stereotype.Service @Service @@ -12,42 +12,33 @@ internal class MafiaGameRoomService( private val mafiaGameRepository: MafiaGameRepository, private val mafiaGameMessenger: MafiaGameMessenger, private val mafiaPhaseMessenger: MafiaPhaseMessenger, + private val roomRepository: RoomRepository, ) : UserConnectionUseCase { - fun connectSession(userId: UserId, roomId: RoomId, nickname: String, locale: String) { - var gameInfo = mafiaGameRepository.getGameInfo(roomId) + override fun connectUser(user: User, roomId: RoomId?, locale: String) { + val gameInfo = connectGame(user, roomId ?: generateRoomId(), locale) - if (gameInfo == null) { - val player = MafiaPlayer(userId, nickname, generateColor(null)) - gameInfo = createGameInfo(roomId, locale, player) - } else { - val player = gameInfo.findPlayer(userId) - if (player != null) { - player.connect() - } else { - gameInfo.room.add(MafiaPlayer(userId, nickname, generateColor(gameInfo))) - } - } - - mafiaGameRepository.saveGameInfo(gameInfo) - mafiaPhaseMessenger.unicastPhase(userId, gameInfo) + mafiaPhaseMessenger.unicastPhase(user.id, gameInfo) mafiaGameMessenger.broadcastPlayerList(gameInfo) } - fun connectSession(user: User, roomId: RoomId, locale: String) { + fun connectGame(user: User, roomId: RoomId, locale: String): MafiaGameInfo { var gameInfo = mafiaGameRepository.getGameInfo(roomId) if (gameInfo == null) { val player = MafiaPlayer(user.id, user.name, generateColor(null)) - - gameInfo = createGameInfo(roomId, locale, player, true) + gameInfo = createGameInfo(roomId, locale, player) } else { - val room = gameInfo.room - - room.add(MafiaPlayer(user.id, user.name, generateColor(gameInfo))) + val player = gameInfo.findPlayer(user.id) + if (player != null) { + player.connect() + } else { + gameInfo.room.add(MafiaPlayer(user.id, user.name, generateColor(gameInfo))) + } } mafiaGameRepository.saveGameInfo(gameInfo) + return gameInfo } override fun disconnectUser(user: User) { @@ -131,6 +122,19 @@ internal class MafiaGameRoomService( return room } + fun generateRoomId(): RoomId { + var value: String + + do { + val charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + value = (1..6) + .map { charset.random() } + .joinToString("") + } while (roomRepository.getRoom(RoomId(value)) != null) + + return RoomId(value) + } + companion object { private val COLOR_LIST = mutableListOf( "FF5D47", diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/UserConnectionUseCase.kt b/core/src/main/kotlin/com/xorker/draw/mafia/UserConnectionUseCase.kt index 2be3ccc3..df34f008 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/UserConnectionUseCase.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/UserConnectionUseCase.kt @@ -1,8 +1,10 @@ package com.xorker.draw.mafia +import com.xorker.draw.room.RoomId import com.xorker.draw.user.User interface UserConnectionUseCase { + fun connectUser(user: User, roomId: RoomId?, locale: String) fun exitUser(user: User) fun disconnectUser(user: User) } diff --git a/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRepository.kt b/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRepository.kt index 6b5dcc00..931753c0 100644 --- a/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRepository.kt +++ b/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRepository.kt @@ -6,7 +6,7 @@ import com.xorker.draw.user.UserId interface MafiaGameRepository { fun saveGameInfo(gameInfo: MafiaGameInfo) fun removeGameInfo(gameInfo: MafiaGameInfo) - fun getGameInfo(roomId: RoomId): MafiaGameInfo? + fun getGameInfo(roomId: RoomId?): MafiaGameInfo? fun getGameInfo(userId: UserId): MafiaGameInfo? fun removePlayer(userId: UserId) } diff --git a/domain/src/main/kotlin/com/xorker/draw/mafia/event/MafiaGameRandomMatchingEvent.kt b/domain/src/main/kotlin/com/xorker/draw/mafia/event/MafiaGameRandomMatchingEvent.kt deleted file mode 100644 index 90767454..00000000 --- a/domain/src/main/kotlin/com/xorker/draw/mafia/event/MafiaGameRandomMatchingEvent.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.xorker.draw.mafia.event - -import com.xorker.draw.user.User - -data class MafiaGameRandomMatchingEvent( - val players: List, - val locale: String, -) From aa7092efd1df4a8893f75f03d51201ec5cac6c49 Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Tue, 17 Sep 2024 19:43:16 +0900 Subject: [PATCH 17/40] =?UTF-8?q?DRAW-353=20fix:=20MDC=20roomId=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../draw/websocket/MainWebSocketHandler.kt | 32 ++++++----- .../draw/websocket/WebSocketController.kt | 5 +- .../xorker/draw/websocket/WebSocketRouter.kt | 2 - .../draw/websocket/log/WebSocketLogger.kt | 54 ++++++++++++------- .../xorker/draw/mafia/MafiaGameRoomService.kt | 7 ++- 5 files changed, 57 insertions(+), 43 deletions(-) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt index 04ce5b4b..9e2034b1 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt @@ -1,6 +1,5 @@ package com.xorker.draw.websocket -import com.xorker.draw.exception.InvalidWebSocketStatusException import com.xorker.draw.exception.XorkerException import com.xorker.draw.mafia.UserConnectionUseCase import com.xorker.draw.support.logging.logger @@ -29,37 +28,36 @@ internal class MainWebSocketHandler( private val logger = logger() override fun afterConnectionEstablished(session: WebSocketSession) { - webSocketLogger.afterConnectionEstablished(session) + webSocketLogger.handshake(session) } override fun handleTextMessage(session: WebSocketSession, message: TextMessage) { val request = requestParser.parse(message.payload) - webSocketLogger.handleRequest(session, request) { s, req -> + webSocketLogger.message(session, request) { try { - router.route(s, req) + router.route(session, request) } catch (ex: XorkerException) { - webSocketExceptionHandler.handleXorkerException(s, req.action, ex) + webSocketExceptionHandler.handleXorkerException(session, request.action, ex) } } } override fun afterConnectionClosed(session: WebSocketSession, status: CloseStatus) { - webSocketLogger.afterConnectionClosed(session, status) + webSocketLogger.connectionClosed(session, status) { + val sessionId = SessionId(session.id) + val sessionDto = sessionManager.unregisterSession(sessionId) ?: return@connectionClosed - val sessionId = SessionId(session.id) - val sessionDto = sessionManager.unregisterSession(sessionId) - ?: return logger.error(InvalidWebSocketStatusException.message, InvalidWebSocketStatusException) + waitingQueueUseCase.remove(sessionDto.user, sessionDto.locale) - waitingQueueUseCase.remove(sessionDto.user, sessionDto.locale) + when (status) { + CloseStatus.NORMAL -> { + userConnectionUseCase.exitUser(sessionDto.user) + } - when (status) { - CloseStatus.NORMAL -> { - userConnectionUseCase.exitUser(sessionDto.user) - } - - else -> { - userConnectionUseCase.disconnectUser(sessionDto.user) + else -> { + userConnectionUseCase.disconnectUser(sessionDto.user) + } } } } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt index 64679c02..7653015a 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt @@ -12,6 +12,7 @@ import com.xorker.draw.websocket.message.request.mafia.MafiaGameRandomMatchingRe import com.xorker.draw.websocket.message.request.mafia.SessionInitializeRequest import com.xorker.draw.websocket.session.SessionFactory import com.xorker.draw.websocket.session.SessionManager +import org.slf4j.MDC import org.springframework.stereotype.Component import org.springframework.web.socket.WebSocketSession @@ -39,9 +40,7 @@ internal class WebSocketController( throw InvalidRequestOtherPlayingException } sessionManager.registerSession(sessionDto) - - // TODO 여기가맞나? - // MDC.put("roomId", roomId.value) + MDC.put("roomId", request.roomId) if (request.roomId == null) { userConnectionUseCase.connectUser(sessionDto.user, null, request.locale) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt index 8d38a76f..0c89aa1a 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt @@ -37,8 +37,6 @@ internal class WebSocketRouter( } val sessionDto = sessionManager.getSession(SessionId(session.id)) ?: throw InvalidRequestValueException - // TODO 방법 찾기 -// MDC.put("roomId", sessionDto.roomId.value) when (request.action) { RequestAction.INIT -> throw UnSupportedException diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt index 445b531b..4f746376 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/log/WebSocketLogger.kt @@ -1,6 +1,7 @@ package com.xorker.draw.websocket.log import com.fasterxml.jackson.databind.ObjectMapper +import com.xorker.draw.mafia.MafiaGameUseCase import com.xorker.draw.support.logging.defaultApiJsonMap import com.xorker.draw.support.logging.logger import com.xorker.draw.support.logging.registerRequestId @@ -18,10 +19,11 @@ import org.springframework.web.socket.WebSocketSession internal class WebSocketLogger( private val sessionManager: SessionManager, private val objectMapper: ObjectMapper, + private val gameUseCase: MafiaGameUseCase, ) { private val logger = logger() - fun afterConnectionEstablished(session: WebSocketSession) { + fun handshake(session: WebSocketSession) { registerRequestId() logger.info( @@ -34,11 +36,12 @@ internal class WebSocketLogger( ) } - fun handleRequest(session: WebSocketSession, request: WebSocketRequest, origin: (WebSocketSession, WebSocketRequest) -> Unit) { + fun message(session: WebSocketSession, request: WebSocketRequest, origin: () -> Unit) { registerRequestId() + setupMdc(SessionId(session.id)) try { - origin(session, request) + origin() } finally { val log = generateLog(SessionId(session.id), request) logger.info(log) @@ -46,6 +49,33 @@ internal class WebSocketLogger( } } + fun connectionClosed(session: WebSocketSession, status: CloseStatus, origin: () -> Unit) { + registerRequestId() + setupMdc(SessionId(session.id)) + + try { + origin() + } finally { + val data = defaultApiJsonMap( + "action" to "WS_CLOSED", + "status" to status, + "sessionId" to session.id, + ) + + injectDefaultSessionInfo(SessionId(session.id), data) + + val log = objectMapper.writeValueAsString(data) + logger.info(log) + MDC.clear() + } + } + + private fun setupMdc(sessionId: SessionId) { + val session = sessionManager.getSession(sessionId) ?: return + val gameInfo = gameUseCase.getGameInfoByUserId(session.user.id) ?: return + MDC.put("roomId", gameInfo.room.id.value) + } + private fun generateLog(sessionId: SessionId, request: WebSocketRequest): String { val body: Any? = if (request.action == RequestAction.INIT) { objectMapper.readValue(request.body, SessionInitializeRequest::class.java).copy(accessToken = "[masked]") @@ -64,27 +94,11 @@ internal class WebSocketLogger( return objectMapper.writeValueAsString(data) } - fun afterConnectionClosed(session: WebSocketSession, status: CloseStatus) { - registerRequestId() - - val data = defaultApiJsonMap( - "action" to "WS_CLOSED", - "status" to status, - "sessionId" to session.id, - ) - - injectDefaultSessionInfo(SessionId(session.id), data) - - val log = objectMapper.writeValueAsString(data) - logger.info(log) - } - private fun injectDefaultSessionInfo(sessionId: SessionId, data: MutableMap) { val sessionDto = sessionManager.getSession(sessionId) if (sessionDto != null) { data["userId"] = sessionDto.user.id.value - // TODO 방법 찾기 - // data["roomId"] = sessionDto.roomId + data["roomId"] = MDC.get("roomId") } } } diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt index 29397c89..220593d6 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt @@ -5,6 +5,7 @@ import com.xorker.draw.room.Room import com.xorker.draw.room.RoomId import com.xorker.draw.room.RoomRepository import com.xorker.draw.user.User +import org.slf4j.MDC import org.springframework.stereotype.Service @Service @@ -16,7 +17,11 @@ internal class MafiaGameRoomService( ) : UserConnectionUseCase { override fun connectUser(user: User, roomId: RoomId?, locale: String) { - val gameInfo = connectGame(user, roomId ?: generateRoomId(), locale) + val roomIdNotNull = roomId ?: generateRoomId() + + MDC.put("roomId", roomIdNotNull.value) + + val gameInfo = connectGame(user, roomIdNotNull, locale) mafiaPhaseMessenger.unicastPhase(user.id, gameInfo) mafiaGameMessenger.broadcastPlayerList(gameInfo) From c96ceef3778e35ef9b7dd03b7c68852f50cad346 Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Thu, 19 Sep 2024 00:49:10 +0900 Subject: [PATCH 18/40] =?UTF-8?q?DRAW-351=20fix:=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/kotlin/com/xorker/draw/mafia/MafiaGameService.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameService.kt b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameService.kt index 8fb6f414..3dc0dfc7 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameService.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameService.kt @@ -61,7 +61,7 @@ internal class MafiaGameService( } override fun voteMafia(user: User, targetUserId: UserId) { - val gameInfo = mafiaGameRepository.getGameInfo(user.id) ?: throw InvalidRequestValueException + val gameInfo = user.getGameInfo() val phase = gameInfo.phase assertIs(phase) @@ -72,7 +72,7 @@ internal class MafiaGameService( } override fun inferAnswer(user: User, answer: String) { - val gameInfo = mafiaGameRepository.getGameInfo(user.id) ?: throw InvalidRequestValueException + val gameInfo = user.getGameInfo() val phase = gameInfo.phase assertIs(phase) From 156891a07e973946287c1e07efc07d44d83031cb Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Thu, 19 Sep 2024 00:52:57 +0900 Subject: [PATCH 19/40] =?UTF-8?q?DRAW-352=20fix:=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../websocket/broker/SimpleSessionMessageBroker.kt | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt index d534e3d2..7ef69292 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt @@ -22,17 +22,7 @@ internal class SimpleSessionMessageBroker( override fun unicast(event: UnicastEvent) { val userId = event.userId - val session = sessionManager.getSession(userId) - - if (session == null) { - val waitingQueueSession = sessionManager.getSession(userId) - - val response = parser.parse(event.message) - - waitingQueueSession?.send(response) - - return - } + val session = sessionManager.getSession(userId) ?: return val response = parser.parse(event.message) From 33fecbcce612204feadc754c34516277f5bf716d Mon Sep 17 00:00:00 2001 From: HoYeon Lee Date: Thu, 19 Sep 2024 19:34:47 +0900 Subject: [PATCH 20/40] =?UTF-8?q?DRAW-353=20fix:=20=EB=B9=A0=EB=A5=B8=20?= =?UTF-8?q?=EB=A7=A4=EC=B9=AD=20=EA=B5=AC=EB=B6=84=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xorker/draw/mafia/MafiaGameRandomMatchingService.kt | 2 +- .../kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt index f43a2323..bd21ca44 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt @@ -46,7 +46,7 @@ internal class MafiaGameRandomMatchingService( val roomId = mafiaGameRoomService.generateRoomId() players.forEach { user -> - mafiaGameRoomService.connectGame(user, roomId, locale) + mafiaGameRoomService.connectGame(user, roomId, locale, true) } mafiaPhaseUseCase.startGame(roomId) diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt index 220593d6..8cfdba5b 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRoomService.kt @@ -21,18 +21,18 @@ internal class MafiaGameRoomService( MDC.put("roomId", roomIdNotNull.value) - val gameInfo = connectGame(user, roomIdNotNull, locale) + val gameInfo = connectGame(user, roomIdNotNull, locale, false) mafiaPhaseMessenger.unicastPhase(user.id, gameInfo) mafiaGameMessenger.broadcastPlayerList(gameInfo) } - fun connectGame(user: User, roomId: RoomId, locale: String): MafiaGameInfo { + fun connectGame(user: User, roomId: RoomId, locale: String, isRandomMatching: Boolean): MafiaGameInfo { var gameInfo = mafiaGameRepository.getGameInfo(roomId) if (gameInfo == null) { val player = MafiaPlayer(user.id, user.name, generateColor(null)) - gameInfo = createGameInfo(roomId, locale, player) + gameInfo = createGameInfo(roomId, locale, player, isRandomMatching) } else { val player = gameInfo.findPlayer(user.id) if (player != null) { @@ -102,7 +102,7 @@ internal class MafiaGameRoomService( .first() } - private fun createGameInfo(roomId: RoomId, locale: String, player: MafiaPlayer, isRandomMatching: Boolean = false): MafiaGameInfo { + private fun createGameInfo(roomId: RoomId, locale: String, player: MafiaPlayer, isRandomMatching: Boolean): MafiaGameInfo { val room = createRoom(roomId, locale, player, isRandomMatching) return MafiaGameInfo( room = room, From 939c650b2d0a39403f9694ebf4fbd7ebe14023c0 Mon Sep 17 00:00:00 2001 From: sunwoong Date: Sun, 22 Sep 2024 16:14:08 +0900 Subject: [PATCH 21/40] =?UTF-8?q?DRAW-287=20chore:=20redis=20=EC=84=B8?= =?UTF-8?q?=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- adapter/redis/build.gradle.kts | 17 ++++++++ .../com/xorker/draw/config/RedisConfig.kt | 43 +++++++++++++++++++ .../src/main/resources/application-redis.yml | 4 ++ 3 files changed, 64 insertions(+) create mode 100644 adapter/redis/build.gradle.kts create mode 100644 adapter/redis/src/main/kotlin/com/xorker/draw/config/RedisConfig.kt create mode 100644 adapter/redis/src/main/resources/application-redis.yml diff --git a/adapter/redis/build.gradle.kts b/adapter/redis/build.gradle.kts new file mode 100644 index 00000000..5285da01 --- /dev/null +++ b/adapter/redis/build.gradle.kts @@ -0,0 +1,17 @@ +import org.springframework.boot.gradle.tasks.bundling.BootJar + +plugins { + kotlin("plugin.spring") +} + +dependencies { + implementation(project(":domain")) + implementation(project(":support:metric")) + + implementation("org.springframework.boot:spring-boot-starter-data-redis:${Versions.SPRING_BOOT}") +} + +tasks { + withType { enabled = true } + withType { enabled = false } +} diff --git a/adapter/redis/src/main/kotlin/com/xorker/draw/config/RedisConfig.kt b/adapter/redis/src/main/kotlin/com/xorker/draw/config/RedisConfig.kt new file mode 100644 index 00000000..8ede2b10 --- /dev/null +++ b/adapter/redis/src/main/kotlin/com/xorker/draw/config/RedisConfig.kt @@ -0,0 +1,43 @@ +package com.xorker.draw.config + +import com.xorker.draw.mafia.RedisMafiaGameInfo +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.data.redis.connection.RedisConnectionFactory +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory +import org.springframework.data.redis.core.RedisTemplate +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer +import org.springframework.data.redis.serializer.StringRedisSerializer + +@Configuration +class RedisConfig { + + @Bean + fun redisConnectionFactory(): RedisConnectionFactory { + return LettuceConnectionFactory() + } + + @Bean + fun redisTemplateWithObject(connectionFactory: RedisConnectionFactory): RedisTemplate { + val template = RedisTemplate() + + template.connectionFactory = connectionFactory + + template.keySerializer = StringRedisSerializer() + template.valueSerializer = Jackson2JsonRedisSerializer(RedisMafiaGameInfo::class.java) + + return template + } + + @Bean + fun redisTemplate(connectionFactory: RedisConnectionFactory): RedisTemplate { + val template = RedisTemplate() + + template.connectionFactory = connectionFactory + + template.keySerializer = StringRedisSerializer() + template.valueSerializer = StringRedisSerializer() + + return template + } +} diff --git a/adapter/redis/src/main/resources/application-redis.yml b/adapter/redis/src/main/resources/application-redis.yml new file mode 100644 index 00000000..226ca828 --- /dev/null +++ b/adapter/redis/src/main/resources/application-redis.yml @@ -0,0 +1,4 @@ +spring: + data: + redis: + port: 6379 From ce15502a11bf5991926a85c2a521856f08892e3f Mon Sep 17 00:00:00 2001 From: sunwoong Date: Sun, 22 Sep 2024 16:15:33 +0900 Subject: [PATCH 22/40] =?UTF-8?q?DRAW-287=20feat:=20job=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=EC=86=8C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xorker/draw/timer/TimerAdapter.kt | 34 ++++++++++++------- .../com/xorker/draw/timer/TimerRepository.kt | 8 +++-- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/adapter/memory/src/main/kotlin/com/xorker/draw/timer/TimerAdapter.kt b/adapter/memory/src/main/kotlin/com/xorker/draw/timer/TimerAdapter.kt index bd15d878..4af83ec2 100644 --- a/adapter/memory/src/main/kotlin/com/xorker/draw/timer/TimerAdapter.kt +++ b/adapter/memory/src/main/kotlin/com/xorker/draw/timer/TimerAdapter.kt @@ -1,34 +1,42 @@ package com.xorker.draw.timer import com.xorker.draw.mafia.event.JobWithStartTime +import com.xorker.draw.room.RoomId import java.time.Duration +import java.time.LocalDateTime +import java.util.concurrent.ConcurrentHashMap import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import org.springframework.context.ApplicationEventPublisher import org.springframework.stereotype.Component @Component -internal class TimerAdapter( - private val eventPublisher: ApplicationEventPublisher, -) : TimerRepository { +internal class TimerAdapter : TimerRepository { + private val jobs = ConcurrentHashMap() - override fun startTimer(interval: Duration, event: T): JobWithStartTime { + override fun startTimer(roomId: RoomId, interval: Duration, callback: () -> Unit): JobWithStartTime { val job = JobWithStartTime() - CoroutineScope(Dispatchers.IO + job).launch { - delay(interval.toMillis()) - eventPublisher.publishEvent(event) - } - return job - } - override fun startTimer(interval: Duration, callback: () -> Unit): JobWithStartTime { - val job = JobWithStartTime() + saveJob(roomId, job) + CoroutineScope(Dispatchers.IO + job).launch { delay(interval.toMillis()) callback.invoke() } return job } + + override fun cancelTimer(roomId: RoomId) { + jobs[roomId]?.cancel() + jobs.remove(roomId) + } + + override fun getTimerStartTime(roomId: RoomId): LocalDateTime? { + return jobs[roomId]?.startTime + } + + private fun saveJob(roomId: RoomId, job: JobWithStartTime) { + jobs[roomId] = job + } } diff --git a/domain/src/main/kotlin/com/xorker/draw/timer/TimerRepository.kt b/domain/src/main/kotlin/com/xorker/draw/timer/TimerRepository.kt index f0355b78..040c2dc6 100644 --- a/domain/src/main/kotlin/com/xorker/draw/timer/TimerRepository.kt +++ b/domain/src/main/kotlin/com/xorker/draw/timer/TimerRepository.kt @@ -1,10 +1,12 @@ package com.xorker.draw.timer import com.xorker.draw.mafia.event.JobWithStartTime +import com.xorker.draw.room.RoomId import java.time.Duration +import java.time.LocalDateTime interface TimerRepository { - fun startTimer(interval: Duration, event: T): JobWithStartTime - - fun startTimer(interval: Duration, callback: () -> Unit): JobWithStartTime + fun startTimer(roomId: RoomId, interval: Duration, callback: () -> Unit): JobWithStartTime + fun cancelTimer(roomId: RoomId) + fun getTimerStartTime(roomId: RoomId): LocalDateTime? } From d27d6a61fe3233de8ffc148a281034d14d296d79 Mon Sep 17 00:00:00 2001 From: sunwoong Date: Sun, 22 Sep 2024 16:19:01 +0900 Subject: [PATCH 23/40] =?UTF-8?q?DRAW-287=20refactor:=20timer=20repository?= =?UTF-8?q?=20=EC=9D=98=EC=A1=B4=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/response/MafiaGameMessengerImpl.kt | 4 +++- .../message/response/MafiaPhaseMessengerImpl.kt | 14 ++++++++------ .../draw/mafia/phase/MafiaPhaseEndGameProcessor.kt | 14 ++++++++------ .../mafia/phase/MafiaPhaseInferAnswerProcessor.kt | 9 +++++++-- .../mafia/phase/MafiaPhasePlayGameProcessor.kt | 9 ++++++--- .../mafia/phase/MafiaPhasePlayVoteProcessor.kt | 10 ++++++++-- .../mafia/phase/MafiaPhaseStartGameProcessor.kt | 8 ++++++-- 7 files changed, 46 insertions(+), 22 deletions(-) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaGameMessengerImpl.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaGameMessengerImpl.kt index eb7dbc7f..87e9fadc 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaGameMessengerImpl.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaGameMessengerImpl.kt @@ -7,6 +7,7 @@ import com.xorker.draw.mafia.MafiaPhaseWithTurnList import com.xorker.draw.mafia.MafiaReactionType import com.xorker.draw.mafia.assertIs import com.xorker.draw.room.RoomId +import com.xorker.draw.timer.TimerRepository import com.xorker.draw.user.UserId import com.xorker.draw.websocket.broker.WebSocketBroadcaster import com.xorker.draw.websocket.message.response.dto.game.MafiaGameAnswerBody @@ -28,6 +29,7 @@ import org.springframework.stereotype.Component @Component internal class MafiaGameMessengerImpl( private val broadcaster: WebSocketBroadcaster, + private val timerRepository: TimerRepository, ) : MafiaGameMessenger { override fun broadcastPlayerList(gameInfo: MafiaGameInfo) { @@ -66,7 +68,7 @@ internal class MafiaGameMessengerImpl( val body = MafiaGameTurnInfoBody( phase.round, phase.turn, - phase.job.startTime, + timerRepository.getTimerStartTime(roomId)!!, phase.turnList[phase.turn].userId, phase.drawData.map { it.second }, ) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaPhaseMessengerImpl.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaPhaseMessengerImpl.kt index 8fbddc24..687bb7ac 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaPhaseMessengerImpl.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaPhaseMessengerImpl.kt @@ -7,6 +7,7 @@ import com.xorker.draw.mafia.MafiaPhase import com.xorker.draw.mafia.MafiaPhaseMessenger import com.xorker.draw.mafia.MafiaPlayer import com.xorker.draw.room.RoomId +import com.xorker.draw.timer.TimerRepository import com.xorker.draw.user.UserId import com.xorker.draw.websocket.SessionMessage import com.xorker.draw.websocket.broker.WebSocketBroadcaster @@ -31,6 +32,7 @@ import org.springframework.stereotype.Component @Component internal class MafiaPhaseMessengerImpl( private val broadcaster: WebSocketBroadcaster, + private val timerRepository: TimerRepository, ) : MafiaPhaseMessenger { override fun unicastPhase(userId: UserId, gameInfo: MafiaGameInfo) { @@ -45,7 +47,7 @@ internal class MafiaPhaseMessengerImpl( private fun MafiaGameInfo.generateMessage(isOrigin: Boolean = true): SessionMessage { return when (val phase = this.phase) { - is MafiaPhase.Wait -> MafiaPhaseWaitMessage( + MafiaPhase.Wait -> MafiaPhaseWaitMessage( MafiaPhaseWaitBody( room.id, room.players.map { it.toResponse(room.owner) }.toList(), @@ -55,7 +57,7 @@ internal class MafiaPhaseMessengerImpl( is MafiaPhase.Ready -> MafiaPhaseReadyMessage( MafiaPhaseReadyBody( - startTime = phase.job.startTime, + startTime = timerRepository.getTimerStartTime(room.id)!!, mafiaGameInfo = generateMafiaGameInfoMessage( roomId = room.id, isRandomMatching = room.isRandomMatching, @@ -71,7 +73,7 @@ internal class MafiaPhaseMessengerImpl( MafiaPhasePlayingBody( round = phase.round, turn = phase.turn, - startTurnTime = phase.job.startTime, + startTurnTime = timerRepository.getTimerStartTime(room.id)!!, draw = phase.getDraw(), currentDraw = phase.getCurrentDraw(), mafiaGameInfo = generateMafiaGameInfoMessage( @@ -87,7 +89,7 @@ internal class MafiaPhaseMessengerImpl( is MafiaPhase.Vote -> MafiaPhaseVoteMessage( MafiaPhaseVoteBody( - startTime = phase.job.startTime, + startTime = timerRepository.getTimerStartTime(room.id)!!, mafiaGameInfo = if (isOrigin.not()) { generateMafiaGameInfoMessage( roomId = room.id, @@ -107,7 +109,7 @@ internal class MafiaPhaseMessengerImpl( is MafiaPhase.InferAnswer -> MafiaPhaseInferAnswerMessage( MafiaPhaseInferAnswerBody( - startTime = phase.job.startTime, + startTime = timerRepository.getTimerStartTime(room.id)!!, mafiaGameInfo = if (isOrigin.not()) { generateMafiaGameInfoMessage( roomId = room.id, @@ -127,7 +129,7 @@ internal class MafiaPhaseMessengerImpl( is MafiaPhase.End -> MafiaPhaseEndMessage( MafiaPhaseEndBody( - startTime = phase.job.startTime, + startTime = timerRepository.getTimerStartTime(room.id)!!, mafiaGameInfo = if (isOrigin.not()) { generateMafiaGameInfoMessage( roomId = room.id, diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseEndGameProcessor.kt b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseEndGameProcessor.kt index 81065ca0..8727a414 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseEndGameProcessor.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseEndGameProcessor.kt @@ -8,7 +8,6 @@ import com.xorker.draw.mafia.MafiaGameResultRepository import com.xorker.draw.mafia.MafiaPhase import com.xorker.draw.mafia.MafiaPhaseMessenger import com.xorker.draw.mafia.assertIs -import com.xorker.draw.mafia.event.JobWithStartTime import com.xorker.draw.timer.TimerRepository import org.springframework.stereotype.Component @@ -26,29 +25,32 @@ internal class MafiaPhaseEndGameProcessor( val gameOption = gameInfo.gameOption - val job = timerRepository.startTimer(gameOption.endTime) { + val room = gameInfo.room + timerRepository.startTimer(room.id, gameOption.endTime) { processEndGame(gameInfo) } - val endPhase = assertAndGetEndPhase(job, phase) + val endPhase = assertAndGetEndPhase(phase) judgeGameResult(endPhase) gameInfo.phase = endPhase + mafiaGameRepository.saveGameInfo(gameInfo) + mafiaGameResultRepository.saveMafiaGameResult(gameInfo) return endPhase } - private fun assertAndGetEndPhase(job: JobWithStartTime, phase: MafiaPhase): MafiaPhase.End { + private fun assertAndGetEndPhase(phase: MafiaPhase): MafiaPhase.End { return when (phase) { is MafiaPhase.Vote -> { - phase.toEnd(job) + phase.toEnd() } is MafiaPhase.InferAnswer -> { - phase.toEnd(job) + phase.toEnd() } else -> { diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseInferAnswerProcessor.kt b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseInferAnswerProcessor.kt index 9963983d..1e2b40dd 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseInferAnswerProcessor.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseInferAnswerProcessor.kt @@ -1,6 +1,7 @@ package com.xorker.draw.mafia.phase import com.xorker.draw.mafia.MafiaGameInfo +import com.xorker.draw.mafia.MafiaGameRepository import com.xorker.draw.mafia.MafiaPhase import com.xorker.draw.mafia.assertIs import com.xorker.draw.timer.TimerRepository @@ -9,6 +10,7 @@ import org.springframework.stereotype.Component @Component internal class MafiaPhaseInferAnswerProcessor( private val timerRepository: TimerRepository, + private val mafiaGameRepository: MafiaGameRepository, ) { internal fun playInferAnswer(gameInfo: MafiaGameInfo, nextStep: () -> Unit): MafiaPhase.InferAnswer { @@ -17,13 +19,16 @@ internal class MafiaPhaseInferAnswerProcessor( val gameOption = gameInfo.gameOption - val job = timerRepository.startTimer(gameOption.answerTime) { + val room = gameInfo.room + timerRepository.startTimer(room.id, gameOption.answerTime) { processInferAnswer(gameInfo, nextStep) } - val inferAnswerPhase = phase.toInferAnswer(job) + val inferAnswerPhase = phase.toInferAnswer() gameInfo.phase = inferAnswerPhase + mafiaGameRepository.saveGameInfo(gameInfo) + return inferAnswerPhase } diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhasePlayGameProcessor.kt b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhasePlayGameProcessor.kt index d67a462c..b47ec025 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhasePlayGameProcessor.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhasePlayGameProcessor.kt @@ -25,13 +25,16 @@ internal class MafiaPhasePlayGameProcessor( time = time.plus(gameOption.introAnimationTime) time = time.plus(gameOption.roundAnimationTime) - val job = timerRepository.startTimer(time) { + val room = gameInfo.room + timerRepository.startTimer(room.id, time) { processNextTurn(gameInfo, nextStep) } - val playingPhase = phase.toPlaying(job) + val playingPhase = phase.toPlaying() gameInfo.phase = playingPhase + mafiaGameRepository.saveGameInfo(gameInfo) + return playingPhase } @@ -58,7 +61,7 @@ internal class MafiaPhasePlayGameProcessor( gameOption.turnTime } - phase.job = timerRepository.startTimer(time) { + timerRepository.startTimer(room.id, time) { processNextTurn(gameInfo, nextStep) } diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhasePlayVoteProcessor.kt b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhasePlayVoteProcessor.kt index 2ecf4c00..14f1bfe2 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhasePlayVoteProcessor.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhasePlayVoteProcessor.kt @@ -1,6 +1,7 @@ package com.xorker.draw.mafia.phase import com.xorker.draw.mafia.MafiaGameInfo +import com.xorker.draw.mafia.MafiaGameRepository import com.xorker.draw.mafia.MafiaPhase import com.xorker.draw.mafia.assertIs import com.xorker.draw.timer.TimerRepository @@ -12,6 +13,7 @@ import kotlin.math.max @Component internal class MafiaPhasePlayVoteProcessor( private val timerRepository: TimerRepository, + private val mafiaGameRepository: MafiaGameRepository, ) { internal fun playVote(gameInfo: MafiaGameInfo, winStep: () -> Unit, loseStep: () -> Unit): MafiaPhase.Vote { @@ -20,17 +22,21 @@ internal class MafiaPhasePlayVoteProcessor( val gameOption = gameInfo.gameOption - val job = timerRepository.startTimer(gameOption.voteTime) { + val room = gameInfo.room + timerRepository.startTimer(room.id, gameOption.voteTime) { processVote(gameInfo, winStep, loseStep) } - val votePhase = phase.toVote(job) + val votePhase = phase.toVote() gameInfo.phase = votePhase + mafiaGameRepository.saveGameInfo(gameInfo) + return votePhase } private fun processVote(gameInfo: MafiaGameInfo, winStep: () -> Unit, loseStep: () -> Unit) { + println("process vote") val phase = gameInfo.phase assertIs(phase) diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseStartGameProcessor.kt b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseStartGameProcessor.kt index 1dcade8b..f5a3b6ed 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseStartGameProcessor.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseStartGameProcessor.kt @@ -1,6 +1,7 @@ package com.xorker.draw.mafia.phase import com.xorker.draw.mafia.MafiaGameInfo +import com.xorker.draw.mafia.MafiaGameRepository import com.xorker.draw.mafia.MafiaKeywordRepository import com.xorker.draw.mafia.MafiaPhase import com.xorker.draw.timer.TimerRepository @@ -11,6 +12,7 @@ import kotlin.random.Random internal class MafiaPhaseStartGameProcessor( private val mafiaKeywordRepository: MafiaKeywordRepository, private val timerRepository: TimerRepository, + private val mafiaGameRepository: MafiaGameRepository, ) { private val random: Random = Random(System.currentTimeMillis()) @@ -24,16 +26,18 @@ internal class MafiaPhaseStartGameProcessor( val mafiaIndex = random.nextInt(0, players.size) val keyword = mafiaKeywordRepository.getRandomKeyword(room.locale) - val job = timerRepository.startTimer(gameOption.readyTime, nextStep) + timerRepository.startTimer(room.id, gameOption.readyTime, nextStep) val phase = MafiaPhase.Ready( - job = job, + jobKey = room.id, turnList = turnList, mafiaPlayer = players[mafiaIndex], keyword = keyword, ) gameInfo.phase = phase + mafiaGameRepository.saveGameInfo(gameInfo) + return phase } } From 3abeb8fe4c221deb047e1c9e37808b1c21b93fbe Mon Sep 17 00:00:00 2001 From: sunwoong Date: Sun, 22 Sep 2024 16:20:20 +0900 Subject: [PATCH 24/40] =?UTF-8?q?DRAW-287=20refactor:=20job=20key=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xorker/draw/mafia/MafiaGameInfo.kt | 2 +- .../com/xorker/draw/mafia/MafiaPhase.kt | 48 +++++++++---------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameInfo.kt b/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameInfo.kt index f0aecd2b..eb962235 100644 --- a/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameInfo.kt +++ b/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameInfo.kt @@ -3,7 +3,7 @@ package com.xorker.draw.mafia import com.xorker.draw.room.Room import com.xorker.draw.user.UserId -class MafiaGameInfo( +data class MafiaGameInfo( val room: Room, var phase: MafiaPhase, val gameOption: MafiaGameOption, diff --git a/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaPhase.kt b/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaPhase.kt index 5ab20eba..33a27870 100644 --- a/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaPhase.kt +++ b/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaPhase.kt @@ -1,8 +1,8 @@ package com.xorker.draw.mafia import com.xorker.draw.exception.InvalidMafiaPhaseException -import com.xorker.draw.mafia.event.JobWithStartTime import com.xorker.draw.mafia.turn.TurnInfo +import com.xorker.draw.room.RoomId import com.xorker.draw.user.UserId import java.util.Vector import kotlin.contracts.ExperimentalContracts @@ -13,29 +13,29 @@ sealed class MafiaPhase { data object Wait : MafiaPhase() data class Ready( - override val job: JobWithStartTime, + override val jobKey: RoomId, override val turnList: List, val mafiaPlayer: MafiaPlayer, val keyword: MafiaKeyword, ) : MafiaPhase(), MafiaPhaseWithTurnList, MafiaPhaseWithTimer { - fun toPlaying(job: JobWithStartTime): Playing { + fun toPlaying(): Playing { return Playing( + jobKey = jobKey, turnList = turnList, mafiaPlayer = mafiaPlayer, keyword = keyword, drawData = mutableListOf(), - job = job, ) } } class Playing( + override val jobKey: RoomId, override val turnList: List, val mafiaPlayer: MafiaPlayer, val keyword: MafiaKeyword, var turnInfo: TurnInfo = TurnInfo(), val drawData: MutableList>>, - override var job: JobWithStartTime, ) : MafiaPhase(), MafiaPhaseWithTurnList, TurnInfo, MafiaPhaseWithTimer { override val round: Int get() = turnInfo.round @@ -43,13 +43,13 @@ sealed class MafiaPhase { override val turn: Int get() = turnInfo.turn - fun toVote(job: JobWithStartTime): Vote { + fun toVote(): Vote { val players = mutableMapOf>() turnList.forEach { player -> players[player.userId] = Vector() } return Vote( - job = job, + jobKey = jobKey, mafiaPlayer = mafiaPlayer, keyword = keyword, drawData = drawData, @@ -89,65 +89,65 @@ sealed class MafiaPhase { } data class Vote( - override val job: JobWithStartTime, + override val jobKey: RoomId, + override val turnList: List, val mafiaPlayer: MafiaPlayer, val keyword: MafiaKeyword, val drawData: MutableList>>, val players: Map>, - override val turnList: List, ) : MafiaPhase(), MafiaPhaseWithTurnList, MafiaPhaseWithTimer { - fun toInferAnswer(job: JobWithStartTime): InferAnswer { + fun toInferAnswer(): InferAnswer { return InferAnswer( - job = job, + jobKey = jobKey, + turnList = turnList, mafiaPlayer = mafiaPlayer, keyword = keyword, drawData = drawData, - turnList = turnList, ) } - fun toEnd(job: JobWithStartTime): End { + fun toEnd(): End { return End( - job = job, + jobKey = jobKey, + turnList = turnList, mafiaPlayer = mafiaPlayer, keyword = keyword, drawData = drawData, showAnswer = false, - turnList = turnList, ) } } class InferAnswer( - override val job: JobWithStartTime, + override val jobKey: RoomId, + override val turnList: List, val mafiaPlayer: MafiaPlayer, val keyword: MafiaKeyword, val drawData: MutableList>>, var answer: String? = null, - override val turnList: List, ) : MafiaPhase(), MafiaPhaseWithTurnList, MafiaPhaseWithTimer { - fun toEnd(job: JobWithStartTime): End { + fun toEnd(): End { return End( - job = job, + jobKey = jobKey, + turnList = turnList, mafiaPlayer = mafiaPlayer, keyword = keyword, drawData = drawData, answer = answer, - turnList = turnList, ) } } class End( - val job: JobWithStartTime, + override val jobKey: RoomId, + override val turnList: List, val mafiaPlayer: MafiaPlayer, val keyword: MafiaKeyword, val drawData: MutableList>>, val showAnswer: Boolean = true, var answer: String? = null, var isMafiaWin: Boolean = false, - override val turnList: List, - ) : MafiaPhase(), MafiaPhaseWithTurnList + ) : MafiaPhase(), MafiaPhaseWithTurnList, MafiaPhaseWithTimer } interface MafiaPhaseWithTurnList { @@ -162,7 +162,7 @@ interface MafiaPhaseWithTurnList { } interface MafiaPhaseWithTimer { - val job: JobWithStartTime + val jobKey: RoomId } @OptIn(ExperimentalContracts::class) From c46fdf5eaac8130a7c53475616f79df883c76a8c Mon Sep 17 00:00:00 2001 From: sunwoong Date: Sun, 22 Sep 2024 16:20:35 +0900 Subject: [PATCH 25/40] =?UTF-8?q?DRAW-287=20chore:=20redis=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- settings.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/settings.gradle.kts b/settings.gradle.kts index 788ce429..30d7507a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,6 +3,7 @@ include( "adapter:memory", "adapter:oauth", "adapter:rdb", + "adapter:redis", "app:api", "app:support:auth", "app:support:exception", From b1ff41ed3fc94eaead0a71ca9433edd24f42fb4c Mon Sep 17 00:00:00 2001 From: sunwoong Date: Sun, 22 Sep 2024 21:48:01 +0900 Subject: [PATCH 26/40] =?UTF-8?q?DRAW-287=20chore:=20core=20=EB=AA=A8?= =?UTF-8?q?=EB=93=88=20redis=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/build.gradle.kts | 1 + .../main/kotlin/com/xorker/draw/mafia/MafiaGameService.kt | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index c305b6d6..7b1b1a83 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -9,6 +9,7 @@ dependencies { implementation(project(":adapter:memory")) implementation(project(":adapter:oauth")) implementation(project(":adapter:rdb")) + implementation(project(":adapter:redis")) implementation(project(":support:jwt")) implementation(project(":support:time")) diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameService.kt b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameService.kt index d9fa121b..356ae0a8 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameService.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameService.kt @@ -7,6 +7,7 @@ import com.xorker.draw.mafia.phase.MafiaPhaseInferAnswerProcessor import com.xorker.draw.mafia.phase.MafiaPhasePlayGameProcessor import com.xorker.draw.mafia.phase.MafiaPhaseService import com.xorker.draw.room.RoomId +import com.xorker.draw.timer.TimerRepository import com.xorker.draw.user.User import com.xorker.draw.user.UserId import com.xorker.draw.websocket.Session @@ -22,6 +23,7 @@ internal class MafiaGameService( private val mafiaPhaseInferAnswerProcessor: MafiaPhaseInferAnswerProcessor, private val mafiaGameRepository: MafiaGameRepository, private val mafiaGameMessenger: MafiaGameMessenger, + private val timerRepository: TimerRepository, ) : MafiaGameUseCase { override fun getGameInfo(userId: UserId): MafiaGameInfo? { @@ -54,7 +56,7 @@ internal class MafiaGameService( val phase = gameInfo.phase assertTurn(phase, session.user.id) - phase.job.cancel() + timerRepository.cancelTimer(phase.jobKey) mafiaPhasePlayGameProcessor.processNextTurn(gameInfo) { mafiaPhaseService.vote(gameInfo.room.id) @@ -95,8 +97,7 @@ internal class MafiaGameService( phase.answer = answer - val job = phase.job - job.cancel() + timerRepository.cancelTimer(phase.jobKey) mafiaPhaseInferAnswerProcessor.processInferAnswer(gameInfo) { mafiaPhaseService.endGame(gameInfo.room.id) From 9150e09c37d0ddc20fd6830c45c255b3955b5869 Mon Sep 17 00:00:00 2001 From: sunwoong Date: Sun, 22 Sep 2024 21:48:38 +0900 Subject: [PATCH 27/40] =?UTF-8?q?DRAW-287=20feat:=20=EB=A7=88=ED=94=BC?= =?UTF-8?q?=EC=95=84=20=EA=B2=8C=EC=9E=84=20=EB=A0=88=EB=94=94=EC=8A=A4=20?= =?UTF-8?q?adapter=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xorker/draw/mafia/MafiaGameAdapter.kt | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 adapter/redis/src/main/kotlin/com/xorker/draw/mafia/MafiaGameAdapter.kt diff --git a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/MafiaGameAdapter.kt b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/MafiaGameAdapter.kt new file mode 100644 index 00000000..4d5c1d72 --- /dev/null +++ b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/MafiaGameAdapter.kt @@ -0,0 +1,95 @@ +package com.xorker.draw.mafia + +import com.xorker.draw.room.Room +import com.xorker.draw.room.RoomId +import com.xorker.draw.room.RoomRepository +import com.xorker.draw.support.metric.MetricManager +import com.xorker.draw.timer.TimerRepository +import com.xorker.draw.user.UserId +import org.springframework.data.redis.core.RedisTemplate +import org.springframework.stereotype.Component + +@Component +internal class MafiaGameAdapter( + private val metricManager: MetricManager, + private val redisTemplateWithObject: RedisTemplate, + private val redisTemplate: RedisTemplate, + private val timerRepository: TimerRepository, +) : MafiaGameRepository, RoomRepository { + + override fun saveGameInfo(gameInfo: MafiaGameInfo) { + val room = gameInfo.room + if (room.isEmpty()) { + removeGameInfo(gameInfo) + } else { + val findGameInfo = redisTemplateWithObject + .opsForValue() + .get(room.id.value) + + if (findGameInfo == null) { + metricManager.increaseGameCount() + } + + redisTemplateWithObject + .opsForValue() + .set(room.id.value, gameInfo.toRedisMafiaGameInfo()) + + room.players.forEach { + redisTemplate + .opsForValue() + .set(it.userId.value.toString(), room.id.value) + } + } + } + + override fun removeGameInfo(gameInfo: MafiaGameInfo) { + metricManager.decreaseGameCount() + + val room = gameInfo.room + + room.players + .map { it.userId } + .forEach { removePlayer(it) } + + val phase = gameInfo.phase + if (phase is MafiaPhaseWithTimer) { + timerRepository.cancelTimer(room.id) + } + + redisTemplateWithObject.delete(room.id.value) + } + + override fun getGameInfo(roomId: RoomId): MafiaGameInfo? { + val gameInfo = redisTemplateWithObject + .opsForValue() + .get(roomId.value) + ?.toMafiaGameInfo() + println("Game info: $gameInfo") + return gameInfo + } + + override fun getGameInfo(userId: UserId): MafiaGameInfo? { + val roomId = redisTemplate + .opsForValue() + .get(userId.value.toString()) ?: return null + + val gameInfo = redisTemplateWithObject + .opsForValue() + .get(roomId) + ?.toMafiaGameInfo() + println("Game info: $gameInfo") + return gameInfo + } + + override fun removePlayer(userId: UserId) { + redisTemplate.delete(userId.value.toString()) + } + + override fun getRoom(roomId: RoomId): Room? { + return redisTemplateWithObject + .opsForValue() + .get(roomId.value) + ?.toMafiaGameInfo() + ?.room + } +} From f779021dc2ca2506d850911dc878692d0edfeb8b Mon Sep 17 00:00:00 2001 From: sunwoong Date: Sun, 22 Sep 2024 21:48:59 +0900 Subject: [PATCH 28/40] =?UTF-8?q?DRAW-287=20feat:=20=EB=A0=88=EB=94=94?= =?UTF-8?q?=EC=8A=A4=20=EB=A7=88=ED=94=BC=EC=95=84=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A0=80=EC=9E=A5=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xorker/draw/mafia/RedisMafiaGameInfo.kt | 387 ++++++++++++++++++ 1 file changed, 387 insertions(+) create mode 100644 adapter/redis/src/main/kotlin/com/xorker/draw/mafia/RedisMafiaGameInfo.kt diff --git a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/RedisMafiaGameInfo.kt b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/RedisMafiaGameInfo.kt new file mode 100644 index 00000000..63db6147 --- /dev/null +++ b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/RedisMafiaGameInfo.kt @@ -0,0 +1,387 @@ +package com.xorker.draw.mafia + +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty +import com.xorker.draw.mafia.turn.TurnInfo +import com.xorker.draw.room.Room +import com.xorker.draw.room.RoomId +import com.xorker.draw.user.UserId +import java.time.Duration +import java.util.* + +data class RedisMafiaGameInfo @JsonCreator constructor( + @JsonProperty("room") val room: RedisRoom, + @JsonProperty("phase") val phase: RedisMafiaPhase, + @JsonProperty("gameOption") val gameOption: RedisGameOption, +) { + fun toMafiaGameInfo(): MafiaGameInfo = MafiaGameInfo( + room = room.toRoom(), + phase = phase.toMafiaPhase(), + gameOption = gameOption.toGameOption(), + ) +} + +data class RedisRoom @JsonCreator constructor( + @JsonProperty("id") val id: String, + @JsonProperty("locale") val locale: String, + @JsonProperty("owner") val owner: RedisMafiaPlayer, + @JsonProperty("maxMemberNum") val maxMemberNum: Int, + @JsonProperty("players") val players: List, + @JsonProperty("randomMatching") val isRandomMatching: Boolean, +) + +data class RedisMafiaPlayer @JsonCreator constructor( + @JsonProperty("id") val id: Long, + @JsonProperty("nickname") val nickname: String, + @JsonProperty("color") val color: String, + @JsonProperty("connect") val isConnect: Boolean, +) + +data class RedisGameOption @JsonCreator constructor( + @JsonProperty("minimum") val minimum: Int, + @JsonProperty("maximum") val maximum: Int, + @JsonProperty("readyTime") val readyTime: Long, + @JsonProperty("introAnimationTime") val introAnimationTime: Long, + @JsonProperty("roundAnimationTime") val roundAnimationTime: Long, + @JsonProperty("round") val round: Int, + @JsonProperty("turnTime") val turnTime: Long, + @JsonProperty("turnCount") val turnCount: Int, + @JsonProperty("voteTime") val voteTime: Long, + @JsonProperty("answerTime") val answerTime: Long, + @JsonProperty("endTime") val endTime: Long, +) + +data class RedisMafiaPhase @JsonCreator constructor( + @JsonProperty("status") val status: String, + @JsonProperty("jobKey") val jobKey: String? = null, + @JsonProperty("turnList") val turnList: List? = null, + @JsonProperty("mafiaPlayer") val mafiaPlayer: RedisMafiaPlayer? = null, + @JsonProperty("keyword") val keyword: RedisMafiaKeyword? = null, + @JsonProperty("drawData") val drawData: List>>? = null, + @JsonProperty("players") val players: Map>? = null, + @JsonProperty("round") val round: Int? = null, + @JsonProperty("turn") val turn: Int? = null, + @JsonProperty("answer") val answer: String? = null, + @JsonProperty("showAnswer") val showAnswer: Boolean? = null, + @JsonProperty("mafiaWin") val isMafiaWin: Boolean? = null, +) + +data class RedisMafiaKeyword @JsonCreator constructor( + @JsonProperty("category") val category: String, + @JsonProperty("answer") val answer: String, +) + +fun MafiaGameInfo.toRedisMafiaGameInfo(): RedisMafiaGameInfo = RedisMafiaGameInfo( + room = RedisRoom( + id = room.id.value, + locale = room.locale, + owner = RedisMafiaPlayer( + id = room.owner.userId.value, + nickname = room.owner.nickname, + color = room.owner.color, + isConnect = room.owner.isConnect(), + ), + maxMemberNum = room.maxMemberNum, + players = room.players.map { player -> + RedisMafiaPlayer( + id = player.userId.value, + nickname = player.nickname, + color = player.color, + isConnect = player.isConnect(), + ) + }, + isRandomMatching = room.isRandomMatching, + ), + phase = phase.toRedisMafiaPhase(), + gameOption = RedisGameOption( + minimum = gameOption.minimum, + maximum = gameOption.maximum, + readyTime = gameOption.readyTime.toMillis(), + introAnimationTime = gameOption.introAnimationTime.toMillis(), + roundAnimationTime = gameOption.roundAnimationTime.toMillis(), + round = gameOption.round, + turnTime = gameOption.turnTime.toMillis(), + turnCount = gameOption.turnCount, + voteTime = gameOption.voteTime.toMillis(), + answerTime = gameOption.answerTime.toMillis(), + endTime = gameOption.endTime.toMillis(), + ), +) + +fun MafiaPhase.toRedisMafiaPhase(): RedisMafiaPhase { + return when (this) { + is MafiaPhase.Wait -> RedisMafiaPhase( + status = "wait", + ) + + is MafiaPhase.Ready -> RedisMafiaPhase( + status = "ready", + jobKey = jobKey.toString(), + turnList = turnList.map { player -> + RedisMafiaPlayer( + id = player.userId.value, + nickname = player.nickname, + color = player.color, + isConnect = player.isConnect(), + ) + }, + mafiaPlayer = RedisMafiaPlayer( + id = mafiaPlayer.userId.value, + nickname = mafiaPlayer.nickname, + color = mafiaPlayer.color, + isConnect = mafiaPlayer.isConnect(), + ), + keyword = RedisMafiaKeyword( + answer = keyword.answer, + category = keyword.category, + ), + ) + + is MafiaPhase.Playing -> RedisMafiaPhase( + status = "playing", + jobKey = jobKey.toString(), + turnList = turnList.map { player -> + RedisMafiaPlayer( + id = player.userId.value, + nickname = player.nickname, + color = player.color, + isConnect = player.isConnect(), + ) + }, + mafiaPlayer = RedisMafiaPlayer( + id = mafiaPlayer.userId.value, + nickname = mafiaPlayer.nickname, + color = mafiaPlayer.color, + isConnect = mafiaPlayer.isConnect(), + ), + keyword = RedisMafiaKeyword( + answer = keyword.answer, + category = keyword.category, + ), + drawData = drawData.map { pair -> + Pair(pair.first.value, pair.second) + }, + round = turnInfo.round, + turn = turnInfo.turn, + ) + + is MafiaPhase.Vote -> RedisMafiaPhase( + status = "vote", + jobKey = jobKey.toString(), + turnList = turnList.map { player -> + RedisMafiaPlayer( + id = player.userId.value, + nickname = player.nickname, + color = player.color, + isConnect = player.isConnect(), + ) + }, + mafiaPlayer = RedisMafiaPlayer( + id = mafiaPlayer.userId.value, + nickname = mafiaPlayer.nickname, + color = mafiaPlayer.color, + isConnect = mafiaPlayer.isConnect(), + ), + keyword = RedisMafiaKeyword( + answer = keyword.answer, + category = keyword.category, + ), + drawData = drawData.map { pair -> + Pair(pair.first.value, pair.second) + }, + players = serializePlayers(this.players), + ) + + is MafiaPhase.InferAnswer -> RedisMafiaPhase( + status = "inferAnswer", + jobKey = jobKey.toString(), + turnList = turnList.map { player -> + RedisMafiaPlayer( + id = player.userId.value, + nickname = player.nickname, + color = player.color, + isConnect = player.isConnect(), + ) + }, + mafiaPlayer = RedisMafiaPlayer( + id = mafiaPlayer.userId.value, + nickname = mafiaPlayer.nickname, + color = mafiaPlayer.color, + isConnect = mafiaPlayer.isConnect(), + ), + keyword = RedisMafiaKeyword( + answer = keyword.answer, + category = keyword.category, + ), + drawData = drawData.map { pair -> + Pair(pair.first.value, pair.second) + }, + answer = answer, + ) + + is MafiaPhase.End -> RedisMafiaPhase( + status = "end", + jobKey = jobKey.toString(), + turnList = turnList.map { player -> + RedisMafiaPlayer( + id = player.userId.value, + nickname = player.nickname, + color = player.color, + isConnect = player.isConnect(), + ) + }, + mafiaPlayer = RedisMafiaPlayer( + id = mafiaPlayer.userId.value, + nickname = mafiaPlayer.nickname, + color = mafiaPlayer.color, + isConnect = mafiaPlayer.isConnect(), + ), + keyword = RedisMafiaKeyword( + answer = keyword.answer, + category = keyword.category, + ), + drawData = drawData.map { pair -> + Pair(pair.first.value, pair.second) + }, + answer = answer, + showAnswer = showAnswer, + isMafiaWin = isMafiaWin, + ) + } +} + +fun RedisMafiaPhase.toMafiaPhase(): MafiaPhase { + return when (status) { + "wait" -> MafiaPhase.Wait + "ready" -> MafiaPhase.Ready( + jobKey = RoomId(jobKey!!), + turnList = turnList!!.map { player -> + player.toPlayer() + }, + mafiaPlayer = mafiaPlayer!!.toPlayer(), + keyword = keyword!!.toMafiaKeyword(), + ) + + "playing" -> MafiaPhase.Playing( + jobKey = RoomId(jobKey!!), + turnList = turnList!!.map { player -> + player.toPlayer() + }, + mafiaPlayer = mafiaPlayer!!.toPlayer(), + keyword = keyword!!.toMafiaKeyword(), + turnInfo = TurnInfo(round!!, turn!!), + drawData = drawData!!.map { pair -> + Pair(UserId(pair.first), pair.second) + }.toMutableList(), + ) + + "vote" -> MafiaPhase.Vote( + jobKey = RoomId(jobKey!!), + turnList = turnList!!.map { player -> + player.toPlayer() + }, + mafiaPlayer = mafiaPlayer!!.toPlayer(), + keyword = keyword!!.toMafiaKeyword(), + drawData = drawData!!.map { pair -> + Pair(UserId(pair.first), pair.second) + }.toMutableList(), + players = deserializePlayers(players!!), + ) + + "inferAnswer" -> MafiaPhase.InferAnswer( + jobKey = RoomId(jobKey!!), + turnList = turnList!!.map { player -> + player.toPlayer() + }, + mafiaPlayer = mafiaPlayer!!.toPlayer(), + keyword = keyword!!.toMafiaKeyword(), + drawData = drawData!!.map { pair -> + Pair(UserId(pair.first), pair.second) + }.toMutableList(), + answer = answer!!, + ) + + "end" -> MafiaPhase.End( + jobKey = RoomId(jobKey!!), + turnList = turnList!!.map { player -> + player.toPlayer() + }, + mafiaPlayer = mafiaPlayer!!.toPlayer(), + keyword = keyword!!.toMafiaKeyword(), + drawData = drawData!!.map { pair -> + Pair(UserId(pair.first), pair.second) + }.toMutableList(), + answer = answer!!, + showAnswer = showAnswer!!, + isMafiaWin = isMafiaWin!!, + ) + + else -> MafiaPhase.Wait + } +} + +fun RedisRoom.toRoom(): Room = Room( + id = RoomId(this.id), + locale = this.locale, + owner = this.owner.toPlayer(), + maxMemberNum = this.maxMemberNum, + players = this.players.map { player -> + player.toPlayer() + }.toMutableList(), + isRandomMatching = isRandomMatching, +) + +fun RedisMafiaPlayer.toPlayer(): MafiaPlayer { + val mafiaPlayer = MafiaPlayer( + userId = UserId(this.id), + nickname = this.nickname, + color = this.color, + ) + + if (this.isConnect.not()) { + mafiaPlayer.disconnect() + } + + return mafiaPlayer +} + +fun RedisGameOption.toGameOption(): MafiaGameOption = MafiaGameOption( + minimum = this.minimum, + maximum = this.maximum, + readyTime = Duration.ofMillis(this.readyTime), + introAnimationTime = Duration.ofMillis(this.introAnimationTime), + roundAnimationTime = Duration.ofMillis(this.roundAnimationTime), + round = this.round, + turnTime = Duration.ofMillis(this.turnTime), + turnCount = this.turnCount, + voteTime = Duration.ofMillis(this.voteTime), + answerTime = Duration.ofMillis(this.answerTime), + endTime = Duration.ofMillis(this.endTime), +) + +fun RedisMafiaKeyword.toMafiaKeyword(): MafiaKeyword = MafiaKeyword( + answer = this.answer, + category = this.category, +) + +fun serializePlayers(players: Map>): Map> { + val serializedPlayers = mutableMapOf>() + players.forEach { player -> + serializedPlayers[player.key.value] = mutableListOf() + players[player.key]?.forEach { userId -> + serializedPlayers[player.key.value]?.add(userId.value) + } + } + return serializedPlayers +} + +fun deserializePlayers(players: Map>): Map> { + val deserializedPlayers = mutableMapOf>() + players.forEach { player -> + deserializedPlayers[UserId(player.key)] = Vector() + players[player.key]?.forEach { userId -> + deserializedPlayers[UserId(player.key)]?.add(UserId(userId)) + } + } + return deserializedPlayers +} From 6d317d9951fff4be8f3121b9bad44aceecea4f06 Mon Sep 17 00:00:00 2001 From: sunwoong Date: Sun, 22 Sep 2024 23:40:26 +0900 Subject: [PATCH 29/40] =?UTF-8?q?DRAW-287=20refactor:=20=EB=A0=88=EB=94=94?= =?UTF-8?q?=EC=8A=A4=20=EB=A7=88=ED=94=BC=EC=95=84=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A0=80=EC=9E=A5=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xorker/draw/mafia/RedisMafiaGameInfo.kt | 387 ------------------ .../draw/mafia/dto/RedisMafiaGameInfo.kt | 54 +++ .../draw/mafia/dto/RedisMafiaGameOption.kt | 34 ++ .../draw/mafia/dto/RedisMafiaKeyword.kt | 15 + .../xorker/draw/mafia/dto/RedisMafiaPhase.kt | 264 ++++++++++++ .../xorker/draw/mafia/dto/RedisMafiaPlayer.kt | 27 ++ .../xorker/draw/mafia/dto/RedisMafiaRoom.kt | 27 ++ 7 files changed, 421 insertions(+), 387 deletions(-) delete mode 100644 adapter/redis/src/main/kotlin/com/xorker/draw/mafia/RedisMafiaGameInfo.kt create mode 100644 adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaGameInfo.kt create mode 100644 adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaGameOption.kt create mode 100644 adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaKeyword.kt create mode 100644 adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaPhase.kt create mode 100644 adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaPlayer.kt create mode 100644 adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaRoom.kt diff --git a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/RedisMafiaGameInfo.kt b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/RedisMafiaGameInfo.kt deleted file mode 100644 index 63db6147..00000000 --- a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/RedisMafiaGameInfo.kt +++ /dev/null @@ -1,387 +0,0 @@ -package com.xorker.draw.mafia - -import com.fasterxml.jackson.annotation.JsonCreator -import com.fasterxml.jackson.annotation.JsonProperty -import com.xorker.draw.mafia.turn.TurnInfo -import com.xorker.draw.room.Room -import com.xorker.draw.room.RoomId -import com.xorker.draw.user.UserId -import java.time.Duration -import java.util.* - -data class RedisMafiaGameInfo @JsonCreator constructor( - @JsonProperty("room") val room: RedisRoom, - @JsonProperty("phase") val phase: RedisMafiaPhase, - @JsonProperty("gameOption") val gameOption: RedisGameOption, -) { - fun toMafiaGameInfo(): MafiaGameInfo = MafiaGameInfo( - room = room.toRoom(), - phase = phase.toMafiaPhase(), - gameOption = gameOption.toGameOption(), - ) -} - -data class RedisRoom @JsonCreator constructor( - @JsonProperty("id") val id: String, - @JsonProperty("locale") val locale: String, - @JsonProperty("owner") val owner: RedisMafiaPlayer, - @JsonProperty("maxMemberNum") val maxMemberNum: Int, - @JsonProperty("players") val players: List, - @JsonProperty("randomMatching") val isRandomMatching: Boolean, -) - -data class RedisMafiaPlayer @JsonCreator constructor( - @JsonProperty("id") val id: Long, - @JsonProperty("nickname") val nickname: String, - @JsonProperty("color") val color: String, - @JsonProperty("connect") val isConnect: Boolean, -) - -data class RedisGameOption @JsonCreator constructor( - @JsonProperty("minimum") val minimum: Int, - @JsonProperty("maximum") val maximum: Int, - @JsonProperty("readyTime") val readyTime: Long, - @JsonProperty("introAnimationTime") val introAnimationTime: Long, - @JsonProperty("roundAnimationTime") val roundAnimationTime: Long, - @JsonProperty("round") val round: Int, - @JsonProperty("turnTime") val turnTime: Long, - @JsonProperty("turnCount") val turnCount: Int, - @JsonProperty("voteTime") val voteTime: Long, - @JsonProperty("answerTime") val answerTime: Long, - @JsonProperty("endTime") val endTime: Long, -) - -data class RedisMafiaPhase @JsonCreator constructor( - @JsonProperty("status") val status: String, - @JsonProperty("jobKey") val jobKey: String? = null, - @JsonProperty("turnList") val turnList: List? = null, - @JsonProperty("mafiaPlayer") val mafiaPlayer: RedisMafiaPlayer? = null, - @JsonProperty("keyword") val keyword: RedisMafiaKeyword? = null, - @JsonProperty("drawData") val drawData: List>>? = null, - @JsonProperty("players") val players: Map>? = null, - @JsonProperty("round") val round: Int? = null, - @JsonProperty("turn") val turn: Int? = null, - @JsonProperty("answer") val answer: String? = null, - @JsonProperty("showAnswer") val showAnswer: Boolean? = null, - @JsonProperty("mafiaWin") val isMafiaWin: Boolean? = null, -) - -data class RedisMafiaKeyword @JsonCreator constructor( - @JsonProperty("category") val category: String, - @JsonProperty("answer") val answer: String, -) - -fun MafiaGameInfo.toRedisMafiaGameInfo(): RedisMafiaGameInfo = RedisMafiaGameInfo( - room = RedisRoom( - id = room.id.value, - locale = room.locale, - owner = RedisMafiaPlayer( - id = room.owner.userId.value, - nickname = room.owner.nickname, - color = room.owner.color, - isConnect = room.owner.isConnect(), - ), - maxMemberNum = room.maxMemberNum, - players = room.players.map { player -> - RedisMafiaPlayer( - id = player.userId.value, - nickname = player.nickname, - color = player.color, - isConnect = player.isConnect(), - ) - }, - isRandomMatching = room.isRandomMatching, - ), - phase = phase.toRedisMafiaPhase(), - gameOption = RedisGameOption( - minimum = gameOption.minimum, - maximum = gameOption.maximum, - readyTime = gameOption.readyTime.toMillis(), - introAnimationTime = gameOption.introAnimationTime.toMillis(), - roundAnimationTime = gameOption.roundAnimationTime.toMillis(), - round = gameOption.round, - turnTime = gameOption.turnTime.toMillis(), - turnCount = gameOption.turnCount, - voteTime = gameOption.voteTime.toMillis(), - answerTime = gameOption.answerTime.toMillis(), - endTime = gameOption.endTime.toMillis(), - ), -) - -fun MafiaPhase.toRedisMafiaPhase(): RedisMafiaPhase { - return when (this) { - is MafiaPhase.Wait -> RedisMafiaPhase( - status = "wait", - ) - - is MafiaPhase.Ready -> RedisMafiaPhase( - status = "ready", - jobKey = jobKey.toString(), - turnList = turnList.map { player -> - RedisMafiaPlayer( - id = player.userId.value, - nickname = player.nickname, - color = player.color, - isConnect = player.isConnect(), - ) - }, - mafiaPlayer = RedisMafiaPlayer( - id = mafiaPlayer.userId.value, - nickname = mafiaPlayer.nickname, - color = mafiaPlayer.color, - isConnect = mafiaPlayer.isConnect(), - ), - keyword = RedisMafiaKeyword( - answer = keyword.answer, - category = keyword.category, - ), - ) - - is MafiaPhase.Playing -> RedisMafiaPhase( - status = "playing", - jobKey = jobKey.toString(), - turnList = turnList.map { player -> - RedisMafiaPlayer( - id = player.userId.value, - nickname = player.nickname, - color = player.color, - isConnect = player.isConnect(), - ) - }, - mafiaPlayer = RedisMafiaPlayer( - id = mafiaPlayer.userId.value, - nickname = mafiaPlayer.nickname, - color = mafiaPlayer.color, - isConnect = mafiaPlayer.isConnect(), - ), - keyword = RedisMafiaKeyword( - answer = keyword.answer, - category = keyword.category, - ), - drawData = drawData.map { pair -> - Pair(pair.first.value, pair.second) - }, - round = turnInfo.round, - turn = turnInfo.turn, - ) - - is MafiaPhase.Vote -> RedisMafiaPhase( - status = "vote", - jobKey = jobKey.toString(), - turnList = turnList.map { player -> - RedisMafiaPlayer( - id = player.userId.value, - nickname = player.nickname, - color = player.color, - isConnect = player.isConnect(), - ) - }, - mafiaPlayer = RedisMafiaPlayer( - id = mafiaPlayer.userId.value, - nickname = mafiaPlayer.nickname, - color = mafiaPlayer.color, - isConnect = mafiaPlayer.isConnect(), - ), - keyword = RedisMafiaKeyword( - answer = keyword.answer, - category = keyword.category, - ), - drawData = drawData.map { pair -> - Pair(pair.first.value, pair.second) - }, - players = serializePlayers(this.players), - ) - - is MafiaPhase.InferAnswer -> RedisMafiaPhase( - status = "inferAnswer", - jobKey = jobKey.toString(), - turnList = turnList.map { player -> - RedisMafiaPlayer( - id = player.userId.value, - nickname = player.nickname, - color = player.color, - isConnect = player.isConnect(), - ) - }, - mafiaPlayer = RedisMafiaPlayer( - id = mafiaPlayer.userId.value, - nickname = mafiaPlayer.nickname, - color = mafiaPlayer.color, - isConnect = mafiaPlayer.isConnect(), - ), - keyword = RedisMafiaKeyword( - answer = keyword.answer, - category = keyword.category, - ), - drawData = drawData.map { pair -> - Pair(pair.first.value, pair.second) - }, - answer = answer, - ) - - is MafiaPhase.End -> RedisMafiaPhase( - status = "end", - jobKey = jobKey.toString(), - turnList = turnList.map { player -> - RedisMafiaPlayer( - id = player.userId.value, - nickname = player.nickname, - color = player.color, - isConnect = player.isConnect(), - ) - }, - mafiaPlayer = RedisMafiaPlayer( - id = mafiaPlayer.userId.value, - nickname = mafiaPlayer.nickname, - color = mafiaPlayer.color, - isConnect = mafiaPlayer.isConnect(), - ), - keyword = RedisMafiaKeyword( - answer = keyword.answer, - category = keyword.category, - ), - drawData = drawData.map { pair -> - Pair(pair.first.value, pair.second) - }, - answer = answer, - showAnswer = showAnswer, - isMafiaWin = isMafiaWin, - ) - } -} - -fun RedisMafiaPhase.toMafiaPhase(): MafiaPhase { - return when (status) { - "wait" -> MafiaPhase.Wait - "ready" -> MafiaPhase.Ready( - jobKey = RoomId(jobKey!!), - turnList = turnList!!.map { player -> - player.toPlayer() - }, - mafiaPlayer = mafiaPlayer!!.toPlayer(), - keyword = keyword!!.toMafiaKeyword(), - ) - - "playing" -> MafiaPhase.Playing( - jobKey = RoomId(jobKey!!), - turnList = turnList!!.map { player -> - player.toPlayer() - }, - mafiaPlayer = mafiaPlayer!!.toPlayer(), - keyword = keyword!!.toMafiaKeyword(), - turnInfo = TurnInfo(round!!, turn!!), - drawData = drawData!!.map { pair -> - Pair(UserId(pair.first), pair.second) - }.toMutableList(), - ) - - "vote" -> MafiaPhase.Vote( - jobKey = RoomId(jobKey!!), - turnList = turnList!!.map { player -> - player.toPlayer() - }, - mafiaPlayer = mafiaPlayer!!.toPlayer(), - keyword = keyword!!.toMafiaKeyword(), - drawData = drawData!!.map { pair -> - Pair(UserId(pair.first), pair.second) - }.toMutableList(), - players = deserializePlayers(players!!), - ) - - "inferAnswer" -> MafiaPhase.InferAnswer( - jobKey = RoomId(jobKey!!), - turnList = turnList!!.map { player -> - player.toPlayer() - }, - mafiaPlayer = mafiaPlayer!!.toPlayer(), - keyword = keyword!!.toMafiaKeyword(), - drawData = drawData!!.map { pair -> - Pair(UserId(pair.first), pair.second) - }.toMutableList(), - answer = answer!!, - ) - - "end" -> MafiaPhase.End( - jobKey = RoomId(jobKey!!), - turnList = turnList!!.map { player -> - player.toPlayer() - }, - mafiaPlayer = mafiaPlayer!!.toPlayer(), - keyword = keyword!!.toMafiaKeyword(), - drawData = drawData!!.map { pair -> - Pair(UserId(pair.first), pair.second) - }.toMutableList(), - answer = answer!!, - showAnswer = showAnswer!!, - isMafiaWin = isMafiaWin!!, - ) - - else -> MafiaPhase.Wait - } -} - -fun RedisRoom.toRoom(): Room = Room( - id = RoomId(this.id), - locale = this.locale, - owner = this.owner.toPlayer(), - maxMemberNum = this.maxMemberNum, - players = this.players.map { player -> - player.toPlayer() - }.toMutableList(), - isRandomMatching = isRandomMatching, -) - -fun RedisMafiaPlayer.toPlayer(): MafiaPlayer { - val mafiaPlayer = MafiaPlayer( - userId = UserId(this.id), - nickname = this.nickname, - color = this.color, - ) - - if (this.isConnect.not()) { - mafiaPlayer.disconnect() - } - - return mafiaPlayer -} - -fun RedisGameOption.toGameOption(): MafiaGameOption = MafiaGameOption( - minimum = this.minimum, - maximum = this.maximum, - readyTime = Duration.ofMillis(this.readyTime), - introAnimationTime = Duration.ofMillis(this.introAnimationTime), - roundAnimationTime = Duration.ofMillis(this.roundAnimationTime), - round = this.round, - turnTime = Duration.ofMillis(this.turnTime), - turnCount = this.turnCount, - voteTime = Duration.ofMillis(this.voteTime), - answerTime = Duration.ofMillis(this.answerTime), - endTime = Duration.ofMillis(this.endTime), -) - -fun RedisMafiaKeyword.toMafiaKeyword(): MafiaKeyword = MafiaKeyword( - answer = this.answer, - category = this.category, -) - -fun serializePlayers(players: Map>): Map> { - val serializedPlayers = mutableMapOf>() - players.forEach { player -> - serializedPlayers[player.key.value] = mutableListOf() - players[player.key]?.forEach { userId -> - serializedPlayers[player.key.value]?.add(userId.value) - } - } - return serializedPlayers -} - -fun deserializePlayers(players: Map>): Map> { - val deserializedPlayers = mutableMapOf>() - players.forEach { player -> - deserializedPlayers[UserId(player.key)] = Vector() - players[player.key]?.forEach { userId -> - deserializedPlayers[UserId(player.key)]?.add(UserId(userId)) - } - } - return deserializedPlayers -} diff --git a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaGameInfo.kt b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaGameInfo.kt new file mode 100644 index 00000000..691a2f2c --- /dev/null +++ b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaGameInfo.kt @@ -0,0 +1,54 @@ +package com.xorker.draw.mafia.dto + +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty +import com.xorker.draw.mafia.MafiaGameInfo + +data class RedisMafiaGameInfo @JsonCreator constructor( + @JsonProperty("room") val room: RedisRoom, + @JsonProperty("phase") val phase: RedisMafiaPhase, + @JsonProperty("gameOption") val gameOption: RedisGameOption, +) { + fun toMafiaGameInfo(): MafiaGameInfo = MafiaGameInfo( + room = room.toRoom(), + phase = phase.toMafiaPhase(), + gameOption = gameOption.toGameOption(), + ) +} + +fun MafiaGameInfo.toRedisMafiaGameInfo(): RedisMafiaGameInfo = RedisMafiaGameInfo( + room = RedisRoom( + id = room.id.value, + locale = room.locale, + owner = RedisMafiaPlayer( + id = room.owner.userId.value, + nickname = room.owner.nickname, + color = room.owner.color, + isConnect = room.owner.isConnect(), + ), + maxMemberNum = room.maxMemberNum, + players = room.players.map { player -> + RedisMafiaPlayer( + id = player.userId.value, + nickname = player.nickname, + color = player.color, + isConnect = player.isConnect(), + ) + }, + isRandomMatching = room.isRandomMatching, + ), + phase = phase.toRedisMafiaPhase(), + gameOption = RedisGameOption( + minimum = gameOption.minimum, + maximum = gameOption.maximum, + readyTime = gameOption.readyTime.toMillis(), + introAnimationTime = gameOption.introAnimationTime.toMillis(), + roundAnimationTime = gameOption.roundAnimationTime.toMillis(), + round = gameOption.round, + turnTime = gameOption.turnTime.toMillis(), + turnCount = gameOption.turnCount, + voteTime = gameOption.voteTime.toMillis(), + answerTime = gameOption.answerTime.toMillis(), + endTime = gameOption.endTime.toMillis(), + ), +) diff --git a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaGameOption.kt b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaGameOption.kt new file mode 100644 index 00000000..1dad4355 --- /dev/null +++ b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaGameOption.kt @@ -0,0 +1,34 @@ +package com.xorker.draw.mafia.dto + +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty +import com.xorker.draw.mafia.MafiaGameOption +import java.time.Duration + +data class RedisGameOption @JsonCreator constructor( + @JsonProperty("minimum") val minimum: Int, + @JsonProperty("maximum") val maximum: Int, + @JsonProperty("readyTime") val readyTime: Long, + @JsonProperty("introAnimationTime") val introAnimationTime: Long, + @JsonProperty("roundAnimationTime") val roundAnimationTime: Long, + @JsonProperty("round") val round: Int, + @JsonProperty("turnTime") val turnTime: Long, + @JsonProperty("turnCount") val turnCount: Int, + @JsonProperty("voteTime") val voteTime: Long, + @JsonProperty("answerTime") val answerTime: Long, + @JsonProperty("endTime") val endTime: Long, +) + +fun RedisGameOption.toGameOption(): MafiaGameOption = MafiaGameOption( + minimum = this.minimum, + maximum = this.maximum, + readyTime = Duration.ofMillis(this.readyTime), + introAnimationTime = Duration.ofMillis(this.introAnimationTime), + roundAnimationTime = Duration.ofMillis(this.roundAnimationTime), + round = this.round, + turnTime = Duration.ofMillis(this.turnTime), + turnCount = this.turnCount, + voteTime = Duration.ofMillis(this.voteTime), + answerTime = Duration.ofMillis(this.answerTime), + endTime = Duration.ofMillis(this.endTime), +) diff --git a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaKeyword.kt b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaKeyword.kt new file mode 100644 index 00000000..bbe60f51 --- /dev/null +++ b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaKeyword.kt @@ -0,0 +1,15 @@ +package com.xorker.draw.mafia.dto + +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty +import com.xorker.draw.mafia.MafiaKeyword + +data class RedisMafiaKeyword @JsonCreator constructor( + @JsonProperty("category") val category: String, + @JsonProperty("answer") val answer: String, +) + +fun RedisMafiaKeyword.toMafiaKeyword(): MafiaKeyword = MafiaKeyword( + answer = this.answer, + category = this.category, +) diff --git a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaPhase.kt b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaPhase.kt new file mode 100644 index 00000000..c1e80392 --- /dev/null +++ b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaPhase.kt @@ -0,0 +1,264 @@ +package com.xorker.draw.mafia.dto + +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty +import com.xorker.draw.mafia.MafiaPhase +import com.xorker.draw.mafia.turn.TurnInfo +import com.xorker.draw.room.RoomId +import com.xorker.draw.user.UserId +import java.util.* + +data class RedisMafiaPhase @JsonCreator constructor( + @JsonProperty("status") val status: RedisMafiaPhaseStatus, + @JsonProperty("jobKey") val jobKey: String? = null, + @JsonProperty("turnList") val turnList: List? = null, + @JsonProperty("mafiaPlayer") val mafiaPlayer: RedisMafiaPlayer? = null, + @JsonProperty("keyword") val keyword: RedisMafiaKeyword? = null, + @JsonProperty("drawData") val drawData: List>>? = null, + @JsonProperty("players") val players: Map>? = null, + @JsonProperty("round") val round: Int? = null, + @JsonProperty("turn") val turn: Int? = null, + @JsonProperty("answer") val answer: String? = null, + @JsonProperty("showAnswer") val showAnswer: Boolean? = null, + @JsonProperty("mafiaWin") val isMafiaWin: Boolean? = null, +) + +enum class RedisMafiaPhaseStatus { + WAIT, + READY, + PLAYING, + VOTE, + INFER_ANSWER, + END, + ; +} + +fun serializePlayers(players: Map>): Map> { + val serializedPlayers = mutableMapOf>() + players.forEach { player -> + serializedPlayers[player.key.value] = mutableListOf() + players[player.key]?.forEach { userId -> + serializedPlayers[player.key.value]?.add(userId.value) + } + } + return serializedPlayers +} + +fun deserializePlayers(players: Map>): Map> { + val deserializedPlayers = mutableMapOf>() + players.forEach { player -> + deserializedPlayers[UserId(player.key)] = Vector() + players[player.key]?.forEach { userId -> + deserializedPlayers[UserId(player.key)]?.add(UserId(userId)) + } + } + return deserializedPlayers +} + +fun MafiaPhase.toRedisMafiaPhase(): RedisMafiaPhase { + return when (this) { + is MafiaPhase.Wait -> RedisMafiaPhase( + status = RedisMafiaPhaseStatus.WAIT, + ) + + is MafiaPhase.Ready -> RedisMafiaPhase( + status = RedisMafiaPhaseStatus.READY, + jobKey = jobKey.value, + turnList = turnList.map { player -> + RedisMafiaPlayer( + id = player.userId.value, + nickname = player.nickname, + color = player.color, + isConnect = player.isConnect(), + ) + }, + mafiaPlayer = RedisMafiaPlayer( + id = mafiaPlayer.userId.value, + nickname = mafiaPlayer.nickname, + color = mafiaPlayer.color, + isConnect = mafiaPlayer.isConnect(), + ), + keyword = RedisMafiaKeyword( + answer = keyword.answer, + category = keyword.category, + ), + ) + + is MafiaPhase.Playing -> RedisMafiaPhase( + status = RedisMafiaPhaseStatus.PLAYING, + jobKey = jobKey.value, + turnList = turnList.map { player -> + RedisMafiaPlayer( + id = player.userId.value, + nickname = player.nickname, + color = player.color, + isConnect = player.isConnect(), + ) + }, + mafiaPlayer = RedisMafiaPlayer( + id = mafiaPlayer.userId.value, + nickname = mafiaPlayer.nickname, + color = mafiaPlayer.color, + isConnect = mafiaPlayer.isConnect(), + ), + keyword = RedisMafiaKeyword( + answer = keyword.answer, + category = keyword.category, + ), + drawData = drawData.map { pair -> + Pair(pair.first.value, pair.second) + }, + round = turnInfo.round, + turn = turnInfo.turn, + ) + + is MafiaPhase.Vote -> RedisMafiaPhase( + status = RedisMafiaPhaseStatus.VOTE, + jobKey = jobKey.value, + turnList = turnList.map { player -> + RedisMafiaPlayer( + id = player.userId.value, + nickname = player.nickname, + color = player.color, + isConnect = player.isConnect(), + ) + }, + mafiaPlayer = RedisMafiaPlayer( + id = mafiaPlayer.userId.value, + nickname = mafiaPlayer.nickname, + color = mafiaPlayer.color, + isConnect = mafiaPlayer.isConnect(), + ), + keyword = RedisMafiaKeyword( + answer = keyword.answer, + category = keyword.category, + ), + drawData = drawData.map { pair -> + Pair(pair.first.value, pair.second) + }, + players = serializePlayers(this.players), + ) + + is MafiaPhase.InferAnswer -> RedisMafiaPhase( + status = RedisMafiaPhaseStatus.INFER_ANSWER, + jobKey = jobKey.value, + turnList = turnList.map { player -> + RedisMafiaPlayer( + id = player.userId.value, + nickname = player.nickname, + color = player.color, + isConnect = player.isConnect(), + ) + }, + mafiaPlayer = RedisMafiaPlayer( + id = mafiaPlayer.userId.value, + nickname = mafiaPlayer.nickname, + color = mafiaPlayer.color, + isConnect = mafiaPlayer.isConnect(), + ), + keyword = RedisMafiaKeyword( + answer = keyword.answer, + category = keyword.category, + ), + drawData = drawData.map { pair -> + Pair(pair.first.value, pair.second) + }, + answer = answer, + ) + + is MafiaPhase.End -> RedisMafiaPhase( + status = RedisMafiaPhaseStatus.END, + jobKey = jobKey.value, + turnList = turnList.map { player -> + RedisMafiaPlayer( + id = player.userId.value, + nickname = player.nickname, + color = player.color, + isConnect = player.isConnect(), + ) + }, + mafiaPlayer = RedisMafiaPlayer( + id = mafiaPlayer.userId.value, + nickname = mafiaPlayer.nickname, + color = mafiaPlayer.color, + isConnect = mafiaPlayer.isConnect(), + ), + keyword = RedisMafiaKeyword( + answer = keyword.answer, + category = keyword.category, + ), + drawData = drawData.map { pair -> + Pair(pair.first.value, pair.second) + }, + answer = answer, + showAnswer = showAnswer, + isMafiaWin = isMafiaWin, + ) + } +} + +fun RedisMafiaPhase.toMafiaPhase(): MafiaPhase = when (status) { + RedisMafiaPhaseStatus.WAIT -> MafiaPhase.Wait + RedisMafiaPhaseStatus.READY -> MafiaPhase.Ready( + jobKey = RoomId(jobKey!!), + turnList = turnList!!.map { player -> + player.toPlayer() + }, + mafiaPlayer = mafiaPlayer!!.toPlayer(), + keyword = keyword!!.toMafiaKeyword(), + ) + + RedisMafiaPhaseStatus.PLAYING -> MafiaPhase.Playing( + jobKey = RoomId(jobKey!!), + turnList = turnList!!.map { player -> + player.toPlayer() + }, + mafiaPlayer = mafiaPlayer!!.toPlayer(), + keyword = keyword!!.toMafiaKeyword(), + turnInfo = TurnInfo(round!!, turn!!), + drawData = drawData!!.map { pair -> + Pair(UserId(pair.first), pair.second) + }.toMutableList(), + ) + + RedisMafiaPhaseStatus.VOTE -> MafiaPhase.Vote( + jobKey = RoomId(jobKey!!), + turnList = turnList!!.map { player -> + player.toPlayer() + }, + mafiaPlayer = mafiaPlayer!!.toPlayer(), + keyword = keyword!!.toMafiaKeyword(), + drawData = drawData!!.map { pair -> + Pair(UserId(pair.first), pair.second) + }.toMutableList(), + players = deserializePlayers(players!!), + ) + + RedisMafiaPhaseStatus.INFER_ANSWER -> MafiaPhase.InferAnswer( + jobKey = RoomId(jobKey!!), + turnList = turnList!!.map { player -> + player.toPlayer() + }, + mafiaPlayer = mafiaPlayer!!.toPlayer(), + keyword = keyword!!.toMafiaKeyword(), + drawData = drawData!!.map { pair -> + Pair(UserId(pair.first), pair.second) + }.toMutableList(), + answer = answer, + ) + + RedisMafiaPhaseStatus.END -> MafiaPhase.End( + jobKey = RoomId(jobKey!!), + turnList = turnList!!.map { player -> + player.toPlayer() + }, + mafiaPlayer = mafiaPlayer!!.toPlayer(), + keyword = keyword!!.toMafiaKeyword(), + drawData = drawData!!.map { pair -> + Pair(UserId(pair.first), pair.second) + }.toMutableList(), + answer = answer, + showAnswer = showAnswer!!, + isMafiaWin = isMafiaWin!!, + ) +} diff --git a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaPlayer.kt b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaPlayer.kt new file mode 100644 index 00000000..6943ce4c --- /dev/null +++ b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaPlayer.kt @@ -0,0 +1,27 @@ +package com.xorker.draw.mafia.dto + +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty +import com.xorker.draw.mafia.MafiaPlayer +import com.xorker.draw.user.UserId + +data class RedisMafiaPlayer @JsonCreator constructor( + @JsonProperty("id") val id: Long, + @JsonProperty("nickname") val nickname: String, + @JsonProperty("color") val color: String, + @JsonProperty("connect") val isConnect: Boolean, +) + +fun RedisMafiaPlayer.toPlayer(): MafiaPlayer { + val mafiaPlayer = MafiaPlayer( + userId = UserId(this.id), + nickname = this.nickname, + color = this.color, + ) + + if (this.isConnect.not()) { + mafiaPlayer.disconnect() + } + + return mafiaPlayer +} diff --git a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaRoom.kt b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaRoom.kt new file mode 100644 index 00000000..3338bbee --- /dev/null +++ b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaRoom.kt @@ -0,0 +1,27 @@ +package com.xorker.draw.mafia.dto + +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty +import com.xorker.draw.mafia.MafiaPlayer +import com.xorker.draw.room.Room +import com.xorker.draw.room.RoomId + +data class RedisRoom @JsonCreator constructor( + @JsonProperty("id") val id: String, + @JsonProperty("locale") val locale: String, + @JsonProperty("owner") val owner: RedisMafiaPlayer, + @JsonProperty("maxMemberNum") val maxMemberNum: Int, + @JsonProperty("players") val players: List, + @JsonProperty("randomMatching") val isRandomMatching: Boolean, +) + +fun RedisRoom.toRoom(): Room = Room( + id = RoomId(this.id), + locale = this.locale, + owner = this.owner.toPlayer(), + maxMemberNum = this.maxMemberNum, + players = this.players.map { player -> + player.toPlayer() + }.toMutableList(), + isRandomMatching = isRandomMatching, +) From 1d67ea0d8f182a547f4d1b7528ac735f179e53a7 Mon Sep 17 00:00:00 2001 From: sunwoong Date: Sun, 22 Sep 2024 23:40:46 +0900 Subject: [PATCH 30/40] =?UTF-8?q?DRAW-287=20refactor:=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xorker/draw/mafia/MafiaGameAdapter.kt | 63 ------------------- .../com/xorker/draw/config/RedisConfig.kt | 4 +- .../com/xorker/draw/mafia/MafiaGameAdapter.kt | 11 ++-- .../broker/SimpleSessionMessageBroker.kt | 1 - .../mafia/phase/MafiaPhaseEndGameProcessor.kt | 1 + .../phase/MafiaPhaseInferAnswerProcessor.kt | 1 + .../phase/MafiaPhasePlayGameProcessor.kt | 1 + .../phase/MafiaPhasePlayVoteProcessor.kt | 2 +- 8 files changed, 11 insertions(+), 73 deletions(-) delete mode 100644 adapter/memory/src/main/kotlin/com/xorker/draw/mafia/MafiaGameAdapter.kt diff --git a/adapter/memory/src/main/kotlin/com/xorker/draw/mafia/MafiaGameAdapter.kt b/adapter/memory/src/main/kotlin/com/xorker/draw/mafia/MafiaGameAdapter.kt deleted file mode 100644 index 08f389eb..00000000 --- a/adapter/memory/src/main/kotlin/com/xorker/draw/mafia/MafiaGameAdapter.kt +++ /dev/null @@ -1,63 +0,0 @@ -package com.xorker.draw.mafia - -import com.xorker.draw.room.Room -import com.xorker.draw.room.RoomId -import com.xorker.draw.room.RoomRepository -import com.xorker.draw.support.metric.MetricManager -import com.xorker.draw.user.UserId -import java.util.concurrent.ConcurrentHashMap -import org.springframework.stereotype.Component - -@Component -internal class MafiaGameAdapter( - private val metricManager: MetricManager, -) : MafiaGameRepository, RoomRepository { - private val data = ConcurrentHashMap() - private val userData = ConcurrentHashMap() - - override fun saveGameInfo(gameInfo: MafiaGameInfo) { - val room = gameInfo.room - if (room.isEmpty()) { - removeGameInfo(gameInfo) - } else { - if (data.containsKey(room.id).not()) { - metricManager.increaseGameCount() - } - data[room.id] = gameInfo - room.players.forEach { - userData[it.userId] = room.id - } - } - } - - override fun removeGameInfo(gameInfo: MafiaGameInfo) { - metricManager.decreaseGameCount() - gameInfo.room.players - .map { it.userId } - .forEach { removePlayer(it) } - - val phase = gameInfo.phase - if (phase is MafiaPhaseWithTimer) { - phase.job.cancel() - } - - data.remove(gameInfo.room.id) - } - - override fun getGameInfo(roomId: RoomId): MafiaGameInfo? { - return data[roomId] - } - - override fun getRoom(roomId: RoomId): Room? { - return data[roomId]?.room - } - - override fun getGameInfo(userId: UserId): MafiaGameInfo? { - val roomId = userData[userId] ?: return null - return data[roomId] - } - - override fun removePlayer(userId: UserId) { - userData.remove(userId) - } -} diff --git a/adapter/redis/src/main/kotlin/com/xorker/draw/config/RedisConfig.kt b/adapter/redis/src/main/kotlin/com/xorker/draw/config/RedisConfig.kt index 8ede2b10..96c37631 100644 --- a/adapter/redis/src/main/kotlin/com/xorker/draw/config/RedisConfig.kt +++ b/adapter/redis/src/main/kotlin/com/xorker/draw/config/RedisConfig.kt @@ -1,6 +1,6 @@ package com.xorker.draw.config -import com.xorker.draw.mafia.RedisMafiaGameInfo +import com.xorker.draw.mafia.dto.RedisMafiaGameInfo import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.data.redis.connection.RedisConnectionFactory @@ -10,7 +10,7 @@ import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer import org.springframework.data.redis.serializer.StringRedisSerializer @Configuration -class RedisConfig { +internal class RedisConfig { @Bean fun redisConnectionFactory(): RedisConnectionFactory { diff --git a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/MafiaGameAdapter.kt b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/MafiaGameAdapter.kt index 4d5c1d72..4b5cb9b4 100644 --- a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/MafiaGameAdapter.kt +++ b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/MafiaGameAdapter.kt @@ -1,5 +1,7 @@ package com.xorker.draw.mafia +import com.xorker.draw.mafia.dto.RedisMafiaGameInfo +import com.xorker.draw.mafia.dto.toRedisMafiaGameInfo import com.xorker.draw.room.Room import com.xorker.draw.room.RoomId import com.xorker.draw.room.RoomRepository @@ -52,6 +54,7 @@ internal class MafiaGameAdapter( .forEach { removePlayer(it) } val phase = gameInfo.phase + if (phase is MafiaPhaseWithTimer) { timerRepository.cancelTimer(room.id) } @@ -60,12 +63,10 @@ internal class MafiaGameAdapter( } override fun getGameInfo(roomId: RoomId): MafiaGameInfo? { - val gameInfo = redisTemplateWithObject + return redisTemplateWithObject .opsForValue() .get(roomId.value) ?.toMafiaGameInfo() - println("Game info: $gameInfo") - return gameInfo } override fun getGameInfo(userId: UserId): MafiaGameInfo? { @@ -73,12 +74,10 @@ internal class MafiaGameAdapter( .opsForValue() .get(userId.value.toString()) ?: return null - val gameInfo = redisTemplateWithObject + return redisTemplateWithObject .opsForValue() .get(roomId) ?.toMafiaGameInfo() - println("Game info: $gameInfo") - return gameInfo } override fun removePlayer(userId: UserId) { diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt index 0b730e55..dc3d1790 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/broker/SimpleSessionMessageBroker.kt @@ -53,7 +53,6 @@ internal class SimpleSessionMessageBroker( roomRepository.getRoom(roomId)?.let { room -> room.players.forEach { player -> val userId = player.userId - sessionUseCase.getSession(userId)?.send(response) } } diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseEndGameProcessor.kt b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseEndGameProcessor.kt index 8727a414..4a2624b9 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseEndGameProcessor.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseEndGameProcessor.kt @@ -26,6 +26,7 @@ internal class MafiaPhaseEndGameProcessor( val gameOption = gameInfo.gameOption val room = gameInfo.room + timerRepository.startTimer(room.id, gameOption.endTime) { processEndGame(gameInfo) } diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseInferAnswerProcessor.kt b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseInferAnswerProcessor.kt index 1e2b40dd..2add571b 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseInferAnswerProcessor.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseInferAnswerProcessor.kt @@ -20,6 +20,7 @@ internal class MafiaPhaseInferAnswerProcessor( val gameOption = gameInfo.gameOption val room = gameInfo.room + timerRepository.startTimer(room.id, gameOption.answerTime) { processInferAnswer(gameInfo, nextStep) } diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhasePlayGameProcessor.kt b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhasePlayGameProcessor.kt index b47ec025..6a4aa574 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhasePlayGameProcessor.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhasePlayGameProcessor.kt @@ -26,6 +26,7 @@ internal class MafiaPhasePlayGameProcessor( time = time.plus(gameOption.roundAnimationTime) val room = gameInfo.room + timerRepository.startTimer(room.id, time) { processNextTurn(gameInfo, nextStep) } diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhasePlayVoteProcessor.kt b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhasePlayVoteProcessor.kt index 14f1bfe2..3e9355e9 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhasePlayVoteProcessor.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhasePlayVoteProcessor.kt @@ -23,6 +23,7 @@ internal class MafiaPhasePlayVoteProcessor( val gameOption = gameInfo.gameOption val room = gameInfo.room + timerRepository.startTimer(room.id, gameOption.voteTime) { processVote(gameInfo, winStep, loseStep) } @@ -36,7 +37,6 @@ internal class MafiaPhasePlayVoteProcessor( } private fun processVote(gameInfo: MafiaGameInfo, winStep: () -> Unit, loseStep: () -> Unit) { - println("process vote") val phase = gameInfo.phase assertIs(phase) From 3d3c061a74299fa733872dd18e74208498b66270 Mon Sep 17 00:00:00 2001 From: sunwoong Date: Mon, 23 Sep 2024 00:07:20 +0900 Subject: [PATCH 31/40] =?UTF-8?q?DRAW-287=20chore:=20redis=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/xorker/draw/config/RedisConfig.kt | 13 ++++++++++++- .../redis/src/main/resources/application-redis.yml | 3 +++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/adapter/redis/src/main/kotlin/com/xorker/draw/config/RedisConfig.kt b/adapter/redis/src/main/kotlin/com/xorker/draw/config/RedisConfig.kt index 96c37631..7c075aa3 100644 --- a/adapter/redis/src/main/kotlin/com/xorker/draw/config/RedisConfig.kt +++ b/adapter/redis/src/main/kotlin/com/xorker/draw/config/RedisConfig.kt @@ -1,9 +1,11 @@ package com.xorker.draw.config import com.xorker.draw.mafia.dto.RedisMafiaGameInfo +import org.springframework.beans.factory.annotation.Value import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.data.redis.connection.RedisConnectionFactory +import org.springframework.data.redis.connection.RedisStandaloneConfiguration import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory import org.springframework.data.redis.core.RedisTemplate import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer @@ -12,9 +14,18 @@ import org.springframework.data.redis.serializer.StringRedisSerializer @Configuration internal class RedisConfig { + @Value("\${spring.data.redis.host}") + lateinit var host: String + + @Value("\${spring.data.redis.password}") + lateinit var password: String + @Bean fun redisConnectionFactory(): RedisConnectionFactory { - return LettuceConnectionFactory() + val config = RedisStandaloneConfiguration(host, 6379) + config.setPassword(password) + + return LettuceConnectionFactory(config) } @Bean diff --git a/adapter/redis/src/main/resources/application-redis.yml b/adapter/redis/src/main/resources/application-redis.yml index 226ca828..e5295dd9 100644 --- a/adapter/redis/src/main/resources/application-redis.yml +++ b/adapter/redis/src/main/resources/application-redis.yml @@ -2,3 +2,6 @@ spring: data: redis: port: 6379 + host: ${REDIS_HOST} + url: jdbc:redis://${REDIS_USER}:${REDIS_PASSWORD}@${REDIS_HOST}:6379 + password: ${REDIS_PASSWORD} From 3b5f7fabf2ec9ce04040a5a8a1227ac673a47801 Mon Sep 17 00:00:00 2001 From: sunwoong Date: Mon, 23 Sep 2024 00:18:04 +0900 Subject: [PATCH 32/40] =?UTF-8?q?DRAW-287=20fix:=20ktlint=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xorker/draw/mafia/dto/RedisMafiaGameInfo.kt | 8 ++++---- .../com/xorker/draw/mafia/dto/RedisMafiaGameOption.kt | 4 ++-- .../kotlin/com/xorker/draw/mafia/dto/RedisMafiaRoom.kt | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaGameInfo.kt b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaGameInfo.kt index 691a2f2c..2c8af5d2 100644 --- a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaGameInfo.kt +++ b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaGameInfo.kt @@ -5,9 +5,9 @@ import com.fasterxml.jackson.annotation.JsonProperty import com.xorker.draw.mafia.MafiaGameInfo data class RedisMafiaGameInfo @JsonCreator constructor( - @JsonProperty("room") val room: RedisRoom, + @JsonProperty("room") val room: RedisMafiaRoom, @JsonProperty("phase") val phase: RedisMafiaPhase, - @JsonProperty("gameOption") val gameOption: RedisGameOption, + @JsonProperty("gameOption") val gameOption: RedisMafiaGameOption, ) { fun toMafiaGameInfo(): MafiaGameInfo = MafiaGameInfo( room = room.toRoom(), @@ -17,7 +17,7 @@ data class RedisMafiaGameInfo @JsonCreator constructor( } fun MafiaGameInfo.toRedisMafiaGameInfo(): RedisMafiaGameInfo = RedisMafiaGameInfo( - room = RedisRoom( + room = RedisMafiaRoom( id = room.id.value, locale = room.locale, owner = RedisMafiaPlayer( @@ -38,7 +38,7 @@ fun MafiaGameInfo.toRedisMafiaGameInfo(): RedisMafiaGameInfo = RedisMafiaGameInf isRandomMatching = room.isRandomMatching, ), phase = phase.toRedisMafiaPhase(), - gameOption = RedisGameOption( + gameOption = RedisMafiaGameOption( minimum = gameOption.minimum, maximum = gameOption.maximum, readyTime = gameOption.readyTime.toMillis(), diff --git a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaGameOption.kt b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaGameOption.kt index 1dad4355..82bfc3bd 100644 --- a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaGameOption.kt +++ b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaGameOption.kt @@ -5,7 +5,7 @@ import com.fasterxml.jackson.annotation.JsonProperty import com.xorker.draw.mafia.MafiaGameOption import java.time.Duration -data class RedisGameOption @JsonCreator constructor( +data class RedisMafiaGameOption @JsonCreator constructor( @JsonProperty("minimum") val minimum: Int, @JsonProperty("maximum") val maximum: Int, @JsonProperty("readyTime") val readyTime: Long, @@ -19,7 +19,7 @@ data class RedisGameOption @JsonCreator constructor( @JsonProperty("endTime") val endTime: Long, ) -fun RedisGameOption.toGameOption(): MafiaGameOption = MafiaGameOption( +fun RedisMafiaGameOption.toGameOption(): MafiaGameOption = MafiaGameOption( minimum = this.minimum, maximum = this.maximum, readyTime = Duration.ofMillis(this.readyTime), diff --git a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaRoom.kt b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaRoom.kt index 3338bbee..70dd7386 100644 --- a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaRoom.kt +++ b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaRoom.kt @@ -6,7 +6,7 @@ import com.xorker.draw.mafia.MafiaPlayer import com.xorker.draw.room.Room import com.xorker.draw.room.RoomId -data class RedisRoom @JsonCreator constructor( +data class RedisMafiaRoom @JsonCreator constructor( @JsonProperty("id") val id: String, @JsonProperty("locale") val locale: String, @JsonProperty("owner") val owner: RedisMafiaPlayer, @@ -15,7 +15,7 @@ data class RedisRoom @JsonCreator constructor( @JsonProperty("randomMatching") val isRandomMatching: Boolean, ) -fun RedisRoom.toRoom(): Room = Room( +fun RedisMafiaRoom.toRoom(): Room = Room( id = RoomId(this.id), locale = this.locale, owner = this.owner.toPlayer(), From 0a8f698644331a2c5e2b327ac55861e83b5672e3 Mon Sep 17 00:00:00 2001 From: sunwoong Date: Mon, 23 Sep 2024 14:46:17 +0900 Subject: [PATCH 33/40] =?UTF-8?q?DRAW-347=20chore:=20scheduler=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xorker/draw/websocket/config/SchedulerConfig.kt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 app/websocket/src/main/kotlin/com/xorker/draw/websocket/config/SchedulerConfig.kt diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/config/SchedulerConfig.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/config/SchedulerConfig.kt new file mode 100644 index 00000000..f526bbf6 --- /dev/null +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/config/SchedulerConfig.kt @@ -0,0 +1,8 @@ +package com.xorker.draw.websocket.config + +import org.springframework.context.annotation.Configuration +import org.springframework.scheduling.annotation.EnableScheduling + +@Configuration +@EnableScheduling +internal class SchedulerConfig From c81077c31f8d5cf03fa3491cac50c32b6f2e3040 Mon Sep 17 00:00:00 2001 From: sunwoong Date: Mon, 23 Sep 2024 14:46:46 +0900 Subject: [PATCH 34/40] =?UTF-8?q?DRAW-347=20feat:=20session=20ping=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=ED=8D=BC=ED=8B=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/kotlin/com/xorker/draw/websocket/session/Session.kt | 1 + .../kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt index fa05f1bd..d6353165 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt @@ -9,6 +9,7 @@ interface Session { val id: SessionId val user: User val locale: String + var ping: Boolean fun send(message: String) } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt index e1959c5e..74706ab1 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt @@ -10,6 +10,7 @@ internal class SessionWrapper( override val locale: String, ) : Session { override val id: SessionId = SessionId(session.id) + override var ping: Boolean = true override fun send(message: String) { synchronized(session) { From 3936a25ede664ed8ac5c10b013cf0d7a58513494 Mon Sep 17 00:00:00 2001 From: sunwoong Date: Mon, 23 Sep 2024 14:47:02 +0900 Subject: [PATCH 35/40] =?UTF-8?q?DRAW-347=20feat:=20=EC=9B=B9=EC=86=8C?= =?UTF-8?q?=EC=BC=93=20ping=20=EC=9A=94=EC=B2=AD=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt | 2 ++ .../com/xorker/draw/websocket/message/request/RequestAction.kt | 1 + 2 files changed, 3 insertions(+) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt index 8d38a76f..42d3de23 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketRouter.kt @@ -71,6 +71,8 @@ internal class WebSocketRouter( mafiaGameUseCase.react(sessionDto.user, requestDto.reaction) } + + RequestAction.PING -> sessionManager.setPing(SessionId(session.id)) } } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/RequestAction.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/RequestAction.kt index 2db15566..c37cc7ae 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/RequestAction.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/request/RequestAction.kt @@ -12,4 +12,5 @@ enum class RequestAction( ANSWER("마피아 정답 입력"), DECIDE_ANSWER("마피아 정답 확정"), REACTION("리액션"), + PING("웹소켓 Ping"), } From d2c1c0320074e19354b369a0e41bc934e7b8887f Mon Sep 17 00:00:00 2001 From: sunwoong Date: Mon, 23 Sep 2024 14:47:46 +0900 Subject: [PATCH 36/40] =?UTF-8?q?DRAW-347=20feat:=20=EC=9B=B9=EC=86=8C?= =?UTF-8?q?=EC=BC=93=20ping=20manager=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../draw/websocket/session/PingManager.kt | 36 +++++++++++++++++++ .../draw/websocket/session/SessionManager.kt | 21 ++++++++--- 2 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/PingManager.kt diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/PingManager.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/PingManager.kt new file mode 100644 index 00000000..51493450 --- /dev/null +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/PingManager.kt @@ -0,0 +1,36 @@ +package com.xorker.draw.websocket.session + +import com.xorker.draw.websocket.SessionEventListener +import com.xorker.draw.websocket.WaitingQueueUseCase +import java.util.concurrent.TimeUnit +import org.springframework.scheduling.annotation.Scheduled +import org.springframework.stereotype.Component + +@Component +internal class PingManager( + private val sessionManager: SessionManager, + private val waitingQueueUseCase: WaitingQueueUseCase, + private val sessionEventListener: List, +) { + + @Scheduled(fixedRate = 3000, timeUnit = TimeUnit.MILLISECONDS) + fun checkSessionStatus() { + val sessions = sessionManager.getSessions() + + sessions.forEach { session -> + if (session.ping.not()) { + val user = session.user + + sessionManager.unregisterSession(session.id) + + waitingQueueUseCase.remove(user, session.locale) + + sessionEventListener.forEach { + it.exitSession(user.id) + } + } else { + session.ping = false + } + } + } +} diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt index 05799156..aa39309b 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt @@ -2,12 +2,9 @@ package com.xorker.draw.websocket.session import com.xorker.draw.user.UserId import java.util.concurrent.ConcurrentHashMap -import org.springframework.core.Ordered -import org.springframework.core.annotation.Order -import org.springframework.stereotype.Service +import org.springframework.stereotype.Component -@Order(Ordered.HIGHEST_PRECEDENCE) -@Service +@Component internal class SessionManager { private val sessionMap: ConcurrentHashMap = ConcurrentHashMap() private val userIdMap: ConcurrentHashMap = ConcurrentHashMap() @@ -20,6 +17,12 @@ internal class SessionManager { return userIdMap[userId] } + fun getSessions(): List { + val sessions = sessionMap.values + + return sessions.toList() + } + fun registerSession(session: Session) { if (sessionMap.contains(session.id)) { // Init을 중복으로 호출 하면 기존 데이터를 Unregister 하고 Init 한다. @@ -34,4 +37,12 @@ internal class SessionManager { val session = sessionMap.remove(sessionId) return userIdMap.remove(session?.user?.id) } + + fun setPing(sessionId: SessionId) { + val session = sessionMap[sessionId] + + session?.let { + session.ping = true + } + } } From 5f4ddfb79b14e80dd733893f6f73703e988c8356 Mon Sep 17 00:00:00 2001 From: sunwoong Date: Fri, 27 Sep 2024 15:58:50 +0900 Subject: [PATCH 37/40] =?UTF-8?q?DRAW-287=20refactor:=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xorker/draw/timer/TimerAdapter.kt | 7 +++++-- .../com/xorker/draw/config/RedisConfig.kt | 5 ++++- .../xorker/draw/mafia/dto/RedisMafiaPhase.kt | 12 ------------ .../src/main/resources/application-redis.yml | 4 ++-- .../message/response/MafiaGameMessengerImpl.kt | 2 +- .../message/response/MafiaPhaseMessengerImpl.kt | 10 +++++----- .../com/xorker/draw/mafia/MafiaGameService.kt | 8 ++++++-- .../mafia/phase/MafiaPhaseStartGameProcessor.kt | 1 - .../kotlin/com/xorker/draw/mafia/MafiaPhase.kt | 17 ++--------------- .../com/xorker/draw/timer/TimerRepository.kt | 2 +- 10 files changed, 26 insertions(+), 42 deletions(-) diff --git a/adapter/memory/src/main/kotlin/com/xorker/draw/timer/TimerAdapter.kt b/adapter/memory/src/main/kotlin/com/xorker/draw/timer/TimerAdapter.kt index 4af83ec2..af995914 100644 --- a/adapter/memory/src/main/kotlin/com/xorker/draw/timer/TimerAdapter.kt +++ b/adapter/memory/src/main/kotlin/com/xorker/draw/timer/TimerAdapter.kt @@ -1,5 +1,6 @@ package com.xorker.draw.timer +import com.xorker.draw.exception.UnSupportedException import com.xorker.draw.mafia.event.JobWithStartTime import com.xorker.draw.room.RoomId import java.time.Duration @@ -32,8 +33,10 @@ internal class TimerAdapter : TimerRepository { jobs.remove(roomId) } - override fun getTimerStartTime(roomId: RoomId): LocalDateTime? { - return jobs[roomId]?.startTime + override fun getTimerStartTime(roomId: RoomId): LocalDateTime { + val job = jobs[roomId] ?: throw UnSupportedException + + return job.startTime } private fun saveJob(roomId: RoomId, job: JobWithStartTime) { diff --git a/adapter/redis/src/main/kotlin/com/xorker/draw/config/RedisConfig.kt b/adapter/redis/src/main/kotlin/com/xorker/draw/config/RedisConfig.kt index 7c075aa3..4cd5d191 100644 --- a/adapter/redis/src/main/kotlin/com/xorker/draw/config/RedisConfig.kt +++ b/adapter/redis/src/main/kotlin/com/xorker/draw/config/RedisConfig.kt @@ -20,9 +20,12 @@ internal class RedisConfig { @Value("\${spring.data.redis.password}") lateinit var password: String + @Value("\${spring.data.redis.port}") + lateinit var port: String + @Bean fun redisConnectionFactory(): RedisConnectionFactory { - val config = RedisStandaloneConfiguration(host, 6379) + val config = RedisStandaloneConfiguration(host, port.toInt()) config.setPassword(password) return LettuceConnectionFactory(config) diff --git a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaPhase.kt b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaPhase.kt index c1e80392..989a0fcd 100644 --- a/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaPhase.kt +++ b/adapter/redis/src/main/kotlin/com/xorker/draw/mafia/dto/RedisMafiaPhase.kt @@ -4,13 +4,11 @@ import com.fasterxml.jackson.annotation.JsonCreator import com.fasterxml.jackson.annotation.JsonProperty import com.xorker.draw.mafia.MafiaPhase import com.xorker.draw.mafia.turn.TurnInfo -import com.xorker.draw.room.RoomId import com.xorker.draw.user.UserId import java.util.* data class RedisMafiaPhase @JsonCreator constructor( @JsonProperty("status") val status: RedisMafiaPhaseStatus, - @JsonProperty("jobKey") val jobKey: String? = null, @JsonProperty("turnList") val turnList: List? = null, @JsonProperty("mafiaPlayer") val mafiaPlayer: RedisMafiaPlayer? = null, @JsonProperty("keyword") val keyword: RedisMafiaKeyword? = null, @@ -63,7 +61,6 @@ fun MafiaPhase.toRedisMafiaPhase(): RedisMafiaPhase { is MafiaPhase.Ready -> RedisMafiaPhase( status = RedisMafiaPhaseStatus.READY, - jobKey = jobKey.value, turnList = turnList.map { player -> RedisMafiaPlayer( id = player.userId.value, @@ -86,7 +83,6 @@ fun MafiaPhase.toRedisMafiaPhase(): RedisMafiaPhase { is MafiaPhase.Playing -> RedisMafiaPhase( status = RedisMafiaPhaseStatus.PLAYING, - jobKey = jobKey.value, turnList = turnList.map { player -> RedisMafiaPlayer( id = player.userId.value, @@ -114,7 +110,6 @@ fun MafiaPhase.toRedisMafiaPhase(): RedisMafiaPhase { is MafiaPhase.Vote -> RedisMafiaPhase( status = RedisMafiaPhaseStatus.VOTE, - jobKey = jobKey.value, turnList = turnList.map { player -> RedisMafiaPlayer( id = player.userId.value, @@ -141,7 +136,6 @@ fun MafiaPhase.toRedisMafiaPhase(): RedisMafiaPhase { is MafiaPhase.InferAnswer -> RedisMafiaPhase( status = RedisMafiaPhaseStatus.INFER_ANSWER, - jobKey = jobKey.value, turnList = turnList.map { player -> RedisMafiaPlayer( id = player.userId.value, @@ -168,7 +162,6 @@ fun MafiaPhase.toRedisMafiaPhase(): RedisMafiaPhase { is MafiaPhase.End -> RedisMafiaPhase( status = RedisMafiaPhaseStatus.END, - jobKey = jobKey.value, turnList = turnList.map { player -> RedisMafiaPlayer( id = player.userId.value, @@ -200,7 +193,6 @@ fun MafiaPhase.toRedisMafiaPhase(): RedisMafiaPhase { fun RedisMafiaPhase.toMafiaPhase(): MafiaPhase = when (status) { RedisMafiaPhaseStatus.WAIT -> MafiaPhase.Wait RedisMafiaPhaseStatus.READY -> MafiaPhase.Ready( - jobKey = RoomId(jobKey!!), turnList = turnList!!.map { player -> player.toPlayer() }, @@ -209,7 +201,6 @@ fun RedisMafiaPhase.toMafiaPhase(): MafiaPhase = when (status) { ) RedisMafiaPhaseStatus.PLAYING -> MafiaPhase.Playing( - jobKey = RoomId(jobKey!!), turnList = turnList!!.map { player -> player.toPlayer() }, @@ -222,7 +213,6 @@ fun RedisMafiaPhase.toMafiaPhase(): MafiaPhase = when (status) { ) RedisMafiaPhaseStatus.VOTE -> MafiaPhase.Vote( - jobKey = RoomId(jobKey!!), turnList = turnList!!.map { player -> player.toPlayer() }, @@ -235,7 +225,6 @@ fun RedisMafiaPhase.toMafiaPhase(): MafiaPhase = when (status) { ) RedisMafiaPhaseStatus.INFER_ANSWER -> MafiaPhase.InferAnswer( - jobKey = RoomId(jobKey!!), turnList = turnList!!.map { player -> player.toPlayer() }, @@ -248,7 +237,6 @@ fun RedisMafiaPhase.toMafiaPhase(): MafiaPhase = when (status) { ) RedisMafiaPhaseStatus.END -> MafiaPhase.End( - jobKey = RoomId(jobKey!!), turnList = turnList!!.map { player -> player.toPlayer() }, diff --git a/adapter/redis/src/main/resources/application-redis.yml b/adapter/redis/src/main/resources/application-redis.yml index e5295dd9..e5844fcb 100644 --- a/adapter/redis/src/main/resources/application-redis.yml +++ b/adapter/redis/src/main/resources/application-redis.yml @@ -1,7 +1,7 @@ spring: data: redis: - port: 6379 + port: ${REDIS_PORT} host: ${REDIS_HOST} - url: jdbc:redis://${REDIS_USER}:${REDIS_PASSWORD}@${REDIS_HOST}:6379 + url: jdbc:redis://${REDIS_USER}:${REDIS_PASSWORD}@${REDIS_HOST}:${REDIS_PORT} password: ${REDIS_PASSWORD} diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaGameMessengerImpl.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaGameMessengerImpl.kt index 87e9fadc..d06415f3 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaGameMessengerImpl.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaGameMessengerImpl.kt @@ -68,7 +68,7 @@ internal class MafiaGameMessengerImpl( val body = MafiaGameTurnInfoBody( phase.round, phase.turn, - timerRepository.getTimerStartTime(roomId)!!, + timerRepository.getTimerStartTime(roomId), phase.turnList[phase.turn].userId, phase.drawData.map { it.second }, ) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaPhaseMessengerImpl.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaPhaseMessengerImpl.kt index 687bb7ac..3158a48e 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaPhaseMessengerImpl.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/message/response/MafiaPhaseMessengerImpl.kt @@ -57,7 +57,7 @@ internal class MafiaPhaseMessengerImpl( is MafiaPhase.Ready -> MafiaPhaseReadyMessage( MafiaPhaseReadyBody( - startTime = timerRepository.getTimerStartTime(room.id)!!, + startTime = timerRepository.getTimerStartTime(room.id), mafiaGameInfo = generateMafiaGameInfoMessage( roomId = room.id, isRandomMatching = room.isRandomMatching, @@ -73,7 +73,7 @@ internal class MafiaPhaseMessengerImpl( MafiaPhasePlayingBody( round = phase.round, turn = phase.turn, - startTurnTime = timerRepository.getTimerStartTime(room.id)!!, + startTurnTime = timerRepository.getTimerStartTime(room.id), draw = phase.getDraw(), currentDraw = phase.getCurrentDraw(), mafiaGameInfo = generateMafiaGameInfoMessage( @@ -89,7 +89,7 @@ internal class MafiaPhaseMessengerImpl( is MafiaPhase.Vote -> MafiaPhaseVoteMessage( MafiaPhaseVoteBody( - startTime = timerRepository.getTimerStartTime(room.id)!!, + startTime = timerRepository.getTimerStartTime(room.id), mafiaGameInfo = if (isOrigin.not()) { generateMafiaGameInfoMessage( roomId = room.id, @@ -109,7 +109,7 @@ internal class MafiaPhaseMessengerImpl( is MafiaPhase.InferAnswer -> MafiaPhaseInferAnswerMessage( MafiaPhaseInferAnswerBody( - startTime = timerRepository.getTimerStartTime(room.id)!!, + startTime = timerRepository.getTimerStartTime(room.id), mafiaGameInfo = if (isOrigin.not()) { generateMafiaGameInfoMessage( roomId = room.id, @@ -129,7 +129,7 @@ internal class MafiaPhaseMessengerImpl( is MafiaPhase.End -> MafiaPhaseEndMessage( MafiaPhaseEndBody( - startTime = timerRepository.getTimerStartTime(room.id)!!, + startTime = timerRepository.getTimerStartTime(room.id), mafiaGameInfo = if (isOrigin.not()) { generateMafiaGameInfoMessage( roomId = room.id, diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameService.kt b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameService.kt index 356ae0a8..baa8455d 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameService.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameService.kt @@ -56,7 +56,9 @@ internal class MafiaGameService( val phase = gameInfo.phase assertTurn(phase, session.user.id) - timerRepository.cancelTimer(phase.jobKey) + val room = gameInfo.room + + timerRepository.cancelTimer(room.id) mafiaPhasePlayGameProcessor.processNextTurn(gameInfo) { mafiaPhaseService.vote(gameInfo.room.id) @@ -97,7 +99,9 @@ internal class MafiaGameService( phase.answer = answer - timerRepository.cancelTimer(phase.jobKey) + val room = gameInfo.room + + timerRepository.cancelTimer(room.id) mafiaPhaseInferAnswerProcessor.processInferAnswer(gameInfo) { mafiaPhaseService.endGame(gameInfo.room.id) diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseStartGameProcessor.kt b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseStartGameProcessor.kt index f5a3b6ed..53ffdb76 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseStartGameProcessor.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/phase/MafiaPhaseStartGameProcessor.kt @@ -29,7 +29,6 @@ internal class MafiaPhaseStartGameProcessor( timerRepository.startTimer(room.id, gameOption.readyTime, nextStep) val phase = MafiaPhase.Ready( - jobKey = room.id, turnList = turnList, mafiaPlayer = players[mafiaIndex], keyword = keyword, diff --git a/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaPhase.kt b/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaPhase.kt index 33a27870..6a16d188 100644 --- a/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaPhase.kt +++ b/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaPhase.kt @@ -2,9 +2,8 @@ package com.xorker.draw.mafia import com.xorker.draw.exception.InvalidMafiaPhaseException import com.xorker.draw.mafia.turn.TurnInfo -import com.xorker.draw.room.RoomId import com.xorker.draw.user.UserId -import java.util.Vector +import java.util.* import kotlin.contracts.ExperimentalContracts import kotlin.contracts.contract @@ -13,14 +12,12 @@ sealed class MafiaPhase { data object Wait : MafiaPhase() data class Ready( - override val jobKey: RoomId, override val turnList: List, val mafiaPlayer: MafiaPlayer, val keyword: MafiaKeyword, ) : MafiaPhase(), MafiaPhaseWithTurnList, MafiaPhaseWithTimer { fun toPlaying(): Playing { return Playing( - jobKey = jobKey, turnList = turnList, mafiaPlayer = mafiaPlayer, keyword = keyword, @@ -30,7 +27,6 @@ sealed class MafiaPhase { } class Playing( - override val jobKey: RoomId, override val turnList: List, val mafiaPlayer: MafiaPlayer, val keyword: MafiaKeyword, @@ -49,7 +45,6 @@ sealed class MafiaPhase { players[player.userId] = Vector() } return Vote( - jobKey = jobKey, mafiaPlayer = mafiaPlayer, keyword = keyword, drawData = drawData, @@ -89,7 +84,6 @@ sealed class MafiaPhase { } data class Vote( - override val jobKey: RoomId, override val turnList: List, val mafiaPlayer: MafiaPlayer, val keyword: MafiaKeyword, @@ -98,7 +92,6 @@ sealed class MafiaPhase { ) : MafiaPhase(), MafiaPhaseWithTurnList, MafiaPhaseWithTimer { fun toInferAnswer(): InferAnswer { return InferAnswer( - jobKey = jobKey, turnList = turnList, mafiaPlayer = mafiaPlayer, keyword = keyword, @@ -108,7 +101,6 @@ sealed class MafiaPhase { fun toEnd(): End { return End( - jobKey = jobKey, turnList = turnList, mafiaPlayer = mafiaPlayer, keyword = keyword, @@ -119,7 +111,6 @@ sealed class MafiaPhase { } class InferAnswer( - override val jobKey: RoomId, override val turnList: List, val mafiaPlayer: MafiaPlayer, val keyword: MafiaKeyword, @@ -128,7 +119,6 @@ sealed class MafiaPhase { ) : MafiaPhase(), MafiaPhaseWithTurnList, MafiaPhaseWithTimer { fun toEnd(): End { return End( - jobKey = jobKey, turnList = turnList, mafiaPlayer = mafiaPlayer, keyword = keyword, @@ -139,7 +129,6 @@ sealed class MafiaPhase { } class End( - override val jobKey: RoomId, override val turnList: List, val mafiaPlayer: MafiaPlayer, val keyword: MafiaKeyword, @@ -161,9 +150,7 @@ interface MafiaPhaseWithTurnList { } } -interface MafiaPhaseWithTimer { - val jobKey: RoomId -} +interface MafiaPhaseWithTimer @OptIn(ExperimentalContracts::class) inline fun assertIs(phase: MafiaPhase) { diff --git a/domain/src/main/kotlin/com/xorker/draw/timer/TimerRepository.kt b/domain/src/main/kotlin/com/xorker/draw/timer/TimerRepository.kt index 040c2dc6..bc364630 100644 --- a/domain/src/main/kotlin/com/xorker/draw/timer/TimerRepository.kt +++ b/domain/src/main/kotlin/com/xorker/draw/timer/TimerRepository.kt @@ -8,5 +8,5 @@ import java.time.LocalDateTime interface TimerRepository { fun startTimer(roomId: RoomId, interval: Duration, callback: () -> Unit): JobWithStartTime fun cancelTimer(roomId: RoomId) - fun getTimerStartTime(roomId: RoomId): LocalDateTime? + fun getTimerStartTime(roomId: RoomId): LocalDateTime } From c83bcc842547aadc3850c65bd05a6a6f6b4ccc3f Mon Sep 17 00:00:00 2001 From: sunwoong Date: Fri, 27 Sep 2024 16:06:44 +0900 Subject: [PATCH 38/40] DRAW-287 fix: merge conflict --- .../main/kotlin/com/xorker/draw/mafia/MafiaGameRepository.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRepository.kt b/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRepository.kt index 931753c0..6b5dcc00 100644 --- a/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRepository.kt +++ b/domain/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRepository.kt @@ -6,7 +6,7 @@ import com.xorker.draw.user.UserId interface MafiaGameRepository { fun saveGameInfo(gameInfo: MafiaGameInfo) fun removeGameInfo(gameInfo: MafiaGameInfo) - fun getGameInfo(roomId: RoomId?): MafiaGameInfo? + fun getGameInfo(roomId: RoomId): MafiaGameInfo? fun getGameInfo(userId: UserId): MafiaGameInfo? fun removePlayer(userId: UserId) } From d3d104502329e08ee92329e756445ccf0c9507c3 Mon Sep 17 00:00:00 2001 From: sunwoong Date: Fri, 27 Sep 2024 17:40:35 +0900 Subject: [PATCH 39/40] =?UTF-8?q?DRAW-334=20refactor:=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xorker/draw/websocket/session/PingManager.kt | 16 ++++++++++++---- .../com/xorker/draw/websocket/session/Session.kt | 3 ++- .../draw/websocket/session/SessionManager.kt | 8 ++++---- .../draw/websocket/session/SessionWrapper.kt | 3 ++- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/PingManager.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/PingManager.kt index 51493450..638eca6e 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/PingManager.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/PingManager.kt @@ -2,6 +2,8 @@ package com.xorker.draw.websocket.session import com.xorker.draw.websocket.SessionEventListener import com.xorker.draw.websocket.WaitingQueueUseCase +import java.time.Duration +import java.time.LocalDateTime import java.util.concurrent.TimeUnit import org.springframework.scheduling.annotation.Scheduled import org.springframework.stereotype.Component @@ -13,12 +15,16 @@ internal class PingManager( private val sessionEventListener: List, ) { - @Scheduled(fixedRate = 3000, timeUnit = TimeUnit.MILLISECONDS) + @Scheduled(fixedRate = 1000, timeUnit = TimeUnit.MILLISECONDS) fun checkSessionStatus() { val sessions = sessionManager.getSessions() + val now = LocalDateTime.now() + sessions.forEach { session -> - if (session.ping.not()) { + val delay = Duration.between(session.ping, now).toSeconds() + + if (delay > ALLOWED_DELAY_TIME) { val user = session.user sessionManager.unregisterSession(session.id) @@ -28,9 +34,11 @@ internal class PingManager( sessionEventListener.forEach { it.exitSession(user.id) } - } else { - session.ping = false } } } + + companion object { + private const val ALLOWED_DELAY_TIME = 2 + } } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt index d6353165..0963cd1b 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/Session.kt @@ -1,6 +1,7 @@ package com.xorker.draw.websocket.session import com.xorker.draw.user.User +import java.time.LocalDateTime @JvmInline value class SessionId(val value: String) @@ -9,7 +10,7 @@ interface Session { val id: SessionId val user: User val locale: String - var ping: Boolean + var ping: LocalDateTime fun send(message: String) } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt index aa39309b..ed42210f 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt @@ -1,6 +1,8 @@ package com.xorker.draw.websocket.session +import com.xorker.draw.exception.UnSupportedException import com.xorker.draw.user.UserId +import java.time.LocalDateTime import java.util.concurrent.ConcurrentHashMap import org.springframework.stereotype.Component @@ -39,10 +41,8 @@ internal class SessionManager { } fun setPing(sessionId: SessionId) { - val session = sessionMap[sessionId] + val session = sessionMap[sessionId] ?: throw UnSupportedException - session?.let { - session.ping = true - } + session.ping = LocalDateTime.now() } } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt index 74706ab1..f259ad06 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionWrapper.kt @@ -1,6 +1,7 @@ package com.xorker.draw.websocket.session import com.xorker.draw.user.User +import java.time.LocalDateTime import org.springframework.web.socket.TextMessage import org.springframework.web.socket.WebSocketSession @@ -10,7 +11,7 @@ internal class SessionWrapper( override val locale: String, ) : Session { override val id: SessionId = SessionId(session.id) - override var ping: Boolean = true + override var ping: LocalDateTime = LocalDateTime.now() override fun send(message: String) { synchronized(session) { From 44066b8d17f49f064c715cdfc6829610c8ae7a59 Mon Sep 17 00:00:00 2001 From: sunwoong Date: Fri, 27 Sep 2024 18:07:25 +0900 Subject: [PATCH 40/40] =?UTF-8?q?DRAW-334=20refactor:=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xorker/draw/websocket/MainWebSocketHandler.kt | 4 +--- .../com/xorker/draw/websocket/WebSocketController.kt | 1 + .../com/xorker/draw/websocket/session/PingManager.kt | 10 ++++------ .../draw/mafia/MafiaGameRandomMatchingService.kt | 1 - .../draw/{websocket => mafia}/WaitingQueueUseCase.kt | 2 +- .../xorker/draw/websocket/SessionEventListener.kt | 12 ------------ 6 files changed, 7 insertions(+), 23 deletions(-) rename core/src/main/kotlin/com/xorker/draw/{websocket => mafia}/WaitingQueueUseCase.kt (82%) delete mode 100644 core/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt index 9e2034b1..972bac4d 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/MainWebSocketHandler.kt @@ -2,7 +2,7 @@ package com.xorker.draw.websocket import com.xorker.draw.exception.XorkerException import com.xorker.draw.mafia.UserConnectionUseCase -import com.xorker.draw.support.logging.logger +import com.xorker.draw.mafia.WaitingQueueUseCase import com.xorker.draw.websocket.exception.WebSocketExceptionHandler import com.xorker.draw.websocket.log.WebSocketLogger import com.xorker.draw.websocket.message.request.WebSocketRequestParser @@ -25,8 +25,6 @@ internal class MainWebSocketHandler( private val userConnectionUseCase: UserConnectionUseCase, ) : TextWebSocketHandler() { - private val logger = logger() - override fun afterConnectionEstablished(session: WebSocketSession) { webSocketLogger.handshake(session) } diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt index 7653015a..141f3232 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/WebSocketController.kt @@ -7,6 +7,7 @@ import com.xorker.draw.exception.NotFoundRoomException import com.xorker.draw.mafia.MafiaGameUseCase import com.xorker.draw.mafia.MafiaPhase import com.xorker.draw.mafia.UserConnectionUseCase +import com.xorker.draw.mafia.WaitingQueueUseCase import com.xorker.draw.room.RoomId import com.xorker.draw.websocket.message.request.mafia.MafiaGameRandomMatchingRequest import com.xorker.draw.websocket.message.request.mafia.SessionInitializeRequest diff --git a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/PingManager.kt b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/PingManager.kt index 638eca6e..1f88491f 100644 --- a/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/PingManager.kt +++ b/app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/PingManager.kt @@ -1,7 +1,7 @@ package com.xorker.draw.websocket.session -import com.xorker.draw.websocket.SessionEventListener -import com.xorker.draw.websocket.WaitingQueueUseCase +import com.xorker.draw.mafia.UserConnectionUseCase +import com.xorker.draw.mafia.WaitingQueueUseCase import java.time.Duration import java.time.LocalDateTime import java.util.concurrent.TimeUnit @@ -12,7 +12,7 @@ import org.springframework.stereotype.Component internal class PingManager( private val sessionManager: SessionManager, private val waitingQueueUseCase: WaitingQueueUseCase, - private val sessionEventListener: List, + private val userConnectionUseCase: UserConnectionUseCase, ) { @Scheduled(fixedRate = 1000, timeUnit = TimeUnit.MILLISECONDS) @@ -31,9 +31,7 @@ internal class PingManager( waitingQueueUseCase.remove(user, session.locale) - sessionEventListener.forEach { - it.exitSession(user.id) - } + userConnectionUseCase.exitUser(user) } } } diff --git a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt index bd21ca44..f44087b4 100644 --- a/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/MafiaGameRandomMatchingService.kt @@ -4,7 +4,6 @@ import com.xorker.draw.exception.InvalidRequestOtherPlayingException import com.xorker.draw.mafia.phase.MafiaPhaseUseCase import com.xorker.draw.notification.PushMessageUseCase import com.xorker.draw.user.User -import com.xorker.draw.websocket.WaitingQueueUseCase import org.springframework.stereotype.Service @Service diff --git a/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueUseCase.kt b/core/src/main/kotlin/com/xorker/draw/mafia/WaitingQueueUseCase.kt similarity index 82% rename from core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueUseCase.kt rename to core/src/main/kotlin/com/xorker/draw/mafia/WaitingQueueUseCase.kt index f8235a13..303b2f12 100644 --- a/core/src/main/kotlin/com/xorker/draw/websocket/WaitingQueueUseCase.kt +++ b/core/src/main/kotlin/com/xorker/draw/mafia/WaitingQueueUseCase.kt @@ -1,4 +1,4 @@ -package com.xorker.draw.websocket +package com.xorker.draw.mafia import com.xorker.draw.user.User diff --git a/core/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt b/core/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt deleted file mode 100644 index 3bf3d695..00000000 --- a/core/src/main/kotlin/com/xorker/draw/websocket/SessionEventListener.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.xorker.draw.websocket - -import com.xorker.draw.room.RoomId -import com.xorker.draw.user.User -import com.xorker.draw.user.UserId - -interface SessionEventListener { - fun connectSession(userId: UserId, roomId: RoomId, nickname: String, locale: String) - fun connectSession(user: User, roomId: RoomId, locale: String) - fun disconnectSession(userId: UserId) - fun exitSession(userId: UserId) -}