buildResourceDescription function

ResourceDescription buildResourceDescription(
  1. ApertureResource res,
  2. Iterable<DataBean<DataObject>> relatedBeans
)

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,
  );
}