pinclub/pinclub

View on GitHub
proxy/board.js

Summary

Maintainability
C
1 day
Test Coverage
var EventProxy = require('eventproxy');
var models = require('../models');
var Board = models.Board;
var User = require('./user');
var Topic = require('./topic');
var tools = require('../common/tools');
var at = require('../common/at');
var _ = require('lodash');


/**
 * 根据画板ID获取画板
 * Callback:
 * - err, 数据库错误
 * - board, 画板
 * - creator, 创建者
 * - lastAction, 最后动作
 * @param {String} id Board ID
 * @param {Function} callback 回调函数
 */
exports.getBoardById = function (id, callback) {
    var proxy = new EventProxy();
    var events = ['board', 'creator', 'topics'];
    proxy.assign(events, function (board, creator, topics) {
        if (!creator) {
            return callback(null, null, null, null);
        }
        return callback(null, board, creator, topics);
    }).fail(callback);

    Board.findOne({_id: id}, proxy.done(function (board) {
        if (!board) {
            proxy.emit('board', null);
            proxy.emit('creator', null);
            proxy.emit('topics', null);
            return;
        }
        proxy.emit('board', board);

        User.getUserById(board.user_id, proxy.done('creator'));

        if (board.topic_count) {
            var options = { limit: 5};
            var query = { board: id };
            Topic.getTopicsByQuery(query, options, proxy.done(function (topics) {
                proxy.emit('topics', topics);
            }));
        } else {
            proxy.emit('topics', null);
        }
    }));
};

/**
 * 获取关键词能搜索到的主题数量
 * Callback:
 * - err, 数据库错误
 * - count, 主题数量
 * @param {String} query 搜索关键词
 * @param {Function} callback 回调函数
 */
exports.getCountByQuery = function (query, callback) {
    Board.count(query, callback);
};

/**
 * 根据关键词,获取画板 (Board) 列表
 * Callback:
 * - err, 数据库错误
 * - count, Board 列表
 * @param {String} query 搜索关键词
 * @param {Object} opt 搜索选项
 * @param {Function} callback 回调函数
 */
exports.getBoardsByQuery = function (query, opt, callback) {
    Board.find(query, {}, opt, function (err, boards) {
        if (err) {
            return callback(err);
        }
        if (boards.length === 0) {
            return callback(null, []);
        }

        var proxy = new EventProxy();
        proxy.after('board_ready', boards.length, function () {
            boards = _.compact(boards); // 删除不合规的 topic
            return callback(null, boards);
        });
        proxy.fail(callback);

        boards.forEach(function (board, i) {
            var ep = new EventProxy();
            ep.all('creator', function (creator) {
                // 保证顺序
                // 作者可能已被删除
                if (creator) {
                    board.creator = creator;
                } else {
                    boards[i] = null;
                }
                proxy.emit('board_ready');
            });

            User.getUserById(board.user_id, ep.done('creator'));
        });
    });
};

/**
 * 获取所有信息的主题
 * Callback:
 * - err, 数据库异常
 * - message, 消息
 * - topic, 主题
 * - author, 主题作者
 * - replies, 主题的回复
 * @param {String} id 主题ID
 * @param {Function} callback 回调函数
 */
exports.getFullBoard = function (id, callback) {
    var proxy = new EventProxy();
    var events = ['board', 'creator', 'topics'];
    proxy
        .assign(events, function (board, creator, topics) {
            return callback(null, '', board, creator, topics);
        })
        .fail(callback);

    Board.findOne({_id: id}, proxy.done(function (board) {
        if (!board) {
            proxy.unbind();
            return callback(null, '此画板不存在或已被删除。');
        }
        proxy.emit('board', board);

        User.getUserById(board.user_id, proxy.done(function (creator) {
            if (!creator) {
                proxy.unbind();
                return callback(null, '画板的作者丢了。');
            }
            proxy.emit('creator', creator);
        }));

        Topic.getTopicsByBoardId(board._id, proxy.done('topics'));
    }));
};


/**
 * 根据Board ID,查找
 * @param {String} id Board ID
 * @param {Function} callback 回调函数
 */
exports.getBoard = function (id, callback) {
    Board.findOne({_id: id}, callback);
};

/**
 * 将当前 Board 的主题计数减1\
 * @param {String} id Board ID
 * @param {Function} callback 回调函数
 */
exports.reduceTopicCount = function (id, callback) {
    Board.findOne({_id: id}, function (err, board) {
        if (err) {
            return callback(err);
        }

        if (!board) {
            return callback(new Error('该Board不存在'));
        }
        board.topic_count -= 1;
        board.save(callback);
    });
};

exports.newAndSave = function (title, type, creatorId, callback) {
    var board = new Board();
    board.title = title;
    board.type = type;
    board.user_id = creatorId;
    board.save(callback);
};

exports.remove = function (id, callback) {
    Board.findOne({_id: id})
        .populate('user_id')
        .exec(function (err, board) {
            if (err) {
                return callback(err);
            }

            if (!board) {
                return callback(new Error('该Board不存在'));
            }
            let user = board.user_id;
            Board.remove({_id: id}, function (err, result) {
                if(err){
                    return callback(err);
                }else {
                    user.board_count -= 1;
                    user.save(callback);
                }
            });

        });
};