@sqb/connect
Version:
Multi-dialect database connection framework written with TypeScript
129 lines (128 loc) • 5.36 kB
JavaScript
;
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;