relatica/lib/data/memory/memory_groups_repo.dart

87 wiersze
2.1 KiB
Dart

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 = <String, List<GroupData>>{};
final _connectionsForGroup = <String, Set<Connection>>{};
final _myGroups = <GroupData>{};
@override
void clear() {
_groupsForConnection.clear();
_connectionsForGroup.clear();
_myGroups.clear();
}
@override
Result<List<GroupData>, 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<GroupData> getMyGroups() {
return _myGroups.toList();
}
@override
Result<List<Connection>, 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);
_groupsForConnection[connection.id]?.add(group);
}
@override
void addAllGroups(List<GroupData> groups) {
_myGroups.addAll(groups);
}
@override
bool updateConnectionGroupData(String id, List<GroupData> 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);
}
}