import 'package:result_monad/result_monad.dart'; import '../../models/connection.dart'; import '../../models/exec_error.dart'; import '../../models/group_data.dart'; import '../interfaces/groups_repo.intf.dart'; class MemoryGroupsRepo implements IGroupsRepo { final _groupsForConnection = >{}; final _connectionsForGroup = >{}; final _myGroups = {}; @override void clear() { _groupsForConnection.clear(); _connectionsForGroup.clear(); _myGroups.clear(); } @override Result, ExecError> getGroupsForUser(String id) { if (!_groupsForConnection.containsKey(id)) { return Result.error(ExecError( type: ErrorType.notFound, message: '$id not a known user ID', )); } return Result.ok(_groupsForConnection[id]!); } @override List getMyGroups() { return _myGroups.toList(); } @override Result, ExecError> getGroupMembers(GroupData group) { if (_connectionsForGroup.containsKey(group.id)) { return Result.ok(_connectionsForGroup[group.id]!.toList()); } return buildErrorResult( type: ErrorType.notFound, message: 'Group ${group.id} not found', ); } @override void clearMyGroups() { _myGroups.clear(); } @override void addConnectionToGroup(GroupData group, Connection connection) { _connectionsForGroup.putIfAbsent(group.id, () => {}).add(connection); } @override void addAllGroups(List groups) { _myGroups.addAll(groups); } @override bool updateConnectionGroupData(String id, List currentGroups) { _groupsForConnection[id] = currentGroups; return true; } @override void upsertGroup(GroupData group) { _connectionsForGroup.putIfAbsent(group.id, () => {}); _myGroups.remove(group); _myGroups.add(group); } @override void deleteGroup(GroupData group) { for (final conGroups in _groupsForConnection.values) { conGroups.remove(group); } _connectionsForGroup.remove(group.id); _myGroups.remove(group); } }