@sqb/connect
Version:
Multi-dialect database connection framework written with TypeScript
93 lines (92 loc) • 3.91 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CreateCommand = 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 entity_metadata_js_1 = require("../model/entity-metadata.js");
const orm_helper_js_1 = require("../util/orm.helper.js");
class CreateCommand {
// 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: {},
colCount: 0,
};
// Prepare
await this._prepareParams(ctx, entity, args.values);
if (!ctx.colCount)
throw new Error('No field given to create new entity instance');
const query = (0, builder_1.Insert)(tableName, ctx.queryValues);
if (args.returning) {
const primaryIndexColumns = entity_metadata_js_1.EntityMetadata.getPrimaryIndexColumns(entity);
if (primaryIndexColumns.length)
query.returning(...primaryIndexColumns.map(col => col.fieldName));
}
const qr = await args.connection.execute(query, {
params: ctx.queryParams,
objectRows: false,
cursor: false,
});
if (args.returning && qr.fields && qr.rows?.length) {
const keyValues = {};
for (const f of qr.fields.values()) {
const el = entity_metadata_js_1.EntityMetadata.getColumnFieldByFieldName(entity, f.fieldName);
if (el)
keyValues[el.name] = qr.rows[0][f.index];
}
return keyValues;
}
}
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 ((0, orm_helper_js_1.isColumnField)(col)) {
if (col.noInsert)
continue;
if (v == null && col.default !== undefined) {
v =
typeof col.default === 'function'
? col.default(values)
: col.default;
}
if (typeof col.serialize === 'function')
v = col.serialize(v, col.name);
if (v == null) {
if (col.notNull && !col.autoGenerated) {
throw new Error(`${entity.name}.${col.name} is required and can't be null`);
}
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.CreateCommand = CreateCommand;