diff --git a/app.js b/app.js
index 330ffc455c..73952abd6c 100644
--- a/app.js
+++ b/app.js
@@ -149,6 +149,7 @@ function start() {
var urlObject = url.parse(nconf.get('url'));
nconf.set('use_port', !!urlObject.port);
nconf.set('relative_path', urlObject.pathname);
+ nconf.set('port', nconf.get('port') || nconf.get('PORT') || 4567);
async.waterfall([
async.apply(plugins.ready),
diff --git a/src/upgrade.js b/src/upgrade.js
index 2eeb1bb7cf..5986acf066 100644
--- a/src/upgrade.js
+++ b/src/upgrade.js
@@ -15,7 +15,7 @@ var db = require('./database'),
Upgrade = {},
- minSchemaDate = Date.UTC(2014, 1, 14, 21, 50), // This value gets updated every new MINOR version
+ minSchemaDate = Date.UTC(2014, 9, 22), // This value gets updated every new MINOR version
schemaDate, thisSchemaDate,
// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema
@@ -67,1085 +67,6 @@ Upgrade.upgrade = function(callback) {
}
});
},
- function(next) {
- thisSchemaDate = Date.UTC(2014, 1, 19, 18, 15);
-
- if (schemaDate < thisSchemaDate) {
- db.setObjectField('widgets:home.tpl', 'motd', JSON.stringify([
- {
- "widget": "html",
- "data": {
- "html": Meta.config.motd || "Welcome to NodeBB, if you are an administrator of this forum visit the Themes ACP to modify and add widgets."
- }
- }
- ]), function(err) {
- Meta.configs.remove('motd');
- Meta.configs.remove('motd_class');
- Meta.configs.remove('show_motd');
-
- winston.info('[2014/2/19] Updated MOTD to use the HTML widget.');
-
- if (err) {
- next(err);
- } else {
- Upgrade.update(thisSchemaDate, next);
- }
- });
- } else {
- winston.info('[2014/2/19] Updating MOTD to use the HTML widget - skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 1, 20, 15, 30);
-
- if (schemaDate < thisSchemaDate) {
- var container = '
';
-
- db.setObjectField('widgets:category.tpl', 'sidebar', JSON.stringify([
- {
- "widget": "recentreplies",
- "data": {
- "title": "Recent Replies",
- "container": container
- }
- },
- {
- "widget": "activeusers",
- "data": {
- "title": "Active Users",
- "container": container
- }
- },
- {
- "widget": "moderators",
- "data": {
- "title": "Moderators",
- "container": container
- }
- }
- ]), function(err) {
- winston.info('[2014/2/20] Adding Recent Replies, Active Users, and Moderator widgets to category sidebar.');
-
- if (err) {
- next(err);
- } else {
- Upgrade.update(thisSchemaDate, next);
- }
- });
- } else {
- winston.info('[2014/2/20] Adding Recent Replies, Active Users, and Moderator widgets to category sidebar - skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 1, 20, 16, 15);
-
- if (schemaDate < thisSchemaDate) {
- db.setObjectField('widgets:home.tpl', 'footer', JSON.stringify([
- {
- "widget": "forumstats",
- "data": {}
- }
- ]), function(err) {
- winston.info('[2014/2/20] Adding Forum Stats Widget to the Homepage Footer.');
-
- if (err) {
- next(err);
- } else {
- Upgrade.update(thisSchemaDate, next);
- }
- });
- } else {
- winston.info('[2014/2/20] Adding Forum Stats Widget to the Homepage Footer - skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 1, 20, 19, 45);
-
- if (schemaDate < thisSchemaDate) {
- var container = '';
-
- db.setObjectField('widgets:home.tpl', 'sidebar', JSON.stringify([
- {
- "widget": "html",
- "data": {
- "html": Meta.config.motd || "Welcome to NodeBB, if you are an administrator of this forum visit the Themes ACP to modify and add widgets.",
- "container": container,
- "title": "MOTD"
- }
- }
- ]), function(err) {
- winston.info('[2014/2/20] Updating Lavender MOTD');
-
- if (err) {
- next(err);
- } else {
- Upgrade.update(thisSchemaDate, next);
- }
- });
- } else {
- winston.info('[2014/2/20] Updating Lavender MOTD - skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 1, 20, 20, 25);
-
- if (schemaDate < thisSchemaDate) {
- db.setAdd('plugins:active', 'nodebb-widget-essentials', function(err) {
- winston.info('[2014/2/20] Activating NodeBB Essential Widgets');
- Plugins.reload(function() {
- if (err) {
- next(err);
- } else {
- Upgrade.update(thisSchemaDate, next);
- }
- });
- });
- } else {
- winston.info('[2014/2/20] Activating NodeBB Essential Widgets - skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 1, 22);
-
- if (schemaDate < thisSchemaDate) {
- db.exists('categories:cid', function(err, exists) {
- if(err) {
- return next(err);
- }
- if(!exists) {
- winston.info('[2014/2/22] Added categories to sorted set - skipped');
- return next();
- }
-
- db.getListRange('categories:cid', 0, -1, function(err, cids) {
- // Naive type-checking, becaue DBAL does not have .type() support
- if(err) {
- // Most likely upgraded already. Skip.
- winston.info('[2014/2/22] Added categories to sorted set - skipped');
- return Upgrade.update(thisSchemaDate, next);
- }
-
- if(!Array.isArray(cids)) {
- winston.info('[2014/2/22] Add categories to sorted set - skipped (cant find any cids)');
- return next();
- }
-
- db.rename('categories:cid', 'categories:cid:old', function(err) {
- if(err) {
- return next(err);
- }
-
- async.each(cids, function(cid, next) {
- Categories.getCategoryField(cid, 'order', function(err, order) {
- if(err) {
- return next(err);
- }
-
- // If there was no order present, put it at the end
- if (!order) {
- order = cids.length;
- }
-
- db.sortedSetAdd('categories:cid', order, cid, next);
- });
- }, function(err) {
- if(err) {
- return next(err);
- }
- winston.info('[2014/2/22] Added categories to sorted set');
- db.delete('categories:cid:old');
- Upgrade.update(thisSchemaDate, next);
- });
- });
- });
- });
-
- } else {
- winston.info('[2014/2/22] Added categories to sorted set - skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 2, 18);
-
- if (schemaDate < thisSchemaDate) {
- db.exists('settings:markdown', function(err, exists) {
- if (err || exists) {
- winston.info('[2014/3/18] Migrating Markdown settings to new configuration - skipped');
- return next();
- }
-
- var fields = [
- 'nodebb-plugin-markdown:options:gfm',
- 'nodebb-plugin-markdown:options:highlight',
- 'nodebb-plugin-markdown:options:tables',
- 'nodebb-plugin-markdown:options:breaks',
- 'nodebb-plugin-markdown:options:pedantic',
- 'nodebb-plugin-markdown:options:sanitize',
- 'nodebb-plugin-markdown:options:smartLists',
- 'nodebb-plugin-markdown:options:smartypants',
- 'nodebb-plugin-markdown:options:langPrefix'
- ],
- settings = {},
- newFieldName;
-
- async.series([
- function(next) {
- db.getObjectFields('config', fields, function(err, values) {
- if (err) {
- return next();
- }
-
- for(var field in values) {
- if (values.hasOwnProperty(field)) {
- newFieldName = field.slice(31);
- settings[newFieldName] = values[field] === '1' ? 'on' : values[field];
- }
- }
-
- next();
- });
- },
- function(next) {
- db.setObject('settings:markdown', settings, next);
- },
- function(next) {
- async.each(fields, function(field, next) {
- db.deleteObjectField('config', field, next);
- }, next);
- }
- ], function(err) {
- if (err) {
- winston.error('[2014/3/18] Problem migrating Markdown settings.');
- next();
- } else {
- winston.info('[2014/3/18] Migrated Markdown settings to new configuration');
- Upgrade.update(thisSchemaDate, next);
- }
- });
- });
- } else {
- winston.info('[2014/3/18] Migrating Markdown settings to new configuration - skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 2, 21);
-
- if (schemaDate < thisSchemaDate) {
- db.getObject('group:gid', function(err, mapping) {
- if (err) {
- return next(err);
- }
-
- if (!err && !mapping) {
- // Done already, skip
- return next();
- }
-
- var names = Object.keys(mapping),
- reverseMapping = {},
- isGroupList = /^cid:[0-9]+:privileges:g\+[rw]$/,
- gid;
-
- for(var groupName in mapping) {
- if (mapping.hasOwnProperty(groupName)) {
- gid = mapping[groupName];
- if (mapping.hasOwnProperty(groupName) && !reverseMapping.hasOwnProperty(gid)) {
- reverseMapping[parseInt(gid, 10)] = groupName;
- }
- }
- }
-
- async.eachSeries(names, function(name, next) {
- async.series([
- function(next) {
- // Remove the gid from the hash
- db.exists('gid:' + mapping[name], function(err, exists) {
- if (exists) {
- db.deleteObjectField('gid:' + mapping[name], 'gid', next);
- } else {
- next();
- }
- });
- },
- function(next) {
- // Rename gid hash to groupName hash
- db.exists('gid:' + mapping[name], function(err, exists) {
- if (exists) {
- db.rename('gid:' + mapping[name], 'group:' + name, next);
- } else {
- next();
- }
- });
- },
- function(next) {
- // Move member lists over
- db.exists('gid:' + mapping[name], function(err, dstExists) {
- if (err) {
- return next(err);
- }
-
- db.exists('gid:' + mapping[name] + ':members', function(err, srcExists) {
- if (err) {
- return next(err);
- }
-
- if (srcExists && !dstExists) {
- db.rename('gid:' + mapping[name] + ':members', 'group:' + name + ':members', next);
- } else {
- // No members or group memberlist collision: do nothing, they'll be removed later
- next();
- }
- });
- });
- },
- function(next) {
- // Add group to the directory (set)
- db.setAdd('groups', name, next);
- },
- function(next) {
- // If this group contained gids, map the gids to group names
- // Also check if the mapping and reverseMapping still work, if not, delete this group
- if (isGroupList.test(name) && name === reverseMapping[mapping[name]]) {
- db.getSetMembers('group:' + name + ':members', function(err, gids) {
- async.each(gids, function(gid, next) {
- db.setRemove('group:' + name + ':members', gid);
- db.setAdd('group:' + name + ':members', reverseMapping[gid], next);
- }, next);
- });
- } else if (name !== reverseMapping[mapping[name]]) {
- async.parallel([
- function(next) {
- db.delete('group:' + name, next);
- },
- function(next) {
- db.delete('group:' + name + ':members', next);
- },
- function(next) {
- db.setRemove('groups', name, next);
- }
- ], next);
- } else {
- next();
- }
- },
- function(next) {
- // Fix its' name, if it is wrong for whatever reason
- db.getObjectField('group:' + name, 'name', function(err, groupName) {
- if (name && groupName && name !== groupName) {
- async.series([
- function(cb) {
- db.setObjectField('group:' + name, 'name', name, cb);
- },
- function(cb) {
- db.setRemove('groups', groupName, cb);
- },
- function(cb) {
- db.setAdd('groups', name, cb);
- }
- ], next);
- } else {
- next();
- }
- });
- }
- ], next);
- }, function(err) {
- if (err) {
- winston.error('[2014/3/21] Problem removing gids and pruning groups.');
- winston.error(err.message);
- return next();
- }
-
- // Clean-up
- var isValidHiddenGroup = /^cid:[0-9]+:privileges:(g)?\+[rw]$/;
- async.series([
- function(next) {
- // Mapping
- db.delete('group:gid', next);
- },
- function(next) {
- // Incrementor
- db.deleteObjectField('global', 'nextGid', next);
- },
- function(next) {
- // Set 'administrators' and 'registered-users' as system groups
- async.parallel([
- function(next) {
- db.setObject('group:administrators', {
- system: '1',
- hidden: '0'
- }, next);
- },
- function(next) {
- db.setObject('group:registered-users', {
- system: '1',
- hidden: '0'
- }, next);
- }
- ], next);
- },
- function(next) {
- Groups.list({ showAllGroups: true }, function(err, groups) {
- async.each(groups, function(group, next) {
- // If deleted, (hidden & empty), or invalidly named hidden group, delete
- if (group.deleted || (group.hidden && group.memberCount === 0) || (group.hidden && !isValidHiddenGroup.test(group.name))) {
- Groups.destroy(group.name, next);
- } else {
- next();
- }
- }, next);
- });
- }
- ], function(err) {
- if (err) {
- winston.error('[2014/3/21] Problem removing gids and pruning groups.');
- next();
- } else {
- winston.info('[2014/3/21] Removing gids and pruning groups');
- Upgrade.update(thisSchemaDate, next);
- }
- });
- });
- });
- } else {
- winston.info('[2014/3/21] Removing gids and pruning groups - skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 3, 31, 12, 30);
-
- if (schemaDate < thisSchemaDate) {
- db.setObjectField('widgets:global', 'footer', "[{\"widget\":\"html\",\"data\":{\"html\":\"\",\"title\":\"\",\"container\":\"\"}}]", function(err) {
- if (err) {
- winston.error('[2014/3/31] Problem re-adding copyright message into global footer widget');
- next();
- } else {
- winston.info('[2014/3/31] Re-added copyright message into global footer widget');
- Upgrade.update(thisSchemaDate, next);
- }
- });
- } else {
- winston.info('[2014/3/31] Re-adding copyright message into global footer widget - skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 4, 1);
-
- if (schemaDate < thisSchemaDate) {
- db.getObjectField('widgets:home.tpl', 'sidebar', function(err, widgetData) {
- if (err) {
- winston.error('[2014/4/1] Error moving home sidebar widgets into draft zone');
- return next(err);
- }
-
- db.setObjectField('widgets:global', 'drafts', widgetData, function(err) {
- if (err) {
- winston.error('[2014/4/1] Error moving home sidebar widgets into draft zone');
- return next(err);
- }
-
- db.deleteObjectField('widgets:home.tpl', 'sidebar', function(err) {
- if (err) {
- winston.error('[2014/4/1] Error moving home sidebar widgets into draft zone');
- next(err);
- } else {
- winston.info('[2014/4/1] Moved home sidebar widgets into draft zone');
- Upgrade.update(thisSchemaDate, next);
- }
- });
- });
- });
- } else {
- winston.info('[2014/4/1] Moved home sidebar widgets into draft zone - skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 4, 2);
-
- if (schemaDate < thisSchemaDate) {
- db.getObjectField('widgets:home.tpl', 'footer', function(err, widgetData) {
- if (err) {
- winston.error('[2014/4/1] Error moving deprecated vanilla footer widgets into draft zone');
- return next(err);
- }
-
- db.setObjectField('widgets:global', 'drafts', widgetData, function(err) {
- if (err) {
- winston.error('[2014/4/1] Error moving deprecated vanilla footer widgets into draft zone');
- return next(err);
- }
-
- db.deleteObjectField('widgets:home.tpl', 'footer', function(err) {
- if (err) {
- winston.error('[2014/4/1] Error moving deprecated vanilla footer widgets into draft zone');
- next(err);
- } else {
- winston.info('[2014/4/1] Moved deprecated vanilla footer widgets into draft zone');
- Upgrade.update(thisSchemaDate, next);
- }
- });
- });
- });
- } else {
- winston.info('[2014/4/2] Moved deprecated vanilla footer widgets into draft zone - skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 4, 13);
-
- if (schemaDate < thisSchemaDate) {
- var tasks = [];
- db.getSetMembers('groups', function(err, groups) {
- var isCidPerm = /^cid:\d+:privileges:g?\+[rw]$/,
- privMap = {
- "+r": "read",
- "+w": "topics:create",
- "g+r": "groups:read",
- "g+w": "groups:topics:create"
- };
-
- groups = groups.filter(function(groupName) {
- return isCidPerm.test(groupName);
- });
-
- groups.forEach(function(groupName) {
- var split = groupName.split(':'),
- privilege = split.pop(),
- newPrivilege = privMap[privilege],
- newName;
-
- split.push(newPrivilege);
- newName = split.join(':');
-
- tasks.push(async.apply(db.rename, 'group:' + groupName, 'group:' + newName));
- tasks.push(async.apply(db.rename, 'group:' + groupName + ':members', 'group:' + newName + ':members'));
- tasks.push(async.apply(db.setRemove, 'groups', groupName));
- tasks.push(async.apply(db.setAdd, 'groups', newName));
- });
-
- async.parallel(tasks, function(err) {
- if (!err) {
- winston.info('[2014/4/1] Updating privilege settings');
- Upgrade.update(thisSchemaDate, next);
- } else {
- winston.error('[2014/4/1] Error encountered while updating privilege settings');
- next(err);
- }
- });
- });
- } else {
- winston.info('[2014/5/13] Updating privilege settings - skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 4, 16);
-
- if (schemaDate < thisSchemaDate) {
- var tasks = [];
-
- db.getObjectField('config', 'allowGuestPosting', function(err, value) {
- if (value === '1') {
- tasks.push(async.apply(db.deleteObjectField, 'config', 'allowGuestPosting'));
-
- db.getSortedSetRange('categories:cid', 0, -1, function(err, cids) {
- async.each(cids, function(cid, next) {
- Categories.getCategoryField(cid, 'disabled', function(err, disabled) {
- if (!disabled || disabled === '0') {
- tasks.push(async.apply(Groups.join, 'cid:' + cid + ':privileges:groups:topics:create', 'guests'));
- tasks.push(async.apply(Groups.join, 'cid:' + cid + ':privileges:groups:topics:reply', 'guests'));
- next();
- } else {
- next();
- }
- });
- }, function() {
- async.parallel(tasks, function(err) {
- if (!err) {
- winston.info('[2014/5/16] Removing allowGuestPosting option');
- Upgrade.update(thisSchemaDate, next);
- } else {
- winston.error('[2014/4/1] Error encountered while removing allowGuestPosting option');
- next(err);
- }
- });
- });
- });
- } else {
- winston.info('[2014/5/16] Removing allowGuestPosting option - skipped');
- next();
- }
- });
- } else {
- winston.info('[2014/5/16] Removing allowGuestPosting option - skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 4, 22);
-
- if (schemaDate < thisSchemaDate) {
- db.exists('tags', function(err, exists) {
- if (err || !exists) {
- winston.info('[2014/5/22] Skipping tag upgrade');
- return Upgrade.update(thisSchemaDate, next);
- }
-
- db.getSetMembers('tags', function(err, tags) {
- if (err) {
- return next(err);
- }
-
- async.each(tags, function(tag, next) {
- db.sortedSetCard('tag:' + tag + ':topics', function(err, count) {
- if (err) {
- return next(err);
- }
- db.sortedSetAdd('tags:topic:count', count, tag, next);
- });
- }, function(err) {
- if (err) {
- winston.error('[2014/5/22] Error encountered while upgrading tags');
- return next(err);
- }
-
- db.delete('tags', function(err) {
- if (err) {
- winston.error('[2014/5/22] Error encountered while upgrading tags');
- return next(err);
- }
- winston.info('[2014/5/22] Tags upgraded to sorted set');
- Upgrade.update(thisSchemaDate, next);
- });
- });
- });
- });
- } else {
- winston.info('[2014/5/16] Tags upgrade - skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 5, 6);
-
- if (schemaDate < thisSchemaDate) {
- winston.info('[2014/6/6] Upgrading topics...');
-
- db.getSortedSetRange('topics:tid', 0, -1, function(err, tids) {
- function upgradeTopic(tid, callback) {
-
- Topics.getTopicField(tid, 'mainPid', function(err, mainPid) {
- if (err) {
- return callback(err);
- }
-
- db.getSortedSetRange('tid:' + tid + ':posts', 0, -1, function(err, pids) {
- if (err) {
- return callback(err);
- }
-
- if (!Array.isArray(pids) || !pids.length) {
- return callback();
- }
-
- if (!parseInt(mainPid, 10)) {
- mainPid = pids[0];
- pids.splice(0, 1);
- Topics.setTopicField(tid, 'mainPid', mainPid);
- db.sortedSetRemove('tid:' + tid + ':posts', mainPid);
- db.sortedSetRemove('tid:' + tid + ':posts:votes', mainPid);
- }
-
- if (!pids.length) {
- return callback();
- }
-
- async.eachLimit(pids, 10, function(pid, next) {
- Posts.getPostField(pid, 'votes', function(err, votes) {
- if (err) {
- return next(err);
- }
- db.sortedSetAdd('tid:' + tid + ':posts:votes', votes ? votes : 0, pid, next);
- });
- }, callback);
- });
- });
- }
-
- if (err) {
- return next(err);
- }
-
- if (!Array.isArray(tids) || !tids.length) {
- winston.info('[2014/6/6] Skipping topic upgrade');
- return Upgrade.update(thisSchemaDate, next);
- }
-
- async.eachLimit(tids, 10, upgradeTopic, function(err) {
- if (err) {
- winston.error('[2014/6/6] Error encountered while upgrading topics');
- return next(err);
- }
- winston.info('[2014/6/6] Topics upgraded.');
- Upgrade.update(thisSchemaDate, next);
- });
- });
- } else {
- winston.info('[2014/6/6] Topic upgrade - skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 5, 17);
-
- if (schemaDate < thisSchemaDate) {
- winston.info('[2014/6/17] Upgrading category post counts...');
-
- db.getSortedSetRange('categories:cid', 0, -1, function(err, cids) {
- if (err) {
- return next(err);
- }
-
- async.each(cids, function(cid, next) {
- db.setObjectField('category:' + cid, 'post_count', 0, next);
- }, function(err) {
- if (err) {
- return next(err);
- }
- db.getSortedSetRange('topics:tid', 0, -1, function(err, tids) {
- function upgradeTopic(tid, callback) {
-
- Topics.getTopicFields(tid, ['cid', 'postcount', 'deleted'], function(err, topicData) {
- if (err || !topicData) {
- return callback(err);
- }
-
- if (parseInt(topicData.deleted, 10) === 1) {
- return callback();
- }
-
- db.incrObjectFieldBy('category:' + topicData.cid, 'post_count', topicData.postcount, callback);
- });
- }
-
- if (err) {
- return next(err);
- }
-
- if (!Array.isArray(tids) || !tids.length) {
- winston.info('[2014/6/17] Skipping category post upgrade');
- return Upgrade.update(thisSchemaDate, next);
- }
-
- async.eachLimit(tids, 10, upgradeTopic, function(err) {
- if (err) {
- winston.error('[2014/6/17] Error encountered while upgrading category postcounts');
- return next(err);
- }
- winston.info('[2014/6/17] Category post counts upgraded');
- Upgrade.update(thisSchemaDate, next);
- });
- });
- });
- });
- } else {
- winston.info('[2014/6/17] Category post count upgrade - skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 6, 23);
-
- if (schemaDate < thisSchemaDate) {
- winston.info('[2014/7/23] Upgrading db dependencies...');
- var install = require('./install');
- var config = require('../config.json');
- install.installDbDependencies(config, function(err) {
- if (err) {
- winston.error('[2014/7/23] Error encountered while upgrading db dependencies');
- return next(err);
- }
-
- winston.info('[2014/7/23] Upgraded db dependencies');
- Upgrade.update(thisSchemaDate, next);
- });
- } else {
- winston.info('[2014/7/23] Upgrading db dependencies - skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 6, 24);
-
- if (schemaDate < thisSchemaDate) {
- winston.info('[2014/7/24] Upgrading chats to sorted set...');
-
- db.getSortedSetRange('users:joindate', 0, -1, function(err, uids) {
- if (err) {
- return next(err);
- }
-
- async.eachLimit(uids, 10, function(uid, next) {
- db.getSortedSetRange('uid:' + uid + ':chats', 0, -1, function(err, toUids) {
- if (err) {
- return next(err);
- }
-
- if (!Array.isArray(toUids) || !toUids.length) {
- return next();
- }
-
- async.eachLimit(toUids, 10, function(toUid, next) {
- var uids = [uid, toUid].sort();
- db.getListRange('messages:' + uids[0] + ':' + uids[1], 0, -1, function(err, mids) {
- if (err) {
- return next(err);
- }
-
- if (!Array.isArray(mids) || !mids.length) {
- return next();
- }
-
- async.eachLimit(mids, 10, function(mid, next) {
- db.getObjectField('message:' + mid, 'timestamp', function(err, timestamp) {
- if (err || !timestamp) {
- return next(err);
- }
-
- db.sortedSetAdd('messages:uid:' + uids[0] + ':to:' + uids[1], timestamp, mid, next);
- });
- }, next);
- });
- }, next);
- });
- }, function(err) {
- if (err) {
- winston.error('[2014/7/24] Error encountered while updating chats to sorted set');
- return next(err);
- }
-
- async.eachLimit(uids, 10, function(uid, next) {
- db.getSortedSetRange('uid:' + uid + ':chats', 0, -1, function(err, toUids) {
- if (err) {
- return next(err);
- }
-
- if (!Array.isArray(toUids) || !toUids.length) {
- return next();
- }
-
- async.eachLimit(toUids, 10, function(toUid, next) {
- var uids = [uid, toUid].sort();
- db.delete('messages:' + uids[0] + ':' + uids[1], next);
- }, next);
- });
- }, function(err) {
- if (err) {
- winston.error('[2014/7/24] Error encountered while updating chats to sorted set');
- return next(err);
- }
-
- winston.info('[2014/7/24] Upgraded chats to sorted set');
- Upgrade.update(thisSchemaDate, next);
- });
- });
- });
- } else {
- winston.info('[2014/7/24] Upgrading chats to sorted set - skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 8, 8);
-
- if (schemaDate < thisSchemaDate) {
- winston.info('[2014/9/8] Deleting old notifications...');
-
- async.parallel({
- uids: function(next) {
- db.getSortedSetRange('users:joindate', 0, -1, next);
- },
- nids: function(next) {
- db.getSetMembers('notifications', next);
- }
- }, function(err, results) {
- if (err) {
- return next(err);
- }
- var uidKeys = results.uids.map(function(uid) {
- return 'uid:' + uid + ':notifications:uniqueId:nid';
- });
-
- var nidKeys = results.nids.filter(Boolean).map(function(nid) {
- return 'notifications:' + nid;
- });
-
- async.series([
- function(next) {
- db.deleteAll(nidKeys, next);
- },
- function(next) {
- db.deleteAll(uidKeys, next);
- },
- function(next) {
- db.delete('notifications', next);
- }
- ], function(err, results) {
- if (err) {
- winston.error('[2014/9/8] Error encountered while deleting notifications');
- return next(err);
- }
-
- winston.info('[2014/9/8] Deleted old notifications');
- Upgrade.update(thisSchemaDate, next);
- });
- });
- } else {
- winston.info('[2014/9/8] Deleting old notifications skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 8, 27);
- if (schemaDate < thisSchemaDate) {
- winston.info('[2014/9/27] Deleting tid::read_by_uid...');
-
- db.getSortedSetRange('topics:tid', 0, -1, function(err, tids) {
- if (err) {
- return next(err);
- }
- tids = tids.filter(Boolean);
- var readKeys = tids.map(function(tid) {
- return 'tid:' + tid + ':read_by_uid';
- });
-
- db.deleteAll(readKeys, function(err, results) {
- if (err) {
- winston.error('[2014/9/27] Error encountered while deleting tid::read_by_uid');
- return next(err);
- }
-
- winston.info('[2014/9/27] Deleted tid::read_by_uid');
- Upgrade.update(thisSchemaDate, next);
- });
- });
- } else {
- winston.info('[2014/9/27] Deleting tid::read_by_uid skipped');
- next();
- }
- },
- function(next) {
- thisSchemaDate = Date.UTC(2014, 9, 7);
- if (schemaDate < thisSchemaDate) {
- winston.info('[2014/10/7] Banned users sorted set');
-
- db.getSortedSetRange('users:joindate', 0, -1, function(err, uids) {
- if (err) {
- return next(err);
- }
-
- var now = Date.now();
-
- async.eachLimit(uids, 50, function(uid, next) {
- User.getUserField(uid, 'banned', function(err, banned) {
- if (err) {
- return next(err);
- }
-
- if (parseInt(banned, 10) !== 1) {
- return next();
- }
-
- db.sortedSetAdd('users:banned', now, uid, next);
- });
- }, function(err) {
- if (err) {
- winston.error('[2014/10/7] Error encountered while updating banned users sorted set');
- return next(err);
- }
-
- winston.info('[2014/10/7] Banned users added to sorted set');
- Upgrade.update(thisSchemaDate, next);
- });
- });
- } else {
- winston.info('[2014/10/7] Banned users sorted set skipped');
- next();
- }
- },
- function(next) {
- function updateCategories(next) {
- db.getSortedSetRange('categories:cid', 0, -1, function(err, cids) {
- if (err) {
- return next(err);
- }
-
- async.eachLimit(cids, 5, function(cid, next) {
- db.sortedSetCard('categories:' + cid + ':tid', function(err, count) {
- if (err) {
- return next(err);
- }
- count = parseInt(count, 10) || 0;
- db.setObjectField('category:' + cid, 'topic_count', count, next);
- });
- }, next);
- });
- }
-
- function updateTopics(next) {
- db.getSortedSetRange('topics:tid', 0, -1, function(err, tids) {
- if (err) {
- return next(err);
- }
-
- async.eachLimit(tids, 50, function(tid, next) {
- db.sortedSetCard('tid:' + tid + ':posts', function(err, count) {
- if (err) {
- return next(err);
- }
- count = (parseInt(count, 10) || 0) + 1;
- winston.info('updating tid ' + tid + ' count ' + count);
- db.setObjectField('topic:' + tid, 'postcount', count, next);
- });
- }, next);
- });
- }
-
- thisSchemaDate = Date.UTC(2014, 9, 22);
- if (schemaDate < thisSchemaDate) {
- winston.info('[2014/10/22] Topic post count migration');
-
- async.series([
- function(next) {
- updateCategories(next);
- },
- function(next) {
- updateTopics(next);
- }
- ], function(err) {
- if (err) {
- winston.error('[2014/10/22] Error encountered while Topic post count migration');
- return next(err);
- }
- winston.info('[2014/10/22] Topic post count migration done');
- Upgrade.update(thisSchemaDate, next);
- });
- } else {
- winston.info('[2014/10/22] Topic post count migration skipped');
- next();
- }
- },
function(next) {
thisSchemaDate = Date.UTC(2014, 9, 31);
if (schemaDate < thisSchemaDate) {
diff --git a/src/webserver.js b/src/webserver.js
index 503d49d392..342e20f7ab 100644
--- a/src/webserver.js
+++ b/src/webserver.js
@@ -34,7 +34,7 @@ if(nconf.get('ssl')) {
(function (app) {
"use strict";
- var port = nconf.get('port') || nconf.get('PORT') || 4567;
+ var port = nconf.get('port');
logger.init(app);
emailer.registerApp(app);