UNPKG

festivals-importer

Version:
128 lines (99 loc) 3.13 kB
var async = require('async'); var logger = require('../logger/logger').logger; var NewsImporter = function NewsImporter(festivalsClient) { var news = {}; var NewsResolver = { addNews: function (name, news) { news[name] = news; }, getNews: function (name) { if (news.hasOwnProperty(name)) { return news[name]; } return null; }, resolve: function (news, festivalId, cb) { var _this = this; if (_this.getNews(news.name)) { return cb(null, _this.getNews[news.name]); } var query = { name: news.name }; festivalsClient.getFestivalNewsCollection(festivalId, query, function (err, response, body) { if (err) { logger.warn(err, body); return cb(err); } if (response.statusCode !== 200 || body.total === 0) { var data = { name: news.name, description: news.description, tags: news.tags, authors: news.authors, images: news.images, publishedAt: news.publishedAt }; festivalsClient.createNews(festivalId, data, function (err, response, body) { if (err) { logger.warn(err, body); return cb(err); } if (response.statusCode === 201 && body) { _this.addNews(news.name, body); return cb(null, body); } logger.warn('Failed to create news: ', data, body); return cb(new Error('Failed to create news: ' + data.name)); }); } else { _this.addNews(news.name, body.news[0]); return cb(null, body.news[0]); } }); } }; var createTasksForNews = function createTasksForNews(newsCollection, festivalId) { var tasks = {}; for (var j in newsCollection) { if (newsCollection.hasOwnProperty(j)) { var news = newsCollection[j]; logger.debug('Prepare news task ' + j + ': ' + news.name); (function (news, festivalId) { var func = function (callback) { logger.debug('Initiated ' + j + ' news: ' + news); NewsResolver.resolve(news, festivalId, callback); }; tasks[news.name] = func; }(news, festivalId)); } } return tasks; }; var extractNews = function extractNews(templateData, callback) { var newsCollection = {}; templateData.news.map(function (news) { newsCollection[news.name] = news; }); return callback(null, newsCollection); }; var syncNews = function syncNews(newsData, festivalId, callback) { var tasks = createTasksForNews(newsData, festivalId); async.series(tasks, callback); }; var importNews = function importNews(festivalId, templateData, callback) { extractNews(templateData, function (err, data) { if (err) { return callback(err); } syncNews(data, festivalId, callback); }); }; return { importNews: importNews }; }; module.exports = { NewsImporter: NewsImporter };