delete<TModel extends RepositoryModel> method

  1. @override
Future<bool> delete<TModel extends RepositoryModel>(
  1. TModel instance, {
  2. OfflineFirstDeletePolicy policy = OfflineFirstDeletePolicy.optimisticLocal,
  3. Query? query,
})

Remove a model from SQLite and the remoteProvider

Implementation

@override
Future<bool> delete<TModel extends RepositoryModel>(
  TModel instance, {
  OfflineFirstDeletePolicy policy = OfflineFirstDeletePolicy.optimisticLocal,
  Query? query,
}) async {
  final withPolicy = applyPolicyToQuery(query, delete: policy);
  query = (withPolicy ?? Query()).copyWith(action: QueryAction.delete);
  logger.finest('#delete: $query');

  final optimisticLocal = policy == OfflineFirstDeletePolicy.optimisticLocal;
  final requireRemote = policy == OfflineFirstDeletePolicy.requireRemote;

  var rowsDeleted = 0;

  if (optimisticLocal) {
    rowsDeleted = await _deleteLocal<TModel>(instance, query: query);
    await notifySubscriptionsWithLocalData<TModel>(notifyWhenEmpty: true);
  }

  try {
    await remoteProvider.delete<TModel>(instance, query: query, repository: this);
    if (requireRemote) {
      rowsDeleted = await _deleteLocal<TModel>(instance, query: query);
      await notifySubscriptionsWithLocalData<TModel>(notifyWhenEmpty: true);
    }
  } on ClientException catch (e) {
    logger.warning('#delete client failure: $e');
    if (requireRemote) rethrow;
  } on SocketException catch (e) {
    logger.warning('#delete socket failure: $e');
    if (requireRemote) rethrow;
  }

  // ignore: unawaited_futures
  if (autoHydrate) hydrate<TModel>(query: query);

  return rowsDeleted > 0;
}