diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/chat/room/service/ChatRoomService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/chat/room/service/ChatRoomService.kt index 55d58bb..35b2ed8 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/chat/room/service/ChatRoomService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/chat/room/service/ChatRoomService.kt @@ -48,6 +48,7 @@ class ChatRoomService( private val characterService: ChatCharacterService, private val characterImageService: CharacterImageService, private val canPaymentService: kr.co.vividnext.sodalive.can.payment.CanPaymentService, + private val imageCloudFront: kr.co.vividnext.sodalive.aws.cloudfront.ImageContentCloudFront, @Value("\${weraser.api-key}") private val apiKey: String, @@ -332,40 +333,7 @@ class ChatRoomService( } val messagesAsc = fetched.sortedBy { it.createdAt } - val items = messagesAsc.map { msg -> - val sender = msg.participant - val profilePath = when (sender.participantType) { - ParticipantType.USER -> sender.member?.profileImage - ParticipantType.CHARACTER -> sender.character?.imagePath - } - val senderImageUrl = "$imageHost/${profilePath ?: "profile/default-profile.png"}" - val createdAtMillis = msg.createdAt?.atZone(ZoneId.systemDefault())?.toInstant()?.toEpochMilli() - ?: 0L - ChatMessageItemDto( - messageId = msg.id!!, - message = msg.message, - profileImageUrl = senderImageUrl, - mine = sender.member?.id == member.id, - createdAt = createdAtMillis, - messageType = msg.messageType.name, - imageUrl = msg.imagePath?.let { "$imageHost/$it" }, - price = msg.price, - hasAccess = if (msg.messageType == ChatMessageType.IMAGE) { - if (msg.price == null) { - true - } else { - msg.characterImage?.id?.let { - characterImageService.isOwnedImageByMember( - it, - member.id!! - ) - } ?: true - } - } else { - true - } - ) - } + val items = messagesAsc.map { toChatMessageItemDto(it, member) } return ChatRoomEnterResponse( roomId = room.id!!, @@ -512,40 +480,7 @@ class ChatRoomService( // createdAt 오름차순으로 정렬하여 반환 val messagesAsc = fetched.sortedBy { it.createdAt } - val items = messagesAsc.map { msg -> - val sender = msg.participant - val profilePath = when (sender.participantType) { - ParticipantType.USER -> sender.member?.profileImage - ParticipantType.CHARACTER -> sender.character?.imagePath - } - val senderImageUrl = "$imageHost/${profilePath ?: "profile/default-profile.png"}" - val createdAtMillis = msg.createdAt?.atZone(ZoneId.systemDefault())?.toInstant()?.toEpochMilli() - ?: 0L - ChatMessageItemDto( - messageId = msg.id!!, - message = msg.message, - profileImageUrl = senderImageUrl, - mine = sender.member?.id == member.id, - createdAt = createdAtMillis, - messageType = msg.messageType.name, - imageUrl = msg.imagePath?.let { "$imageHost/$it" }, - price = msg.price, - hasAccess = if (msg.messageType == ChatMessageType.IMAGE) { - if (msg.price == null) { - true - } else { - msg.characterImage?.id?.let { - characterImageService.isOwnedImageByMember( - it, - member.id!! - ) - } ?: true - } - } else { - true - } - ) - } + val items = messagesAsc.map { toChatMessageItemDto(it, member) } return ChatMessagesPageResponse( messages = items, @@ -643,19 +578,7 @@ class ChatRoomService( ) ) - val imageDto = ChatMessageItemDto( - messageId = imageMsg.id!!, - message = imageMsg.message, - profileImageUrl = senderImageUrl, - mine = false, - createdAt = imageMsg.createdAt?.atZone(ZoneId.systemDefault())?.toInstant() - ?.toEpochMilli() - ?: 0L, - messageType = ChatMessageType.IMAGE.name, - imageUrl = imageMsg.imagePath?.let { "$imageHost/$it" }, - price = imageMsg.price, - hasAccess = owned || imageMsg.price == null - ) + val imageDto = toChatMessageItemDto(imageMsg, member) return listOf(textDto, imageDto) } @@ -687,6 +610,23 @@ class ChatRoomService( } else { true } + val expirationMs = 5L * 60L * 1000L + val resolvedImageUrl: String? = if (msg.messageType == ChatMessageType.IMAGE) { + val path = if (hasAccess) { + msg.characterImage?.imagePath ?: msg.imagePath + } else { + msg.imagePath + } + path?.let { p -> + if (hasAccess) { + imageCloudFront.generateSignedURL(p, expirationMs) + } else { + "$imageHost/$p" + } + } + } else { + null + } return ChatMessageItemDto( messageId = msg.id!!, message = msg.message, @@ -694,7 +634,7 @@ class ChatRoomService( mine = sender.member?.id == member.id, createdAt = createdAtMillis, messageType = msg.messageType.name, - imageUrl = msg.imagePath?.let { "$imageHost/$it" }, + imageUrl = resolvedImageUrl, price = msg.price, hasAccess = hasAccess )