캐릭터 챗봇 #338
|
@ -48,6 +48,7 @@ class ChatRoomService(
|
||||||
private val characterService: ChatCharacterService,
|
private val characterService: ChatCharacterService,
|
||||||
private val characterImageService: CharacterImageService,
|
private val characterImageService: CharacterImageService,
|
||||||
private val canPaymentService: kr.co.vividnext.sodalive.can.payment.CanPaymentService,
|
private val canPaymentService: kr.co.vividnext.sodalive.can.payment.CanPaymentService,
|
||||||
|
private val imageCloudFront: kr.co.vividnext.sodalive.aws.cloudfront.ImageContentCloudFront,
|
||||||
|
|
||||||
@Value("\${weraser.api-key}")
|
@Value("\${weraser.api-key}")
|
||||||
private val apiKey: String,
|
private val apiKey: String,
|
||||||
|
@ -332,40 +333,7 @@ class ChatRoomService(
|
||||||
}
|
}
|
||||||
|
|
||||||
val messagesAsc = fetched.sortedBy { it.createdAt }
|
val messagesAsc = fetched.sortedBy { it.createdAt }
|
||||||
val items = messagesAsc.map { msg ->
|
val items = messagesAsc.map { toChatMessageItemDto(it, member) }
|
||||||
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
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return ChatRoomEnterResponse(
|
return ChatRoomEnterResponse(
|
||||||
roomId = room.id!!,
|
roomId = room.id!!,
|
||||||
|
@ -512,40 +480,7 @@ class ChatRoomService(
|
||||||
// createdAt 오름차순으로 정렬하여 반환
|
// createdAt 오름차순으로 정렬하여 반환
|
||||||
val messagesAsc = fetched.sortedBy { it.createdAt }
|
val messagesAsc = fetched.sortedBy { it.createdAt }
|
||||||
|
|
||||||
val items = messagesAsc.map { msg ->
|
val items = messagesAsc.map { toChatMessageItemDto(it, member) }
|
||||||
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
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return ChatMessagesPageResponse(
|
return ChatMessagesPageResponse(
|
||||||
messages = items,
|
messages = items,
|
||||||
|
@ -643,19 +578,7 @@ class ChatRoomService(
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
val imageDto = ChatMessageItemDto(
|
val imageDto = toChatMessageItemDto(imageMsg, member)
|
||||||
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
|
|
||||||
)
|
|
||||||
return listOf(textDto, imageDto)
|
return listOf(textDto, imageDto)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -687,6 +610,23 @@ class ChatRoomService(
|
||||||
} else {
|
} else {
|
||||||
true
|
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(
|
return ChatMessageItemDto(
|
||||||
messageId = msg.id!!,
|
messageId = msg.id!!,
|
||||||
message = msg.message,
|
message = msg.message,
|
||||||
|
@ -694,7 +634,7 @@ class ChatRoomService(
|
||||||
mine = sender.member?.id == member.id,
|
mine = sender.member?.id == member.id,
|
||||||
createdAt = createdAtMillis,
|
createdAt = createdAtMillis,
|
||||||
messageType = msg.messageType.name,
|
messageType = msg.messageType.name,
|
||||||
imageUrl = msg.imagePath?.let { "$imageHost/$it" },
|
imageUrl = resolvedImageUrl,
|
||||||
price = msg.price,
|
price = msg.price,
|
||||||
hasAccess = hasAccess
|
hasAccess = hasAccess
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue