diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index 5047d3a..8c89c67 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -1,6 +1,7 @@ dependencies { compileOnly("org.springframework:spring-tx") compileOnly("org.springframework:spring-context") + compileOnly("org.springframework.boot:spring-boot-starter-websocket") testImplementation(project(":storage")) testImplementation(project(path = ":storage", configuration = "testArtifacts")) diff --git a/domain/src/main/kotlin/gloddy/groupChat/GroupChat.kt b/domain/src/main/kotlin/gloddy/groupChat/GroupChat.kt index 9b6adc6..72d8509 100644 --- a/domain/src/main/kotlin/gloddy/groupChat/GroupChat.kt +++ b/domain/src/main/kotlin/gloddy/groupChat/GroupChat.kt @@ -7,8 +7,8 @@ import gloddy.groupChat.vo.GroupChatMessageImage import gloddy.groupChat.vo.MessageType import gloddy.util.UUIDGenerator import java.time.LocalDateTime -import java.time.LocalDateTime.* -import java.util.UUID +import java.time.LocalDateTime.now +import java.util.* data class GroupChat( val hostId: Long, @@ -51,6 +51,7 @@ data class GroupChat( this.events.add( GroupChatMessageEvent( userId = userId, + chatId = this.id, eventType = GroupChatMessageEventType.CREATE, groupChatMessageId = groupChatMessage.id, eventDateTime = groupChatMessage.createdAt @@ -76,6 +77,7 @@ data class GroupChat( this.events.add( GroupChatMessageEvent( userId = userId, + chatId = this.id, eventType = GroupChatMessageEventType.CREATE, groupChatMessageId = groupChatMessage.id, eventDateTime = groupChatMessage.createdAt @@ -86,14 +88,13 @@ data class GroupChat( fun deleteUserMessage(userId: Long, groupChatMessage: GroupChatMessage): GroupChatMessageDeleteResult { val deletedGroupChatMessage = groupChatMessage.delete(userId) - this.events.add( - GroupChatMessageEvent( - userId = userId, - eventType = GroupChatMessageEventType.DELETE, - groupChatMessageId = groupChatMessage.id, - eventDateTime = deletedGroupChatMessage.deletedAt!! - ) - ) + this.events.add(GroupChatMessageEvent( + userId = userId, + chatId = this.id, + eventType = GroupChatMessageEventType.DELETE, + groupChatMessageId = groupChatMessage.id, + eventDateTime = deletedGroupChatMessage.deletedAt!! + )) return GroupChatMessageDeleteResult( groupChat = this, groupChatMessage = deletedGroupChatMessage diff --git a/domain/src/main/kotlin/gloddy/groupChat/event/GroupChatMessageEvent.kt b/domain/src/main/kotlin/gloddy/groupChat/event/GroupChatMessageEvent.kt index 281f9b3..9d8ad3a 100644 --- a/domain/src/main/kotlin/gloddy/groupChat/event/GroupChatMessageEvent.kt +++ b/domain/src/main/kotlin/gloddy/groupChat/event/GroupChatMessageEvent.kt @@ -5,6 +5,7 @@ import java.util.UUID data class GroupChatMessageEvent( val userId: Long, + val chatId: UUID, val eventType: GroupChatMessageEventType, val groupChatMessageId: UUID, val eventDateTime: LocalDateTime diff --git a/domain/src/main/kotlin/gloddy/groupChat/service/GroupChatMessageCommander.kt b/domain/src/main/kotlin/gloddy/groupChat/service/GroupChatMessageCommander.kt new file mode 100644 index 0000000..ce6bcc1 --- /dev/null +++ b/domain/src/main/kotlin/gloddy/groupChat/service/GroupChatMessageCommander.kt @@ -0,0 +1,16 @@ +package gloddy.groupChat.service + +import gloddy.groupChat.event.GroupChatMessageEvent +import gloddy.groupChat.repository.GroupChatCommandRepository +import org.springframework.messaging.simp.SimpMessageSendingOperations + +class GroupChatMessageCommander( + private val simpMessageSendingOperations: SimpMessageSendingOperations, + private val groupChatCommandRepository: GroupChatCommandRepository +) { + + fun broadcastMessage(groupChatMessageEvent: GroupChatMessageEvent) { + val foundMessage = groupChatCommandRepository.findGroupChatMessageById(groupChatMessageEvent.groupChatMessageId) + simpMessageSendingOperations.convertAndSend("sub/channel/" + groupChatMessageEvent.chatId, foundMessage) + } +} \ No newline at end of file diff --git a/domain/src/test/kotlin/gloddy/groupChat/GroupChatCreateMessageTest.kt b/domain/src/test/kotlin/gloddy/groupChat/GroupChatCreateMessageTest.kt index ca2dcbc..6c485b8 100644 --- a/domain/src/test/kotlin/gloddy/groupChat/GroupChatCreateMessageTest.kt +++ b/domain/src/test/kotlin/gloddy/groupChat/GroupChatCreateMessageTest.kt @@ -58,6 +58,7 @@ class GroupChatCreateMessageTest : GroupChatServiceTest() { it.contains( GroupChatMessageEvent( userId = groupChatMessage.userId, + chatId = groupChat.id, eventType = GroupChatMessageEventType.CREATE, groupChatMessageId = groupChatMessage.id, eventDateTime = groupChatMessage.createdAt @@ -104,6 +105,7 @@ class GroupChatCreateMessageTest : GroupChatServiceTest() { it.contains( GroupChatMessageEvent( userId = groupChatMessage.userId, + chatId = groupChat.id, eventType = GroupChatMessageEventType.CREATE, groupChatMessageId = groupChatMessage.id, eventDateTime = groupChatMessage.createdAt diff --git a/domain/src/test/kotlin/gloddy/groupChat/GroupChatDeleteMessageTest.kt b/domain/src/test/kotlin/gloddy/groupChat/GroupChatDeleteMessageTest.kt index f82f320..fa941ed 100644 --- a/domain/src/test/kotlin/gloddy/groupChat/GroupChatDeleteMessageTest.kt +++ b/domain/src/test/kotlin/gloddy/groupChat/GroupChatDeleteMessageTest.kt @@ -66,6 +66,7 @@ class GroupChatDeleteMessageTest : GroupChatServiceTest() { it.contains( GroupChatMessageEvent( userId = groupChatMessage.userId, + chatId = groupChat.id, eventType = GroupChatMessageEventType.DELETE, groupChatMessageId = groupChatMessage.id, eventDateTime = groupChatMessage.deletedAt!! diff --git a/in-message/src/main/kotlin/gloddy/hanlder/InPayloadHandler.kt b/in-message/src/main/kotlin/gloddy/hanlder/InPayloadHandler.kt index cecc4d7..0cd3585 100644 --- a/in-message/src/main/kotlin/gloddy/hanlder/InPayloadHandler.kt +++ b/in-message/src/main/kotlin/gloddy/hanlder/InPayloadHandler.kt @@ -3,33 +3,37 @@ package gloddy.hanlder import gloddy.groupChat.dto.command.GroupChatCreateCommand import gloddy.groupChat.dto.command.GroupChatJoinCommand import gloddy.groupChat.service.GroupChatCommander +import gloddy.groupChat.service.GroupChatMessageCommander +import gloddy.hanlder.mapper.toDomainEvent import gloddy.internal.apply.ApplyRepository import gloddy.internal.group.GroupRepository import gloddy.payload.apply.ApplyPayload import gloddy.payload.apply.ApplyPayloadType +import gloddy.payload.chatMessage.GroupChatMessagePayload import gloddy.payload.group.GroupPayload import gloddy.payload.group.GroupPayloadType import org.springframework.stereotype.Component @Component class InPayloadHandler( - private val applyRepository: ApplyRepository, - private val groupRepository: GroupRepository, - private val groupChatCommander: GroupChatCommander, + private val applyRepository: ApplyRepository, + private val groupRepository: GroupRepository, + private val groupChatMessageCommander: GroupChatMessageCommander, + private val groupChatCommander: GroupChatCommander, ) { fun handle(payload: GroupPayload) { when (payload.eventType) { GroupPayloadType.CREATE_GROUP -> { groupRepository.findById(payload.groupId) - .let { - groupChatCommander.createGroupChat( - GroupChatCreateCommand( - userId = it.captainId, - groupId = payload.groupId + .let { + groupChatCommander.createGroupChat( + GroupChatCreateCommand( + userId = it.captainId, + groupId = payload.groupId + ) ) - ) - } + } } } } @@ -38,17 +42,22 @@ class InPayloadHandler( when (payload.eventType) { ApplyPayloadType.APPLY_APPROVE -> { applyRepository.findById(payload.applyId) - .let { - groupChatCommander.join( - GroupChatJoinCommand( - groupId = it.groupId, - userId = it.applyUserId + .let { + groupChatCommander.join( + GroupChatJoinCommand( + groupId = it.groupId, + userId = it.applyUserId + ) ) - ) - } + } } else -> return } } + + fun handle(payload: GroupChatMessagePayload){ + val groupChatMessageEvent = payload.toDomainEvent() + groupChatMessageCommander.broadcastMessage(groupChatMessageEvent) + } } \ No newline at end of file diff --git a/in-message/src/main/kotlin/gloddy/hanlder/mapper/ApplicationEventMapper.kt b/in-message/src/main/kotlin/gloddy/hanlder/mapper/ApplicationEventMapper.kt new file mode 100644 index 0000000..0a64018 --- /dev/null +++ b/in-message/src/main/kotlin/gloddy/hanlder/mapper/ApplicationEventMapper.kt @@ -0,0 +1,20 @@ +package gloddy.hanlder.mapper + +import gloddy.groupChat.event.GroupChatMessageEvent +import gloddy.groupChat.event.GroupChatMessageEventType +import gloddy.payload.chatMessage.GroupChatMessagePayload +import gloddy.payload.chatMessage.GroupChatMessagePayloadType + +fun GroupChatMessagePayload.toDomainEvent() : GroupChatMessageEvent = + GroupChatMessageEvent( + userId = this.userId, + chatId = this.chatId, + eventType = this.eventType.toDomainEventType(), + groupChatMessageId = this.groupChatMessageId, + eventDateTime = this.eventDateTime + ) + +private fun GroupChatMessagePayloadType.toDomainEventType() : GroupChatMessageEventType = + when(this){ + GroupChatMessagePayloadType.CREATE -> GroupChatMessageEventType.CREATE + } \ No newline at end of file diff --git a/in-message/src/main/kotlin/gloddy/payload/chatMessage/GroupChatMessagePayload.kt b/in-message/src/main/kotlin/gloddy/payload/chatMessage/GroupChatMessagePayload.kt new file mode 100644 index 0000000..ca237e6 --- /dev/null +++ b/in-message/src/main/kotlin/gloddy/payload/chatMessage/GroupChatMessagePayload.kt @@ -0,0 +1,14 @@ +package gloddy.payload.chatMessage + +import gloddy.groupChat.event.GroupChatMessageEventType +import gloddy.payload.apply.ApplyPayloadType +import java.time.LocalDateTime +import java.util.* + +data class GroupChatMessagePayload( + val userId: Long, + val chatId: UUID, + val eventType: GroupChatMessagePayloadType, + val groupChatMessageId: UUID, + val eventDateTime: LocalDateTime +) \ No newline at end of file diff --git a/in-message/src/main/kotlin/gloddy/payload/chatMessage/GroupChatMessagePayloadType.kt b/in-message/src/main/kotlin/gloddy/payload/chatMessage/GroupChatMessagePayloadType.kt new file mode 100644 index 0000000..51f40ee --- /dev/null +++ b/in-message/src/main/kotlin/gloddy/payload/chatMessage/GroupChatMessagePayloadType.kt @@ -0,0 +1,5 @@ +package gloddy.payload.chatMessage + +enum class GroupChatMessagePayloadType { + CREATE +} \ No newline at end of file diff --git a/in-message/src/main/kotlin/gloddy/sqs/listner/SqsHandler.kt b/in-message/src/main/kotlin/gloddy/sqs/listner/SqsHandler.kt index 1cfbee9..719e7b1 100644 --- a/in-message/src/main/kotlin/gloddy/sqs/listner/SqsHandler.kt +++ b/in-message/src/main/kotlin/gloddy/sqs/listner/SqsHandler.kt @@ -7,7 +7,7 @@ import org.springframework.stereotype.Component @Component class SqsHandler( - private val inPayloadHandler: InPayloadHandler, + private val inPayloadHandler: InPayloadHandler, ) { @SqsListener(value = ["\${sqs.queue.group}"]) @@ -21,4 +21,10 @@ class SqsHandler( val applyPayload = MessageParser.parseApplyEvent(message) inPayloadHandler.handle(applyPayload) } + + @SqsListener(value = ["\${sqs.queue.message-create}"]) + fun handleChatMessageEvent(message: String) { + val groupChatMessagePayload = MessageParser.parseChatMessageEvent(message) + inPayloadHandler.handle(groupChatMessagePayload) + } } \ No newline at end of file diff --git a/in-message/src/main/kotlin/gloddy/sqs/util/MessageParser.kt b/in-message/src/main/kotlin/gloddy/sqs/util/MessageParser.kt index 48ededa..cefd086 100644 --- a/in-message/src/main/kotlin/gloddy/sqs/util/MessageParser.kt +++ b/in-message/src/main/kotlin/gloddy/sqs/util/MessageParser.kt @@ -3,6 +3,7 @@ package gloddy.sqs.util import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import gloddy.payload.apply.ApplyPayload +import gloddy.payload.chatMessage.GroupChatMessagePayload import gloddy.payload.group.GroupPayload class MessageParser { @@ -20,6 +21,11 @@ class MessageParser { return objectMapper.readValue(payload, GroupPayload::class.java) } + fun parseChatMessageEvent(message: String): GroupChatMessagePayload { + val payload = parsePayloadFromMessage(message) + return objectMapper.readValue(payload, GroupChatMessagePayload::class.java) + } + private fun parsePayloadFromMessage(message: String): String { val outerMessage: Map = objectMapper.readValue(message, Map::class.java) as Map