Unfortunately, the migration 20190726150000_shorten_field_column_names.js corrupted the segments table. There is no automatic fix. If this affected you, you have to either revert the DB or fix the segments manually.
This commit is contained in:
Tomas Bures 2019-08-10 23:15:38 +02:00
parent 30e03adf0c
commit 69ce80ebfd

View file

@ -11,6 +11,8 @@ const { EntityVals: TriggerEntityVals, EventVals: TriggerEventVals } = require('
const { SubscriptionSource } = require('../../../../shared/lists');
const {DOMParser, XMLSerializer} = require('xmldom');
const log = require('../../../lib/log');
const shortid = require('shortid');
const slugify = require('slugify');
const entityTypesAddNamespace = ['list', 'custom_form', 'template', 'campaign', 'report', 'report_template', 'user'];
const shareableEntityTypes = ['list', 'custom_form', 'template', 'campaign', 'report', 'report_template', 'namespace', 'send_configuration', 'mosaico_template'];
@ -236,16 +238,54 @@ async function migrateUsers(knex) {
});
}
async function shortenFieldColumnNames(knex, list) {
const fields = await knex('custom_fields').whereNotNull('column').where('list', list.id);
const fieldsMap = new Map();
for (const field of fields) {
const oldName = field.column;
const newName = ('custom_' + slugify(field.name, '_').substring(0,32) + '_' + shortid.generate()).toLowerCase().replace(/[^a-z0-9_]/g, '_');
fieldsMap.set(oldName, newName);
await knex('custom_fields').where('id', field.id).update('column', newName);
await knex.schema.table('subscription__' + list.id, table => {
table.renameColumn(oldName, newName);
});
}
function processRule(rule) {
if (rule.type === 'all' || rule.type === 'some' || rule.type === 'none') {
for (const childRule of rule.rules) {
processRule(childRule);
}
} else {
rule.column = fieldsMap.get(rule.column) || rule.column /* this is to handle "email" column */;
}
}
const segments = await knex('segments').where('list', list.id);
for (const segment of segments) {
const settings = JSON.parse(segment.settings);
processRule(settings.rootRule);
await knex('segments').where('id', segment.id).update({settings: JSON.stringify(settings)});
}
}
async function migrateSubscriptions(knex) {
await knex.schema.dropTableIfExists('subscription');
const lists = await knex('lists');
for (const list of lists) {
await shortenFieldColumnNames(knex, list);
await knex.schema.raw('ALTER TABLE `subscription__' + list.id + '` ADD `unsubscribed` timestamp NULL DEFAULT NULL');
await knex.schema.raw('ALTER TABLE `subscription__' + list.id + '` ADD `source_email` int(11) DEFAULT NULL');
await knex.schema.raw('ALTER TABLE `subscription__' + list.id + '` ADD `hash_email` varchar(255) CHARACTER SET ascii');
const fields = await knex('custom_fields').where('list', list.id);
const info = await knex('subscription__' + list.id).columnInfo();
for (const field of fields) {
@ -1251,11 +1291,12 @@ exports.up = (knex, Promise) => (async() => {
await migrateCustomFields(knex);
log.verbose('Migration', 'Custom fields complete')
await migrateSubscriptions(knex);
await migrateSegments(knex);
log.verbose('Migration', 'Segments complete')
await migrateSubscriptions(knex);
log.verbose('Migration', 'Subscriptions complete')
await migrateReports(knex);
log.verbose('Migration', 'Reports complete')