added view for RSS campaigns
This commit is contained in:
parent
09103ac58b
commit
fd0e75da27
10 changed files with 430 additions and 134 deletions
|
@ -7,6 +7,9 @@ let templates = require('./templates');
|
|||
let segments = require('./segments');
|
||||
let subscriptions = require('./subscriptions');
|
||||
let shortid = require('shortid');
|
||||
let isUrl = require('is-url');
|
||||
let feed = require('../feed');
|
||||
let log = require('npmlog');
|
||||
|
||||
let allowedKeys = ['description', 'from', 'address', 'subject', 'template', 'source_url', 'list', 'segment', 'html', 'text'];
|
||||
|
||||
|
@ -32,7 +35,7 @@ module.exports.list = (start, limit, callback) => {
|
|||
});
|
||||
};
|
||||
|
||||
module.exports.filter = (request, callback) => {
|
||||
module.exports.filter = (request, parent, callback) => {
|
||||
let columns = ['#', 'name', 'description', 'status', 'created'];
|
||||
let processQuery = queryData => {
|
||||
|
||||
|
@ -107,11 +110,20 @@ module.exports.filter = (request, callback) => {
|
|||
});
|
||||
};
|
||||
|
||||
processQuery({
|
||||
// only find normal campaigns at this point
|
||||
where: '`type`=?',
|
||||
values: [1]
|
||||
});
|
||||
if (parent) {
|
||||
processQuery({
|
||||
// only find normal and RSS parent campaigns at this point
|
||||
where: '`parent`=?',
|
||||
values: [parent]
|
||||
});
|
||||
} else {
|
||||
|
||||
processQuery({
|
||||
// only find normal and RSS parent campaigns at this point
|
||||
where: '`type` IN (?,?)',
|
||||
values: [1, 2]
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
module.exports.getByCid = (cid, callback) => {
|
||||
|
@ -215,6 +227,10 @@ module.exports.create = (campaign, callback) => {
|
|||
return callback(new Error('Campaign Name must be set'));
|
||||
}
|
||||
|
||||
if (campaign.type === 2 && !campaign.sourceUrl || !isUrl(campaign.sourceUrl)) {
|
||||
return callback(new Error('RSS URL must be set'));
|
||||
}
|
||||
|
||||
lists.get(campaign.list, (err, list) => {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
|
@ -223,10 +239,15 @@ module.exports.create = (campaign, callback) => {
|
|||
return callback(new Error('Selected list not found'));
|
||||
}
|
||||
|
||||
let keys = ['name'];
|
||||
let values = [name];
|
||||
let keys = ['name', 'type'];
|
||||
let values = [name, campaign.type];
|
||||
|
||||
let create = () => {
|
||||
if (campaign.type === 2) {
|
||||
keys.push('status');
|
||||
values.push(5); // inactive
|
||||
}
|
||||
|
||||
let create = next => {
|
||||
Object.keys(campaign).forEach(key => {
|
||||
let value = typeof campaign[key] === 'number' ? campaign[key] : (campaign[key] || '').toString().trim();
|
||||
key = tools.toDbKey(key);
|
||||
|
@ -242,19 +263,19 @@ module.exports.create = (campaign, callback) => {
|
|||
|
||||
db.getConnection((err, connection) => {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
return next(err);
|
||||
}
|
||||
|
||||
let query = 'INSERT INTO campaigns (`' + keys.join('`, `') + '`) VALUES (' + values.map(() => '?').join(',') + ')';
|
||||
connection.query(query, values, (err, result) => {
|
||||
connection.release();
|
||||
if (err) {
|
||||
return callback(err);
|
||||
return next(err);
|
||||
}
|
||||
|
||||
let campaignId = result && result.insertId || false;
|
||||
if (!campaignId) {
|
||||
return callback(null, false);
|
||||
return next(null, false);
|
||||
}
|
||||
|
||||
// we are going to aqcuire a lot of log info, so we are putting
|
||||
|
@ -262,16 +283,55 @@ module.exports.create = (campaign, callback) => {
|
|||
createCampaignTables(campaignId, err => {
|
||||
if (err) {
|
||||
// FIXME: rollback
|
||||
return callback(err);
|
||||
return next(err);
|
||||
}
|
||||
return callback(null, campaignId);
|
||||
return next(null, campaignId);
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
if (campaign.type === 2) {
|
||||
create();
|
||||
feed.fetch(campaign.sourceUrl, (err, entries) => {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
create((err, campaignId) => {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
if (!campaignId || !entries.length) {
|
||||
return callback(null, campaignId);
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
// store references to already existing feed entries
|
||||
// this is needed to detect new entries
|
||||
let query = 'INSERT IGNORE INTO `rss` (`parent`,`guid`,`pubdate`) VALUES ' + entries.map(() => '(?,?,?)').join(',');
|
||||
|
||||
values = [];
|
||||
entries.forEach(entry => {
|
||||
values.push(campaignId, entry.guid, entry.date);
|
||||
});
|
||||
|
||||
connection.query(query, values, err => {
|
||||
connection.release();
|
||||
if (err) {
|
||||
// too late to report as failed
|
||||
log.error('RSS', err);
|
||||
}
|
||||
|
||||
return callback(null, campaignId);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
return;
|
||||
} else if (campaign.template) {
|
||||
templates.get(campaign.template, (err, template) => {
|
||||
if (err) {
|
||||
|
@ -284,10 +344,11 @@ module.exports.create = (campaign, callback) => {
|
|||
keys = keys.concat(['html', 'text']);
|
||||
values = values.concat([template.html, template.text]);
|
||||
|
||||
create();
|
||||
create(callback);
|
||||
});
|
||||
return;
|
||||
} else {
|
||||
create();
|
||||
return create(callback);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
@ -343,11 +404,53 @@ module.exports.update = (id, updates, callback) => {
|
|||
values.push(id);
|
||||
|
||||
connection.query('UPDATE campaigns SET ' + keys.map(key => '`' + key + '`=?').join(', ') + ' WHERE id=? LIMIT 1', values, (err, result) => {
|
||||
connection.release();
|
||||
if (err) {
|
||||
connection.release();
|
||||
return callback(err);
|
||||
}
|
||||
return callback(null, result && result.affectedRows || false);
|
||||
let affected = result && result.affectedRows || false;
|
||||
|
||||
if (!affected) {
|
||||
connection.release();
|
||||
return callback(null, affected);
|
||||
}
|
||||
|
||||
connection.query('SELECT `type`, `source_url` FROM campaigns WHERE id=? LIMIT 1', [id], (err, rows) => {
|
||||
if (err) {
|
||||
connection.release();
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
if (!rows || !rows[0] || rows[0].type !== 2) {
|
||||
// if not RSS, then nothing to do here
|
||||
connection.release();
|
||||
return callback(null, affected);
|
||||
}
|
||||
|
||||
// update seen rss entries to avoid sending old entries to subscribers
|
||||
feed.fetch(rows[0].source_url, (err, entries) => {
|
||||
if (err) {
|
||||
connection.release();
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
let query = 'INSERT IGNORE INTO `rss` (`parent`,`guid`,`pubdate`) VALUES ' + entries.map(() => '(?,?,?)').join(',');
|
||||
|
||||
values = [];
|
||||
entries.forEach(entry => {
|
||||
values.push(id, entry.guid, entry.date);
|
||||
});
|
||||
|
||||
connection.query(query, values, err => {
|
||||
connection.release();
|
||||
if (err) {
|
||||
// too late to report as failed
|
||||
log.error('RSS', err);
|
||||
}
|
||||
return callback(null, affected);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -498,6 +601,60 @@ module.exports.reset = (id, callback) => {
|
|||
});
|
||||
};
|
||||
|
||||
module.exports.activate = (id, callback) => {
|
||||
module.exports.get(id, false, (err, campaign) => {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
if (campaign.status !== 5) {
|
||||
return callback(null, false);
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
// campaigns marked as status=5 are paused
|
||||
connection.query('UPDATE campaigns SET `status`=6, `status_change`=NOW() WHERE id=? LIMIT 1', [id], err => {
|
||||
if (err) {
|
||||
connection.release();
|
||||
return callback(err);
|
||||
}
|
||||
return callback(null, true);
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
module.exports.inactivate = (id, callback) => {
|
||||
module.exports.get(id, false, (err, campaign) => {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
if (campaign.status !== 6) {
|
||||
return callback(null, false);
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
// campaigns marked as status=6 are paused
|
||||
connection.query('UPDATE campaigns SET `status`=5, `status_change`=NOW() WHERE id=? LIMIT 1', [id], err => {
|
||||
if (err) {
|
||||
connection.release();
|
||||
return callback(err);
|
||||
}
|
||||
return callback(null, true);
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
module.exports.getMail = (campaignId, listId, subscriptionId, callback) => {
|
||||
campaignId = Number(campaignId) || 0;
|
||||
listId = Number(listId) || 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue