chore: API 오류 매핑과 Failure 파서 고도화
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
||||
import '../config/environment.dart';
|
||||
import 'permission_resources.dart';
|
||||
|
||||
/// 권한 체크를 위한 액션 종류.
|
||||
enum PermissionAction { view, create, edit, delete, restore, approve }
|
||||
@@ -9,16 +10,20 @@ enum PermissionAction { view, create, edit, delete, restore, approve }
|
||||
class PermissionManager extends ChangeNotifier {
|
||||
PermissionManager({Map<String, Set<PermissionAction>>? overrides}) {
|
||||
if (overrides != null) {
|
||||
_overrides.addAll(overrides);
|
||||
updateOverrides(overrides);
|
||||
}
|
||||
}
|
||||
|
||||
/// 리소스별 임시 권한 집합을 보관한다.
|
||||
final Map<String, Set<PermissionAction>> _overrides = {};
|
||||
|
||||
/// 서버에서 내려받은 실제 권한 집합.
|
||||
final Map<String, Set<PermissionAction>> _serverPermissions = {};
|
||||
|
||||
/// 지정한 리소스/행동이 허용되는지 여부를 반환한다.
|
||||
bool can(String resource, PermissionAction action) {
|
||||
final override = _overrides[resource];
|
||||
final key = _normalize(resource);
|
||||
final override = _overrides[key];
|
||||
if (override != null) {
|
||||
// View 권한은 최소 접근을 허용하기 위해 별도로 처리한다.
|
||||
if (override.contains(PermissionAction.view) &&
|
||||
@@ -27,16 +32,50 @@ class PermissionManager extends ChangeNotifier {
|
||||
}
|
||||
return override.contains(action);
|
||||
}
|
||||
return Environment.hasPermission(resource, action.name);
|
||||
|
||||
final server = _serverPermissions[key];
|
||||
if (server != null) {
|
||||
if (action == PermissionAction.view) {
|
||||
return server.contains(PermissionAction.view);
|
||||
}
|
||||
return server.contains(action);
|
||||
}
|
||||
|
||||
return Environment.hasPermission(key, action.name);
|
||||
}
|
||||
|
||||
/// 개발/테스트 환경에서 사용할 임시 오버라이드 값을 설정한다.
|
||||
void updateOverrides(Map<String, Set<PermissionAction>> overrides) {
|
||||
_overrides
|
||||
..clear()
|
||||
..addAll(overrides);
|
||||
..addAll(
|
||||
overrides.map((key, value) => MapEntry(_normalize(key), value.toSet())),
|
||||
);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// 서버에서 내려온 권한 정보를 적용한다.
|
||||
void applyServerPermissions(Map<String, Set<PermissionAction>> permissions) {
|
||||
_serverPermissions
|
||||
..clear()
|
||||
..addAll(
|
||||
permissions.map(
|
||||
(key, value) => MapEntry(_normalize(key), value.toSet()),
|
||||
),
|
||||
);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// 서버 권한 정보를 초기화한다.
|
||||
void clearServerPermissions() {
|
||||
if (_serverPermissions.isEmpty) {
|
||||
return;
|
||||
}
|
||||
_serverPermissions.clear();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
String _normalize(String resource) => PermissionResources.normalize(resource);
|
||||
}
|
||||
|
||||
/// 위젯 트리에 [PermissionManager]를 전달하는 Inherited 위젯.
|
||||
|
||||
Reference in New Issue
Block a user