멤버 등급 변경 권한 규칙 수정 v1.5.6

This commit is contained in:
2026-05-26 16:31:56 +09:00
parent 3843e16d9f
commit a5ae2c3fce
9 changed files with 120 additions and 94 deletions

View File

@@ -24,7 +24,6 @@ const passwordModalOpen = ref(false)
const deleteModalOpen = ref(false)
const isUpdatingPassword = ref(false)
const isDeletingMember = ref(false)
const isUpdatingRole = ref(false)
const actionMessage = ref('')
const actionError = ref('')
@@ -93,7 +92,10 @@ const currentRoleLabel = computed(() => roleOptions.find((option) => option.valu
* 회원 저장 요청 본문을 문자열로 직렬화한다.
* @returns {string} 직렬화된 회원 입력값
*/
const serializeMemberPayload = () => JSON.stringify(getMemberPayload())
const serializeMemberPayload = () => JSON.stringify({
...getMemberPayload(),
roleCode: form.roleCode
})
/**
* 날짜 표시 형식 변환
@@ -340,40 +342,6 @@ const updateMemberPassword = async () => {
}
}
/**
* 관리자 권한으로 회원 등급을 변경한다.
* @returns {Promise<void>}
*/
const updateMemberRole = async () => {
if (isNewMember.value || isUpdatingRole.value) {
return
}
actionMessage.value = ''
actionError.value = ''
isUpdatingRole.value = true
try {
const updated = await $fetch(`/admin/api/members/${props.member.id}/role`, {
method: 'PUT',
body: {
role: form.roleCode
}
})
emit('saved', {
...props.member,
...updated
})
actionMessage.value = '멤버 등급이 변경되었습니다.'
} catch (error) {
form.roleCode = props.member?.roleCode || 'member'
actionError.value = error?.data?.message || '멤버 등급 변경에 실패했습니다.'
} finally {
isUpdatingRole.value = false
}
}
/**
* 관리자 권한으로 회원을 삭제한다.
* @returns {Promise<void>}
@@ -415,6 +383,15 @@ const saveMember = async () => {
try {
const payload = getMemberPayload()
if (!isNewMember.value && form.roleCode !== props.member?.roleCode) {
await $fetch(`/admin/api/members/${props.member.id}/role`, {
method: 'PUT',
body: {
role: form.roleCode
}
})
}
const saved = isNewMember.value
? await $fetch('/admin/api/members', {
method: 'POST',
@@ -584,8 +561,7 @@ watch(() => props.member, () => {
<select
v-model="form.roleCode"
class="admin-member-form__select h-12 w-full rounded-md border border-transparent bg-[#eef1f4] px-4 text-sm text-[#15171a] outline-none focus:border-[#c5ccd5] focus:bg-white focus:ring-2 focus:ring-[#dce2e8] disabled:opacity-60"
:disabled="isNewMember || isUpdatingRole"
@change="updateMemberRole"
:disabled="isNewMember || isSaving"
>
<option v-for="option in roleOptions" :key="option.value" :value="option.value">
{{ option.label }}