updateCacheRelations method

  1. @override
Future<Result<int, String, List<T>?>> updateCacheRelations({
  1. Set<String>? oldRels,
  2. Set<String>? newRels,
  3. required String fieldToUpdate,
  4. required ItemCreator<T> creator,
  5. String channel = 'main',
  6. CrudStrategy strategy = const DefaultCrudStrategy(),
})
override

Implementation

@override
Future<Result<int, String, List<T>?>> updateCacheRelations({
  Set<String>? oldRels,
  Set<String>? newRels,
  required String fieldToUpdate,
  required ItemCreator<T> creator,
  String channel = 'main',
  CrudStrategy strategy = const DefaultCrudStrategy(),
}) async {
  final Set<String> relsToAdd = {};
  final Set<String> relsToRemove = {};

  final allRels = <String>{...?oldRels, ...?newRels};
  for (final r in allRels) {
    if (newRels?.contains(r) == true) {
      relsToAdd.add(r);
    }
    if (oldRels?.contains(r) == true) {
      relsToRemove.add(r);
    }
  }

  final items = _currentList(channel);
  final updatedItems = items.map((e) {
    final map = e.toJson();
    final shouldIncrement = relsToAdd.contains(e.id);
    final shouldDecrement = relsToRemove.contains(e.id);
    if (shouldIncrement && !shouldDecrement) {
      map[fieldToUpdate] = (map[fieldToUpdate] ?? 0) + 1;
    } else if (shouldDecrement && !shouldIncrement) {
      map[fieldToUpdate] = (map[fieldToUpdate] ?? 1) - 1;
    }
    return creator(map);
  }).toList();

  _getItemsStream(channel).add(updatedItems);
  return _listResult(updatedItems);
}