62 lines
1.9 KiB
Dart
62 lines
1.9 KiB
Dart
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<GroupModel> _sessionGroups = [];
|
|
final Map<String, List<GroupMemberModel>> _sessionMembers = {};
|
|
|
|
GroupApiService(this._client);
|
|
|
|
@override
|
|
Future<List<GroupModel>> getGroups() async {
|
|
return List.unmodifiable(_sessionGroups);
|
|
}
|
|
|
|
@override
|
|
Future<GroupModel> createGroup(String name, String? description) async {
|
|
final body = <String, dynamic>{'name': name};
|
|
if (description != null && description.isNotEmpty) {
|
|
body['description'] = description;
|
|
}
|
|
final data = await _client.post('/groups/', body);
|
|
final group = GroupModel.fromJson(data as Map<String, dynamic>);
|
|
_sessionGroups.add(group);
|
|
_sessionMembers[group.id] = [];
|
|
return group;
|
|
}
|
|
|
|
@override
|
|
Future<GroupMemberModel> 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<String, dynamic>);
|
|
_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<List<GroupMemberModel>> getGroupMembers(String groupId) async {
|
|
return List.unmodifiable(_sessionMembers[groupId] ?? []);
|
|
}
|
|
}
|