File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
'use server';
import { revalidatePath } from 'next/cache';
import { verifySession } from '@/lib/auth/dal';
import {
fetchStudentMemberById,
updateStudentMemberActiveStatus,
} 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 GENERIC_ERROR = '요청을 처리할 수 없습니다. 잠시 후 다시 시도해 주세요.';
/**
* 학생 회원 사용여부 변경 Server Action — 조회 팝업에서 유일하게 수정 가능한 필드다.
* Server Action은 UI를 거치지 않고 직접 POST될 수 있으므로 인증 확인과 입력 검증을 이
* 함수 내부에서 직접 수행한다(§3 SRP 체크). 성공 시 목록 화면을 재검증해 변경된 사용여부가
* 즉시 반영되게 한다.
*/
export async function updateStudentActiveStatus(
_prevState: UpdateStudentActiveStatusState,
formData: FormData
): Promise<UpdateStudentActiveStatusState> {
await verifySession();
const id = formData.get('id');
const isActiveRaw = formData.get('isActive');
if (typeof id !== 'string' || id.trim().length === 0) {
return { status: 'error', error: GENERIC_ERROR };
}
if (isActiveRaw !== 'true' && isActiveRaw !== 'false') {
return { status: 'error', error: GENERIC_ERROR };
}
const member = await fetchStudentMemberById(id);
if (!member) {
return { status: 'error', error: '존재하지 않는 학생 회원입니다.' };
}
await updateStudentMemberActiveStatus(id, isActiveRaw === 'true');
revalidatePath(STUDENT_MEMBERS_PATH);
return { status: 'success' };
}