import '../../../../core/permissions/permission_manager.dart'; import '../../../../core/permissions/permission_resources.dart'; /// 로그인 응답에서 내려오는 단일 권한(리소스 + 액션 목록)을 표현한다. class AuthPermission { const AuthPermission({required this.resource, required this.actions}); /// 서버가 반환한 리소스 식별자 (예: `/stock-transactions`) final String resource; /// 허용된 액션 문자열 목록 (예: `view`, `create`) final List actions; /// [PermissionManager]가 이해할 수 있는 포맷으로 변환한다. Map> toPermissionMap() { final normalized = PermissionResources.normalize(resource); final actionSet = {}; for (final raw in actions) { final parsed = _parseAction(raw); if (parsed == null) { continue; } actionSet.add(parsed); } if (actionSet.isEmpty) { return >{}; } return {normalized: actionSet}; } /// 백엔드 권한 문자열을 [PermissionAction]으로 변환한다. /// /// - 백엔드 스펙(`create`, `read`, `update`, `delete`, `restore`, `approve`)과 /// 프런트 내부 별칭(`view`, `edit`)을 모두 인식한다. /// - 인식할 수 없는 문자열은 무시해 잘못된 권한이 섞여도 앱이 중단되지 않도록 한다. PermissionAction? _parseAction(String raw) { final key = raw.trim().toLowerCase(); return _actionMap[key]; } static const Map _actionMap = { 'view': PermissionAction.view, 'read': PermissionAction.view, 'create': PermissionAction.create, 'edit': PermissionAction.edit, 'update': PermissionAction.edit, 'delete': PermissionAction.delete, 'restore': PermissionAction.restore, 'approve': PermissionAction.approve, }; }