Skip to content

Instantly share code, notes, and snippets.

@kapouer
Last active April 9, 2018 22:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kapouer/27c3fc7aaf4ff9382b47d3c867763203 to your computer and use it in GitHub Desktop.
Save kapouer/27c3fc7aaf4ff9382b47d3c867763203 to your computer and use it in GitHub Desktop.
var objection = require('objection');
var ref = objection.ref;
var Model = objection.Model;
var QueryBuilder = objection.QueryBuilder;
var UpdateOperation = require(
require('path').join(
require.resolve('objection'),
'..',
'queryBuilder/operations/UpdateOperation'
)
);
var InstanceUpdateOperation = require(
require('path').join(
require.resolve('objection'),
'..',
'queryBuilder/operations/InstanceUpdateOperation'
)
);
exports.Model = class CommonModel extends Model {
$query(trx) {
return super.$query(trx).patchObjectOperationFactory(() => {
return new InstancePatchObjectOperation('patch', {
instance: this,
modelOptions: { patch: true }
});
});
}
};
exports.QueryBuilder = class CommonQueryBuilder extends QueryBuilder {
constructor(modelClass) {
super(modelClass);
this._patchObjectOperationFactory = function patchObjectOperationFactory() {
return new UpdateOperation('patch', {
modelOptions: { patch: true }
});
};
}
patchObjectOperationFactory(factory) {
this._patchObjectOperationFactory = factory;
return this;
}
patchObject(obj) {
var patchObjectOperation = this._patchObjectOperationFactory();
this.skipUndefined();
this.addOperation(patchObjectOperation, [obj]);
return this;
}
clone() {
var builder = super.clone();
builder._patchObjectOperationFactory = this._patchObjectOperationFactory;
return builder;
}
};
function asPaths(obj, ret, pre, first) {
Object.keys(obj).forEach(function(key) {
var val = obj[key];
var cur = `${pre || ""}${key}`;
if (Array.isArray(val) || val == null || typeof val != "object") {
ret[cur] = val;
} else if (typeof val == "object") {
asPaths(val, ret, cur + (first ? ':' : '.'));
}
});
return ret;
}
class PatchObjectOperation extends UpdateOperation {
onBuildKnex(knexBuilder, builder) {
const json = this.model.$toDatabaseJson(builder.knex());
const jsonPaths = asPaths(json, {}, "", true);
const convertedJson = this.convertFieldExpressionsToRaw(builder, jsonPaths);
knexBuilder.update(convertedJson);
}
}
class InstancePatchObjectOperation extends InstanceUpdateOperation {}
InstancePatchObjectOperation.prototype.onBuildKnex = PatchObjectOperation.prototype.onBuildKnex;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment