사용자 마스터 UI 및 테스트 구현

This commit is contained in:
JiWoong Sul
2025-09-22 21:27:45 +09:00
parent 2106d13b12
commit b6e50464d2
16 changed files with 1921 additions and 54 deletions

View File

@@ -0,0 +1,165 @@
import 'package:flutter/foundation.dart';
import 'package:superport_v2/core/common/models/paginated_result.dart';
import '../../../group/domain/entities/group.dart';
import '../../../group/domain/repositories/group_repository.dart';
import '../../domain/entities/user.dart';
import '../../domain/repositories/user_repository.dart';
enum UserStatusFilter { all, activeOnly, inactiveOnly }
class UserController extends ChangeNotifier {
UserController({
required UserRepository userRepository,
required GroupRepository groupRepository,
}) : _userRepository = userRepository,
_groupRepository = groupRepository;
final UserRepository _userRepository;
final GroupRepository _groupRepository;
PaginatedResult<UserAccount>? _result;
bool _isLoading = false;
bool _isSubmitting = false;
bool _isLoadingGroups = false;
String _query = '';
int? _groupFilter;
UserStatusFilter _statusFilter = UserStatusFilter.all;
String? _errorMessage;
List<Group> _groups = const [];
PaginatedResult<UserAccount>? get result => _result;
bool get isLoading => _isLoading;
bool get isSubmitting => _isSubmitting;
bool get isLoadingGroups => _isLoadingGroups;
String get query => _query;
int? get groupFilter => _groupFilter;
UserStatusFilter get statusFilter => _statusFilter;
String? get errorMessage => _errorMessage;
List<Group> get groups => _groups;
Future<void> loadGroups() async {
_isLoadingGroups = true;
notifyListeners();
try {
final response = await _groupRepository.list(page: 1, pageSize: 100);
_groups = response.items;
} catch (e) {
_errorMessage = e.toString();
} finally {
_isLoadingGroups = false;
notifyListeners();
}
}
Future<void> fetch({int page = 1}) async {
_isLoading = true;
_errorMessage = null;
notifyListeners();
try {
final isActive = switch (_statusFilter) {
UserStatusFilter.all => null,
UserStatusFilter.activeOnly => true,
UserStatusFilter.inactiveOnly => false,
};
final response = await _userRepository.list(
page: page,
pageSize: _result?.pageSize ?? 20,
query: _query.isEmpty ? null : _query,
groupId: _groupFilter,
isActive: isActive,
);
_result = response;
} catch (e) {
_errorMessage = e.toString();
} finally {
_isLoading = false;
notifyListeners();
}
}
void updateQuery(String value) {
_query = value;
notifyListeners();
}
void updateGroupFilter(int? groupId) {
_groupFilter = groupId;
notifyListeners();
}
void updateStatusFilter(UserStatusFilter filter) {
_statusFilter = filter;
notifyListeners();
}
Future<UserAccount?> create(UserInput input) async {
_setSubmitting(true);
try {
final created = await _userRepository.create(input);
await fetch(page: 1);
return created;
} catch (e) {
_errorMessage = e.toString();
notifyListeners();
return null;
} finally {
_setSubmitting(false);
}
}
Future<UserAccount?> update(int id, UserInput input) async {
_setSubmitting(true);
try {
final updated = await _userRepository.update(id, input);
await fetch(page: _result?.page ?? 1);
return updated;
} catch (e) {
_errorMessage = e.toString();
notifyListeners();
return null;
} finally {
_setSubmitting(false);
}
}
Future<bool> delete(int id) async {
_setSubmitting(true);
try {
await _userRepository.delete(id);
await fetch(page: _result?.page ?? 1);
return true;
} catch (e) {
_errorMessage = e.toString();
notifyListeners();
return false;
} finally {
_setSubmitting(false);
}
}
Future<UserAccount?> restore(int id) async {
_setSubmitting(true);
try {
final restored = await _userRepository.restore(id);
await fetch(page: _result?.page ?? 1);
return restored;
} catch (e) {
_errorMessage = e.toString();
notifyListeners();
return null;
} finally {
_setSubmitting(false);
}
}
void clearError() {
_errorMessage = null;
notifyListeners();
}
void _setSubmitting(bool value) {
_isSubmitting = value;
notifyListeners();
}
}