UNPKG

@sqb/connect

Version:

Multi-dialect database connection framework written with TypeScript

129 lines (128 loc) 5.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Association = void 0; const putil_varhelpers_1 = require("putil-varhelpers"); const orm_helper_js_1 = require("../util/orm.helper.js"); const entity_metadata_js_1 = require("./entity-metadata.js"); class Association { constructor(name, args) { this.name = name; this.source = args.source; this.target = args.target; this.sourceKey = args.sourceKey; this.targetKey = args.targetKey; this.many = !!args.many; } async resolveSource() { this._source = await (0, orm_helper_js_1.resolveEntityMeta)(this.source); if (!this._source) throw new Error(`Can't resolve source entity of association "${this.name}"`); return this._source; } async resolveTarget() { this._target = await (0, orm_helper_js_1.resolveEntityMeta)(this.target); if (!this._target) throw new Error(`Can't resolve target entity of association "${this.name}"`); return this._target; } async resolveSourceKey() { await this._resolveKeys(); // @ts-ignore return this._sourceKey; } async resolveSourceProperty() { await this._resolveKeys(); // @ts-ignore return this._sourceProperty; } async resolveTargetKey() { await this._resolveKeys(); // @ts-ignore return this._targetKey; } async resolveTargetProperty() { await this._resolveKeys(); // @ts-ignore return this._targetProperty; } returnsMany() { return this.many; } async _resolveKeys() { if (this._resolved) return; const source = await this.resolveSource(); const target = await this.resolveTarget(); let sourceKey = this.sourceKey || ''; let targetKey = this.targetKey || ''; if (!(sourceKey && targetKey)) { // Try to determine key fields from foreign key from source to target let foreign = await entity_metadata_js_1.EntityMetadata.getForeignKeyFor(source, target); if (foreign && foreign !== this) { await foreign._resolveKeys(); this._sourceKey = foreign._sourceKey; this._sourceProperty = foreign._sourceProperty; this._targetKey = foreign._targetKey; this._targetProperty = foreign._targetProperty; return; } // Try to determine key fields from foreign key from target to source foreign = await entity_metadata_js_1.EntityMetadata.getForeignKeyFor(target, source); if (foreign && foreign !== this) { await foreign._resolveKeys(); this._sourceKey = foreign._targetKey; this._sourceProperty = foreign._targetProperty; this._targetKey = foreign._sourceKey; this._targetProperty = foreign._sourceProperty; return; } if (this.many) { if (!sourceKey) { const primaryIndexColumns = entity_metadata_js_1.EntityMetadata.getPrimaryIndexColumns(source); sourceKey = primaryIndexColumns && primaryIndexColumns.length === 1 ? primaryIndexColumns[0].name : 'id'; } if (!targetKey && sourceKey) { // snake-case let s = source.name[0].toLowerCase() + source.name.substring(1) + '_' + sourceKey; if (!entity_metadata_js_1.EntityMetadata.getColumnField(target, s)) s = (0, putil_varhelpers_1.camelCase)(s); targetKey = s; } } else { if (!targetKey) { const primaryIndexColumns = entity_metadata_js_1.EntityMetadata.getPrimaryIndexColumns(target); targetKey = primaryIndexColumns && primaryIndexColumns.length === 1 ? primaryIndexColumns[0].name : 'id'; } if (!sourceKey && targetKey) { // snake-case let s = target.name[0].toLowerCase() + target.name.substring(1) + '_' + targetKey; if (!entity_metadata_js_1.EntityMetadata.getColumnField(source, s)) s = (0, putil_varhelpers_1.camelCase)(s); sourceKey = s; } } } this._targetProperty = entity_metadata_js_1.EntityMetadata.getColumnField(target, targetKey); if (!this._targetProperty) throw new Error(`Can't determine target key of ${this.name}`); this._sourceProperty = entity_metadata_js_1.EntityMetadata.getColumnField(source, sourceKey); if (!this._sourceProperty) throw new Error(`Can't determine source key of ${this.name}`); this._targetKey = targetKey; this._sourceKey = sourceKey; } } exports.Association = Association;