upsert<TModel extends RepositoryModel> method

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

Send a model to remoteProvider and hydrate.

Implementation

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

  final optimisticLocal = policy == OfflineFirstUpsertPolicy.optimisticLocal;
  final requireRemote = policy == OfflineFirstUpsertPolicy.requireRemote;

  if (optimisticLocal) {
    instance.primaryKey = await _upsertLocal<TModel>(instance, query: query);
    await notifySubscriptionsWithLocalData<TModel>();
  }

  try {
    await remoteProvider.upsert<TModel>(instance, query: query, repository: this);

    if (requireRemote) {
      instance.primaryKey = await _upsertLocal<TModel>(instance, query: query);
      await notifySubscriptionsWithLocalData<TModel>();
    }
  } on ClientException catch (e) {
    logger.warning('#upsert client failure: $e');
    if (requireRemote) rethrow;
  } on SocketException catch (e) {
    logger.warning('#upsert socket failure: $e');
    if (requireRemote) rethrow;
  }

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

  return instance;
}