git commit -m "fix(chat): 캐릭터 등록/수정 API

- 이름 중복 검사 로직 추가
This commit is contained in:
Klaus 2025-08-06 22:19:52 +09:00
parent 5132a6b9fa
commit 45b6c8db96
2 changed files with 23 additions and 3 deletions

View File

@ -57,6 +57,12 @@ class AdminChatCharacterController(
val objectMapper = ObjectMapper() val objectMapper = ObjectMapper()
val request = objectMapper.readValue(requestString, ChatCharacterRegisterRequest::class.java) val request = objectMapper.readValue(requestString, ChatCharacterRegisterRequest::class.java)
// 외부 API 호출 전 DB에 동일한 이름이 있는지 조회
val existingCharacter = service.findByName(request.name)
if (existingCharacter != null) {
throw SodaException("동일한 이름은 등록이 불가능합니다: ${request.name}")
}
// 1. 외부 API 호출 // 1. 외부 API 호출
val characterUUID = callExternalApi(request) val characterUUID = callExternalApi(request)
@ -188,6 +194,15 @@ class AdminChatCharacterController(
if (hasChangedData) { if (hasChangedData) {
val chatCharacter = service.findById(request.id) val chatCharacter = service.findById(request.id)
?: throw SodaException("해당 ID의 캐릭터를 찾을 수 없습니다: ${request.id}") ?: throw SodaException("해당 ID의 캐릭터를 찾을 수 없습니다: ${request.id}")
// 이름이 수정된 경우 DB에 동일한 이름이 있는지 확인
if (request.name != null && request.name != chatCharacter.name) {
val existingCharacter = service.findByName(request.name)
if (existingCharacter != null) {
throw SodaException("동일한 이름은 등록이 불가능합니다: ${request.name}")
}
}
callExternalApiForUpdate(chatCharacter.characterUUID, request) callExternalApiForUpdate(chatCharacter.characterUUID, request)
} }
@ -261,8 +276,11 @@ class AdminChatCharacterController(
// 변경된 데이터만 포함하는 맵 생성 // 변경된 데이터만 포함하는 맵 생성
val updateData = mutableMapOf<String, Any>() val updateData = mutableMapOf<String, Any>()
// isActive = false인 경우 처리
if (request.isActive != null && !request.isActive) { if (request.isActive != null && !request.isActive) {
updateData["name"] = "inactive_${request.name}" val inactiveName = "inactive_${request.name}"
val randomSuffix = "_" + java.util.UUID.randomUUID().toString().replace("-", "")
updateData["name"] = inactiveName + randomSuffix
} else { } else {
request.name?.let { updateData["name"] = it } request.name?.let { updateData["name"] = it }
request.systemPrompt?.let { updateData["systemPrompt"] = it } request.systemPrompt?.let { updateData["systemPrompt"] = it }
@ -284,7 +302,6 @@ class AdminChatCharacterController(
} }
val httpEntity = HttpEntity(updateData, headers) val httpEntity = HttpEntity(updateData, headers)
val response = restTemplate.exchange( val response = restTemplate.exchange(
"$apiUrl/api/characters/$characterUUID", "$apiUrl/api/characters/$characterUUID",
HttpMethod.PUT, HttpMethod.PUT,

View File

@ -292,7 +292,10 @@ class ChatCharacterService(
// isActive가 false이면 isActive = false, name = "inactive_$name"으로 변경하고 나머지는 반영하지 않는다. // isActive가 false이면 isActive = false, name = "inactive_$name"으로 변경하고 나머지는 반영하지 않는다.
if (request.isActive != null && !request.isActive) { if (request.isActive != null && !request.isActive) {
chatCharacter.isActive = false chatCharacter.isActive = false
chatCharacter.name = "inactive_${chatCharacter.name}"
val inactiveName = "inactive_${request.name}"
val randomSuffix = "_" + java.util.UUID.randomUUID().toString().replace("-", "")
chatCharacter.name = inactiveName + randomSuffix
return saveChatCharacter(chatCharacter) return saveChatCharacter(chatCharacter)
} }