feat: 결재·마스터 실연동 업데이트

This commit is contained in:
JiWoong Sul
2025-10-14 18:10:24 +09:00
parent 1325109fba
commit 8067416c09
66 changed files with 2129 additions and 222 deletions

View File

@@ -1,6 +1,9 @@
import 'package:flutter/foundation.dart';
import 'package:superport_v2/core/common/models/paginated_result.dart';
import 'package:superport_v2/core/network/failure.dart';
import '../../../../../core/permissions/permission_manager.dart';
import '../../application/permission_synchronizer.dart';
import '../../../group/domain/entities/group.dart';
import '../../../group/domain/repositories/group_repository.dart';
import '../../../menu/domain/entities/menu.dart';
@@ -20,13 +23,16 @@ class GroupPermissionController extends ChangeNotifier {
required GroupPermissionRepository permissionRepository,
required GroupRepository groupRepository,
required MenuRepository menuRepository,
PermissionManager? permissionManager,
}) : _permissionRepository = permissionRepository,
_groupRepository = groupRepository,
_menuRepository = menuRepository;
_menuRepository = menuRepository,
_permissionManager = permissionManager;
final GroupPermissionRepository _permissionRepository;
final GroupRepository _groupRepository;
final MenuRepository _menuRepository;
final PermissionManager? _permissionManager;
PaginatedResult<GroupPermission>? _result;
bool _isLoading = false;
@@ -63,8 +69,9 @@ class GroupPermissionController extends ChangeNotifier {
_groups
..clear()
..addAll(response.items);
} catch (e) {
_errorMessage = e.toString();
} catch (error) {
final failure = Failure.from(error);
_errorMessage = failure.describe();
} finally {
_isLoadingGroups = false;
notifyListeners();
@@ -84,8 +91,9 @@ class GroupPermissionController extends ChangeNotifier {
_menus
..clear()
..addAll(response.items);
} catch (e) {
_errorMessage = e.toString();
} catch (error) {
final failure = Failure.from(error);
_errorMessage = failure.describe();
} finally {
_isLoadingMenus = false;
notifyListeners();
@@ -112,8 +120,9 @@ class GroupPermissionController extends ChangeNotifier {
includeDeleted: _includeDeleted,
);
_result = response;
} catch (e) {
_errorMessage = e.toString();
} catch (error) {
final failure = Failure.from(error);
_errorMessage = failure.describe();
} finally {
_isLoading = false;
notifyListeners();
@@ -150,9 +159,11 @@ class GroupPermissionController extends ChangeNotifier {
try {
final created = await _permissionRepository.create(input);
await fetch(page: 1);
await _syncPermissionsForGroup(input.groupId);
return created;
} catch (e) {
_errorMessage = e.toString();
} catch (error) {
final failure = Failure.from(error);
_errorMessage = failure.describe();
notifyListeners();
return null;
} finally {
@@ -166,9 +177,11 @@ class GroupPermissionController extends ChangeNotifier {
try {
final updated = await _permissionRepository.update(id, input);
await fetch(page: _result?.page ?? 1);
await _syncPermissionsForGroup(input.groupId);
return updated;
} catch (e) {
_errorMessage = e.toString();
} catch (error) {
final failure = Failure.from(error);
_errorMessage = failure.describe();
notifyListeners();
return null;
} finally {
@@ -180,11 +193,16 @@ class GroupPermissionController extends ChangeNotifier {
Future<bool> delete(int id) async {
_setSubmitting(true);
try {
final groupId = _resolveGroupIdForPermission(id);
await _permissionRepository.delete(id);
await fetch(page: _result?.page ?? 1);
if (groupId != null) {
await _syncPermissionsForGroup(groupId);
}
return true;
} catch (e) {
_errorMessage = e.toString();
} catch (error) {
final failure = Failure.from(error);
_errorMessage = failure.describe();
notifyListeners();
return false;
} finally {
@@ -198,9 +216,11 @@ class GroupPermissionController extends ChangeNotifier {
try {
final restored = await _permissionRepository.restore(id);
await fetch(page: _result?.page ?? 1);
await _syncPermissionsForGroup(restored.group.id);
return restored;
} catch (e) {
_errorMessage = e.toString();
} catch (error) {
final failure = Failure.from(error);
_errorMessage = failure.describe();
notifyListeners();
return null;
} finally {
@@ -219,4 +239,33 @@ class GroupPermissionController extends ChangeNotifier {
_isSubmitting = value;
notifyListeners();
}
Future<void> _syncPermissionsForGroup(int groupId) async {
final manager = _permissionManager;
if (manager == null) {
return;
}
try {
final synchronizer = PermissionSynchronizer(
repository: _permissionRepository,
manager: manager,
);
await synchronizer.syncForGroup(groupId);
} catch (_) {
// 권한 동기화 실패는 사용자 경험에 영향이 없도록 무시한다.
}
}
int? _resolveGroupIdForPermission(int permissionId) {
final current = _result?.items;
if (current == null) {
return null;
}
for (final item in current) {
if (item.id == permissionId) {
return item.group.id;
}
}
return null;
}
}

View File

@@ -9,6 +9,7 @@ import 'package:superport_v2/widgets/components/filter_bar.dart';
import 'package:superport_v2/widgets/components/superport_dialog.dart';
import '../../../../../core/config/environment.dart';
import '../../../../../core/permissions/permission_manager.dart';
import '../../../../../widgets/spec_page.dart';
import '../../../group/domain/entities/group.dart';
import '../../../group/domain/repositories/group_repository.dart';
@@ -118,14 +119,27 @@ class _GroupPermissionEnabledPageState
final intl.DateFormat _dateFormat = intl.DateFormat('yyyy-MM-dd HH:mm');
String? _lastError;
bool _initialized = false;
@override
void initState() {
super.initState();
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
if (_initialized) {
return;
}
final permissionManager = PermissionScope.of(context);
_controller = GroupPermissionController(
permissionRepository: GetIt.I<GroupPermissionRepository>(),
groupRepository: GetIt.I<GroupRepository>(),
menuRepository: GetIt.I<MenuRepository>(),
permissionManager: permissionManager,
)..addListener(_handleControllerUpdate);
_initialized = true;
WidgetsBinding.instance.addPostFrameCallback((_) async {
await _controller.loadGroups();
await _controller.loadMenus();