Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Socket: πŸ”§ The server sends a success message after a chat message is saved successfully #214

Merged
merged 5 commits into from
Jan 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import kr.co.pennyway.domain.domains.message.type.MessageContentType;
import kr.co.pennyway.socket.common.constants.SystemMessageConstants;

import java.util.Map;

/**
* μ±„νŒ… λ©”μ‹œμ§€ 전솑을 μœ„ν•œ Command 클래슀
*/
Expand All @@ -12,7 +14,9 @@ public record SendMessageCommand(
String content,
MessageContentType contentType,
MessageCategoryType categoryType,
long senderId
long senderId,
String senderName,
Map<String, Object> messageIdHeader
) {
public SendMessageCommand {
if (chatRoomId <= 0) {
Expand Down Expand Up @@ -45,26 +49,32 @@ public static SendMessageCommand createSystemMessage(long chatRoomId, String con
content,
MessageContentType.TEXT,
MessageCategoryType.SYSTEM,
SystemMessageConstants.SYSTEM_SENDER_ID
SystemMessageConstants.SYSTEM_SENDER_ID,
null,
null
);
}

/**
* μ‚¬μš©μž λ©”μ‹œμ§€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
*
* @param chatRoomId long : μ±„νŒ…λ°© 아이디
* @param content String : λ©”μ‹œμ§€ λ‚΄μš©
* @param contentType {@link MessageContentType} : λ©”μ‹œμ§€ νƒ€μž…
* @param senderId long : λ°œμ‹ μž 아이디
* @param chatRoomId long : μ±„νŒ…λ°© 아이디
* @param content String : λ©”μ‹œμ§€ λ‚΄μš©
* @param contentType {@link MessageContentType} : λ©”μ‹œμ§€ νƒ€μž…
* @param senderId long : λ°œμ‹ μž 아이디
* @param senderName String : λ°œμ‹ μž 이름
* @param messageIdHeader Map<String, String> : `x-message-id` 헀더. null일 경우 성곡 λ©”μ‹œμ§€λ₯Ό λ°˜ν™˜ν•˜μ§€ μ•ŠμŒ.
* @return {@link MessageCategoryType#NORMAL}둜 μƒμ„±λœ SendMessageCommand
*/
public static SendMessageCommand createUserMessage(long chatRoomId, String content, MessageContentType contentType, long senderId) {
public static SendMessageCommand createUserMessage(long chatRoomId, String content, MessageContentType contentType, long senderId, String senderName, Map<String, Object> messageIdHeader) {
return new SendMessageCommand(
chatRoomId,
content,
contentType,
MessageCategoryType.NORMAL,
senderId
senderId,
senderName,
messageIdHeader
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import kr.co.pennyway.socket.common.security.authenticate.UserPrincipal
import kr.co.pennyway.socket.service.ChatMessageSendService
import kr.co.pennyway.socket.service.LastMessageIdSaveService
import org.springframework.messaging.handler.annotation.DestinationVariable
import org.springframework.messaging.handler.annotation.Header
import org.springframework.messaging.handler.annotation.MessageMapping
import org.springframework.stereotype.Controller
import org.springframework.validation.annotation.Validated
Expand All @@ -26,14 +27,17 @@ class ChatMessageController(
fun sendMessage(
@DestinationVariable chatRoomId: Long,
@Validated payload: ChatMessageDto.Request,
principal: UserPrincipal
principal: UserPrincipal,
@Header("x-message-id") messageId: String?
) {
chatMessageSendService.execute(
SendMessageCommand.createUserMessage(
chatRoomId,
payload.content(),
payload.contentType(),
principal.userId
principal.userId,
principal.name,
messageId?.let { mapOf("x-message-id" to it) }
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import kr.co.pennyway.infra.common.properties.ChatExchangeProperties
import kr.co.pennyway.socket.command.SendMessageCommand
import kr.co.pennyway.socket.common.dto.ChatMessageDto
import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.messaging.simp.SimpMessagingTemplate
import org.springframework.stereotype.Component

@Component
Expand All @@ -16,28 +17,42 @@ class ChatMessageSendService(
private val chatMessageService: ChatMessageService,
private val messageBrokerAdapter: MessageBrokerAdapter,
private val idGenerator: IdGenerator<Long>,
private val chatExchangeProperties: ChatExchangeProperties
private val chatExchangeProperties: ChatExchangeProperties,
private val simpMessagingTemplate: SimpMessagingTemplate
) {
/**
* μ±„νŒ… λ©”μ‹œμ§€λ₯Ό μ „μ†‘ν•œλ‹€.
*
* @param command SendMessageCommand : μ±„νŒ… λ©”μ‹œμ§€ 전솑을 μœ„ν•œ Command
*/
fun execute(command: SendMessageCommand) {
val message = ChatMessageBuilder.builder()
.chatRoomId(command.chatRoomId())
.chatId(idGenerator.generate())
.content(command.content())
.contentType(command.contentType())
.categoryType(command.categoryType())
.sender(command.senderId())
.build()
val message = command.toChatMessage(command)
.let { chatMessageService.create(it) }

messageBrokerAdapter.convertAndSend(
chatExchangeProperties.exchange,
"chat.room.${command.chatRoomId()}",
ChatMessageDto.Response.from(message)
)
with(chatExchangeProperties) {
messageBrokerAdapter.convertAndSend(
exchange,
"chat.room.${command.chatRoomId}",
ChatMessageDto.Response.from(message)
)
}

command.senderName.takeIf { it.isNotBlank() }?.let { senderName ->
simpMessagingTemplate.convertAndSendToUser(
senderName,
"/queue/success",
Unit,
command.messageIdHeader()
)
}
}

private fun SendMessageCommand.toChatMessage(command: SendMessageCommand) = ChatMessageBuilder.builder()
.chatRoomId(command.chatRoomId())
.chatId(idGenerator.generate())
.content(command.content())
.contentType(command.contentType())
.categoryType(command.categoryType())
.sender(command.senderId())
.build()
}
Loading