Files
superport_v2/lib/features/auth/domain/entities/auth_permission.dart
JiWoong Sul 47cc62a33d feat(inventory): 재고 현황 요약/상세 플로우를 릴리스
- lib/features/inventory/summary 계층과 warehouse select 위젯을 추가해 목록/상세, 자동 새로고침, 필터, 상세 시트를 구현

- PermissionBootstrapper, scope 파서, 라우트 가드로 inventory.view 기반 권한 부여와 메뉴 노출을 통합(lib/core, lib/main.dart 등)

- Inventory Summary API/QA/Audit 문서와 PR 템플릿, CHANGELOG를 신규 스펙과 검증 커맨드로 업데이트

- DTO 직렬화 의존성을 추가하고 Golden·Widget·단위 테스트를 작성했으며 flutter analyze / flutter test --coverage를 통과
2025-11-09 01:13:10 +09:00

56 lines
2.0 KiB
Dart

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<String> actions;
/// [PermissionManager]가 이해할 수 있는 포맷으로 변환한다.
Map<String, Set<PermissionAction>> toPermissionMap() {
final normalized = PermissionResources.normalize(resource);
final actionSet = <PermissionAction>{};
final isScope = normalized.startsWith('scope:');
for (final raw in actions) {
final parsed = _parseAction(raw);
if (parsed == null) {
continue;
}
actionSet.add(parsed);
}
if (actionSet.isEmpty && isScope) {
actionSet.add(PermissionAction.view);
}
if (actionSet.isEmpty) {
return <String, Set<PermissionAction>>{};
}
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<String, PermissionAction> _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,
};
}