diff --git a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js index cd50926..ad1cd34 100644 --- a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js +++ b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js @@ -127,9 +127,9 @@ const getAlterCollectionsScriptDtos = ({ ...createCollectionsScriptDtos, ...deleteCollectionScriptDtos, ...addColumnScriptDtos, - ...modifyCollectionScriptDtos, ...deleteColumnScriptDtos, ...modifyColumnScriptDtos, + ...modifyCollectionScriptDtos, ].filter(Boolean); }; diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js index 90d82a6..67cafe4 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js @@ -11,6 +11,7 @@ const { const { getModifyCheckConstraintScriptDtos } = require('./entityHelpers/checkConstraintHelper'); const { getModifyPkConstraintsScriptDtos } = require('./entityHelpers/primaryKeyHelper'); const { getModifyUniqueKeyConstraintsScriptDtos } = require('./entityHelpers/uniqueKeyHelper'); +const { getModifyNonNullColumnsScriptDtos } = require('./columnHelpers/nonNullConstraintHelper'); /** * @return {(collection: AlterCollectionDto) => AlterScriptDto | undefined} @@ -205,8 +206,9 @@ const getModifyColumnScriptDtos = (app, dbVersion, scriptFormat) => collection = const renameColumnScriptDtos = getRenameColumnScriptDtos(ddlProvider, scriptFormat)(collection); const updateTypeScriptDtos = getUpdateTypesScriptDtos(ddlProvider, scriptFormat)(collection); + const modifyNotNullScriptDtos = getModifyNonNullColumnsScriptDtos({ scriptFormat, collection }); - return [...renameColumnScriptDtos, ...updateTypeScriptDtos].filter(Boolean); + return [...renameColumnScriptDtos, ...updateTypeScriptDtos, ...modifyNotNullScriptDtos].filter(Boolean); }; module.exports = { diff --git a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/nonNullConstraintHelper.js b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/nonNullConstraintHelper.js new file mode 100644 index 0000000..c640033 --- /dev/null +++ b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/nonNullConstraintHelper.js @@ -0,0 +1,56 @@ +const _ = require('lodash'); +const { AlterScriptDto } = require('../../types/AlterScriptDto'); +const { assignTemplates } = require('../../../utils/assignTemplates'); +const templates = require('../../../ddlProvider/templates'); +const { + wrapInQuotes, + getSchemaOfAlterCollection, + getFullCollectionName, + prepareNameForScriptFormat, +} = require('../../../utils/general'); + +/** + * @param {string} tableName + * @param {string} columnName + * @return {string} + * */ +const setNotNullConstraint = (tableName, columnName) => { + return assignTemplates(templates.addNotNullConstraint, { + tableName, + columnName, + }); +}; + +/** + * @param {object} params + * @property {string} [scriptFormat] + * @property {AlterCollectionDto} collection + * @return {AlterScriptDto[]} + * */ +const getModifyNonNullColumnsScriptDtos = ({ scriptFormat, collection }) => { + const prepareName = prepareNameForScriptFormat(scriptFormat); + const collectionSchema = getSchemaOfAlterCollection(collection); + const fullTableName = getFullCollectionName(scriptFormat)(collectionSchema); + + const currentRequiredColumnNames = collection.required || []; + const previousRequiredColumnNames = collection.role.required || []; + + const columnNamesToAddNotNullConstraint = _.difference(currentRequiredColumnNames, previousRequiredColumnNames); + const columnNamesToRemoveNotNullConstraint = _.difference(previousRequiredColumnNames, currentRequiredColumnNames); + + const addNotNullConstraintsScript = _.toPairs(collection.properties) + .filter(([name, jsonSchema]) => { + const oldName = jsonSchema.compMod.oldField.name; + const shouldRemoveForOldName = columnNamesToRemoveNotNullConstraint.includes(oldName); + const shouldAddForNewName = columnNamesToAddNotNullConstraint.includes(name); + return shouldAddForNewName && !shouldRemoveForOldName; + }) + .map(([columnName]) => setNotNullConstraint(fullTableName, prepareName(columnName))) + .map(script => AlterScriptDto.getInstance([script], true, false)); + + return addNotNullConstraintsScript; +}; + +module.exports = { + getModifyNonNullColumnsScriptDtos, +}; diff --git a/forward_engineering/ddlProvider/templates.js b/forward_engineering/ddlProvider/templates.js index 6fef063..7b2e5b6 100644 --- a/forward_engineering/ddlProvider/templates.js +++ b/forward_engineering/ddlProvider/templates.js @@ -79,4 +79,6 @@ module.exports = { dropConstraint: 'ALTER TABLE ${tableName} DROP CONSTRAINT ${constraintName};', addPkConstraint: 'ALTER TABLE ${tableName} ADD ${constraintStatement};', + + addNotNullConstraint: 'ALTER TABLE ${tableName} MODIFY ${columnName} NOT NULL;', };