mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-18 03:31:03 +01:00
Merge branch 'master' of github.com:designcreateplay/NodeBB
This commit is contained in:
@@ -48,8 +48,8 @@
|
|||||||
todo: fix this nesting if issue#1065 is a win
|
todo: fix this nesting if issue#1065 is a win
|
||||||
todo: add a check for config.allowTopicsThumbnail if issue#1066 is a win
|
todo: add a check for config.allowTopicsThumbnail if issue#1066 is a win
|
||||||
-->
|
-->
|
||||||
<a href="../../user/{topics.userslug}" class="pull-left">
|
<a href="../../user/{topics.user.userslug}" class="pull-left">
|
||||||
<img src="<!-- IF topics.thumb -->{topics.thumb}<!-- ELSE -->{topics.picture}<!-- ENDIF topics.thumb -->" class="img-rounded user-img" title="{topics.username}"/>
|
<img src="<!-- IF topics.thumb -->{topics.thumb}<!-- ELSE -->{topics.user.picture}<!-- ENDIF topics.thumb -->" class="img-rounded user-img" title="{topics.user.username}"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<h3>
|
<h3>
|
||||||
|
|||||||
@@ -26,8 +26,8 @@
|
|||||||
<!-- BEGIN topics -->
|
<!-- BEGIN topics -->
|
||||||
<li class="category-item <!-- IF topics.deleted --> deleted<!-- ENDIF topics.deleted --><!-- IF topics.unread --> unread<!-- ENDIF topics.unread -->">
|
<li class="category-item <!-- IF topics.deleted --> deleted<!-- ENDIF topics.deleted --><!-- IF topics.unread --> unread<!-- ENDIF topics.unread -->">
|
||||||
<div class="col-md-12 col-xs-12 panel panel-default topic-row">
|
<div class="col-md-12 col-xs-12 panel panel-default topic-row">
|
||||||
<a href="{relative_path}/user/{topics.userslug}" class="pull-left">
|
<a href="{relative_path}/user/{topics.user.userslug}" class="pull-left">
|
||||||
<img class="img-rounded user-img" src="{topics.picture}" title="{topics.username}" />
|
<img class="img-rounded user-img" src="{topics.user.picture}" title="{topics.user.username}" />
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<h3>
|
<h3>
|
||||||
|
|||||||
@@ -27,8 +27,8 @@
|
|||||||
<!-- BEGIN topics -->
|
<!-- BEGIN topics -->
|
||||||
<li class="category-item <!-- IF topics.deleted --> deleted<!-- ENDIF topics.deleted --><!-- IF topics.unread --> unread<!-- ENDIF topics.unread -->">
|
<li class="category-item <!-- IF topics.deleted --> deleted<!-- ENDIF topics.deleted --><!-- IF topics.unread --> unread<!-- ENDIF topics.unread -->">
|
||||||
<div class="col-md-12 col-xs-12 panel panel-default topic-row">
|
<div class="col-md-12 col-xs-12 panel panel-default topic-row">
|
||||||
<a href="{relative_path}/user/{topics.userslug}" class="pull-left">
|
<a href="{relative_path}/user/{topics.user.userslug}" class="pull-left">
|
||||||
<img class="img-rounded user-img" src="{topics.picture}" title="{topics.username}" />
|
<img class="img-rounded user-img" src="{topics.user.picture}" title="{topics.user.username}" />
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<h3>
|
<h3>
|
||||||
|
|||||||
@@ -21,8 +21,8 @@
|
|||||||
<!-- BEGIN topics -->
|
<!-- BEGIN topics -->
|
||||||
<li class="category-item<!-- IF topics.deleted --> deleted<!-- ENDIF topics.deleted -->" data-tid="{topics.tid}">
|
<li class="category-item<!-- IF topics.deleted --> deleted<!-- ENDIF topics.deleted -->" data-tid="{topics.tid}">
|
||||||
<div class="col-md-12 col-xs-12 panel panel-default topic-row">
|
<div class="col-md-12 col-xs-12 panel panel-default topic-row">
|
||||||
<a href="{relative_path}/user/{topics.userslug}" class="pull-left">
|
<a href="{relative_path}/user/{topics.user.userslug}" class="pull-left">
|
||||||
<img class="img-rounded user-img" src="{topics.picture}" title="{topics.username}" />
|
<img class="img-rounded user-img" src="{topics.user.picture}" title="{topics.user.username}" />
|
||||||
</a>
|
</a>
|
||||||
<h3>
|
<h3>
|
||||||
<a href="{relative_path}/topic/{topics.slug}">
|
<a href="{relative_path}/topic/{topics.slug}">
|
||||||
|
|||||||
@@ -82,18 +82,6 @@
|
|||||||
//
|
//
|
||||||
// helper functions
|
// helper functions
|
||||||
//
|
//
|
||||||
function removeHiddenFields(item) {
|
|
||||||
if(item) {
|
|
||||||
if(item._id) {
|
|
||||||
delete item._id;
|
|
||||||
}
|
|
||||||
if(item._key) {
|
|
||||||
delete item._key;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
|
|
||||||
function findItem(data, key) {
|
function findItem(data, key) {
|
||||||
if(!data) {
|
if(!data) {
|
||||||
return null;
|
return null;
|
||||||
@@ -261,11 +249,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
module.getObject = function(key, callback) {
|
module.getObject = function(key, callback) {
|
||||||
db.collection('objects').findOne({_key:key}, function(err, item) {
|
db.collection('objects').findOne({_key:key}, {_id:0, _key:0}, callback);
|
||||||
removeHiddenFields(item);
|
|
||||||
|
|
||||||
callback(err, item);
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
module.getObjects = function(keys, callback) {
|
module.getObjects = function(keys, callback) {
|
||||||
@@ -302,7 +286,9 @@
|
|||||||
|
|
||||||
module.getObjectFields = function(key, fields, callback) {
|
module.getObjectFields = function(key, fields, callback) {
|
||||||
|
|
||||||
var _fields = {};
|
var _fields = {
|
||||||
|
_id: 0
|
||||||
|
};
|
||||||
for(var i=0; i<fields.length; ++i) {
|
for(var i=0; i<fields.length; ++i) {
|
||||||
if (typeof fields[i] !== 'string') {
|
if (typeof fields[i] !== 'string') {
|
||||||
fields[i] = fields[i].toString();
|
fields[i] = fields[i].toString();
|
||||||
@@ -312,6 +298,7 @@
|
|||||||
_fields[fields[i]] = 1;
|
_fields[fields[i]] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
db.collection('objects').findOne({_key:key}, _fields, function(err, item) {
|
db.collection('objects').findOne({_key:key}, _fields, function(err, item) {
|
||||||
|
|
||||||
if(err) {
|
if(err) {
|
||||||
@@ -328,8 +315,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
removeHiddenFields(item);
|
|
||||||
|
|
||||||
callback(null, item);
|
callback(null, item);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
138
src/topics.js
138
src/topics.js
@@ -323,17 +323,35 @@ var async = require('async'),
|
|||||||
};
|
};
|
||||||
|
|
||||||
Topics.getTopicData = function(tid, callback) {
|
Topics.getTopicData = function(tid, callback) {
|
||||||
db.getObject('topic:' + tid, function(err, data) {
|
Topics.getTopicsData([tid], function(err, topics) {
|
||||||
if(err) {
|
if (err) {
|
||||||
return callback(err, null);
|
return callback(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(data) {
|
callback(null, topics ? topics[0] : null);
|
||||||
data.title = validator.escape(data.title);
|
});
|
||||||
data.relativeTime = utils.toISOString(data.timestamp);
|
};
|
||||||
|
|
||||||
|
Topics.getTopicsData = function(tids, callback) {
|
||||||
|
var keys = [];
|
||||||
|
|
||||||
|
for (var i=0; i<tids.length; ++i) {
|
||||||
|
keys.push('topic:' + tids[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
db.getObjects(keys, function(err, topics) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
callback(null, data);
|
for (var i=0; i<tids.length; ++i) {
|
||||||
|
if(topics[i]) {
|
||||||
|
topics[i].title = validator.escape(topics[i].title);
|
||||||
|
topics[i].relativeTime = utils.toISOString(topics[i].timestamp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
callback(null, topics);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -352,9 +370,12 @@ var async = require('async'),
|
|||||||
userData = {};
|
userData = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
topic.username = userData.username || 'Anonymous';
|
topic.user = {
|
||||||
topic.userslug = userData.userslug || '';
|
username: userData.username || 'Anonymous',
|
||||||
topic.picture = userData.picture || gravatar.url('', {}, true);
|
userslug: userData.userslug || '',
|
||||||
|
picture: userData.picture || gravatar.url('', {}, true)
|
||||||
|
};
|
||||||
|
|
||||||
callback(null, topic);
|
callback(null, topic);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -671,73 +692,86 @@ var async = require('async'),
|
|||||||
return callback(null, []);
|
return callback(null, []);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getTopicInfo(topicData, callback) {
|
var categoryCache = {},
|
||||||
|
privilegeCache = {},
|
||||||
|
userCache = {};
|
||||||
|
|
||||||
|
function loadTopicInfo(topicData, next) {
|
||||||
|
|
||||||
|
function isTopicVisible(topicData, topicInfo) {
|
||||||
|
var deleted = parseInt(topicData.deleted, 10) !== 0;
|
||||||
|
return !deleted || (deleted && topicInfo.privileges.view_deleted) || parseInt(topicData.uid, 10) === parseInt(uid, 10);
|
||||||
|
}
|
||||||
|
|
||||||
async.parallel({
|
async.parallel({
|
||||||
hasread : function (next) {
|
hasread: function(next) {
|
||||||
Topics.hasReadTopic(topicData.tid, uid, next);
|
Topics.hasReadTopic(topicData.tid, uid, next);
|
||||||
},
|
},
|
||||||
teaser : function (next) {
|
teaser: function(next) {
|
||||||
Topics.getTeaser(topicData.tid, next);
|
Topics.getTeaser(topicData.tid, next);
|
||||||
},
|
},
|
||||||
privileges : function (next) {
|
privileges: function(next) {
|
||||||
|
if (privilegeCache[topicData.cid]) {
|
||||||
|
return next(null, privilegeCache[topicData.cid]);
|
||||||
|
}
|
||||||
categoryTools.privileges(topicData.cid, uid, next);
|
categoryTools.privileges(topicData.cid, uid, next);
|
||||||
},
|
},
|
||||||
categoryData : function (next) {
|
categoryData: function(next) {
|
||||||
|
if (categoryCache[topicData.cid]) {
|
||||||
|
return next(null, categoryCache[topicData.cid]);
|
||||||
|
}
|
||||||
categories.getCategoryFields(topicData.cid, ['name', 'slug', 'icon'], next);
|
categories.getCategoryFields(topicData.cid, ['name', 'slug', 'icon'], next);
|
||||||
|
},
|
||||||
|
user: function(next) {
|
||||||
|
if (userCache[topicData.uid]) {
|
||||||
|
return next(null, userCache[topicData.uid]);
|
||||||
|
}
|
||||||
|
user.getUserFields(topicData.uid, ['username', 'userslug', 'picture'], next);
|
||||||
}
|
}
|
||||||
}, callback);
|
}, function(err, topicInfo) {
|
||||||
}
|
|
||||||
|
|
||||||
function isTopicVisible(topicData, topicInfo) {
|
|
||||||
var deleted = parseInt(topicData.deleted, 10) !== 0;
|
|
||||||
|
|
||||||
return !deleted || (deleted && topicInfo.privileges.view_deleted) || parseInt(topicData.uid, 10) === parseInt(uid, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadTopic(tid, next) {
|
|
||||||
|
|
||||||
Topics.getTopicDataWithUser(tid, function(err, topicData) {
|
|
||||||
if(err) {
|
if(err) {
|
||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!topicData) {
|
privilegeCache[topicData.cid] = topicInfo.privileges;
|
||||||
|
categoryCache[topicData.cid] = topicInfo.categoryData;
|
||||||
|
userCache[topicData.uid] = topicInfo.user;
|
||||||
|
|
||||||
|
if (!isTopicVisible(topicData, topicInfo)) {
|
||||||
|
topicData = null;
|
||||||
return next();
|
return next();
|
||||||
}
|
}
|
||||||
|
|
||||||
getTopicInfo(topicData, function(err, topicInfo) {
|
topicData.pinned = parseInt(topicData.pinned, 10) === 1;
|
||||||
if(err) {
|
topicData.locked = parseInt(topicData.locked, 10) === 1;
|
||||||
return next(err);
|
topicData.deleted = parseInt(topicData.deleted, 10) === 1;
|
||||||
}
|
topicData.unread = !(topicInfo.hasread && parseInt(uid, 10) !== 0);
|
||||||
|
topicData.unreplied = parseInt(topicData.postcount, 10) === 1;
|
||||||
|
|
||||||
if (!isTopicVisible(topicData, topicInfo)) {
|
topicData.category = topicInfo.categoryData;
|
||||||
return next();
|
topicData.teaser = topicInfo.teaser;
|
||||||
}
|
topicData.user = topicInfo.user;
|
||||||
|
|
||||||
topicData.pinned = parseInt(topicData.pinned, 10) === 1;
|
next();
|
||||||
topicData.locked = parseInt(topicData.locked, 10) === 1;
|
|
||||||
topicData.deleted = parseInt(topicData.deleted, 10) === 1;
|
|
||||||
topicData.unread = !(topicInfo.hasread && parseInt(uid, 10) !== 0);
|
|
||||||
topicData.unreplied = parseInt(topicData.postcount, 10) === 1;
|
|
||||||
|
|
||||||
topicData.category = topicInfo.categoryData;
|
|
||||||
topicData.teaser = topicInfo.teaser;
|
|
||||||
|
|
||||||
next(null, topicData);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async.map(tids, loadTopic, function(err, topics) {
|
Topics.getTopicsData(tids, function(err, topics) {
|
||||||
if(err) {
|
if (err) {
|
||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
topics = topics.filter(function(topic) {
|
async.eachSeries(topics, loadTopicInfo, function(err) {
|
||||||
return !!topic;
|
if(err) {
|
||||||
});
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
callback(null, topics);
|
topics = topics.filter(function(topic) {
|
||||||
|
return !!topic;
|
||||||
|
});
|
||||||
|
|
||||||
|
callback(null, topics);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user