93 lines
2.9 KiB
JavaScript

var tag_ctrl = require('./tag');
var user_ctrl = require('./user');
var topic_ctrl = require('./topic');
var config = require('../config').config;
var EventProxy = require('eventproxy').EventProxy;
var sanitize = require('validator').sanitize;
exports.index = function(req,res,next){
var page = Number(req.query.page) || 1;
var keyword = req.query.q || ''; // in-site search
keyword = keyword.trim();
var limit = config.list_topic_count;
var render = function(tags,topics,hot_topics,stars,tops,no_reply_topics,pages){
var all_tags = tags.slice(0);
// 计算最热标签
tags.sort(function(tag_a,tag_b){
if(tag_a.topic_count == tag_b.topic_count) return 0;
if(tag_a.topic_count > tag_b.topic_count) return -1;
if(tag_a.topic_count < tag_b.topic_count) return 1;
});
var hot_tags = tags.slice(0,5);
// 计算最新标签
tags.sort(function(tag_a,tag_b){
if(tag_a.create_at == tag_b.create_at) return 0;
if(tag_a.create_at > tag_b.create_at) return -1;
if(tag_a.create_at < tag_b.create_at) return 1;
});
var recent_tags = tags.slice(0,5);
res.render('index', {
tags: all_tags,
topics: topics,
current_page: page,
list_topic_count: limit,
recent_tags: recent_tags,
hot_topics: hot_topics,
stars: stars,
tops: tops,
no_reply_topics: no_reply_topics,
pages: pages,
keyword: keyword
});
};
var proxy = new EventProxy();
proxy.assign('tags','topics','hot_topics','stars','tops','no_reply_topics','pages',render);
tag_ctrl.get_all_tags(function(err,tags){
if(err) return next(err);
proxy.trigger('tags',tags);
});
var opt = {skip:(page-1)*limit, limit:limit, sort:[['top','desc'],['last_reply_at','desc']]};
var query = {};
if (keyword) {
keyword = keyword.replace(/[\*\^\&\(\)\[\]\+\?\\]/g, '');
query.title = new RegExp(keyword, 'i');
}
topic_ctrl.get_topics_by_query(query, opt,function(err,topics){
if(err) return next(err);
proxy.trigger('topics',topics);
});
opt = {limit:5, sort:[['visit_count','desc']]};
topic_ctrl.get_topics_by_query({},opt,function(err,hot_topics){
if(err) return next(err);
proxy.trigger('hot_topics',hot_topics);
});
opt = {limit:5};
user_ctrl.get_users_by_query({is_star:true},opt,function(err,users){
if(err) return next(err);
proxy.trigger('stars',users);
});
opt = {limit:10, sort:[['score','desc']]};
user_ctrl.get_users_by_query({},opt,function(err,tops){
if(err) return next(err);
proxy.trigger('tops',tops);
});
opt = {limit:5, sort:[['create_at','desc']]};
topic_ctrl.get_topics_by_query({reply_count:0},opt,function(err,no_reply_topics){
if(err) return next(err);
proxy.trigger('no_reply_topics',no_reply_topics);
});
topic_ctrl.get_count_by_query(query,function(err,all_topics_count){
if(err) return next(err);
var pages = Math.ceil(all_topics_count/limit);
proxy.trigger('pages',pages);
});
};