feat(chat): 캐릭터 리스트, 추가/수정 폼, 배너

- response의 데이터 구조에 맞춰서 코드 수정
This commit is contained in:
Yu Sung
2025-08-12 21:09:08 +09:00
parent a3e82a81f8
commit ba248f7680
4 changed files with 119 additions and 61 deletions

View File

@@ -19,6 +19,14 @@ async function getCharacter(id) {
return Vue.axios.get(`/admin/chat/character/${id}`)
}
// 내부 헬퍼: 빈 문자열을 null로 변환
function toNullIfBlank(value) {
if (typeof value === 'string') {
return value.trim() === '' ? null : value;
}
return value === '' ? null : value;
}
// 캐릭터 등록
async function createCharacter(characterData) {
const formData = new FormData()
@@ -28,18 +36,18 @@ async function createCharacter(characterData) {
// 나머지 데이터는 JSON 문자열로 변환하여 request 필드에 추가
const requestData = {
name: characterData.name,
systemPrompt: characterData.systemPrompt,
description: characterData.description,
age: characterData.age,
gender: characterData.gender,
mbti: characterData.mbti,
characterType: characterData.type,
originalTitle: characterData.originalTitle,
originalLink: characterData.originalLink,
speechPattern: characterData.speechPattern,
speechStyle: characterData.conversationStyle,
appearance: characterData.appearance,
name: toNullIfBlank(characterData.name),
systemPrompt: toNullIfBlank(characterData.systemPrompt),
description: toNullIfBlank(characterData.description),
age: toNullIfBlank(characterData.age),
gender: toNullIfBlank(characterData.gender),
mbti: toNullIfBlank(characterData.mbti),
characterType: toNullIfBlank(characterData.type),
originalTitle: toNullIfBlank(characterData.originalTitle),
originalLink: toNullIfBlank(characterData.originalLink),
speechPattern: toNullIfBlank(characterData.speechPattern),
speechStyle: toNullIfBlank(characterData.speechStyle),
appearance: toNullIfBlank(characterData.appearance),
tags: characterData.tags || [],
hobbies: characterData.hobbies || [],
values: characterData.values || [],
@@ -66,9 +74,18 @@ async function updateCharacter(characterData, image = null) {
// 이미지가 있는 경우에만 FormData에 추가
if (image) formData.append('image', image)
// 변경된 데이터만 JSON 문자열로 변환하여 request 필드에 추가
// 변경된 데이터만 JSON 문자열로 변환하여 request 필드에 추가 ('' -> null 변환)
// characterData는 이미 변경된 필드만 포함하고 있음
formData.append('request', JSON.stringify(characterData))
const processed = {}
Object.keys(characterData).forEach(key => {
const value = characterData[key]
if (typeof value === 'string' || value === '') {
processed[key] = toNullIfBlank(value)
} else {
processed[key] = value
}
})
formData.append('request', JSON.stringify(processed))
return Vue.axios.put(`/admin/chat/character/update`, formData, {
headers: {