objection
Version:
An SQL-friendly ORM for Node.js
80 lines (62 loc) • 1.93 kB
JavaScript
'use strict';
const { UpdateOperation } = require('../../../queryBuilder/operations/UpdateOperation');
class ManyToManyUpdateOperationBase extends UpdateOperation {
constructor(name, opt) {
super(name, opt);
this.relation = opt.relation;
this.owner = opt.owner;
this.hasExtraProps = false;
this.joinTablePatch = {};
this.joinTablePatchFilterQuery = null;
}
onAdd(builder, args) {
const obj = args[0];
// Copy all extra properties to the `joinTablePatch` object.
for (const extra of this.relation.joinTableExtras) {
if (extra.aliasProp in obj) {
this.hasExtraProps = true;
this.joinTablePatch[extra.joinTableProp] = obj[extra.aliasProp];
}
}
const res = super.onAdd(builder, args);
if (this.hasExtraProps) {
// Make sure we don't try to insert the extra properties
// to the target table.
this.relation.omitExtraProps([this.model]);
}
return res;
}
async onAfter1(builder, result) {
if (this.hasExtraProps) {
const joinTableUpdateQuery = this.relation
.getJoinModelClass(builder.knex())
.query()
.childQueryOf(builder)
.patch(this.joinTablePatch);
await this.applyModifyFilterForJoinTable(joinTableUpdateQuery).modify(
this.relation.joinTableModify,
);
return result;
} else {
return result;
}
}
/* istanbul ignore next */
applyModifyFilterForRelatedTable(builder) {
throw new Error('not implemented');
}
/* istanbul ignore next */
applyModifyFilterForJoinTable(builder) {
throw new Error('not implemented');
}
clone() {
const clone = super.clone();
clone.hasExtraProps = this.hasExtraProps;
clone.joinTablePatch = this.joinTablePatch;
clone.joinTablePatchFilterQuery = this.joinTablePatchFilterQuery;
return clone;
}
}
module.exports = {
ManyToManyUpdateOperationBase,
};