diff --git a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js index 52b52fa..214e023 100644 --- a/forward_engineering/alterScript/alterScriptFromDeltaHelper.js +++ b/forward_engineering/alterScript/alterScriptFromDeltaHelper.js @@ -131,6 +131,7 @@ const sortCollectionsByRelationships = (collections, relationships) => { * modelDefinitions: ModelDefinitions, * internalDefinitions: InternalDefinitions, * externalDefinitions: ExternalDefinitions, + * shouldIgnoreColumnComments?: boolean, * }} * @return {AlterScriptDto[]} * */ @@ -142,6 +143,7 @@ const getAlterCollectionsScriptDtos = ({ internalDefinitions, externalDefinitions, inlineDeltaRelationships, + shouldIgnoreColumnComments = false, }) => { const entitiesData = collection.properties?.entities?.properties; const createScriptsData = getItemProperties(entitiesData?.added); @@ -172,7 +174,14 @@ const getAlterCollectionsScriptDtos = ({ const addColumnScriptDtos = createScriptsData .filter(item => !item?.compMod?.created) .flatMap( - getAddColumnScriptDtos({ app, dbVersion, modelDefinitions, internalDefinitions, externalDefinitions }), + getAddColumnScriptDtos({ + app, + dbVersion, + modelDefinitions, + internalDefinitions, + externalDefinitions, + shouldIgnoreColumnComments, + }), ); const deleteColumnScriptDtos = deleteScriptsData @@ -180,7 +189,14 @@ const getAlterCollectionsScriptDtos = ({ .flatMap(getDeleteColumnScriptDtos(app)); const modifyColumnScriptDtos = modifyScriptsData.flatMap( - getModifyColumnScriptDtos({ app, dbVersion, modelDefinitions, internalDefinitions, externalDefinitions }), + getModifyColumnScriptDtos({ + app, + dbVersion, + modelDefinitions, + internalDefinitions, + externalDefinitions, + shouldIgnoreColumnComments, + }), ); return [ @@ -382,6 +398,8 @@ const getAlterScriptDtos = (data, app) => { const externalDefinitions = JSON.parse(data.externalDefinitions); const dbVersion = data.modelData[0]?.dbVersion; const inlineDeltaRelationships = getInlineRelationships({ collection, options: data.options }); + const shouldIgnoreColumnComments = + data.options?.scriptGenerationOptions?.feActiveOptions?.columnComments === 'ignore'; const containersScriptDtos = getAlterContainersScriptDtos({ collection }); const collectionsScriptDtos = getAlterCollectionsScriptDtos({ collection, @@ -391,6 +409,7 @@ const getAlterScriptDtos = (data, app) => { internalDefinitions, externalDefinitions, inlineDeltaRelationships, + shouldIgnoreColumnComments, }); const viewScriptDtos = getAlterViewScriptDtos(collection, app); const modelDefinitionsScriptDtos = getAlterModelDefinitionsScriptDtos({ diff --git a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js index a8a50bf..2b8502f 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/alterEntityHelper.js @@ -3,7 +3,10 @@ const { getModifyCheckConstraintScriptDtos } = require('./entityHelpers/checkCon const { getModifyEntityCommentsScriptDtos } = require('./entityHelpers/commentsHelper'); const { getUpdateTypesScriptDtos } = require('./columnHelpers/alterTypeHelper'); const { getModifyNonNullColumnsScriptDtos } = require('./columnHelpers/nonNullConstraintHelper'); -const { getModifiedCommentOnColumnScriptDtos } = require('./columnHelpers/commentsHelper'); +const { + getModifiedCommentOnColumnScriptDtos, + getAddedCommentOnColumnScriptDto, +} = require('./columnHelpers/commentsHelper'); const { getRenameColumnScriptDtos } = require('./columnHelpers/renameColumnHelper'); const { getModifyColumnCheckConstraintScriptDtos } = require('./columnHelpers/checkConstraintHelper'); const { AlterScriptDto, SCRIPT_TYPE } = require('../types/AlterScriptDto'); @@ -145,7 +148,14 @@ const getModifyCollectionKeysScriptDtos = * @return {(collection: Object, predicate: ([name: string, jsonSchema: Object]) => boolean) => AlterScriptDto[]} * */ const getAddColumnsByConditionScriptDtos = - ({ app, dbVersion, modelDefinitions, internalDefinitions, externalDefinitions }) => + ({ + app, + dbVersion, + modelDefinitions, + internalDefinitions, + externalDefinitions, + shouldIgnoreColumnComments = false, + }) => (collection, predicate) => { const { createColumnDefinitionBySchema } = require('./createColumnDefinition')(app); const ddlProvider = require('../../ddlProvider/ddlProvider')(null, null, app); @@ -162,7 +172,7 @@ const getAddColumnsByConditionScriptDtos = const scripts = _.toPairs(collection.properties) .filter(([name, jsonSchema]) => predicate([name, jsonSchema])) - .map(([name, jsonSchema]) => { + .flatMap(([name, jsonSchema]) => { const definitionJsonSchema = getDefinitionByReference({ propertySchema: jsonSchema, modelDefinitions, @@ -181,13 +191,21 @@ const getAddColumnsByConditionScriptDtos = const isActivated = isContainerActivated && isCollectionActivated && jsonSchema.isActivated; const script = ddlProvider.addColumn(fullName, ddlProvider.convertColumnDefinition(columnDefinition)); - return AlterScriptDto.getInstance( + const addColumnScriptDto = AlterScriptDto.getInstance( script, isActivated, false, SCRIPT_TYPE.alterEntity, getId(collectionSchema), ); + const commentScriptDto = getAddedCommentOnColumnScriptDto({ + collection, + name, + jsonSchema, + shouldIgnoreColumnComments, + }); + + return [addColumnScriptDto, commentScriptDto]; }) .filter(Boolean); @@ -227,7 +245,14 @@ const getNewlyCreatedIndexesScripts = ({ dbVersion, collection }) => { * @return {(collection: Object) => AlterScriptDto[]} * */ const getAddColumnScriptDtos = - ({ app, dbVersion, modelDefinitions, internalDefinitions, externalDefinitions }) => + ({ + app, + dbVersion, + modelDefinitions, + internalDefinitions, + externalDefinitions, + shouldIgnoreColumnComments = false, + }) => collection => { return getAddColumnsByConditionScriptDtos({ app, @@ -235,6 +260,7 @@ const getAddColumnScriptDtos = modelDefinitions, internalDefinitions, externalDefinitions, + shouldIgnoreColumnComments, })(collection, ([name, jsonSchema]) => !jsonSchema.compMod); }; @@ -279,7 +305,14 @@ const getDeleteColumnScriptDtos = app => collection => { * @return {(collection: Object) => Array} * */ const getDropAndRecreateColumnsScriptDtos = - ({ app, dbVersion, modelDefinitions, internalDefinitions, externalDefinitions }) => + ({ + app, + dbVersion, + modelDefinitions, + internalDefinitions, + externalDefinitions, + shouldIgnoreColumnComments = false, + }) => collection => { return _.toPairs(collection.properties) .filter(([name, jsonSchema]) => { @@ -307,6 +340,7 @@ const getDropAndRecreateColumnsScriptDtos = modelDefinitions, internalDefinitions, externalDefinitions, + shouldIgnoreColumnComments, })(collectionWithJustThisProperty, () => true); return [...deleteColumnsScriptDtos, ...addColumnsScriptDtos]; @@ -318,7 +352,14 @@ const getDropAndRecreateColumnsScriptDtos = * @return {(collection: Object) => AlterScriptDto[]} * */ const getModifyColumnScriptDtos = - ({ app, dbVersion, modelDefinitions, internalDefinitions, externalDefinitions }) => + ({ + app, + dbVersion, + modelDefinitions, + internalDefinitions, + externalDefinitions, + shouldIgnoreColumnComments = false, + }) => collection => { const renameColumnScriptDtos = getRenameColumnScriptDtos(collection); @@ -328,6 +369,7 @@ const getModifyColumnScriptDtos = modelDefinitions, internalDefinitions, externalDefinitions, + shouldIgnoreColumnComments, })(collection); if (dropAndRecreateScriptDtos.length) { return [...renameColumnScriptDtos, ...dropAndRecreateScriptDtos].filter(Boolean); diff --git a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/commentsHelper.js b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/commentsHelper.js index 4b600e4..4dcf15b 100644 --- a/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/commentsHelper.js +++ b/forward_engineering/alterScript/alterScriptHelpers/columnHelpers/commentsHelper.js @@ -91,6 +91,53 @@ const getModifiedCommentOnColumnScriptDtos = collection => { return [...updatedCommentScripts, ...deletedCommentScripts]; }; +/** + * Studio clears jsonSchema.description on newly added columns so comments cannot be inlined. + * The original text is kept on collection.role.properties[name]. + * + * @param {{ jsonSchema: Object, roleProperty: Object }} dto + * @return {string | undefined} + */ +const getAddedColumnComment = ({ jsonSchema, roleProperty } = {}) => { + return ( + jsonSchema?.description || + jsonSchema?.refDescription || + roleProperty?.description || + roleProperty?.refDescription + ); +}; + +/** + * @param {{ collection: Object, name: string, jsonSchema: Object, shouldIgnoreColumnComments?: boolean }} dto + * @return {AlterScriptDto | undefined} + */ +const getAddedCommentOnColumnScriptDto = ({ + collection, + name, + jsonSchema, + shouldIgnoreColumnComments = false, +} = {}) => { + if (shouldIgnoreColumnComments) { + return undefined; + } + + const roleProperty = collection?.role?.properties?.[name]; + const comment = getAddedColumnComment({ jsonSchema, roleProperty }); + if (!comment) { + return undefined; + } + + const isContainerActivated = isParentContainerActivated(collection) !== false; + const isCollectionActivated = isObjectInDeltaModelActivated(collection) !== false; + const isColumnActivated = jsonSchema.isActivated !== false; + const isActivated = isContainerActivated && isCollectionActivated && isColumnActivated; + + const columnName = getFullColumnName(collection, name); + const script = updateColumnComment(columnName, wrapComment(comment)); + return AlterScriptDto.getInstance(script, isActivated, false, SCRIPT_TYPE.alterEntity, getId(collection)); +}; + module.exports = { getModifiedCommentOnColumnScriptDtos, + getAddedCommentOnColumnScriptDto, };