import { clearAdminSession, getAdminSession, requireAdminSession, setAdminSession } from '../../../../utils/admin-auth' import { clearMemberSession, getVerifiedMemberSession } from '../../../../utils/member-auth' import { getMemberForAdmin, isPrivilegedMemberSession } from '../../../../repositories/member-repository' /** * 공개 회원 세션이 관리자 권한이면 관리자 세션으로 승격한다. * @param {import('h3').H3Event} event - 요청 이벤트 * @returns {Promise<{ userId: string, email: string, role: 'admin', sessionVersion: number } | null>} 관리자 세션 */ const bridgeMemberAdminSession = async (event) => { const memberSession = await getVerifiedMemberSession(event) if (!memberSession) { return null } const isPrivileged = await isPrivilegedMemberSession(memberSession.userId, memberSession.sessionVersion) if (!isPrivileged) { return null } const adminSession = { userId: memberSession.userId, email: memberSession.email, role: 'admin', sessionVersion: memberSession.sessionVersion } setAdminSession(event, adminSession) return adminSession } /** * 관리자 세션 조회 API * @param {import('h3').H3Event} event - 요청 이벤트 * @returns {Promise<{ userId: string, email: string, role: 'admin', roleCode: string, roleLabel: string } | null>} 관리자 세션 정보 */ export default defineEventHandler(async (event) => { const isOptional = getQuery(event).optional === '1' let session = getAdminSession(event) if (session) { const isPrivileged = await isPrivilegedMemberSession(session.userId, session.sessionVersion) if (!isPrivileged) { clearAdminSession(event) clearMemberSession(event) session = null } } if (!session) { session = await bridgeMemberAdminSession(event) } if (!session && !isOptional) { session = requireAdminSession(event) } if (!session) { return null } const member = await getMemberForAdmin(session.userId) return { userId: session.userId, email: session.email, role: session.role, roleCode: member?.roleCode || 'admin', roleLabel: member?.role || '관리자' } })