select method

Future<APIResponse> select(
  1. String table,
  2. APIRequest apiRequest, {
  3. bool? eager,
  4. bool json = false,
})

Implementation

Future<APIResponse<dynamic>> select(String table, APIRequest apiRequest,
    {bool? eager, bool json = false}) async {
  if (onlyOnDevelopment && !development) {
    return APIResponse.error(error: "Unsupported request!");
  }

  var requestedUri = apiRequest.requestedUri;

  final entityRepositoryProviders = await this.entityRepositoryProviders;

  var entityRepository =
      entityRepositoryProviders.getEntityRepository(name: table);

  if (entityRepository == null) {
    return APIResponse.error(error: "Can't find table: $table");
  }

  var query = Uri.decodeQueryComponent(requestedUri.query);

  if (query == 'EAGER=true') {
    query = '';
    eager = true;
  } else if (query.endsWith('&EAGER=true')) {
    query = query.substring(0, query.length - 11);
    eager = true;
  }

  eager ??= false;

  _log.info("APIDBModule[REQUEST]> select> "
      "table: `$table` ; "
      "eager: $eager"
      "${query.isNotEmpty ? ' ; QUERY> $query' : ''}");

  var resolutionRules = eager ? EntityResolutionRules(allEager: eager) : null;

  List<Object> list;

  if (query.isEmpty) {
    var selectAll =
        await entityRepository.selectAll(resolutionRules: resolutionRules);
    list = selectAll.toList();
  } else {
    var selectByQuery = await entityRepository.selectByQuery(query,
        resolutionRules: resolutionRules);
    list = selectByQuery.toList();
  }

  list.sort((a, b) {
    var id1 = entityRepository.getEntityID(a);
    var id2 = entityRepository.getEntityID(b);

    if (id1 == null && id2 == null) {
      return 0;
    } else if (id1 == null) {
      return 1;
    } else if (id2 == null) {
      return -1;
    } else if (id1 is num && id2 is num) {
      return id1.compareTo(id2);
    } else if (id1 is String && id2 is String) {
      return id1.compareTo(id2);
    } else {
      return 0;
    }
  });

  if (json) {
    var entitiesJson = _entitiesToJsonMap(list);
    return APIResponse.ok(entitiesJson, mimeType: 'json');
  }

  var entityType = entityRepository.type;

  var htmlDoc = HTMLDocument.darkTheme(
    title: 'DB - Tables',
    top: _buildTop(
        apiRootName: apiRoot.name,
        apiRootVersion: apiRoot.version,
        table: table,
        entityType: entityType),
    footer: _buildFooter(),
  );

  var content = [];

  var entityHandler = entityRepository.entityHandler;

  var repoName = entityRepository.name;

  var fieldsEntries = _fieldsOrdered(entityHandler);

  content.add('<br><h2>$entityType</h2>');

  content.add('<table class="center">');

  content.add('<thead><tr>');
  for (var e in fieldsEntries) {
    content.add('<td style="text-align: center">${e.key}</td>');
  }
  content.add(
      '<td style="text-align: center; min-width: 100px;">[operations]</td>');
  content.add('</tr></thead>');

  for (var o in list) {
    content.add('<tr>');

    for (var e in fieldsEntries) {
      var fieldName = e.key;
      var fieldType = e.value;

      var v = entityHandler.getField(o, fieldName);
      var v2 = _resolveValue(v, fieldType);

      var entityType = fieldType.entityType ?? fieldType.listEntityType?.type;
      var fieldEntityRepository = entityType != null
          ? entityRepositoryProviders.getEntityRepositoryByType(entityType)
          : null;

      if (fieldEntityRepository != null) {
        var repoName = fieldEntityRepository.name;

        content.add('<td style="text-align: center">');

        if (v2 is List) {
          var ids = v2
              .map((e) => '<a href="${basePath}update/$repoName/$e">$e</a>')
              .join(' , ');
          content.add(ids);
        } else {
          content.add('<a href="${basePath}update/$repoName/$v2">$v2</a>');
        }

        content.add('</td>');
      } else {
        content.add('<td style="text-align: center">$v2</td>');
      }
    }

    var id = entityHandler.getID(o);

    if (id != null) {
      content.add('<td style="text-align: center"> &nbsp; [ ');

      content.add('<a href="../update/$repoName/$id">edit</a>');

      content.add(' &nbsp;|&nbsp; <a href="../delete/$repoName/$id">del</a>');

      content.add(' ] &nbsp;</td>');
    }

    content.add('</tr>');
  }

  content.add(
      '<tr><td colspan="${fieldsEntries.length + 1}" style="text-align: right"><a href="${basePath}insert/$repoName">&nbsp;+&nbsp;</a></td></tr>');

  content.add('</table>');

  content.add(
      '<br><div style="width: 100%; text-align: center;"><i><a href="${basePath}select/$repoName/json">JSON</a></i></div>');

  htmlDoc.content = content;

  var html = htmlDoc.build();

  return APIResponse.ok(html, mimeType: 'html');
}