Fix for #663.
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:
parent
30e03adf0c
commit
69ce80ebfd
1 changed files with 44 additions and 3 deletions
|
@ -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')
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue