upsert<_Model extends _RepositoryModel> method
Future<_Model>
upsert<_Model extends _RepositoryModel>(
- _Model instance, {
- Query? query,
- OfflineFirstUpsertPolicy policy = OfflineFirstUpsertPolicy.optimisticLocal,
Send a model to remoteProvider and hydrate.
Implementation
@override
Future<_Model> upsert<_Model extends _RepositoryModel>(
_Model 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<_Model>(instance, query: query);
}
try {
await remoteProvider.upsert<_Model>(instance, query: query, repository: this);
if (requireRemote) {
instance.primaryKey = await _upsertLocal<_Model>(instance, query: query);
}
} 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<_Model>(query: query);
return instance;
}