summaryrefslogtreecommitdiff
path: root/src/app/db/service/pivot/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/db/service/pivot/index.js')
-rw-r--r--src/app/db/service/pivot/index.js47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/app/db/service/pivot/index.js b/src/app/db/service/pivot/index.js
new file mode 100644
index 0000000..ded69b8
--- /dev/null
+++ b/src/app/db/service/pivot/index.js
@@ -0,0 +1,47 @@
+/**
+ * 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;
+}