import '../../models/group_model.dart'; import '../../models/group_member_model.dart'; import '../interfaces/group_service.dart'; import 'api_client.dart'; /// Real API implementation. /// NOTE: The backend has no list-groups or list-members endpoint. /// Groups and members are tracked in memory per session. class GroupApiService implements GroupService { final ApiClient _client; final List _sessionGroups = []; final Map> _sessionMembers = {}; GroupApiService(this._client); @override Future> getGroups() async { return List.unmodifiable(_sessionGroups); } @override Future createGroup(String name, String? description) async { final body = {'name': name}; if (description != null && description.isNotEmpty) { body['description'] = description; } final data = await _client.post('/groups/', body); final group = GroupModel.fromJson(data as Map); _sessionGroups.add(group); _sessionMembers[group.id] = []; return group; } @override Future addMember( String groupId, String userId, GroupRole role, ) async { final data = await _client.post('/groups/$groupId/members', { 'user_id': userId, 'role': role.apiValue, }); final member = GroupMemberModel.fromJson(data as Map); _sessionMembers.putIfAbsent(groupId, () => []).add(member); // Update member count on the cached group final idx = _sessionGroups.indexWhere((g) => g.id == groupId); if (idx != -1) { _sessionGroups[idx] = _sessionGroups[idx].copyWith( memberCount: (_sessionMembers[groupId]?.length ?? 1), ); } return member; } @override Future> getGroupMembers(String groupId) async { return List.unmodifiable(_sessionMembers[groupId] ?? []); } }