UNPKG

@avonjs/avonjs

Version:

A fluent Node.js API generator.

82 lines (81 loc) 2.87 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 HasOneOrManyFilter_1 = __importDefault(require("./Filters/HasOneOrManyFilter")); const Relation_1 = __importDefault(require("./Relation")); const ResourceRelationshipGuesser_1 = require("./ResourceRelationshipGuesser"); class HasManyOrOne extends Relation_1.default { /** * Indicates related resources have to load. */ loaded = true; constructor(resource, relation) { super(resource, relation); this.foreignKey = ''; this.ownerKey = ''; } filterableAttribute(request) { return this.ownerKeyName(request); } /** * Make the field filter. */ makeFilter(request) { return new HasOneOrManyFilter_1.default(this); } /** * Get attribute that hold the related model key. */ foreignKeyName(request) { return String(this.foreignKey).length > 0 ? this.foreignKey : (0, ResourceRelationshipGuesser_1.guessForeignKey)(request.resource()); } /** * Get attribute that hold the related model key. */ ownerKeyName(request) { return String(this.ownerKey).length > 0 ? this.ownerKey : request.model().getKeyName(); } /** * Resolve related value for given resources. */ async resolveRelatables(request, resources) { const relatables = await this.searchRelatables(request, resources); resources.forEach((resource) => { resource.setAttribute(this.attribute, relatables.filter((relatable) => { const relatableKey = String(relatable.getAttribute(this.foreignKeyName(request))); const resourceKey = String(resource.getAttribute(this.ownerKeyName(request))); return relatableKey === resourceKey; })); }); } /** * Get related models for given resources. */ async searchRelatables(request, resources) { const repository = this.relatedResource.resolveRepository(request).where({ key: this.foreignKeyName(request), value: resources .map((resource) => resource.getAttribute(this.ownerKeyName(request))) .filter((value) => value), operator: Contracts_1.Operator.in, }); // to ensure only valid data attached const query = this.relatableQueryCallback.apply(repository, [request, repository]) ?? repository; return await query.all(); } /** * Determine field is fillable or not. */ fillable() { return false; } } exports.default = HasManyOrOne;