mirror of
https://github.com/strapi/strapi.git
synced 2025-12-28 07:33:17 +00:00
refacto
Signed-off-by: Pierre Noël <petersg83@gmail.com>
This commit is contained in:
parent
e2341e9b06
commit
d84284faf2
@ -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);
|
||||
};
|
||||
|
||||
@ -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 => {
|
||||
@ -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) {
|
||||
@ -304,16 +298,14 @@ const createOrUpdateTable = async ({ table, attributes, definition, ORM, model }
|
||||
});
|
||||
}
|
||||
|
||||
const attrNamesWithoutTimestamps = attributesNames.filter(
|
||||
attributeName => !(definition.options.timestamps || []).includes(attributeName)
|
||||
const attrsNameWithoutTimestamps = attributesNames.filter(
|
||||
columnName => !(definition.options.timestamps || []).includes(columnName)
|
||||
);
|
||||
const changedAttributesResult = await Promise.all(
|
||||
attrNamesWithoutTimestamps.map(attributeName =>
|
||||
didColumnDefinitionChange(attributeName, definition, ORM)
|
||||
)
|
||||
);
|
||||
const columnsToAlter = attrNamesWithoutTimestamps.filter(
|
||||
(attributeName, index) => changedAttributesResult[index]
|
||||
|
||||
const columnsToAlter = getColumnsWhereDefinitionChanged(
|
||||
attrsNameWithoutTimestamps,
|
||||
definition,
|
||||
ORM
|
||||
);
|
||||
|
||||
if (columnsToAlter.length > 0) {
|
||||
|
||||
@ -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;
|
||||
@ -55,6 +57,5 @@ const migrateDraftAndPublish = async ({ definition, ORM, way }) => {
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
getDraftAndPublishMigrationWay,
|
||||
migrateDraftAndPublish,
|
||||
};
|
||||
|
||||
@ -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,
|
||||
};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user