message.js 10.4 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 userApi = require('./user-api');
const setPager = require(`${global.utils}/pager`).setPager;

const co = Promise.coroutine;

const getMessageTabList = (uid) => {
    return api.get('', {
        method: 'app.inbox.getAllInboxCatInfo',
        uid: uid
    }, {code: 200});
};

const getMessageAsync = (uid, page, size, type) => {
    let params = {
        method: 'app.inbox.getlistnew',
        uid: uid,
        page: page || 1,
        size: size || 10
    };

    if (type) {
        params.displayTab = type;
    }

    return api.get('', params, {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 unreadTotal
 * @param { Number } uid 用户uid
 * @return { Number } 未读消息数量
 */
const unreadTotal = (uid) => {
    return api.get('', {
        method: 'app.inbox.getTotal',
        uid: uid,
        is_read: 'N'
    });
};

/**
 * 获取消息列表
 * @function getMessageList
 * @param { Number } uid 用户uid
 * @param { Object } params url参数
 * @param { Number } limit 每页数目
 * @return { Object } 消息列表数据
 */
const getMessageList = (uid, params, limit) => {
    let resData = {};
    let page = parseInt(`0${params.page}`, 10) || 1,
        type = parseInt(`0${params.type}`, 10);

    return Promise.all([
        userApi.getUserInfo(uid),
        getMessageTabList(uid),
        getMessageAsync(uid, page, limit, type)
    ]).then(result => {
        const msgBaseUrl = '/home/message';

        resData.userThumb = _.get(result, '[0].data.head_ico', '');

        let tabList = [{
            name: '全部',
            focus: !type,
            href: msgBaseUrl
        }];

        let focusTabName = '';

        _.forEach(_.get(result, '[1]data.list', []), value => {
            let tab = {
                name: `${value.inboxCatName}`,
                focus: type === value.id * 1,
                href: `${msgBaseUrl}?type=${value.id}`
            };

            if (value.unReadCount * 1) {
                tab.name += ` (${value.unReadCount})`;
            }

            if (tab.focus) {
                focusTabName = value.inboxCatName;
            }

            tabList.push(tab);
        });

        resData.tabList = tabList;

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

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

                let href = `/home/message/detail?id=${value.id}&page=${page}`;

                href += type ? `&type=${type}` : '';
                switch (value.type) {
                    case 'pullCoupon':
                    case 'button':
                    case 'pushCoupon':
                        break;
                    default:
                        if (value.pcLink) {
                            href = value.pcLink.replace('http:', '');
                        }
                        break;
                }

                msg.push({
                    id: value.id || 0,
                    href: href,
                    title: value.title || '',
                    content: _.get(value, 'body.content', ''),
                    sender: value.from || '',
                    time: value.create_date,
                    isNew: value.is_read === 'Y' ? false : true
                });
            });

            resData.messages = msg;

            let pagerList = setPager(_.get(data, 'page_total', 1),
                Object.assign(params, {page: page}));

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

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

        return resData;
    });
};

/**
 * 获取消息内容
 * @function getMessageDetail
 * @param { Number } uid 用户uid
 * @param { Object } params url参数
 * @param { Number } limit 每页数目
 * @return { Object } 消息列表数据
 */
const getMessageDetail = (uid, params, limit) => {
    let mid = parseInt(`0${params.id}`, 10);
    let page = parseInt(`0${params.page}`, 10) || 1;
    let type = parseInt(`0${params.type}`, 10);

    let process = function*() {
        let result = yield Promise.all([
            userApi.getUserInfo(uid),
            getMessageAsync(uid, page, limit, type)
        ]);
        let resData = {
            backUrl: `/home/message?page=${page}`,
            userThumb: _.get(result, '[0].data.head_ico', '')
        };
        let msg = _.find(_.get(result, '[1]data.list', []), {id: mid});

        if (type) {
            resData.backUrl += `&type=${type}`;
        }

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

            switch (msg.type) {
                case 'pullCoupon': // eslint-disable-line
                    resData.message.birthCoupon = {
                        text: `${_.get(result, '[0].data.nickname', '')} 有货祝您生日快乐!感谢您对有货的支持,特赠您VIP生日专属礼,即刻享受生日福利吧!`
                    };

                    if (_.get(msg, 'body.is_collar', '') === 'Y') {
                        Object.assign(resData.message.birthCoupon, {
                            over: true,
                            overText: '已领取'
                        });
                        break;
                    }

                    if (_.get(msg, 'body.is_over_time', '') === 'Y') {
                        Object.assign(resData.message.birthCoupon, {
                            over: true,
                            overText: '生日券已过期'
                        });
                        break;
                    }

                    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,
    unreadTotal,
    pickBirthCoupon
};