select method
Future<APIResponse>
select(
- String table,
- APIRequest apiRequest, {
- bool? eager,
- 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"> [ ');
content.add('<a href="../update/$repoName/$id">edit</a>');
content.add(' | <a href="../delete/$repoName/$id">del</a>');
content.add(' ] </td>');
}
content.add('</tr>');
}
content.add(
'<tr><td colspan="${fieldsEntries.length + 1}" style="text-align: right"><a href="${basePath}insert/$repoName"> + </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');
}