You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.5 KiB
75 lines
2.5 KiB
3 years ago
|
'use strict';
|
||
|
|
||
|
const _ = require('lodash');
|
||
|
|
||
|
function checkNamingCollision(association) {
|
||
|
if (association.source.rawAttributes.hasOwnProperty(association.as)) {
|
||
|
throw new Error(
|
||
|
'Naming collision between attribute \'' + association.as +
|
||
|
'\' and association \'' + association.as + '\' on model ' + association.source.name +
|
||
|
'. To remedy this, change either foreignKey or as in your association definition'
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
exports.checkNamingCollision = checkNamingCollision;
|
||
|
|
||
|
function addForeignKeyConstraints(newAttribute, source, target, options, key) {
|
||
|
// FK constraints are opt-in: users must either set `foreignKeyConstraints`
|
||
|
// on the association, or request an `onDelete` or `onUpdate` behaviour
|
||
|
|
||
|
if (options.foreignKeyConstraint || options.onDelete || options.onUpdate) {
|
||
|
|
||
|
// Find primary keys: composite keys not supported with this approach
|
||
|
const primaryKeys = _.chain(source.rawAttributes).keys()
|
||
|
.filter(key => source.rawAttributes[key].primaryKey)
|
||
|
.map(key => source.rawAttributes[key].field || key).value();
|
||
|
|
||
|
if (primaryKeys.length === 1) {
|
||
|
if (source._schema) {
|
||
|
newAttribute.references = {
|
||
|
model: source.sequelize.getQueryInterface().QueryGenerator.addSchema({
|
||
|
tableName: source.tableName,
|
||
|
_schema: source._schema,
|
||
|
_schemaDelimiter: source._schemaDelimiter
|
||
|
})
|
||
|
};
|
||
|
} else {
|
||
|
newAttribute.references = { model: source.tableName };
|
||
|
}
|
||
|
|
||
|
newAttribute.references.key = key || primaryKeys[0];
|
||
|
newAttribute.onDelete = options.onDelete;
|
||
|
newAttribute.onUpdate = options.onUpdate;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
exports.addForeignKeyConstraints = addForeignKeyConstraints;
|
||
|
|
||
|
/**
|
||
|
* Mixin (inject) association methods to model prototype
|
||
|
*
|
||
|
* @private
|
||
|
* @param {Object} Association instance
|
||
|
* @param {Object} Model prototype
|
||
|
* @param {Array} Method names to inject
|
||
|
* @param {Object} Mapping between model and association method names
|
||
|
*/
|
||
|
function mixinMethods(association, obj, methods, aliases) {
|
||
|
aliases = aliases || {};
|
||
|
|
||
|
for (const method of methods) {
|
||
|
// don't override custom methods
|
||
|
if (!obj[association.accessors[method]]) {
|
||
|
const realMethod = aliases[method] || method;
|
||
|
|
||
|
obj[association.accessors[method]] = function() {
|
||
|
const instance = this;
|
||
|
const args = [instance].concat(Array.from(arguments));
|
||
|
|
||
|
return association[realMethod].apply(association, args);
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
exports.mixinMethods = mixinMethods;
|