From 80b298440b352d68a7245b73af26a49cc02c4480 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Thu, 7 Aug 2025 18:35:58 +0900 Subject: [PATCH] =?UTF-8?q?feat(character):=20=EC=BA=90=EB=A6=AD=ED=84=B0?= =?UTF-8?q?=20=EB=93=B1=EB=A1=9D=20API=20-=20=EB=AA=A8=EB=93=A0=20?= =?UTF-8?q?=EB=82=B4=EC=9A=A9=EC=9D=84=20form=20=EC=97=90=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=ED=95=98=EB=8D=98=20=EB=B0=A9=EC=8B=9D=EC=9D=84=20ima?= =?UTF-8?q?ge=EC=99=80=20request(json=20string)=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/character.js | 103 +++++++++++++++++++++---------------------- 1 file changed, 50 insertions(+), 53 deletions(-) diff --git a/src/api/character.js b/src/api/character.js index a5adab3..cf0e18f 100644 --- a/src/api/character.js +++ b/src/api/character.js @@ -23,35 +23,33 @@ async function getCharacter(id) { async function createCharacter(characterData) { const formData = new FormData() - // 기본 필드 추가 - formData.append('name', characterData.name) - formData.append('description', characterData.description) - formData.append('isActive', characterData.isActive) - - // 추가 필드가 있는 경우 추가 - if (characterData.personality) formData.append('personality', characterData.personality) - if (characterData.gender) formData.append('gender', characterData.gender) - if (characterData.birthDate) formData.append('birthDate', characterData.birthDate) - if (characterData.mbti) formData.append('mbti', characterData.mbti) - if (characterData.ageRestricted !== undefined) formData.append('ageRestricted', characterData.ageRestricted) - if (characterData.worldView) formData.append('worldView', characterData.worldView) - if (characterData.relationships) formData.append('relationships', characterData.relationships) - if (characterData.speechPattern) formData.append('speechPattern', characterData.speechPattern) - if (characterData.systemPrompt) formData.append('systemPrompt', characterData.systemPrompt) - - // 태그와 메모리는 배열이므로 JSON 문자열로 변환 - if (characterData.tags && characterData.tags.length > 0) { - formData.append('tags', JSON.stringify(characterData.tags)) - } - - if (characterData.memories && characterData.memories.length > 0) { - formData.append('memories', JSON.stringify(characterData.memories)) - } - - // 이미지가 있는 경우 추가 + // 이미지만 FormData에 추가 if (characterData.image) formData.append('image', characterData.image) - return Vue.axios.post('/api/admin/characters', formData, { + // 나머지 데이터는 JSON 문자열로 변환하여 request 필드에 추가 + const requestData = { + name: characterData.name, + systemPrompt: characterData.systemPrompt, + description: characterData.description, + age: characterData.age, + gender: characterData.gender, + mbti: characterData.mbti, + speechPattern: characterData.speechPattern, + speechStyle: characterData.conversationStyle, + appearance: characterData.appearance, + tags: characterData.tags || [], + hobbies: characterData.hobbies || [], + values: characterData.values || [], + goals: characterData.goals || [], + relationships: characterData.relationships || [], + personalities: characterData.personalities || [], + backgrounds: characterData.backgrounds || [], + memories: characterData.memories || [] + } + + formData.append('request', JSON.stringify(requestData)) + + return Vue.axios.post('/admin/chat/character/register', formData, { headers: { 'Content-Type': 'multipart/form-data' } @@ -62,34 +60,33 @@ async function createCharacter(characterData) { async function updateCharacter(characterData) { const formData = new FormData() - // 기본 필드 추가 - formData.append('name', characterData.name) - formData.append('description', characterData.description) - formData.append('isActive', characterData.isActive) - - // 추가 필드가 있는 경우 추가 - if (characterData.personality) formData.append('personality', characterData.personality) - if (characterData.gender) formData.append('gender', characterData.gender) - if (characterData.birthDate) formData.append('birthDate', characterData.birthDate) - if (characterData.mbti) formData.append('mbti', characterData.mbti) - if (characterData.ageRestricted !== undefined) formData.append('ageRestricted', characterData.ageRestricted) - if (characterData.worldView) formData.append('worldView', characterData.worldView) - if (characterData.relationships) formData.append('relationships', characterData.relationships) - if (characterData.speechPattern) formData.append('speechPattern', characterData.speechPattern) - if (characterData.systemPrompt) formData.append('systemPrompt', characterData.systemPrompt) - - // 태그와 메모리는 배열이므로 JSON 문자열로 변환 - if (characterData.tags && characterData.tags.length > 0) { - formData.append('tags', JSON.stringify(characterData.tags)) - } - - if (characterData.memories && characterData.memories.length > 0) { - formData.append('memories', JSON.stringify(characterData.memories)) - } - - // 이미지가 있는 경우 추가 + // 이미지만 FormData에 추가 if (characterData.image) formData.append('image', characterData.image) + // 나머지 데이터는 JSON 문자열로 변환하여 request 필드에 추가 + const requestData = { + name: characterData.name, + systemPrompt: characterData.systemPrompt, + description: characterData.description, + age: characterData.age, + gender: characterData.gender, + mbti: characterData.mbti, + speechPattern: characterData.speechPattern, + speechStyle: characterData.conversationStyle, + appearance: characterData.appearance, + tags: characterData.tags || [], + hobbies: characterData.hobbies || [], + values: characterData.values || [], + goals: characterData.goals || [], + relationships: characterData.relationships || [], + personalities: characterData.personalities || [], + backgrounds: characterData.backgrounds || [], + memories: characterData.memories || [], + isActive: characterData.isActive + } + + formData.append('request', JSON.stringify(requestData)) + return Vue.axios.put(`/api/admin/characters/${characterData.id}`, formData, { headers: { 'Content-Type': 'multipart/form-data'