@avonjs/avonjs
Version:
A fluent Node.js API generator.
208 lines (207 loc) • 6.94 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const node_assert_1 = __importDefault(require("node:assert"));
const FieldCollection_1 = __importDefault(require("../Collections/FieldCollection"));
exports.default = (Parent) => {
class ResolvesFields extends Parent {
/**
* Resolve the index fields.
*/
indexFields(request, resource) {
return this.availableFields(request)
.filterForIndex(request, resource)
.authorized(request)
.resolveForDisplay(resource);
}
/**
* Resolve the detail fields.
*/
detailFields(request, resource) {
return this.availableFields(request)
.filterForDetail(request, resource)
.authorized(request)
.resolveForDisplay(resource);
}
/**
* Resolve the creation fields.
*/
creationFields(request) {
return this.availableFields(request)
.authorized(request)
.onlyCreationFields(request)
.resolve(this.resource);
}
/**
* Resolve the update fields.
*/
updateFields(request) {
return this.resolveFields(request).onlyUpdateFields(request, this.resource);
}
/**
* Resolve the review fields.
*/
reviewFields(request, resource) {
return this.availableFields(request)
.filterForReview(request, resource)
.authorized(request)
.resolveForDisplay(resource);
}
/**
* Resolve the association fields.
*/
associationFields(request) {
return this.resolveFields(request)
.filterForAssociation(request)
.withoutUnresolvableFields()
.withoutRelatableFields();
}
/**
* Resolve the prunable fields.
*/
// public prunableFields(
// request: AvonRequest,
// skipSoftDeletes = true,
// ): FieldCollection<Field> {
// return this.availableFieldsOnIndexOrDetail(request)
// .filter((field) => {
// if (skipSoftDeletes && request.resourceSoftDeletes()) {
// return false;
// }
// return field.isPrunable();
// })
// .unique('attribute')
// .authorized(request)
// .resolveForDisplay(this.resource);
// }
/**
* Resolve the filterable fields.
*/
filterableFields(request) {
return this.availableFieldsOnIndexOrDetail(request)
.withOnlyFilterableFields()
.authorized(request);
}
/**
* Resolve the orderable fields.
*/
orderableFields(request) {
return this.availableFieldsOnIndexOrDetail(request)
.withOnlyOrderableFields()
.authorized(request);
}
/**
* Get the fields for the given request.
*/
resolveFields(request, resource) {
return this.availableFields(request).resolve(resource ?? this.resource);
}
/**
* Get the fields that are available for the given request.
*/
availableFields(request) {
const fieldsMethod = this.fieldsMethod(request);
return new FieldCollection_1.default(this.callFieldsMethod(fieldsMethod, request));
}
/**
* Get the fields that are available on "index" or "detail" for the given request.
*/
availableFieldsOnIndexOrDetail(request) {
return this.buildAvailableFields(request, [
'fieldsForIndex',
'fieldsForDetail',
]);
}
/**
* Get the fields that are available on "forms" for the given request.
*/
availableFieldsOnForms(request) {
return this.buildAvailableFields(request, [
'fieldsForCreate',
'fieldsForUpdate',
]);
}
/**
* Get the fields that are available for the given request.
*/
buildAvailableFields(request, methods) {
return new FieldCollection_1.default([
...this.fields(request),
...methods.flatMap((method) => {
return this.callFieldsMethod(method, request);
}),
]);
}
/**
* Forwards the dynamic filed method calls.
*/
callFieldsMethod(method, request) {
const fieldsMethod = this[method];
(0, node_assert_1.default)(typeof fieldsMethod === 'function', `The "${method}" method is not a function`);
return fieldsMethod.call(this, request);
}
/**
* Compute the method to use to get the available fields.
*/
fieldsMethod(request) {
if (request.isResourceIndexRequest()) {
return 'fieldsForIndex';
}
if (request.isResourceDetailRequest()) {
return 'fieldsForDetail';
}
if (request.isResourceReviewRequest()) {
return 'fieldsForReview';
}
if (request.isCreateOrAttachRequest()) {
return 'fieldsForCreate';
}
if (request.isUpdateOrUpdateAttachedRequest()) {
return 'fieldsForUpdate';
}
if (request.isResourceAssociationRequest()) {
return 'fieldsForAssociation';
}
return 'fields';
}
/**
* Get the fields available on the entity.
*/
fieldsForCreate(request) {
return this.fields(request);
}
/**
* Get the fields available on the entity.
*/
fieldsForUpdate(request) {
return this.fields(request);
}
/**
* Get the fields available on the entity.
*/
fieldsForIndex(request) {
return this.fields(request);
}
/**
* Get the fields available on the entity.
*/
fieldsForDetail(request) {
return this.fields(request);
}
/**
* Get the fields available on the entity.
*/
fieldsForReview(request) {
return this.fields(request);
}
/**
* Get the fields available on the entity.
*/
fieldsForAssociation(request) {
return this.fields(request);
}
}
return ResolvesFields;
};