'use server'; import { revalidatePath } from 'next/cache'; import { verifySession } from '@/lib/auth/dal'; import { updateStudentMemberUseYn } from '@/lib/data/repositories/student-member-repository'; import { STUDENT_MEMBERS_PATH } from '@/lib/domain/student-member-query'; export type UpdateStudentActiveStatusState = | { status: 'idle' } | { status: 'error'; error: string } | { status: 'success' }; const INVALID_INPUT_ERROR = '요청 값이 올바르지 않습니다.'; /** * 학생 회원 사용여부 변경 Server Action. * * PUT /api/v1/mngr/user/{userId}/{useYn} * * 백엔드에 값도 변경 API도 없어 한동안 막아 두었던 경로다. edupay-backend develop 4d98756에서 * 목록 응답에 `useYn`이 실리고 변경 API가 생기면서 되살렸다. * * 인증 확인을 본문 맨 앞에 둔다 — Server Action은 UI를 거치지 않고 직접 POST될 수 있어 이 * 확인이 유일한 최종 방어선이다. 실패 사유는 일반화된 문구만 화면으로 보낸다(백엔드 message * 원문에는 내부 정보가 실릴 수 있다). */ export async function updateStudentActiveStatus( _prevState: UpdateStudentActiveStatusState, formData: FormData ): Promise { await verifySession(); const id = formData.get('id'); if (typeof id !== 'string' || id.trim() === '') { return { status: 'error', error: INVALID_INPUT_ERROR }; } // 체크박스는 켜졌을 때만 값이 실린다 — 없으면 꺼진 것이다. const isActive = formData.get('isActive') !== null; const result = await updateStudentMemberUseYn(id, isActive); if (!result.ok) { return { status: 'error', error: result.message }; } // 목록의 사용여부 열이 방금 바꾼 값을 반영해야 한다. revalidatePath(STUDENT_MEMBERS_PATH); return { status: 'success' }; }