work in progress on segments
some cleanup of models - handling dependencies in delete
This commit is contained in:
parent
b23529a75b
commit
0bfb30817b
29 changed files with 553 additions and 990 deletions
|
@ -5,6 +5,11 @@ exports.up = (knex, Promise) => (async() => {
|
|||
table.json('settings');
|
||||
});
|
||||
|
||||
await knex.schema.table('custom_fields', table => {
|
||||
table.dropForeign('list', 'custom_fields_ibfk_1');
|
||||
table.foreign('list').references('lists.id');
|
||||
});
|
||||
|
||||
const fields = await knex('custom_fields');
|
||||
|
||||
for (const field of fields) {
|
|
@ -1,8 +0,0 @@
|
|||
exports.up = (knex, Promise) => (async() => {
|
||||
await knex.schema.table('custom_fields', table => {
|
||||
table.foreign('group').references('custom_fields.id').onDelete('CASCADE');
|
||||
});
|
||||
})();
|
||||
|
||||
exports.down = (knex, Promise) => (async() => {
|
||||
})();
|
175
setup/knex/migrations/20170814174051_upgrade_segments.js
Normal file
175
setup/knex/migrations/20170814174051_upgrade_segments.js
Normal file
|
@ -0,0 +1,175 @@
|
|||
"use strict";
|
||||
|
||||
exports.up = (knex, Promise) => (async() => {
|
||||
await knex.schema.table('segments', table => {
|
||||
table.json('settings');
|
||||
});
|
||||
|
||||
await knex.schema.table('segments', table => {
|
||||
table.dropForeign('list', 'segments_ibfk_1');
|
||||
table.foreign('list').references('lists.id');
|
||||
});
|
||||
|
||||
|
||||
const segments = await knex('segments');
|
||||
|
||||
for (const segment of segments) {
|
||||
const oldRules = await knex('segment_rules').where('segment', segment.id);
|
||||
|
||||
let type;
|
||||
if (segment.type === 1) {
|
||||
type = 'all';
|
||||
} else {
|
||||
type = 'some';
|
||||
}
|
||||
|
||||
const rules = [];
|
||||
for (const oldRule of oldRules) {
|
||||
const oldSettings = JSON.parse(oldRule.value);
|
||||
|
||||
const predefColumns = {
|
||||
email: 'string',
|
||||
opt_in_country: 'string',
|
||||
created: 'date',
|
||||
latest_open: 'date',
|
||||
latest_click: 'date'
|
||||
};
|
||||
// first_name and last_name are not here because they have been already converted to custom fields by 20170731072050_upgrade_custom_fields.js
|
||||
|
||||
let fieldType;
|
||||
if (oldRule.column in predefColumns) {
|
||||
fieldType = predefColumns[oldRule.column];
|
||||
} else {
|
||||
const field = await knex('custom_fields').where({list: segment.list, type: 'like', column: oldRule.column}).select(['type']).first();
|
||||
if (field) {
|
||||
fieldType = field.type;
|
||||
}
|
||||
}
|
||||
|
||||
switch (fieldType) {
|
||||
case 'string':
|
||||
rules.push({ column: oldRule.column, value: oldSettings.value });
|
||||
break;
|
||||
case 'boolean':
|
||||
rules.push({ type: 'eq', column: oldRule.column, value: oldSettings.value });
|
||||
break;
|
||||
case 'number':
|
||||
if (oldSettings.range) {
|
||||
if (oldSettings.start && oldSettings.end) {
|
||||
if (type === 'all') {
|
||||
rules.push({ type: 'ge', column: oldRule.column, value: oldSettings.start});
|
||||
rules.push({ type: 'lt', column: oldRule.column, value: oldSettings.end});
|
||||
} else {
|
||||
rules.push({
|
||||
type: 'all',
|
||||
rules: [
|
||||
{type: 'ge', value: oldSettings.start},
|
||||
{type: 'lt', value: oldSettings.end}
|
||||
]
|
||||
});
|
||||
}
|
||||
} else if (oldSettings.start) {
|
||||
rules.push({ type: 'ge', column: oldRule.column, value: oldSettings.start });
|
||||
}
|
||||
if (oldSettings.end) {
|
||||
rules.push({ type: 'lt', column: oldRule.column, value: oldSettings.end });
|
||||
}
|
||||
} else {
|
||||
rules.push({ type: 'eq', column: oldRule.column, value: oldSettings.value });
|
||||
}
|
||||
break;
|
||||
case 'birthday':
|
||||
if (oldSettings.range) {
|
||||
if (oldSettings.start && oldSettings.end) {
|
||||
if (type === 'all') {
|
||||
rules.push({ type: 'birthdayGe', column: oldRule.column, value: oldSettings.start});
|
||||
rules.push({ type: 'birthdayLe', column: oldRule.column, value: oldSettings.end});
|
||||
} else {
|
||||
rules.push({
|
||||
type: 'all',
|
||||
rules: [
|
||||
{ type: 'birthdayGe', column: oldRule.column, value: oldSettings.start},
|
||||
{ type: 'birthdayLe', column: oldRule.column, value: oldSettings.end}
|
||||
]
|
||||
});
|
||||
}
|
||||
} else if (oldSettings.start) {
|
||||
rules.push({ type: 'birthdayGe', column: oldRule.column, value: oldSettings.start });
|
||||
}
|
||||
if (oldSettings.end) {
|
||||
rules.push({ type: 'birthdayLe', column: oldRule.column, value: oldSettings.end });
|
||||
}
|
||||
} else {
|
||||
rules.push({ type: 'birthdayEq', column: oldRule.column, value: oldSettings.value });
|
||||
}
|
||||
break;
|
||||
case 'date':
|
||||
if (oldSettings.relativeRange) {
|
||||
if (oldSettings.start && oldSettings.end) {
|
||||
if (type === 'all') {
|
||||
rules.push({ type: 'dateGeNowPlusDays', column: oldRule.column, value: oldSettings.start});
|
||||
rules.push({ type: 'dateLeNowPlusDays', column: oldRule.column, value: oldSettings.end});
|
||||
} else {
|
||||
rules.push({
|
||||
type: 'all',
|
||||
rules: [
|
||||
{ type: 'dateGeNowPlusDays', column: oldRule.column, value: oldSettings.start},
|
||||
{ type: 'dateLeNowPlusDays', column: oldRule.column, value: oldSettings.end}
|
||||
]
|
||||
});
|
||||
}
|
||||
} else if (oldSettings.start) {
|
||||
rules.push({ type: 'dateGeNowPlusDays', column: oldRule.column, value: oldSettings.startDirection ? oldSettings.start : -oldSettings.start });
|
||||
}
|
||||
if (oldSettings.end) {
|
||||
rules.push({ type: 'dateLeNowPlusDays', column: oldRule.column, value: oldSettings.endDirection ? oldSettings.end : -oldSettings.end });
|
||||
}
|
||||
} else if (oldSettings.range) {
|
||||
if (oldSettings.start && oldSettings.end) {
|
||||
if (type === 'all') {
|
||||
rules.push({ type: 'dateGe', column: oldRule.column, value: oldSettings.start});
|
||||
rules.push({ type: 'dateLe', column: oldRule.column, value: oldSettings.end});
|
||||
} else {
|
||||
rules.push({
|
||||
type: 'all',
|
||||
rules: [
|
||||
{ type: 'dateGe', column: oldRule.column, value: oldSettings.start},
|
||||
{ type: 'dateLe', column: oldRule.column, value: oldSettings.end}
|
||||
]
|
||||
});
|
||||
}
|
||||
} else if (oldSettings.start) {
|
||||
rules.push({ type: 'dateGe', column: oldRule.column, value: oldSettings.start });
|
||||
}
|
||||
if (oldSettings.end) {
|
||||
rules.push({ type: 'dateLe', column: oldRule.column, value: oldSettings.end });
|
||||
}
|
||||
} else {
|
||||
rules.push({ type: 'dateEq', column: oldRule.column, value: oldSettings.value });
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new Error(`Unknown rule for column ${oldRule.column} with field type ${fieldType}`);
|
||||
}
|
||||
}
|
||||
|
||||
const settings = {
|
||||
rootRule: {
|
||||
type,
|
||||
rules
|
||||
}
|
||||
};
|
||||
|
||||
await knex('segments').where('id', segment.id).update({settings: JSON.stringify(settings)});
|
||||
}
|
||||
|
||||
await knex.schema.table('segments', table => {
|
||||
table.dropColumn('type');
|
||||
});
|
||||
|
||||
await knex.schema.dropTable('segment_rules');
|
||||
})();
|
||||
|
||||
|
||||
exports.down = (knex, Promise) => (async() => {
|
||||
})();
|
|
@ -0,0 +1,9 @@
|
|||
exports.up = (knex, Promise) => (async() => {
|
||||
await knex.schema.table('reports', table => {
|
||||
table.dropForeign('report_template', 'report_template_ibfk_1');
|
||||
table.foreign('report_template').references('report_templates.id');
|
||||
});
|
||||
})();
|
||||
|
||||
exports.down = (knex, Promise) => (async() => {
|
||||
})();
|
Loading…
Add table
Add a link
Reference in a new issue