437 lines
15 KiB
JavaScript
437 lines
15 KiB
JavaScript
'use strict';
|
|
|
|
let express = require('express');
|
|
let router = new express.Router();
|
|
let passport = require('../lib/passport');
|
|
let lists = require('../lib/models/lists');
|
|
let segments = require('../lib/models/segments');
|
|
let tools = require('../lib/tools');
|
|
let _ = require('../lib/translate')._;
|
|
|
|
router.all('/*', (req, res, next) => {
|
|
if (!req.user) {
|
|
req.flash('danger', _('Need to be logged in to access restricted content'));
|
|
return res.redirect('/users/login?next=' + encodeURIComponent(req.originalUrl));
|
|
}
|
|
res.setSelectedMenu('lists');
|
|
next();
|
|
});
|
|
|
|
router.get('/:list', (req, res) => {
|
|
lists.get(req.params.list, (err, list) => {
|
|
if (err) {
|
|
req.flash('danger', err.message || err);
|
|
return res.redirect('/');
|
|
}
|
|
|
|
if (!list) {
|
|
req.flash('danger', _('Selected list ID not found'));
|
|
return res.redirect('/');
|
|
}
|
|
|
|
segments.list(list.id, (err, rows) => {
|
|
if (err) {
|
|
req.flash('danger', err.message || err);
|
|
return res.redirect('/fields/' + encodeURIComponent(req.params.list));
|
|
}
|
|
|
|
let index = 0;
|
|
res.render('lists/segments/segments', {
|
|
rows: rows.map(row => {
|
|
row.index = ++index;
|
|
row.type = row.type === 1 ? 'ALL' : 'ANY';
|
|
return row;
|
|
}),
|
|
list
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
router.get('/:list/create', passport.csrfProtection, (req, res) => {
|
|
lists.get(req.params.list, (err, list) => {
|
|
if (err) {
|
|
req.flash('danger', err.message || err);
|
|
return res.redirect('/');
|
|
}
|
|
|
|
if (!list) {
|
|
req.flash('danger', _('Selected list ID not found'));
|
|
return res.redirect('/');
|
|
}
|
|
|
|
let segment = tools.convertKeys(req.query, {
|
|
skip: ['layout']
|
|
});
|
|
|
|
segment.csrfToken = req.csrfToken();
|
|
segment.list = list;
|
|
|
|
switch (Number(segment.type) || 0) {
|
|
case 1:
|
|
segment.matchAll = true;
|
|
break;
|
|
case 2:
|
|
segment.matchAny = true;
|
|
break;
|
|
}
|
|
|
|
res.render('lists/segments/create', segment);
|
|
});
|
|
});
|
|
|
|
router.post('/:list/create', passport.parseForm, passport.csrfProtection, (req, res) => {
|
|
segments.create(req.params.list, req.body, (err, id) => {
|
|
if (err || !id) {
|
|
req.flash('danger', err && err.message || err || _('Could not create segment'));
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list) + '/create?' + tools.queryParams(req.body));
|
|
}
|
|
req.flash('success', _('Segment created'));
|
|
res.redirect('/segments/' + encodeURIComponent(req.params.list) + '/view/' + id);
|
|
});
|
|
});
|
|
|
|
router.get('/:list/view/:id', (req, res) => {
|
|
lists.get(req.params.list, (err, list) => {
|
|
if (err) {
|
|
req.flash('danger', err.message || err);
|
|
return res.redirect('/');
|
|
}
|
|
|
|
if (!list) {
|
|
req.flash('danger', _('Selected list ID not found'));
|
|
return res.redirect('/');
|
|
}
|
|
|
|
segments.get(req.params.id, (err, segment) => {
|
|
if (err) {
|
|
req.flash('danger', err.message || err);
|
|
return res.redirect('/');
|
|
}
|
|
|
|
if (!segment) {
|
|
req.flash('danger', _('Selected segment ID not found'));
|
|
return res.redirect('/');
|
|
}
|
|
|
|
segment.list = list;
|
|
segment.rules.forEach((rule, i) => {
|
|
rule.index = i + 1;
|
|
});
|
|
|
|
switch (Number(segment.type) || 0) {
|
|
case 1:
|
|
segment.type = 'ALL';
|
|
break;
|
|
case 2:
|
|
segment.type = 'ANY';
|
|
break;
|
|
}
|
|
|
|
segments.subscribers(req.params.id, true, (err, subscribers) => {
|
|
if (err) {
|
|
// ignore
|
|
}
|
|
segment.subscribers = subscribers || 0;
|
|
|
|
res.render('lists/segments/view', segment);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
router.get('/:list/edit/:segment', passport.csrfProtection, (req, res) => {
|
|
lists.get(req.params.list, (err, list) => {
|
|
if (err) {
|
|
req.flash('danger', err.message || err);
|
|
return res.redirect('/');
|
|
}
|
|
|
|
if (!list) {
|
|
req.flash('danger', _('Selected list ID not found'));
|
|
return res.redirect('/');
|
|
}
|
|
|
|
segments.get(req.params.segment, (err, segment) => {
|
|
if (err) {
|
|
req.flash('danger', err.message || err);
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list));
|
|
}
|
|
|
|
if (!segment) {
|
|
req.flash('danger', 'Selected segment not found');
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list));
|
|
}
|
|
|
|
segment.csrfToken = req.csrfToken();
|
|
segment.list = list;
|
|
|
|
switch (Number(segment.type) || 0) {
|
|
case 1:
|
|
segment.matchAll = true;
|
|
break;
|
|
case 2:
|
|
segment.matchAny = true;
|
|
break;
|
|
}
|
|
|
|
res.render('lists/segments/edit', segment);
|
|
});
|
|
});
|
|
});
|
|
|
|
router.post('/:list/edit', passport.parseForm, passport.csrfProtection, (req, res) => {
|
|
segments.update(req.body.id, req.body, (err, updated) => {
|
|
if (err) {
|
|
req.flash('danger', err.message || err);
|
|
} else if (updated) {
|
|
req.flash('success', _('Segment settings updated'));
|
|
} else {
|
|
req.flash('info', _('Segment settings not updated'));
|
|
}
|
|
|
|
if (req.body.id) {
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list) + '/view/' + encodeURIComponent(req.body.id));
|
|
} else {
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list));
|
|
}
|
|
});
|
|
});
|
|
|
|
router.post('/:list/delete', passport.parseForm, passport.csrfProtection, (req, res) => {
|
|
segments.delete(req.body.id, (err, deleted) => {
|
|
if (err) {
|
|
req.flash('danger', err && err.message || err);
|
|
} else if (deleted) {
|
|
req.flash('success', _('Segment deleted'));
|
|
} else {
|
|
req.flash('info', _('Could not delete specified segment'));
|
|
}
|
|
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list));
|
|
});
|
|
});
|
|
|
|
router.get('/:list/rules/:segment/create', passport.csrfProtection, (req, res) => {
|
|
lists.get(req.params.list, (err, list) => {
|
|
if (err) {
|
|
req.flash('danger', err.message || err);
|
|
return res.redirect('/');
|
|
}
|
|
|
|
if (!list) {
|
|
req.flash('danger', _('Selected list ID not found'));
|
|
return res.redirect('/');
|
|
}
|
|
|
|
segments.get(req.params.segment, (err, segment) => {
|
|
if (err) {
|
|
req.flash('danger', err.message || err);
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list));
|
|
}
|
|
|
|
if (!segment) {
|
|
req.flash('danger', 'Selected segment not found');
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list));
|
|
}
|
|
|
|
segment.csrfToken = req.csrfToken();
|
|
|
|
segment.list = list;
|
|
|
|
res.render('lists/segments/rule-create', segment);
|
|
});
|
|
});
|
|
});
|
|
|
|
router.post('/:list/rules/:segment/next', passport.parseForm, passport.csrfProtection, (req, res) => {
|
|
lists.get(req.params.list, (err, list) => {
|
|
if (err) {
|
|
req.flash('danger', err.message || err);
|
|
return res.redirect('/');
|
|
}
|
|
|
|
if (!list) {
|
|
req.flash('danger', _('Selected list ID not found'));
|
|
return res.redirect('/');
|
|
}
|
|
|
|
segments.get(req.params.segment, (err, segment) => {
|
|
if (err) {
|
|
req.flash('danger', err.message || err);
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list));
|
|
}
|
|
|
|
if (!segment) {
|
|
req.flash('danger', _('Selected segment not found'));
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list));
|
|
}
|
|
|
|
let column = segment.columns.filter(column => column.column === req.body.column).pop();
|
|
if (!column) {
|
|
req.flash('danger', _('Invalid rule type'));
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list) + '/rules/' + segment.id + '/create?' + tools.queryParams(req.body));
|
|
}
|
|
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list) + '/rules/' + segment.id + '/configure?' + tools.queryParams(req.body));
|
|
});
|
|
});
|
|
});
|
|
|
|
router.get('/:list/rules/:segment/configure', passport.csrfProtection, (req, res) => {
|
|
lists.get(req.params.list, (err, list) => {
|
|
if (err) {
|
|
req.flash('danger', err.message || err);
|
|
return res.redirect('/');
|
|
}
|
|
|
|
if (!list) {
|
|
req.flash('danger', _('Selected list ID not found'));
|
|
return res.redirect('/');
|
|
}
|
|
|
|
segments.get(req.params.segment, (err, segment) => {
|
|
if (err) {
|
|
req.flash('danger', err.message || err);
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list));
|
|
}
|
|
|
|
if (!segment) {
|
|
req.flash('danger', _('Selected segment not found'));
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list));
|
|
}
|
|
|
|
let column = segment.columns.filter(column => column.column === req.query.column).pop();
|
|
if (!column) {
|
|
req.flash('danger', _('Invalid rule type'));
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list) + '/rules/' + segment.id + '/create?' + tools.queryParams(req.body));
|
|
}
|
|
|
|
let data = tools.convertKeys(req.query, {
|
|
skip: ['layout']
|
|
});
|
|
|
|
segment.csrfToken = req.csrfToken();
|
|
|
|
segment.value = data;
|
|
segment.list = list;
|
|
segment.column = column;
|
|
segment['columnType' + column.type.replace(/^[a-z]/, c => c.toUpperCase())] = true;
|
|
|
|
segment.useEditor = true;
|
|
|
|
res.render('lists/segments/rule-configure', segment);
|
|
});
|
|
});
|
|
});
|
|
|
|
router.post('/:list/rules/:segment/create', passport.parseForm, passport.csrfProtection, (req, res) => {
|
|
lists.get(req.params.list, (err, list) => {
|
|
if (err) {
|
|
req.flash('danger', err.message || err);
|
|
return res.redirect('/');
|
|
}
|
|
|
|
if (!list) {
|
|
req.flash('danger', _('Selected list ID not found'));
|
|
return res.redirect('/');
|
|
}
|
|
|
|
segments.createRule(req.params.segment, req.body, (err, id) => {
|
|
if (err || !id) {
|
|
req.flash('danger', err && err.message || err || _('Could not create rule'));
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list) + '/rules/' + encodeURIComponent(req.params.segment) + '/configure?' + tools.queryParams(req.body));
|
|
}
|
|
req.flash('success', _('Rule created'));
|
|
res.redirect('/segments/' + encodeURIComponent(req.params.list) + '/view/' + encodeURIComponent(req.params.segment));
|
|
});
|
|
});
|
|
});
|
|
|
|
router.get('/:list/rules/:segment/edit/:rule', passport.csrfProtection, (req, res) => {
|
|
lists.get(req.params.list, (err, list) => {
|
|
if (err) {
|
|
req.flash('danger', err.message || err);
|
|
return res.redirect('/');
|
|
}
|
|
|
|
if (!list) {
|
|
req.flash('danger', _('Selected list ID not found'));
|
|
return res.redirect('/');
|
|
}
|
|
|
|
segments.get(req.params.segment, (err, segment) => {
|
|
if (err) {
|
|
req.flash('danger', err.message || err);
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list));
|
|
}
|
|
|
|
if (!segment) {
|
|
req.flash('danger', _('Selected segment not found'));
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list));
|
|
}
|
|
|
|
segments.getRule(req.params.rule, (err, rule) => {
|
|
if (err) {
|
|
req.flash('danger', err.message || err);
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list));
|
|
}
|
|
|
|
if (!segment) {
|
|
req.flash('danger', _('Selected segment not found'));
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list));
|
|
}
|
|
|
|
let column = segment.columns.filter(column => column.column === rule.column).pop();
|
|
if (!column) {
|
|
req.flash('danger', _('Invalid rule type'));
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list) + '/view/' + segment.id);
|
|
}
|
|
|
|
rule.csrfToken = req.csrfToken();
|
|
rule.list = list;
|
|
rule.segment = segment;
|
|
rule.column = column;
|
|
rule['columnType' + column.type.replace(/^[a-z]/, c => c.toUpperCase())] = true;
|
|
|
|
rule.useEditor = true;
|
|
|
|
res.render('lists/segments/rule-edit', rule);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
router.post('/:list/rules/:segment/edit', passport.parseForm, passport.csrfProtection, (req, res) => {
|
|
segments.updateRule(req.body.id, req.body, (err, updated) => {
|
|
if (err) {
|
|
req.flash('danger', err.message || err);
|
|
} else if (updated) {
|
|
req.flash('success', _('Rule settings updated'));
|
|
} else {
|
|
req.flash('info', _('Rule settings not updated'));
|
|
}
|
|
|
|
if (req.params.segment) {
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list) + '/view/' + encodeURIComponent(req.params.segment));
|
|
} else {
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list));
|
|
}
|
|
});
|
|
});
|
|
|
|
router.post('/:list/rules/:segment/delete', passport.parseForm, passport.csrfProtection, (req, res) => {
|
|
segments.deleteRule(req.body.id, (err, deleted) => {
|
|
if (err) {
|
|
req.flash('danger', err && err.message || err);
|
|
} else if (deleted) {
|
|
req.flash('success', _('Rule deleted'));
|
|
} else {
|
|
req.flash('info', _('Could not delete specified rule'));
|
|
}
|
|
|
|
return res.redirect('/segments/' + encodeURIComponent(req.params.list) + '/view/' + encodeURIComponent(req.params.segment));
|
|
});
|
|
});
|
|
|
|
module.exports = router;
|