get<TModel extends RestModel> method

  1. @override
Future<List<TModel>> get<TModel extends RestModel>({
  1. Query? query,
  2. ModelRepository<RestModel>? repository,
})

Query's providerArgs can extend the get functionality:

  • 'request' (RestRequest) Specifies configurable information about the request like HTTP method or top level key (however, when defined, ['request'].topLevelKey is prioritized). Note that when no key is defined, the first value is returned regardless of the first key (in the example, {"id"...}).

Implementation

@override
Future<List<TModel>> get<TModel extends RestModel>({query, repository}) async {
  final adapter = modelDictionary.adapterFor[TModel]!;
  final fromAdapter = adapter.restRequest != null ? adapter.restRequest!(query, null).get : null;
  final request = (query?.providerArgs['request'] as RestRequest?) ?? fromAdapter;

  final url = request?.url;
  if (url == null) return <TModel>[];

  final resp = await _brickRequestToHttpRequest(
    request!,
    QueryAction.get,
    query: query,
  );

  if (statusCodeIsSuccessful(resp.statusCode)) {
    final topLevelKey = request.topLevelKey;
    final parsed = convertJsonFromGet(resp.body, topLevelKey);
    final body = parsed is Iterable ? parsed : [parsed];
    final results = body
        .where((msg) => msg != null)
        .map((msg) {
          return adapter.fromRest(msg, provider: this, repository: repository);
        })
        .toList()
        .cast<Future<TModel>>();

    return await Future.wait<TModel>(results);
  } else {
    logger.warning('#get: url=$url statusCode=${resp.statusCode} body=${resp.body}');
    throw RestException(resp);
  }
}