Skip to content

Commit

Permalink
refacto
Browse files Browse the repository at this point in the history
Signed-off-by: Pierre No毛l <petersg83@gmail.com>
  • Loading branch information
petersg83 committed Oct 16, 2020
1 parent e2341e9 commit d84284f
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 41 deletions.
58 changes: 25 additions & 33 deletions packages/strapi-connector-bookshelf/lib/build-database-schema.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,18 @@ const _ = require('lodash');
const { singular } = require('pluralize');
const { contentTypes: contentTypesUtils } = require('strapi-utils');

const { storeDefinition, didColumnDefinitionChange } = require('./utils/store-definition');
const { getDraftAndPublishMigrationWay, migrateDraftAndPublish } = require('./database-migration');
const { storeDefinition, getColumnsWhereDefinitionChanged } = require('./utils/store-definition');
const { migrateDraftAndPublish } = require('./database-migration');
const { getManyRelations } = require('./utils/associations');

module.exports = async ({ ORM, loadedModel, definition, connection, model }) => {
// Migrations to do before updating/creating the tables in database
const draftAndPublishMigrationWay = await getDraftAndPublishMigrationWay({ definition, ORM });
if (draftAndPublishMigrationWay === 'disable') {
await migrateDraftAndPublish({ definition, ORM, way: 'disable' });
}

// Update/create the tables in database
await createOrUpdateTables({ ORM, loadedModel, definition, connection, model });

// Migrations to do after updating/creating the tables in database
if (draftAndPublishMigrationWay === 'enable') {
await migrateDraftAndPublish({ definition, ORM, way: 'enable' });
}
// migrations
await migrateDraftAndPublish({ definition, ORM });

// store new definitions
await storeDefinition(definition, ORM);
};

Expand Down Expand Up @@ -112,6 +105,15 @@ const createOrUpdateTables = async ({ ORM, loadedModel, definition, connection,
}
};

const getColumnInfo = async (columnName, tableName, ORM) => {
const exists = await ORM.knex.schema.hasColumn(tableName, columnName);

return {
columnName,
exists,
};
};

const isColumn = ({ definition, attribute, name }) => {
if (!_.has(attribute, 'type')) {
const relation = definition.associations.find(association => {
Expand Down Expand Up @@ -282,20 +284,12 @@ const createOrUpdateTable = async ({ table, attributes, definition, ORM, model }
const attributesNames = Object.keys(attributes);

// Fetch existing column
const columnsExist = await Promise.all(
attributesNames.map(attribute => ORM.knex.schema.hasColumn(table, attribute))
const columnsInfo = await Promise.all(
attributesNames.map(attributeName => getColumnInfo(attributeName, table, ORM))
);
const nameOfColumnsToAdd = columnsInfo.filter(info => !info.exists).map(info => info.columnName);

const columnsToAdd = {};

// Get columns to add
columnsExist.forEach((columnExist, index) => {
const attribute = attributes[attributesNames[index]];

if (!columnExist) {
columnsToAdd[attributesNames[index]] = attribute;
}
});
const columnsToAdd = _.pick(attributes, nameOfColumnsToAdd);

// Generate and execute query to add missing column
if (Object.keys(columnsToAdd).length > 0) {
Expand All @@ -304,16 +298,14 @@ const createOrUpdateTable = async ({ table, attributes, definition, ORM, model }
});
}

const attrNamesWithoutTimestamps = attributesNames.filter(
attributeName => !(definition.options.timestamps || []).includes(attributeName)
);
const changedAttributesResult = await Promise.all(
attrNamesWithoutTimestamps.map(attributeName =>
didColumnDefinitionChange(attributeName, definition, ORM)
)
const attrsNameWithoutTimestamps = attributesNames.filter(
columnName => !(definition.options.timestamps || []).includes(columnName)
);
const columnsToAlter = attrNamesWithoutTimestamps.filter(
(attributeName, index) => changedAttributesResult[index]

const columnsToAlter = getColumnsWhereDefinitionChanged(
attrsNameWithoutTimestamps,
definition,
ORM
);

if (columnsToAlter.length > 0) {
Expand Down
5 changes: 3 additions & 2 deletions packages/strapi-connector-bookshelf/lib/database-migration.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ const getDraftAndPublishMigrationWay = async ({ definition, ORM }) => {
}
};

const migrateDraftAndPublish = async ({ definition, ORM, way }) => {
const migrateDraftAndPublish = async ({ definition, ORM }) => {
const way = await getDraftAndPublishMigrationWay({ definition, ORM });

if (way === 'enable') {
const now = new Date();
let publishedAtValue = now;
Expand Down Expand Up @@ -55,6 +57,5 @@ const migrateDraftAndPublish = async ({ definition, ORM, way }) => {
};

module.exports = {
getDraftAndPublishMigrationWay,
migrateDraftAndPublish,
};
Original file line number Diff line number Diff line change
Expand Up @@ -38,18 +38,20 @@ const storeDefinition = async (definition, ORM) => {
return strapi.models['core_store'].forge(defData).save();
};

const didColumnDefinitionChange = async (attributeName, definition, ORM) => {
// Checks if the definition has changed
const getColumnsWhereDefinitionChanged = async (columnsName, definition, ORM) => {
const previousDefinitionRow = await getDefinitionFromStore(definition, ORM);
const previousDefinition = JSON.parse(_.get(previousDefinitionRow, 'value', null));
const previousAttribute = _.get(previousDefinition, ['attributes', attributeName], null);
const actualAttribute = _.get(definition, ['attributes', attributeName], null);

return !_.isEqual(previousAttribute, actualAttribute);
return columnsName.filter(columnName => {
const previousAttribute = _.get(previousDefinition, ['attributes', columnName], null);
const actualAttribute = _.get(definition, ['attributes', columnName], null);

return !_.isEqual(previousAttribute, actualAttribute);
});
};

module.exports = {
storeDefinition,
getDefinitionFromStore,
didColumnDefinitionChange,
getColumnsWhereDefinitionChanged,
};

0 comments on commit d84284f

Please sign in to comment.