From 0f199af84d95e1d2a818006c5eedeacd9f4a9a43 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 11 May 2015 14:20:10 -0400 Subject: [PATCH] moved widget code out of controller; cleaned up code into a folder --- src/controllers/admin.js | 63 +--------------- src/widgets.js | 157 --------------------------------------- src/widgets/admin.js | 78 +++++++++++++++++++ src/widgets/index.js | 157 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 237 insertions(+), 218 deletions(-) delete mode 100644 src/widgets.js create mode 100644 src/widgets/admin.js create mode 100644 src/widgets/index.js diff --git a/src/controllers/admin.js b/src/controllers/admin.js index 4487167873..50c8deb009 100644 --- a/src/controllers/admin.js +++ b/src/controllers/admin.js @@ -15,7 +15,6 @@ var async = require('async'), events = require('../events'), languages = require('../languages'), plugins = require('../plugins'), - widgets = require('../widgets'), groups = require('../groups'), validator = require('validator'); @@ -364,70 +363,12 @@ adminController.appearance.get = function(req, res, next) { }; adminController.extend.widgets = function(req, res, next) { - async.parallel({ - areas: function(next) { - var defaultAreas = [ - { name: 'Global Sidebar', template: 'global', location: 'sidebar' }, - { name: 'Global Header', template: 'global', location: 'header' }, - { name: 'Global Footer', template: 'global', location: 'footer' }, - - { name: 'Group Page (Left)', template: 'groups/details.tpl', location: 'left'}, - { name: 'Group Page (Right)', template: 'groups/details.tpl', location: 'right'} - ]; - - plugins.fireHook('filter:widgets.getAreas', defaultAreas, next); - }, - widgets: function(next) { - plugins.fireHook('filter:widgets.getWidgets', [], next); - } - }, function(err, widgetData) { + require('../widgets/admin').get(function(err, data) { if (err) { return next(err); } - widgetData.areas.push({ name: 'Draft Zone', template: 'global', location: 'drafts' }); - async.each(widgetData.areas, function(area, next) { - widgets.getArea(area.template, area.location, function(err, areaData) { - area.data = areaData; - next(err); - }); - }, function(err) { - if (err) { - return next(err); - } - for (var w in widgetData.widgets) { - if (widgetData.widgets.hasOwnProperty(w)) { - // if this gets anymore complicated, it needs to be a template - widgetData.widgets[w].content += "

"; - } - } - - var templates = [], - list = {}, index = 0; - - widgetData.areas.forEach(function(area) { - if (typeof list[area.template] === 'undefined') { - list[area.template] = index; - templates.push({ - template: area.template, - areas: [] - }); - - index++; - } - - templates[list[area.template]].areas.push({ - name: area.name, - location: area.location - }); - }); - - res.render('admin/extend/widgets', { - templates: templates, - areas: widgetData.areas, - widgets: widgetData.widgets - }); - }); + res.render('admin/extend/widgets', data); }); }; diff --git a/src/widgets.js b/src/widgets.js deleted file mode 100644 index ffe2ad2629..0000000000 --- a/src/widgets.js +++ /dev/null @@ -1,157 +0,0 @@ -"use strict"; - -var async = require('async'), - winston = require('winston'), - templates = require('templates.js'), - - plugins = require('./plugins'), - db = require('./database'); - - -(function(Widgets) { - Widgets.render = function(uid, area, callback) { - if (!area.locations || !area.template) { - return callback(new Error('[[error:invalid-data]]')); - } - - Widgets.getAreas(['global', area.template], area.locations, function(err, data) { - if (err) { - return callback(err); - } - - var widgetsByLocation = {}; - - async.map(area.locations, function(location, done) { - widgetsByLocation[location] = data.global[location].concat(data[area.template][location]); - - if (!widgetsByLocation[location].length) { - return done(null, {location: location, widgets: []}); - } - - async.map(widgetsByLocation[location], function(widget, next) { - - if (!widget || !widget.data || (!!widget.data['hide-registered'] && uid !== 0) || (!!widget.data['hide-guests'] && uid === 0)) { - return next(); - } - - plugins.fireHook('filter:widget.render:' + widget.widget, { - uid: uid, - area: area, - data: widget.data - }, function(err, html) { - if (err) { - return next(err); - } - - if (typeof html !== 'string') { - html = ''; - } - - if (widget.data.container && widget.data.container.match('{body}')) { - html = templates.parse(widget.data.container, { - title: widget.data.title, - body: html - }); - } - - next(null, {html: html}); - }); - }, function(err, widgets) { - done(err, {location: location, widgets: widgets.filter(Boolean)}); - }); - }, callback); - }); - }; - - Widgets.getAreas = function(templates, locations, callback) { - var keys = templates.map(function(tpl) { - return 'widgets:' + tpl; - }); - db.getObjectsFields(keys, locations, function(err, data) { - if (err) { - return callback(err); - } - - var returnData = {}; - - templates.forEach(function(template, index) { - returnData[template] = returnData[template] || {}; - locations.forEach(function(location) { - if (data && data[index] && data[index][location]) { - try { - returnData[template][location] = JSON.parse(data[index][location]); - } catch(err) { - winston.error('can not parse widget data. template: ' + template + ' location: ' + location); - returnData[template][location] = []; - } - } else { - returnData[template][location] = []; - } - }); - }); - - callback(null, returnData); - }); - }; - - Widgets.getArea = function(template, location, callback) { - db.getObjectField('widgets:' + template, location, function(err, widgets) { - if (err) { - return callback(err); - } - if (!widgets) { - return callback(null, []); - } - try { - widgets = JSON.parse(widgets); - } catch(err) { - return callback(err); - } - - callback(null, widgets); - }); - }; - - Widgets.setArea = function(area, callback) { - if (!area.location || !area.template) { - return callback(new Error('Missing location and template data')); - } - - db.setObjectField('widgets:' + area.template, area.location, JSON.stringify(area.widgets), callback); - }; - - Widgets.reset = function(callback) { - var defaultAreas = [ - { name: 'Draft Zone', template: 'global', location: 'drafts' } - ]; - - plugins.fireHook('filter:widgets.getAreas', defaultAreas, function(err, areas) { - if (err) { - return callback(err); - } - var drafts = []; - - async.each(areas, function(area, next) { - Widgets.getArea(area.template, area.location, function(err, areaData) { - if (err) { - return next(err); - } - - drafts = drafts.concat(areaData); - area.widgets = []; - Widgets.setArea(area, next); - }); - }, function(err) { - if (err) { - return callback(err); - } - Widgets.setArea({ - template: 'global', - location: 'drafts', - widgets: drafts - }, callback); - }); - }); - }; - -}(exports)); diff --git a/src/widgets/admin.js b/src/widgets/admin.js new file mode 100644 index 0000000000..110f523e21 --- /dev/null +++ b/src/widgets/admin.js @@ -0,0 +1,78 @@ +"use strict"; + + +var async = require('async'), + plugins = require('../plugins'); + +var admin = {}; + +admin.get = function(callback) { + async.parallel({ + areas: function(next) { + var defaultAreas = [ + { name: 'Global Sidebar', template: 'global', location: 'sidebar' }, + { name: 'Global Header', template: 'global', location: 'header' }, + { name: 'Global Footer', template: 'global', location: 'footer' }, + + { name: 'Group Page (Left)', template: 'groups/details.tpl', location: 'left'}, + { name: 'Group Page (Right)', template: 'groups/details.tpl', location: 'right'} + ]; + + plugins.fireHook('filter:widgets.getAreas', defaultAreas, next); + }, + widgets: function(next) { + plugins.fireHook('filter:widgets.getWidgets', [], next); + } + }, function(err, widgetData) { + if (err) { + return callback(err); + } + widgetData.areas.push({ name: 'Draft Zone', template: 'global', location: 'drafts' }); + + async.each(widgetData.areas, function(area, next) { + require('./index').getArea(area.template, area.location, function(err, areaData) { + area.data = areaData; + next(err); + }); + + }, function(err) { + if (err) { + return callback(err); + } + for (var w in widgetData.widgets) { + if (widgetData.widgets.hasOwnProperty(w)) { + // if this gets anymore complicated, it needs to be a template + widgetData.widgets[w].content += "

"; + } + } + + var templates = [], + list = {}, index = 0; + + widgetData.areas.forEach(function(area) { + if (typeof list[area.template] === 'undefined') { + list[area.template] = index; + templates.push({ + template: area.template, + areas: [] + }); + + index++; + } + + templates[list[area.template]].areas.push({ + name: area.name, + location: area.location + }); + }); + + callback(false, { + templates: templates, + areas: widgetData.areas, + widgets: widgetData.widgets + }); + }); + }); +}; + +module.exports = admin; \ No newline at end of file diff --git a/src/widgets/index.js b/src/widgets/index.js new file mode 100644 index 0000000000..7a147f1dd6 --- /dev/null +++ b/src/widgets/index.js @@ -0,0 +1,157 @@ +"use strict"; + +var async = require('async'), + winston = require('winston'), + templates = require('templates.js'), + + plugins = require('../plugins'), + db = require('../database'); + +var widgets = {}; + +widgets.render = function(uid, area, callback) { + if (!area.locations || !area.template) { + return callback(new Error('[[error:invalid-data]]')); + } + + widgets.getAreas(['global', area.template], area.locations, function(err, data) { + if (err) { + return callback(err); + } + + var widgetsByLocation = {}; + + async.map(area.locations, function(location, done) { + widgetsByLocation[location] = data.global[location].concat(data[area.template][location]); + + if (!widgetsByLocation[location].length) { + return done(null, {location: location, widgets: []}); + } + + async.map(widgetsByLocation[location], function(widget, next) { + + if (!widget || !widget.data || (!!widget.data['hide-registered'] && uid !== 0) || (!!widget.data['hide-guests'] && uid === 0)) { + return next(); + } + + plugins.fireHook('filter:widget.render:' + widget.widget, { + uid: uid, + area: area, + data: widget.data + }, function(err, html) { + if (err) { + return next(err); + } + + if (typeof html !== 'string') { + html = ''; + } + + if (widget.data.container && widget.data.container.match('{body}')) { + html = templates.parse(widget.data.container, { + title: widget.data.title, + body: html + }); + } + + next(null, {html: html}); + }); + }, function(err, result) { + done(err, {location: location, widgets: result.filter(Boolean)}); + }); + }, callback); + }); +}; + +widgets.getAreas = function(templates, locations, callback) { + var keys = templates.map(function(tpl) { + return 'widgets:' + tpl; + }); + db.getObjectsFields(keys, locations, function(err, data) { + if (err) { + return callback(err); + } + + var returnData = {}; + + templates.forEach(function(template, index) { + returnData[template] = returnData[template] || {}; + locations.forEach(function(location) { + if (data && data[index] && data[index][location]) { + try { + returnData[template][location] = JSON.parse(data[index][location]); + } catch(err) { + winston.error('can not parse widget data. template: ' + template + ' location: ' + location); + returnData[template][location] = []; + } + } else { + returnData[template][location] = []; + } + }); + }); + + callback(null, returnData); + }); +}; + +widgets.getArea = function(template, location, callback) { + db.getObjectField('widgets:' + template, location, function(err, result) { + if (err) { + return callback(err); + } + if (!result) { + return callback(null, []); + } + try { + result = JSON.parse(result); + } catch(err) { + return callback(err); + } + + callback(null, result); + }); +}; + +widgets.setArea = function(area, callback) { + if (!area.location || !area.template) { + return callback(new Error('Missing location and template data')); + } + + db.setObjectField('widgets:' + area.template, area.location, JSON.stringify(area.widgets), callback); +}; + +widgets.reset = function(callback) { + var defaultAreas = [ + { name: 'Draft Zone', template: 'global', location: 'drafts' } + ]; + + plugins.fireHook('filter:widgets.getAreas', defaultAreas, function(err, areas) { + if (err) { + return callback(err); + } + var drafts = []; + + async.each(areas, function(area, next) { + widgets.getArea(area.template, area.location, function(err, areaData) { + if (err) { + return next(err); + } + + drafts = drafts.concat(areaData); + area.widgets = []; + widgets.setArea(area, next); + }); + }, function(err) { + if (err) { + return callback(err); + } + widgets.setArea({ + template: 'global', + location: 'drafts', + widgets: drafts + }, callback); + }); + }); +}; + +module.exports = widgets;