@avonjs/avonjs
Version:
A fluent Node.js API generator.
82 lines (81 loc) • 2.87 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 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;