fix(chat): 채팅방, 채팅방 메시지, 채팅방 참여자 엔티티 이름 변경

- CharacterChatRoom -> ChatRoom
- CharacterChatMessage -> ChatMessage
- CharacterChatParticipant -> ChatParticipant
This commit is contained in:
Klaus 2025-08-08 16:47:47 +09:00
parent 4b3463e97c
commit 3e9f7f9e29
7 changed files with 44 additions and 44 deletions

View File

@ -7,16 +7,16 @@ import javax.persistence.JoinColumn
import javax.persistence.ManyToOne
@Entity
class CharacterChatMessage(
class ChatMessage(
val message: String,
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "chat_room_id", nullable = false)
val chatRoom: CharacterChatRoom,
val chatRoom: ChatRoom,
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "participant_id", nullable = false)
val participant: CharacterChatParticipant,
val participant: ChatParticipant,
val isActive: Boolean = true
) : BaseEntity()

View File

@ -13,10 +13,10 @@ import javax.persistence.ManyToOne
import javax.persistence.OneToMany
@Entity
class CharacterChatParticipant(
class ChatParticipant(
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "chat_room_id", nullable = false)
val chatRoom: CharacterChatRoom,
val chatRoom: ChatRoom,
@Enumerated(EnumType.STRING)
val participantType: ParticipantType,
@ -32,7 +32,7 @@ class CharacterChatParticipant(
var isActive: Boolean = true
) : BaseEntity() {
@OneToMany(mappedBy = "participant", cascade = [CascadeType.ALL], fetch = FetchType.LAZY)
val messages: MutableList<CharacterChatMessage> = mutableListOf()
val messages: MutableList<ChatMessage> = mutableListOf()
}
enum class ParticipantType {

View File

@ -7,14 +7,14 @@ import javax.persistence.FetchType
import javax.persistence.OneToMany
@Entity
class CharacterChatRoom(
class ChatRoom(
val sessionId: String,
val title: String,
val isActive: Boolean = true
) : BaseEntity() {
@OneToMany(mappedBy = "chatRoom", cascade = [CascadeType.ALL], fetch = FetchType.LAZY)
val messages: MutableList<CharacterChatMessage> = mutableListOf()
val messages: MutableList<ChatMessage> = mutableListOf()
@OneToMany(mappedBy = "chatRoom", cascade = [CascadeType.ALL], fetch = FetchType.LAZY)
val participants: MutableList<CharacterChatParticipant> = mutableListOf()
val participants: MutableList<ChatParticipant> = mutableListOf()
}

View File

@ -1,18 +1,18 @@
package kr.co.vividnext.sodalive.chat.room.repository
import kr.co.vividnext.sodalive.chat.room.CharacterChatMessage
import kr.co.vividnext.sodalive.chat.room.CharacterChatRoom
import kr.co.vividnext.sodalive.chat.room.ChatMessage
import kr.co.vividnext.sodalive.chat.room.ChatRoom
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
@Repository
interface CharacterChatMessageRepository : JpaRepository<CharacterChatMessage, Long> {
fun findTopByChatRoomAndIsActiveTrueOrderByCreatedAtDesc(chatRoom: CharacterChatRoom): CharacterChatMessage?
interface ChatMessageRepository : JpaRepository<ChatMessage, Long> {
fun findTopByChatRoomAndIsActiveTrueOrderByCreatedAtDesc(chatRoom: ChatRoom): ChatMessage?
fun findTop20ByChatRoomAndIsActiveTrueOrderByIdDesc(chatRoom: CharacterChatRoom): List<CharacterChatMessage>
fun findTop20ByChatRoomAndIsActiveTrueOrderByIdDesc(chatRoom: ChatRoom): List<ChatMessage>
fun findTop20ByChatRoomAndIdLessThanAndIsActiveTrueOrderByIdDesc(
chatRoom: CharacterChatRoom,
chatRoom: ChatRoom,
id: Long
): List<CharacterChatMessage>
): List<ChatMessage>
}

View File

@ -1,36 +1,36 @@
package kr.co.vividnext.sodalive.chat.room.repository
import kr.co.vividnext.sodalive.chat.room.CharacterChatParticipant
import kr.co.vividnext.sodalive.chat.room.CharacterChatRoom
import kr.co.vividnext.sodalive.chat.room.ChatParticipant
import kr.co.vividnext.sodalive.chat.room.ChatRoom
import kr.co.vividnext.sodalive.chat.room.ParticipantType
import kr.co.vividnext.sodalive.member.Member
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
@Repository
interface CharacterChatParticipantRepository : JpaRepository<CharacterChatParticipant, Long> {
interface ChatParticipantRepository : JpaRepository<ChatParticipant, Long> {
/**
* 특정 채팅방에 참여 중인 멤버 참여자 찾기
*/
fun findByChatRoomAndMemberAndIsActiveTrue(
chatRoom: CharacterChatRoom,
chatRoom: ChatRoom,
member: Member
): CharacterChatParticipant?
): ChatParticipant?
/**
* 특정 채팅방에 특정 타입(CHARACTER/USER)으로 활성 상태인 참여자 찾기
*/
fun findByChatRoomAndParticipantTypeAndIsActiveTrue(
chatRoom: CharacterChatRoom,
chatRoom: ChatRoom,
participantType: ParticipantType
): CharacterChatParticipant?
): ChatParticipant?
/**
* 특정 채팅방의 활성 USER 참여자
*/
fun countByChatRoomAndParticipantTypeAndIsActiveTrue(
chatRoom: CharacterChatRoom,
chatRoom: ChatRoom,
participantType: ParticipantType
): Long
}

View File

@ -1,7 +1,7 @@
package kr.co.vividnext.sodalive.chat.room.repository
import kr.co.vividnext.sodalive.chat.character.ChatCharacter
import kr.co.vividnext.sodalive.chat.room.CharacterChatRoom
import kr.co.vividnext.sodalive.chat.room.ChatRoom
import kr.co.vividnext.sodalive.chat.room.dto.ChatRoomListQueryDto
import kr.co.vividnext.sodalive.member.Member
import org.springframework.data.jpa.repository.JpaRepository
@ -10,14 +10,14 @@ import org.springframework.data.repository.query.Param
import org.springframework.stereotype.Repository
@Repository
interface CharacterChatRoomRepository : JpaRepository<CharacterChatRoom, Long> {
interface ChatRoomRepository : JpaRepository<ChatRoom, Long> {
/**
* 특정 멤버와 캐릭터가 참여 중인 활성화된 채팅방을 찾는 쿼리
*/
@Query(
"""
SELECT DISTINCT r FROM CharacterChatRoom r
SELECT DISTINCT r FROM ChatRoom r
JOIN r.participants p1
JOIN r.participants p2
WHERE p1.member = :member AND p1.isActive = true
@ -28,7 +28,7 @@ interface CharacterChatRoomRepository : JpaRepository<CharacterChatRoom, Long> {
fun findActiveChatRoomByMemberAndCharacter(
@Param("member") member: Member,
@Param("character") character: ChatCharacter
): CharacterChatRoom?
): ChatRoom?
/**
* 멤버가 참여 중인 채팅방을 최근 메시지 시간 순으로 페이징 조회
@ -41,7 +41,7 @@ interface CharacterChatRoomRepository : JpaRepository<CharacterChatRoom, Long> {
r.title,
pc.character.imagePath
)
FROM CharacterChatRoom r
FROM ChatRoom r
JOIN r.participants p
JOIN r.participants pc
LEFT JOIN r.messages m

View File

@ -2,9 +2,9 @@ package kr.co.vividnext.sodalive.chat.room.service
import com.fasterxml.jackson.databind.ObjectMapper
import kr.co.vividnext.sodalive.chat.character.service.ChatCharacterService
import kr.co.vividnext.sodalive.chat.room.CharacterChatMessage
import kr.co.vividnext.sodalive.chat.room.CharacterChatParticipant
import kr.co.vividnext.sodalive.chat.room.CharacterChatRoom
import kr.co.vividnext.sodalive.chat.room.ChatMessage
import kr.co.vividnext.sodalive.chat.room.ChatParticipant
import kr.co.vividnext.sodalive.chat.room.ChatRoom
import kr.co.vividnext.sodalive.chat.room.ParticipantType
import kr.co.vividnext.sodalive.chat.room.dto.ChatMessageItemDto
import kr.co.vividnext.sodalive.chat.room.dto.ChatRoomListItemDto
@ -14,9 +14,9 @@ import kr.co.vividnext.sodalive.chat.room.dto.ExternalChatSendResponse
import kr.co.vividnext.sodalive.chat.room.dto.ExternalChatSessionCreateResponse
import kr.co.vividnext.sodalive.chat.room.dto.ExternalChatSessionGetResponse
import kr.co.vividnext.sodalive.chat.room.dto.SendChatMessageResponse
import kr.co.vividnext.sodalive.chat.room.repository.CharacterChatMessageRepository
import kr.co.vividnext.sodalive.chat.room.repository.CharacterChatParticipantRepository
import kr.co.vividnext.sodalive.chat.room.repository.CharacterChatRoomRepository
import kr.co.vividnext.sodalive.chat.room.repository.ChatMessageRepository
import kr.co.vividnext.sodalive.chat.room.repository.ChatParticipantRepository
import kr.co.vividnext.sodalive.chat.room.repository.ChatRoomRepository
import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.member.Member
import org.slf4j.LoggerFactory
@ -33,9 +33,9 @@ import java.util.UUID
@Service
class ChatRoomService(
private val chatRoomRepository: CharacterChatRoomRepository,
private val participantRepository: CharacterChatParticipantRepository,
private val messageRepository: CharacterChatMessageRepository,
private val chatRoomRepository: ChatRoomRepository,
private val participantRepository: ChatParticipantRepository,
private val messageRepository: ChatMessageRepository,
private val characterService: ChatCharacterService,
@Value("\${weraser.api-key}")
@ -78,7 +78,7 @@ class ChatRoomService(
val sessionId = callExternalApiForChatSession(userId, character.characterUUID)
// 5. 채팅방 생성
val chatRoom = CharacterChatRoom(
val chatRoom = ChatRoom(
sessionId = sessionId,
title = character.name,
isActive = true
@ -86,7 +86,7 @@ class ChatRoomService(
val savedChatRoom = chatRoomRepository.save(chatRoom)
// 6. 채팅방 참여자 추가 (멤버)
val memberParticipant = CharacterChatParticipant(
val memberParticipant = ChatParticipant(
chatRoom = savedChatRoom,
participantType = ParticipantType.USER,
member = member,
@ -96,7 +96,7 @@ class ChatRoomService(
participantRepository.save(memberParticipant)
// 7. 채팅방 참여자 추가 (캐릭터)
val characterParticipant = CharacterChatParticipant(
val characterParticipant = ChatParticipant(
chatRoom = savedChatRoom,
participantType = ParticipantType.CHARACTER,
member = null,
@ -186,7 +186,7 @@ class ChatRoomService(
fun listMyChatRooms(member: Member): List<ChatRoomListItemDto> {
val rooms: List<ChatRoomListQueryDto> = chatRoomRepository.findMemberRoomsOrderByLastMessageDesc(member)
return rooms.map { q ->
val room = CharacterChatRoom(
val room = ChatRoom(
sessionId = "",
title = q.title,
isActive = true
@ -388,7 +388,7 @@ class ChatRoomService(
val characterReply = callExternalApiForChatSendWithRetry(userId, characterUUID, message, sessionId)
// 6) 내 메시지 저장
val myMsgEntity = CharacterChatMessage(
val myMsgEntity = ChatMessage(
message = message,
chatRoom = room,
participant = myParticipant,
@ -397,7 +397,7 @@ class ChatRoomService(
messageRepository.save(myMsgEntity)
// 7) 캐릭터 메시지 저장
val characterMsgEntity = CharacterChatMessage(
val characterMsgEntity = ChatMessage(
message = characterReply,
chatRoom = room,
participant = characterParticipant,