UNPKG

@avonjs/avonjs

Version:

A fluent Node.js API generator.

44 lines (43 loc) 2.18 kB
"use strict"; 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;