/** * Pivot Table API Service * @module app/db/service/pivot/index */ import Service from "app/db/service/base"; import * as pivotMethods from "app/db/service/pivot/methods"; import { loadColumns } from "app/db/helpers"; /** * Create a relational API service to access models via a pivot table. * All options are the same as on a normal service, but with a few changes: * @param {Model|string} options.Model the Bookshelf pivot model * @param {string} options.ChildModel the Bookshelf model inheriting from the pivot * @param {string} options.parentPivotRelation relation method on the parent that will access the pivot * @param {string} options.pivotChildRelation relation method on the pivot that will access the child * @param {string} options.childRelation relation method on the parent that will access the children * @return {Service} the service object */ export default async function PivotTableService(options) { const { ChildModel, bookshelf } = options; /** Locate the Model specified in the configuration */ options.ChildModel = ChildModel && typeof ChildModel === "string" ? bookshelf.model(ChildModel) : ChildModel; /** Due to the way English is inflected, sometimes these are the same and only one needs to be specified */ options.pivotChildRelation = options.pivotChildRelation || options.childRelation; options.pivotColumns = ChildModel && (await loadColumns(bookshelf, ChildModel)); // /** Use the model to identify the service's resource name */ // options.parentResource = options.name || service.Model?.prototype.tableName; // if (!service.resource) { // throw new Error("No name or model defined for resource"); // } const service = await Service(options, pivotMethods); service.type = "pivot"; service.ChildModel = options.ChildModel; return service; }