@avonjs/avonjs
Version:
A fluent Node.js API generator.
44 lines (43 loc) • 2.18 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const Contracts_1 = require("../../Contracts");
const ResourceAssociationResponse_1 = __importDefault(require("../Responses/ResourceAssociationResponse"));
const Controller_1 = __importDefault(require("./Controller"));
class AssociableController extends Controller_1.default {
/**
* Default route handler
*/
async __invoke(request) {
const resource = request.resource();
const relationship = request.relatedField();
request
.logger()
?.dump(`Searching "${request.resourceName()}" for relation-ship "${relationship.attribute}" ...`);
const repository = await relationship.searchAssociable(request, request.query('withTrashed') === 'true');
const { items, count } = await repository.search(request.string('search', ''), request.currentPage(), relationship.relatedResource.relatableSearchResults);
const relatedResource = (resource) => {
return new relationship.relatedResource.constructor.prototype.constructor(resource);
};
const resources = await Promise.all(items
.map((item) => relatedResource(item))
.filter((associable) => {
request
.logger()
?.dump(`Authorizing "${associable.resourceName()}" to allow adding to "${request.resourceName()}" ...`);
return resource.authorizedTo(request, Contracts_1.Ability.add, [associable]);
}));
request.logger()?.dump('Preparing response ...');
return new ResourceAssociationResponse_1.default(await Promise.all(resources.map((resource) => {
return resource.serializeForAssociation(request);
})), {
count,
currentPage: request.currentPage(),
perPage: relationship.relatedResource.relatableSearchResults,
perPageOptions: [relationship.relatedResource.relatableSearchResults],
});
}
}
exports.default = AssociableController;