chore: API 오류 매핑과 Failure 파서 고도화

This commit is contained in:
JiWoong Sul
2025-10-14 18:06:25 +09:00
parent 67fc319c3c
commit 9f61b305d4
7 changed files with 1000 additions and 71 deletions

View File

@@ -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 위젯.