UNPKG

@sqb/connect

Version:

Multi-dialect database connection framework written with TypeScript

93 lines (92 loc) 3.91 kB
"use strict"; 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;