article.js 7.75 KB
/**
 * 文章controller
 * @author: leo <qi.li@yoho.cn>
 * @date: 23/06/2017
 */
const _ = require('lodash');
const camelcase = require('camelcase');
const ArticleModel = require('../models/article');

const POST_SUCCESS = '操作成功';
const GET_SUCCESS = '获取成功';
const INVALID_PARAMS = '参数错误';

const article = {
    /**
     * 文章列表
     * @param req
     * @param res
     * @param next
     */
    list(req, res, next) {
        const query = req.query;
        const actId = query.actId;
        const pageNo = query.pageNo || 1;
        const pageSize = query.pageSize || 10;
        const orderBy = query.orderBy || 'createTime';
        const order = ((query.order || 'desc') + '').toLowerCase();
        const orderByFields = ['createTime', 'goodCount'];

        if (!actId) {
            return res.json({
                code: 400,
                message: INVALID_PARAMS
            });
        }

        if (order !== 'asc' && order !== 'desc') {
            return res.json({
                code: 400,
                message: INVALID_PARAMS
            });
        }

        if (orderByFields.indexOf(orderBy) === -1) {
            return res.json({
                code: 400,
                message: INVALID_PARAMS
            });
        }

        req.ctx(ArticleModel).articleList({
            actId,
            order,
            orderBy,
            pageNo,
            pageSize
        })
        .then(result => {
            let list = [];

            _.each(result, item => {
                let data = {};

                _.each(item, (val, key) => {
                    data[camelcase(key)] = val;
                });
                list.push(data);
            });
            return list;
        })
        .then(list => {
            return req.ctx(ArticleModel).allArticlesNum(actId)
                .then(totalCount => {
                    res.json({
                        code: 200,
                        data: list,
                        pageNo: +pageNo,
                        pageSize: +pageSize,
                        totalCount,
                        totalPage: Math.ceil(totalCount / pageSize),
                        message: GET_SUCCESS
                    });
                });
        })
        .catch(next);

    },

    /**
     * 文章列表无图
     * @param req
     * @param res
     * @param next
     */
    listNoImg(req, res, next) {
        const query = req.query;
        const actId = query.actId;
        const pageNo = query.pageNo || 1;
        const pageSize = query.pageSize || 10;
        const orderBy = query.orderBy || 'createTime';
        const order = ((query.order || 'desc') + '').toLowerCase();
        const orderByFields = ['createTime', 'goodCount', 'id'];

        console.log('query', query);
        if (!actId) {
            return res.json({
                code: 400,
                message: INVALID_PARAMS
            });
        }

        if (order !== 'asc' && order !== 'desc') {
            return res.json({
                code: 400,
                message: INVALID_PARAMS
            });
        }

        if (orderByFields.indexOf(orderBy) === -1) {
            return res.json({
                code: 400,
                message: INVALID_PARAMS
            });
        }

        req.ctx(ArticleModel).articleListWithOutImg({
            actId,
            order,
            orderBy,
            pageNo,
            pageSize
        })
            .then(result => {
                console.log('result', result);
                let list = [];

                _.each(result, item => {
                    let data = {};

                    _.each(item, (val, key) => {
                        data[camelcase(key)] = val;
                    });
                    list.push(data);
                });
                return list;
            })
            .then(list => {
                req.ctx(ArticleModel).allArticlesNum(actId)
                    .then(totalCount => {
                        res.json({
                            code: 200,
                            data: list,
                            pageNo,
                            pageSize,
                            totalCount,
                            totalPage: Math.ceil(totalCount / pageSize),
                            message: GET_SUCCESS
                        });
                    });
            })
            .catch(next);

    },

    /**
     * 发布文章
     * @param req
     * @param res
     * @param next
     */
    publish(req, res, next) {
        let newId;
        let errorMsg = '';
        const actId = req.body.actId;
        const imgUrl = req.body.imgUrl;
        const content = req.body.content;

        if (!imgUrl || !content || !actId) {
            errorMsg = INVALID_PARAMS;
        }

        if (errorMsg) {
            return res.json({
                code: 400,
                message: errorMsg
            });
        }

        const params = {
            actId,
            imgUrl,
            content
        };

        req.ctx(ArticleModel).createArticle(params)
            .then(id => {
                newId = id;
                return id;
            })
            .then(id => {
                return req.ctx(ArticleModel)
                          .insertArticleImg(id, imgUrl);
            })
            .then(() => {
                res.json({
                    code: 200,
                    data: {
                        id: newId
                    },
                    message: POST_SUCCESS
                });
            })
            .catch(next);
    },

    /**
     * 查询单个article详情
     * @param req
     * @param res
     * @param next
     */
    querySingle(req, res, next) {
        let errorMsg = '';
        const actId = req.query.actId;
        const articleId = req.query.articleId;

        if (!actId || !articleId) {
            errorMsg = INVALID_PARAMS;
        }

        if (errorMsg) {
            return res.json({
                code: 400,
                message: errorMsg
            });
        }

        req.ctx(ArticleModel).getSingleArticle(actId, articleId)
            .then(ret => {
                let img_arr = _.map(ret, 'img_url');

                let result = {};
                let final_result = {};

                if (ret.length > 0) {
                    result.id = ret[0].id;
                    result.content = ret[0].content;
                    result.good_count = ret[0].good_count;
                    result.user_id = ret[0].user_id;
                    result.user_name = ret[0].user_name;
                    result.create_time = ret[0].create_time;
                    result.img_url = img_arr;
                }
                _.each(result, (value, key) => {
                    final_result[camelcase(key)] = value;
                });
                res.json({
                    code: 200,
                    data: final_result,
                    message: GET_SUCCESS
                });
            })
            .catch(next);
    },

    /**
     * 文章点赞
     * @param req
     * @param res
     * @param next
     */
    like(req, res, next) {
        const actId = req.body.actId;
        const articleId = req.body.articleId;

        if (!actId || !articleId) {
            return res.json({
                code: 400,
                message: INVALID_PARAMS
            });
        }

        req.ctx(ArticleModel).likeArticle(actId, articleId)
            .then(() => {
                return req.ctx(ArticleModel)
                          .insertLikeDetail(actId, articleId);
            })
            .then(() => {
                res.json({
                    code: 200,
                    message: POST_SUCCESS
                });
            })
            .catch(next);
    }
};


module.exports = article;