message.js 7.09 KB
/**
 * 我的消息model
 * @author: yyq<yanqing.yang@yoho.cn>
 * @date: 2016/8/29
 */
'use strict';

const api = global.yoho.API;

const _ = require('lodash');
const Promise = require('bluebird');

const setPager = require(`${global.utils}/pager`).setPager;

const co = Promise.coroutine;

const getMessageAsync = (uid, page, size) => {
    return api.get('', {
        method: 'app.inbox.getlist',
        uid: uid,
        page: page || 1,
        size: size || 10
    }, {code: 200});
};

const delMessageAsync = (uid, id) => {
    return api.get('', {
        method: 'app.inbox.delmessage',
        uid: uid,
        id: id
    });
};

const readMessageAsync = (uid, id) => {
    return api.get('', {
        method: 'web.inbox.setread',
        uid: uid,
        ids: id
    });
};

const getBirthCouponAsync = (uid, couponId) => {
    return api.get('', {
        method: 'app.promotion.getCoupon',
        uid: uid,
        couponId: couponId
    });
};

/**
 * 根据用户uid获取生日券id
 * @function getCouponAsync
 * @param { Number } uid 用户uid
 * @return { Object } 生日券数据
 */
const getCouponAsync = (uid) => {
    return api.get('', {
        method: 'app.promotion.queryBirthCoupon',
        uid: uid,
        couponType: 4
    }, {code: 200});

};

/**
 * 获取消息列表
 * @function getMessageList
 * @param { Number } uid 用户uid
 * @param { Number } page 页码
 * @param { Number } limit 每页数目
 * @return { Object } 消息列表数据
 */
const getMessageList = (uid, page, limit) => {
    let process = function*() {
        let resData = {};
        let result = yield getMessageAsync(uid, page, limit);

        if (result.data) {
            let msg = [];

            _.forEach(_.get(result, 'data.list', []), value => {
                // 信息过滤
                if (value.type === '$inboxval' || value.type === 'notice') {
                    return;
                }

                msg.push({
                    id: value.id || 0,
                    href: `/home/message/detail?id=${value.id}&page=${page}`,
                    title: value.title || '',
                    sender: value.from || '',
                    time: value.create_date,
                    isNew: value.is_read === 'Y' ? false : true
                });
            });

            resData.messages = msg;

            resData.pager = Object.assign({
                count: _.get(result, 'data.total', 0),
                curPage: page,
                totalPages: _.get(result, 'data.page_total', 0)
            }, setPager(_.get(result, 'data.page_total', 0), {
                page: page
            }));
        }

        if (_.isEmpty(resData.messages)) {
            resData.messages = {empty: '您尚未收到任何短消息'};
        }

        return resData;
    };

    return co(process)();
};

/**
 * 获取消息内容
 * @function getMessageDetail
 * @param { Number } uid 用户uid
 * @param { Number } page 页码
 * @param { Number } limit 每页数目
 * @return { Object } 消息列表数据
 */
const getMessageDetail = (uid, mid, page, limit) => {
    let process = function*() {
        let resData = {
            backUrl: `/home/message?page=${page}`
        };
        let result = yield getMessageAsync(uid, page, limit);
        let msg = _.find(_.get(result, 'data.list', []), {id: mid});

        if (!_.isEmpty(msg)) {
            resData.message = {
                sender: msg.from, // 消息发言人
                title: msg.title, // 消息标题
                time: msg.create_date // 消息创建时间
            };

            switch (msg.type) {
                case 'pullCoupon': // eslint-disable-line
                    let couponInfo = yield getCouponAsync(uid);
                    let coupons = [];

                    if (!_.isEmpty(couponInfo.data)) {
                        _.forEach(couponInfo.data, value => {
                            coupons.push({
                                id: value.id,
                                remark: value.couponName || '',
                                useTime: _.get(value, 'body.use_time', ''),
                                pickTime: _.get(value, 'body.collar_time', ''),
                                canPick: true
                            });
                        });
                    } else {
                        // 已过期生日券信息
                        coupons.push({
                            remark: _.get(msg, 'body.name', ''),
                            useTime: _.get(msg, 'body.use_time', ''),
                            pickTime: _.get(msg, 'body.collar_time', '')
                        });
                    }
                    resData.message.coupons = coupons;
                    break;
                case 'button':
                    // 促销活动
                    resData.message.sale = {
                        image: _.get(msg, 'body.image', ''),
                        content: _.get(msg, 'body.text', ''),
                        btnLink: _.get(msg, 'body.pc_link', ''),
                        btnName: _.get(msg, 'body.button_text', '')
                    };
                    break;
                case 'pushCoupon':
                    // 查看优惠券
                    resData.message.coupons = [{
                        remark: _.get(msg, 'body.coupon_name', ''),
                        useTime: _.get(msg, 'body.time', ''),
                        id: _.get(msg, 'body.inboxId', ''),
                        price: _.get(msg, 'body.price', ''),
                        url: '/home/coupons'
                    }];
                    break;
                default:
                    // 普通文本
                    resData.message.text = {
                        content: _.get(msg, 'body.content', '')
                    };
                    break;
            }
        }

        return resData;
    };

    return co(process)();
};

/**
 * 删除用户消息
 * @function getMessageDetail
 * @param { Number } uid 用户uid
 * @param { Number } mid 消息id
 * @return { Object } 消息列表数据
 */
const delMessage = (uid, mid) => {
    let process = function*() {
        let resData = {code: 400, message: '删除失败'};
        let result = yield delMessageAsync(uid, mid);

        if (result.code === 200) {
            Object.assign(resData, {
                code: 200,
                message: '删除成功'
            });
        }

        return resData;
    };

    return co(process)();
};



/**
 * 删除用户消息
 * @function getMessageDetail
 * @param { Number } uid 用户uid
 * @param { Number } mid 消息id
 * @return { Object } 消息列表数据
 */
const readMessage = (uid, mid) => {
    let process = function*() {
        let resData = {code: 400, message: '标记失败'};
        let result = yield readMessageAsync(uid, mid);

        if (result.code === 200) {
            resData = result;
        }

        return resData;
    };

    return co(process)();
};

const pickBirthCoupon = (uid, id) => {
    return getBirthCouponAsync(uid, id);
};

module.exports = {
    getMessageList,
    getMessageDetail,
    delMessage,
    readMessage,
    pickBirthCoupon
};