pinclub/pinclub

View on GitHub
controllers/dashboard.js

Summary

Maintainability
D
2 days
Test Coverage
var os = require('os');
var _ = require('lodash');
var async = require('async');
var mongoose = require('mongoose');
var EventProxy = require('eventproxy');
var Forum        = require('../proxy').Forum;
var Board        = require('../proxy').Board;
var User        = require('../proxy').User;
var Node        = require('../proxy').Node;
var Topic = require('../proxy').Topic;
var store = require('../common/store');

// DONE(hhdem) 管理员维护界面 Dashboard, 统计数据的获取
exports.dashboard = function (req, res, next) {
    async.parallel({
        mongodb: function (callback) {
            var mongodbAdmin = new mongoose.mongo.Admin(mongoose.connection.db);

            mongodbAdmin.buildInfo(function (err, info) {
                if (err) {
                    err.type = 'database';
                    return callback(err);
                }
                callback(null, _.pick(info, 'version').version);
            });
        }
    }, function (err, results) {
        let system = {
            cpuarch: os.arch(),
            cpus: os.cpus(),
            freemem: os.freemem(),
            hostname: os.hostname(),
            platform: os.platform(),
            loadavg: os.loadavg(),
            release: os.release(),
            totalmem: os.totalmem(),
            uptime: os.uptime(),
            node_version: process.versions.node,
            mongodb_version: results.mongodb
        };
        var render = function (users, active_users, forums, boards, topics, images, nodes) {
            res.render('dashboard/index', {
                reply_count: 0,
                active_user_count: active_users.length,
                users: users,
                topics: topics,
                images: images,
                boards: boards,
                teams: [],
                forums: forums,
                system: system,
                nodes: nodes
            });
        };
        var ep = EventProxy.create();
        ep.fail(next);
        ep.assign('users', 'active_users', 'forums', 'boards', 'topics', 'images', 'nodes', render);
        User.getUsersByQuery({}, {}, ep.done('users'));
        User.getUsersByQuery({active: true}, {}, ep.done('active_users'));
        Forum.getForumsByQuery({}, {}, ep.done('forums'));
        Node.getNodesByQuery({}, {}, ep.done('nodes'));
        Board.getBoardsByQuery({}, {}, ep.done('boards'));
        Topic.getTopicsByQuery({type: 'text'}, {}, ep.done('topics'));
        Topic.getTopicsByQuery({type: 'image'}, {}, ep.done('images'));
    });
};

// TODO 管理员维护界面 tag 列表
exports.tags = function (req, res, next) {

};

// DONE(hhdem) 管理员维护界面 board 列表
exports.boards = function (req, res, next) {
    var page = parseInt(req.query.page, 10) || 1;
    page = page > 0 ? page : 1;
    var limit = 20;
    var options = { skip: (page - 1) * limit, sort: '-create_at', limit: limit};
    Board.getCountByQuery({}, function (err, all_boards_count) {
        if (err) {
            return next(err);
        }
        var pages = Math.ceil(all_boards_count / limit);
        Board.getBoardsByQuery({}, options, function (err, boards) {
            if (err) {
                return next(err);
            }
            res.render('dashboard/boards', {
                current_page: page,
                pages: pages,
                boards: boards
            });
        });
    });
};

// DONE(hhdem) 管理员维护界面 用户 列表
exports.users = function (req, res, next) {
    var page = parseInt(req.query.page, 10) || 1;
    page = page > 0 ? page : 1;
    var limit = 20;
    var options = { skip: (page - 1) * limit, sort: '-create_at', limit: limit};
    User.getCountByQuery({}, function (err, all_topics_count) {
        if (err) {
            return next(err);
        }
        var pages = Math.ceil(all_topics_count / limit);
        User.getUsersByQuery({}, options, function (err, users) {
            if (err) {
                return next(err);
            }
            res.render('dashboard/users', {
                current_page: page,
                pages: pages,
                users: users
            });
        });
    });

};

// DONE(hhdem) 管理员节点管理界面
exports.nodes = function (req, res, next) {
    var page = parseInt(req.query.page, 10) || 1;
    page = page > 0 ? page : 1;
    var limit = 20;
    var options = { skip: (page - 1) * limit, sort: '-create_at', limit: limit};
    var query = {parent: null};
    if (!!req.query.pid) {
        query.parent = req.query.pid;
    }
    Node.getCountByQuery(query, function (err, all_nodes_count) {
        if (err) {
            return next(err);
        }
        var pages = Math.ceil(all_nodes_count / limit);
        Node.getNodesByQuery(query, options, function (err, nodes) {
            if (err) {
                return next(err);
            }
            let parent = null;
            if (!!query.parent && nodes.length > 0) {
                parent = nodes[0].parent;
            }
            res.render('dashboard/nodes', {
                current_page: page,
                pages: pages,
                nodes: nodes,
                parent: parent
            });
        });
    });
};

// DONE (hhdem) 所有Forum列表
exports.forums = function (req, res, next) {
    var options = { sort: '-order', limit: 10};
    var query = {parent: null};
    if (!!req.query.pid) {
        query.parent = req.query.pid;
    }
    Forum.getForumsByQuery(query, options, function (err, forums) {
        if (err) {
            return next(err);
        }
        let parent = null;
        if (!!query.parent && forums.length > 0) {
            parent = forums[0].parent;
        }
        res.render('dashboard/forums', {
            forums: forums,
            parent: parent
        });
    });
};

exports.forumShow = function (req, res, next) {
    req.checkParams({
        'id': {
            notEmpty: {
                options: [true],
                errorMessage: '板块名称不能为空'
            },
            isMongoId: {errorMessage: 'id 需为 mongoId 对象'}
        }
    });
    req.getValidationResult().then(function(result) {
        if (!result.isEmpty()) {
            return res.status(400).json({
                success: false,
                err_message: '参数验证失败',
                err: result.useFirstErrorOnly().mapped()
            }).end();
        }
        var id = req.params.id;
        Forum.getFullForum(id, function (err, msg, forum, topics) {
            if (!!err) {
                return next (err);
            }
            if (!forum) {
                res.status(404);
                return res.send({success: false, error_msg: '板块不存在'});
            }
            if (!!msg) {
                res.status(404);
                return res.send({success: false, error_msg: msg});
            }
            forum.topics = topics;
            res.send({success: true, data: forum});
        });
    });
};

/**
 * Physically remove the images that 'deleted == true'
 * @param req
 * @param res
 * @param next
 */
exports.deleteAllImages = function (req, res, next) {
    Topic.getTopicsByQuery({type: 'image', deleted: true}, {}, function (err, topics) {
        if (!!err) {
            return next (err);
        }
        // test for qn
        // store.delete('FpUrRAkfWrcB79T2oQgm94LJAGW9', function(err){
        //     if (err) {
        //         logger.error(err);
        //     }
        // });
        _.forEach(topics, function (topic) {
            store.delete(topic.image, function(){});
            // DONE(hhdem) 删除图片时,删除Model对象
            topic.remove();
        });
        res.send({success: true, count: topics.length});
    });
};