@sqb/connect
Version:
Multi-dialect database connection framework written with TypeScript
84 lines (83 loc) • 3.43 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.UpdateCommand = void 0;
const builder_1 = require("@sqb/builder");
const column_field_metadata_js_1 = require("../model/column-field-metadata.js");
const embedded_field_metadata_js_1 = require("../model/embedded-field-metadata.js");
const orm_helper_js_1 = require("../util/orm.helper.js");
const command_helper_js_1 = require("./command.helper.js");
class UpdateCommand {
// istanbul ignore next
constructor() {
throw new Error('This class is abstract');
}
static async execute(args) {
const { entity } = args;
const tableName = entity.tableName;
if (!tableName)
throw new Error(`${entity.ctor.name} is not decorated with @Entity decorator`);
// Create a context
const ctx = {
entity,
queryParams: {},
queryValues: {},
queryFilter: [],
colCount: 0,
};
// Prepare
await this._prepareParams(ctx, entity, args.values);
if (!ctx.colCount)
return 0;
if (args.filter)
await this._prepareFilter(ctx, args.filter);
const query = (0, builder_1.Update)(tableName + ' as T', ctx.queryValues).where(...ctx.queryFilter);
const qr = await args.connection.execute(query, {
params: args.params ? [...args.params, ctx.queryParams] : ctx.queryParams,
objectRows: false,
cursor: false,
});
return qr.rowsAffected || 0;
}
static async _prepareFilter(ctx, filter) {
if (filter) {
const where = (0, builder_1.And)();
await (0, command_helper_js_1.prepareFilter)(ctx.entity, filter, where);
ctx.queryFilter.push(...where._items);
}
}
static async _prepareParams(ctx, entity, values, prefix, suffix) {
let v;
prefix = prefix || '';
suffix = suffix || '';
for (const col of Object.values(entity.fields)) {
v = values[col.name];
if (v === undefined)
continue;
if ((0, orm_helper_js_1.isColumnField)(col)) {
if (col.noUpdate)
continue;
if (typeof col.serialize === 'function')
v = col.serialize(v, col.name);
if (v === null && col.notNull)
throw new Error(`${entity.name}.${col.name} is required and can't be null`);
if (v === undefined)
continue;
column_field_metadata_js_1.ColumnFieldMetadata.checkEnumValue(col, v);
const fieldName = prefix + col.fieldName + suffix;
const k = ('I$_' + fieldName).substring(0, 30);
ctx.queryValues[fieldName] = (0, builder_1.Param)({
name: k,
dataType: col.dataType,
isArray: col.isArray,
});
ctx.queryParams[k] = v;
ctx.colCount++;
}
else if (v != null && (0, orm_helper_js_1.isEmbeddedField)(col)) {
const type = await embedded_field_metadata_js_1.EmbeddedFieldMetadata.resolveType(col);
await this._prepareParams(ctx, type, v, col.fieldNamePrefix, col.fieldNameSuffix);
}
}
}
}
exports.UpdateCommand = UpdateCommand;