upsert<TModel extends RepositoryModel> method
Future<TModel>
upsert<TModel extends RepositoryModel>(
- TModel instance, {
- Query? query,
- 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;
}