buildResourceDescription function
Implementation
ResourceDescription buildResourceDescription(
ApertureResource res,
Iterable<DataBean> relatedBeans,
) {
final repository = res.repository.find();
final bean = repository.bean;
final relations = bean.allMetaOfType<ApertureRelation>().map((meta) {
final relatedBean = relatedBeans.firstWhere(
(e) => e.type == meta.type,
orElse: () => throw ApiError(
'Related bean for ${meta.type.name} not found for ApertureRelation of ${bean.name}.',
),
);
final relationIdField = relatedBean.fields.firstWhere(
(f) => f.hasMetaOfType<RelationId>((m) => m.type == bean.type),
orElse: () => throw ApiError(
'Data class ${relatedBean.name} does not provide RelationId for relation to ${bean.name}.',
),
);
final relatedMeta = relatedBean.meta.whereType<Meta>().firstOrNull;
return ResourceRelation(
name: relatedMeta?.namePlural ?? relatedMeta?.name ?? relatedBean.name,
resourceId: relatedBean.name,
filter: ResourceRelationFilter(
fieldId: relationIdField.name,
type: ResourceFilterType.equals,
valueFieldId: bean.requireIdField.name,
),
);
}).toList();
final meta = bean.metaOfType<Meta>();
final isReadOnly = false;
return ResourceDescription(
id: buildResourceId(res),
name: meta?.name ?? niceName(bean.name),
namePlural: meta?.namePlural,
icon: meta?.icon ?? Icons.data_object,
readOnly: isReadOnly,
revisable: repository is RevisableDataRepository,
actions: [
for (final action in res.actions) action.buildDescription(relatedBeans),
],
fields: [
for (final field in bean.fields)
fieldDescription(bean, field, relatedBeans),
],
relations: relations,
idField: bean.fields
.firstWhere(
(e) => e.meta.whereType<Id>().isNotEmpty,
orElse: () => throw MissingIdFieldError(bean),
)
.name,
// TODO allow multiple display fields
displayField: bean.fields
.where((e) => e.hasMetaOfType<ApertureField>((e) => e.isDisplayField))
.firstOrNull
?.name,
);
}