feat: 결재·마스터 실연동 업데이트
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:superport_v2/core/common/models/paginated_result.dart';
|
||||
import 'package:superport_v2/core/network/api_client.dart';
|
||||
import 'package:superport_v2/core/network/api_routes.dart';
|
||||
|
||||
import '../../domain/entities/user.dart';
|
||||
import '../../domain/repositories/user_repository.dart';
|
||||
@@ -12,7 +13,7 @@ class UserRepositoryRemote implements UserRepository {
|
||||
|
||||
final ApiClient _api;
|
||||
|
||||
static const _basePath = '/employees';
|
||||
static const _basePath = '${ApiRoutes.apiV1}/employees';
|
||||
|
||||
/// 사용자 목록을 조회한다.
|
||||
@override
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
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 '../../../group/domain/entities/group.dart';
|
||||
import '../../../group/domain/repositories/group_repository.dart';
|
||||
import '../../../group_permission/application/permission_synchronizer.dart';
|
||||
import '../../../group_permission/domain/repositories/group_permission_repository.dart';
|
||||
import '../../domain/entities/user.dart';
|
||||
import '../../domain/repositories/user_repository.dart';
|
||||
|
||||
@@ -14,11 +18,17 @@ class UserController extends ChangeNotifier {
|
||||
UserController({
|
||||
required UserRepository userRepository,
|
||||
required GroupRepository groupRepository,
|
||||
GroupPermissionRepository? permissionRepository,
|
||||
PermissionManager? permissionManager,
|
||||
}) : _userRepository = userRepository,
|
||||
_groupRepository = groupRepository;
|
||||
_groupRepository = groupRepository,
|
||||
_permissionRepository = permissionRepository,
|
||||
_permissionManager = permissionManager;
|
||||
|
||||
final UserRepository _userRepository;
|
||||
final GroupRepository _groupRepository;
|
||||
final GroupPermissionRepository? _permissionRepository;
|
||||
final PermissionManager? _permissionManager;
|
||||
|
||||
PaginatedResult<UserAccount>? _result;
|
||||
bool _isLoading = false;
|
||||
@@ -47,8 +57,9 @@ class UserController extends ChangeNotifier {
|
||||
try {
|
||||
final response = await _groupRepository.list(page: 1, pageSize: 100);
|
||||
_groups = response.items;
|
||||
} catch (e) {
|
||||
_errorMessage = e.toString();
|
||||
} catch (error) {
|
||||
final failure = Failure.from(error);
|
||||
_errorMessage = failure.describe();
|
||||
} finally {
|
||||
_isLoadingGroups = false;
|
||||
notifyListeners();
|
||||
@@ -74,8 +85,9 @@ class UserController extends ChangeNotifier {
|
||||
isActive: isActive,
|
||||
);
|
||||
_result = response;
|
||||
} catch (e) {
|
||||
_errorMessage = e.toString();
|
||||
} catch (error) {
|
||||
final failure = Failure.from(error);
|
||||
_errorMessage = failure.describe();
|
||||
} finally {
|
||||
_isLoading = false;
|
||||
notifyListeners();
|
||||
@@ -106,9 +118,11 @@ class UserController extends ChangeNotifier {
|
||||
try {
|
||||
final created = await _userRepository.create(input);
|
||||
await fetch(page: 1);
|
||||
await _syncPermissions(input.groupId);
|
||||
return created;
|
||||
} catch (e) {
|
||||
_errorMessage = e.toString();
|
||||
} catch (error) {
|
||||
final failure = Failure.from(error);
|
||||
_errorMessage = failure.describe();
|
||||
notifyListeners();
|
||||
return null;
|
||||
} finally {
|
||||
@@ -122,9 +136,11 @@ class UserController extends ChangeNotifier {
|
||||
try {
|
||||
final updated = await _userRepository.update(id, input);
|
||||
await fetch(page: _result?.page ?? 1);
|
||||
await _syncPermissions(input.groupId);
|
||||
return updated;
|
||||
} catch (e) {
|
||||
_errorMessage = e.toString();
|
||||
} catch (error) {
|
||||
final failure = Failure.from(error);
|
||||
_errorMessage = failure.describe();
|
||||
notifyListeners();
|
||||
return null;
|
||||
} finally {
|
||||
@@ -136,11 +152,16 @@ class UserController extends ChangeNotifier {
|
||||
Future<bool> delete(int id) async {
|
||||
_setSubmitting(true);
|
||||
try {
|
||||
final groupId = _resolveGroupId(id);
|
||||
await _userRepository.delete(id);
|
||||
await fetch(page: _result?.page ?? 1);
|
||||
if (groupId != null) {
|
||||
await _syncPermissions(groupId);
|
||||
}
|
||||
return true;
|
||||
} catch (e) {
|
||||
_errorMessage = e.toString();
|
||||
} catch (error) {
|
||||
final failure = Failure.from(error);
|
||||
_errorMessage = failure.describe();
|
||||
notifyListeners();
|
||||
return false;
|
||||
} finally {
|
||||
@@ -154,9 +175,14 @@ class UserController extends ChangeNotifier {
|
||||
try {
|
||||
final restored = await _userRepository.restore(id);
|
||||
await fetch(page: _result?.page ?? 1);
|
||||
final groupId = restored.group?.id;
|
||||
if (groupId != null) {
|
||||
await _syncPermissions(groupId);
|
||||
}
|
||||
return restored;
|
||||
} catch (e) {
|
||||
_errorMessage = e.toString();
|
||||
} catch (error) {
|
||||
final failure = Failure.from(error);
|
||||
_errorMessage = failure.describe();
|
||||
notifyListeners();
|
||||
return null;
|
||||
} finally {
|
||||
@@ -175,4 +201,34 @@ class UserController extends ChangeNotifier {
|
||||
_isSubmitting = value;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> _syncPermissions(int groupId) async {
|
||||
final manager = _permissionManager;
|
||||
final repository = _permissionRepository;
|
||||
if (manager == null || repository == null) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
final synchronizer = PermissionSynchronizer(
|
||||
repository: repository,
|
||||
manager: manager,
|
||||
);
|
||||
await synchronizer.syncForGroup(groupId);
|
||||
} catch (_) {
|
||||
// 권한 동기화 실패는 무시하고 기존 흐름을 유지한다.
|
||||
}
|
||||
}
|
||||
|
||||
int? _resolveGroupId(int userId) {
|
||||
final items = _result?.items;
|
||||
if (items == null) {
|
||||
return null;
|
||||
}
|
||||
for (final user in items) {
|
||||
if (user.id == userId) {
|
||||
return user.group?.id;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,9 +8,11 @@ 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';
|
||||
import '../../../group_permission/domain/repositories/group_permission_repository.dart';
|
||||
import '../../domain/entities/user.dart';
|
||||
import '../../domain/repositories/user_repository.dart';
|
||||
import '../controllers/user_controller.dart';
|
||||
@@ -96,17 +98,31 @@ class _UserEnabledPageState extends State<_UserEnabledPage> {
|
||||
final FocusNode _searchFocus = FocusNode();
|
||||
bool _groupsLoaded = false;
|
||||
String? _lastError;
|
||||
bool _initialized = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
void didChangeDependencies() {
|
||||
super.didChangeDependencies();
|
||||
if (_initialized) {
|
||||
return;
|
||||
}
|
||||
final permissionManager = PermissionScope.of(context);
|
||||
_controller = UserController(
|
||||
userRepository: GetIt.I<UserRepository>(),
|
||||
groupRepository: GetIt.I<GroupRepository>(),
|
||||
permissionRepository: GetIt.I<GroupPermissionRepository>(),
|
||||
permissionManager: permissionManager,
|
||||
)..addListener(_handleControllerUpdate);
|
||||
_initialized = true;
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
||||
await _controller.loadGroups();
|
||||
await _controller.fetch();
|
||||
if (!mounted) return;
|
||||
setState(() {
|
||||
_groupsLoaded = true;
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user