/** * 권한 체크 유틸리티 * 3단계 권한 체계: SUPER_ADMIN / COMPANY_ADMIN / USER */ import { PersonBean } from "../types/auth"; /** * 권한 레벨 Enum */ export enum PermissionLevel { SUPER_ADMIN = "SUPER_ADMIN", // 최고 관리자 (전체 시스템) COMPANY_ADMIN = "COMPANY_ADMIN", // 회사 관리자 (자기 회사만) USER = "USER", // 일반 사용자 } /** * 사용자가 슈퍼관리자인지 확인 * @param user 사용자 정보 * @returns 슈퍼관리자 여부 */ export function isSuperAdmin(user?: PersonBean | null): boolean { if (!user) return false; return user.companyCode === "*" && user.userType === "SUPER_ADMIN"; } /** * 사용자가 회사 관리자인지 확인 (슈퍼관리자 제외) * @param user 사용자 정보 * @returns 회사 관리자 여부 */ export function isCompanyAdmin(user?: PersonBean | null): boolean { if (!user) return false; return user.userType === "COMPANY_ADMIN" && user.companyCode !== "*"; } /** * 사용자가 관리자인지 확인 (슈퍼관리자 + 회사관리자) * @param user 사용자 정보 * @returns 관리자 여부 */ export function isAdmin(user?: PersonBean | null): boolean { return isSuperAdmin(user) || isCompanyAdmin(user); } /** * 사용자가 일반 사용자인지 확인 * @param user 사용자 정보 * @returns 일반 사용자 여부 */ export function isRegularUser(user?: PersonBean | null): boolean { if (!user) return false; return ( user.userType === "USER" || user.userType === "GUEST" || user.userType === "PARTNER" ); } /** * 사용자의 권한 레벨 반환 * @param user 사용자 정보 * @returns 권한 레벨 */ export function getUserPermissionLevel( user?: PersonBean | null ): PermissionLevel | null { if (!user) return null; if (isSuperAdmin(user)) { return PermissionLevel.SUPER_ADMIN; } if (isCompanyAdmin(user)) { return PermissionLevel.COMPANY_ADMIN; } return PermissionLevel.USER; } /** * DDL 실행 권한 확인 (슈퍼관리자만) * @param user 사용자 정보 * @returns DDL 실행 가능 여부 */ export function canExecuteDDL(user?: PersonBean | null): boolean { return isSuperAdmin(user); } /** * 회사 데이터 접근 권한 확인 * @param user 사용자 정보 * @param targetCompanyCode 접근하려는 회사 코드 * @returns 접근 가능 여부 */ export function canAccessCompanyData( user?: PersonBean | null, targetCompanyCode?: string ): boolean { if (!user) return false; // 슈퍼관리자는 모든 회사 데이터 접근 가능 if (isSuperAdmin(user)) { return true; } // 자기 회사 데이터만 접근 가능 return user.companyCode === targetCompanyCode; } /** * 사용자 관리 권한 확인 (관리자만) * @param user 사용자 정보 * @param targetCompanyCode 관리하려는 회사 코드 * @returns 사용자 관리 가능 여부 */ export function canManageUsers( user?: PersonBean | null, targetCompanyCode?: string ): boolean { if (!user) return false; // 슈퍼관리자는 모든 회사 사용자 관리 가능 if (isSuperAdmin(user)) { return true; } // 회사 관리자는 자기 회사 사용자만 관리 가능 if (isCompanyAdmin(user)) { return user.companyCode === targetCompanyCode; } return false; } /** * 회사 설정 변경 권한 확인 (관리자만) * @param user 사용자 정보 * @param targetCompanyCode 설정 변경하려는 회사 코드 * @returns 설정 변경 가능 여부 */ export function canManageCompanySettings( user?: PersonBean | null, targetCompanyCode?: string ): boolean { return canManageUsers(user, targetCompanyCode); } /** * 회사 생성/삭제 권한 확인 (슈퍼관리자만) * @param user 사용자 정보 * @returns 회사 생성/삭제 가능 여부 */ export function canManageCompanies(user?: PersonBean | null): boolean { return isSuperAdmin(user); } /** * 시스템 설정 변경 권한 확인 (슈퍼관리자만) * @param user 사용자 정보 * @returns 시스템 설정 변경 가능 여부 */ export function canManageSystemSettings(user?: PersonBean | null): boolean { return isSuperAdmin(user); } /** * 권한 에러 메시지 생성 * @param requiredLevel 필요한 권한 레벨 * @returns 에러 메시지 */ export function getPermissionErrorMessage( requiredLevel: PermissionLevel ): string { const messages: Record = { [PermissionLevel.SUPER_ADMIN]: "최고 관리자 권한이 필요합니다. 전체 시스템을 관리할 수 있는 권한이 없습니다.", [PermissionLevel.COMPANY_ADMIN]: "관리자 권한이 필요합니다. 회사 관리자 이상의 권한이 필요합니다.", [PermissionLevel.USER]: "인증된 사용자 권한이 필요합니다.", }; return messages[requiredLevel] || "권한이 부족합니다."; } /** * 권한 부족 에러 객체 생성 * @param requiredLevel 필요한 권한 레벨 * @returns 에러 응답 객체 */ export function createPermissionError(requiredLevel: PermissionLevel) { return { success: false, error: { code: "INSUFFICIENT_PERMISSION", details: getPermissionErrorMessage(requiredLevel), }, }; } /** * 사용자 권한 정보 요약 * @param user 사용자 정보 * @returns 권한 정보 객체 */ export function getUserPermissionSummary(user?: PersonBean | null) { if (!user) { return { level: null, isSuperAdmin: false, isCompanyAdmin: false, isAdmin: false, canExecuteDDL: false, canManageUsers: false, canManageCompanies: false, canManageSystemSettings: false, }; } return { level: getUserPermissionLevel(user), isSuperAdmin: isSuperAdmin(user), isCompanyAdmin: isCompanyAdmin(user), isAdmin: isAdmin(user), canExecuteDDL: canExecuteDDL(user), canManageUsers: isAdmin(user), canManageCompanies: canManageCompanies(user), canManageSystemSettings: canManageSystemSettings(user), }; }