사용자 마스터 UI 및 테스트 구현
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user