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
import type { Metadata } from 'next';
import { verifySession } from '@/lib/auth/dal';
import { fetchAdminMembers } from '@/lib/data/repositories/admin-member-repository';
import { parseAdminMemberQuery } from '@/lib/domain/admin-member-query';
import { AdminMemberList } from './_components/admin-member-list';
export const metadata: Metadata = {
title: '관리자 회원',
};
interface PageProps {
searchParams: Promise<Record<string, string | string[] | undefined>>;
}
/**
* 관리자 회원 목록(시안 ADM_ADM_101).
*
* 학생 회원 목록과 달리 전체 건수가 **확정값**이라 페이지 수를 그대로 계산한다 — Repository가
* 백엔드 페이징을 쓰지 않고 전체를 받아 직접 세기 때문이다(그 이유는 Repository 주석 참조).
*
* `verifySession()`의 반환값을 목록까지 내려보내는 이유는 본인 계정의 삭제 버튼을 막기 위해서다
* (시안 ⑤). 실제 차단은 Server Action이 다시 확인한다.
*/
export default async function Page({ searchParams }: PageProps) {
const admin = await verifySession();
const query = parseAdminMemberQuery(await searchParams);
const { items, totalCount } = await fetchAdminMembers(query);
const totalPages = Math.max(1, Math.ceil(totalCount / query.pageSize));
// 요청 페이지가 범위를 벗어나면(예: 삭제로 마지막 페이지가 사라짐) 마지막 페이지로 맞춘다 —
// 표의 순번 계산도 이 값을 기준으로 해야 페이지네이션의 현재 위치와 어긋나지 않는다.
const currentPage = Math.min(query.page, totalPages);
return (
<AdminMemberList
items={items}
query={query}
currentPage={currentPage}
totalPages={totalPages}
totalCount={totalCount}
currentAdminId={admin.id}
/>
);
}