ERP-node/backend-node/src/utils/permissionUtils.ts

231 lines
5.9 KiB
TypeScript

/**
* 권한 체크 유틸리티
* 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, string> = {
[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),
};
}