upsert<TModel extends RestModel> method

  1. @override
Future<Response?> upsert<TModel extends RestModel>(
  1. TModel instance, {
  2. Query? query,
  3. ModelRepository<RestModel>? repository,
})

Query's providerArgs can extend the upsert functionality:

  • 'request' (RestRequest) Specifies configurable information about the request like HTTP method or top level key

Implementation

@override
Future<http.Response?> upsert<TModel extends RestModel>(instance, {query, repository}) async {
  final adapter = modelDictionary.adapterFor[TModel]!;
  final body = await adapter.toRest(instance, provider: this, repository: repository);
  final fromAdapter =
      adapter.restRequest != null ? adapter.restRequest!(query, instance).upsert : null;
  final request = (query?.providerArgs['request'] as RestRequest?) ?? fromAdapter;

  final url = request?.url;
  if (url == null) return null;

  final combinedBody = <String, dynamic>{};

  final topLevelKey = request?.topLevelKey;
  if (topLevelKey != null) {
    combinedBody.addAll({topLevelKey: body});
  } else {
    combinedBody.addAll(body);
  }

  final resp = await _brickRequestToHttpRequest(
    request!,
    QueryAction.upsert,
    body: combinedBody,
    query: query,
  );

  logger.finest('#upsert: url=$url statusCode=${resp.statusCode} body=${resp.body}');

  if (statusCodeIsSuccessful(resp.statusCode)) {
    return resp;
  } else {
    logger.warning('#upsert: url=$url statusCode=${resp.statusCode} body=${resp.body}');
    throw RestException(resp);
  }
}