feat(admin-character): 캐릭터 수정 API

- 가치관, 취미, 목표가 중복 매핑이 되지 않도록 수정
This commit is contained in:
Klaus 2025-08-12 21:51:52 +09:00
parent eed755fd11
commit 147b8b0a42
2 changed files with 66 additions and 9 deletions

View File

@ -75,13 +75,13 @@ class ChatCharacter(
@OneToMany(mappedBy = "chatCharacter", cascade = [CascadeType.ALL], fetch = FetchType.LAZY, orphanRemoval = true) @OneToMany(mappedBy = "chatCharacter", cascade = [CascadeType.ALL], fetch = FetchType.LAZY, orphanRemoval = true)
var tagMappings: MutableList<ChatCharacterTagMapping> = mutableListOf() var tagMappings: MutableList<ChatCharacterTagMapping> = mutableListOf()
@OneToMany(mappedBy = "chatCharacter", cascade = [CascadeType.ALL], fetch = FetchType.LAZY) @OneToMany(mappedBy = "chatCharacter", cascade = [CascadeType.ALL], fetch = FetchType.LAZY, orphanRemoval = true)
var valueMappings: MutableList<ChatCharacterValueMapping> = mutableListOf() var valueMappings: MutableList<ChatCharacterValueMapping> = mutableListOf()
@OneToMany(mappedBy = "chatCharacter", cascade = [CascadeType.ALL], fetch = FetchType.LAZY) @OneToMany(mappedBy = "chatCharacter", cascade = [CascadeType.ALL], fetch = FetchType.LAZY, orphanRemoval = true)
var hobbyMappings: MutableList<ChatCharacterHobbyMapping> = mutableListOf() var hobbyMappings: MutableList<ChatCharacterHobbyMapping> = mutableListOf()
@OneToMany(mappedBy = "chatCharacter", cascade = [CascadeType.ALL], fetch = FetchType.LAZY) @OneToMany(mappedBy = "chatCharacter", cascade = [CascadeType.ALL], fetch = FetchType.LAZY, orphanRemoval = true)
var goalMappings: MutableList<ChatCharacterGoalMapping> = mutableListOf() var goalMappings: MutableList<ChatCharacterGoalMapping> = mutableListOf()
// 태그 추가 헬퍼 메소드 // 태그 추가 헬퍼 메소드

View File

@ -172,6 +172,66 @@ class ChatCharacterService(
goals.forEach { addGoalToCharacter(chatCharacter, it) } goals.forEach { addGoalToCharacter(chatCharacter, it) }
} }
/**
* 가치관 매핑 증분 업데이트
*/
@Transactional
fun updateValuesForCharacter(chatCharacter: ChatCharacter, values: List<String>) {
val desired = values.distinct()
val current = chatCharacter.valueMappings.map { it.value.value }
val toAdd = desired.filterNot { current.contains(it) }
toAdd.forEach { addValueToCharacter(chatCharacter, it) }
if (chatCharacter.valueMappings.isNotEmpty()) {
val iterator = chatCharacter.valueMappings.iterator()
while (iterator.hasNext()) {
val mapping = iterator.next()
if (!desired.contains(mapping.value.value)) {
iterator.remove() // orphanRemoval=true 이므로 매핑 엔티티 삭제 처리
}
}
}
}
/**
* 취미 매핑 증분 업데이트
*/
@Transactional
fun updateHobbiesForCharacter(chatCharacter: ChatCharacter, hobbies: List<String>) {
val desired = hobbies.distinct()
val current = chatCharacter.hobbyMappings.map { it.hobby.hobby }
val toAdd = desired.filterNot { current.contains(it) }
toAdd.forEach { addHobbyToCharacter(chatCharacter, it) }
if (chatCharacter.hobbyMappings.isNotEmpty()) {
val iterator = chatCharacter.hobbyMappings.iterator()
while (iterator.hasNext()) {
val mapping = iterator.next()
if (!desired.contains(mapping.hobby.hobby)) {
iterator.remove() // orphanRemoval=true 이므로 매핑 엔티티 삭제 처리
}
}
}
}
/**
* 목표 매핑 증분 업데이트
*/
@Transactional
fun updateGoalsForCharacter(chatCharacter: ChatCharacter, goals: List<String>) {
val desired = goals.distinct()
val current = chatCharacter.goalMappings.map { it.goal.goal }
val toAdd = desired.filterNot { current.contains(it) }
toAdd.forEach { addGoalToCharacter(chatCharacter, it) }
if (chatCharacter.goalMappings.isNotEmpty()) {
val iterator = chatCharacter.goalMappings.iterator()
while (iterator.hasNext()) {
val mapping = iterator.next()
if (!desired.contains(mapping.goal.goal)) {
iterator.remove() // orphanRemoval=true 이므로 매핑 엔티티 삭제 처리
}
}
}
}
/** /**
* 캐릭터 저장 * 캐릭터 저장
*/ */
@ -441,18 +501,15 @@ class ChatCharacterService(
} }
if (request.values != null) { if (request.values != null) {
chatCharacter.valueMappings.clear() updateValuesForCharacter(chatCharacter, request.values)
addValuesToCharacter(chatCharacter, request.values)
} }
if (request.hobbies != null) { if (request.hobbies != null) {
chatCharacter.hobbyMappings.clear() updateHobbiesForCharacter(chatCharacter, request.hobbies)
addHobbiesToCharacter(chatCharacter, request.hobbies)
} }
if (request.goals != null) { if (request.goals != null) {
chatCharacter.goalMappings.clear() updateGoalsForCharacter(chatCharacter, request.goals)
addGoalsToCharacter(chatCharacter, request.goals)
} }
// 추가 정보 설정 - 변경된 데이터만 업데이트 // 추가 정보 설정 - 변경된 데이터만 업데이트