0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-01-20 22:42:53 -05:00

Added migration to normalize all empty strings to NULL (#11132)

refs https://github.com/TryGhost/Ghost/issues/10388, original PR https://github.com/TryGhost/Ghost/pull/10428

- re-introduces the migration which normalizes all empty strings in the database to `NULL`
- this was previously reverted due to being too large of a migration for a minor but a major is a good time to do it
This commit is contained in:
Kevin Ansfield 2019-09-16 17:43:48 +01:00 committed by GitHub
parent 0bee38d586
commit ea7a677e4a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -0,0 +1,81 @@
const Promise = require('bluebird');
const common = require('../../../../lib/common');
const schema = require('../../../schema');
/*
* [{
* tableName: 'posts',
* columns: ['custom_excerpt', 'description', 'etc...']
* }]
* */
const tablesToUpdate = Object.keys(schema.tables).reduce((tablesToUpdate, tableName) => {
const table = schema.tables[tableName];
const columns = Object.keys(table).filter((columnName) => {
const column = table[columnName];
return column.nullable && ['string', 'text'].includes(column.type);
});
if (!columns.length) {
return tablesToUpdate;
}
return tablesToUpdate.concat({
tableName,
columns
});
}, []);
const createReplace = (connection, from, to) => (tableName, columnName) => {
return connection.schema.hasTable(tableName)
.then((tableExists) => {
if (!tableExists) {
common.logging.warn(
`Table ${tableName} does not exist`
);
return;
}
return connection.schema.hasColumn(tableName, columnName)
.then((columnExists) => {
if (!columnExists) {
common.logging.warn(
`Table '${tableName}' does not have column '${columnName}'`
);
return;
}
common.logging.info(
`Updating ${tableName}, setting '${from}' in ${columnName} to '${to}'`
);
return connection(tableName)
.where(columnName, from)
.update(columnName, to);
});
});
};
module.exports.up = ({transacting}) => {
const replaceEmptyStringWithNull = createReplace(transacting, '', null);
return Promise.all(
tablesToUpdate.map(({tableName, columns}) => Promise.all(
columns.map(
columnName => replaceEmptyStringWithNull(tableName, columnName)
)
))
);
};
module.exports.down = ({connection}) => {
const replaceNullWithEmptyString = createReplace(connection, null, '');
return Promise.all(
tablesToUpdate.map(({tableName, columns}) => Promise.all(
columns.map(
columnName => replaceNullWithEmptyString(tableName, columnName)
)
))
);
};
module.exports.config = {
transaction: true
};