star.js 6.54 KB
/**
 * 新潮教室
 * @author: wsl<shuiling.wang@yoho.cn>
 * @date: 2016/05/30
 */
'use strict';
const library = '../../../library';
const utils = '../../../utils';
const resourcesProcess = require(`${utils}/resources-process`);
const ServiceAPI = require(`${library}/api`).ServiceAPI;
const API = require(`${library}/api`).API;
const sign = require(`${library}/sign`);
const logger = require(`${library}/logger`);
const camelCase = require(`${library}/camel-case`);
const helpers = require(`${library}/helpers`);
const _ = require('lodash');
const serviceAPI = new ServiceAPI();
const api = new API();

const contentCode = {
    special: '89cc20483ee2cbc8a716dcfe2b6c7603'
};

class Star {
    /**
     * 获取资源位数据
     * @param  {[string]} page
     * @return {[array]}
     */
    static getResources(page) {
        return serviceAPI.get('operations/api/v5/resource/get', sign.apiSign({
            content_code: contentCode[page]
        })).then((result) => {
            if (result && result.code === 200) {
                return resourcesProcess(result.data);
            } else {
                logger.error('星潮教室页面资源位返回 code 不是 200');
                return [];
            }
        });
    }

    /**
     * 星潮教室首页数据处理
     * @param  {[array]} list
     * @return {[array]}
     */
    static processIndexData(list) {
        const formatData = {
            ads: [],
            starAvatar: [],
            articles: []
        };

        list = list || {};
        list = camelCase(list);

        // 首页资源位数据处理
        _.forEach(list.ads.data, (data) => {
            formatData.ads.push({
                src: data.src,
                url: data.url
            });
        });

        // 首页明星文章数据处理
        _.forEach(list.list, (data) => {
            const avatar = {
                tags: []
            };

            if (data.ext.tags.length > 1) {
                avatar.isSwiper = true;
            }

            _.forEach(data.ext.tags, (tags) => {
                avatar.tags.push({
                    avatarUrl: `/guang/star/detail?tag=${tags.tagName}`,
                    cover: tags.cover,
                    tagName: tags.tagName
                });
            });

            formatData.articles.push(_.merge({
                id: data.id,
                url: data.url,
                title: data.title,
                articeTxt: data.intro,
                src: data.src,
                publishTime: helpers.dateFormat('MM月DD日 hh:mm', data.publishTime),
                viewsNum: data.viewsNum
            }, avatar));
        });

        // 首页明星头像数据处理
        _.forEach(list.tags, (data) => {
            let url = `/guang/star/detail?tag=${data.tagName}`;

            formatData.starAvatar.push({
                url: url,
                cover: data.cover
            });
        });

        return formatData;
    }

    static processShareUrl(post) {
        return `${post.share.url}&openby:yohobuy={"action":"go.share","params":{"pic":"${helpers.image(post.src, 640, 640)}","title":"${post.title}","url":"${post.share.url}","content":"潮流资讯,新鲜贩售,YOHO!Buy有货【逛】不停"}}`; // eslint-disable-line
    }

    /**
     * 明星专题列表数据处理
     * @param  {[array]} list
     * @return {[array]}
     */
    static processDetailData(list) {
        const formatData = [];

        list = list || [];
        list = camelCase(list);

        _.forEach(list, (data) => {
            data.publishTime = helpers.dateFormat('MM月DD日 hh:mm', data.publishTime);
            if (data.share && data.share.url) {
                data.share.url = Star.processShareUrl(data);
            }
            formatData.push(data);
        });

        return formatData;
    }


    /**
     * 星搭配文章列表数据处理
     */
    static processCollocationData(list) {
        const formatData = [];

        list = list || [];
        list = camelCase(list);

        _.forEach(list, (data) => {
            if (data.isFavor === 'N') {
                data.isCollected = false;
            } else {
                data.isCollected = true;
            }
            formatData.push(data);
        });

        return formatData;
    }

    /**
     * 星潮首页
     */
    static getIndexData() {
        return api.get('', sign.apiSign({
            method: 'app.starClass.index',
            code: '8adc27fcf5676f356602889afcfd2a8e'
        })).then((result) => {
            if (result && result.code === 200) {
                return Star.processIndexData(result.data);
            } else {
                logger.error('星潮教室首页数据返回 code 不是 200');
                return {};
            }
        });
    }

    /**
     * 明星专题
     */
    static getDetailData(params) {
        return api.get('', sign.apiSign({
            method: 'app.starClass.lastTagArticle',
            tag: params.tag,
            page: params.page || 1,
            size: 10
        })).then((result) => {
            if (result && result.code === 200) {
                if (params.page > result.data.totalPage) {
                    return '';
                } else {
                    return Star.processDetailData(result.data.list);
                }
            } else {
                logger.error('明星专题文章数据返回 code 不是 200');
                return [];
            }
        });
    }


    /**
     * 星专题
     */
    static getSpecialData() {
        return Star.getResources('special');
    }

    /**
     * 星搭配
     */
    static getCollocationListData(params, uid) {

        return serviceAPI.get('guang/api/v5/article/getStarClassroomArticleList', sign.apiSign(Object.assign({
            limit: '20',
            uid: uid
        }, params))).then((result) => {
            if (result && result.code === 200) {
                return Star.processCollocationData(result.data.list.artList);
            } else {
                logger.error('获取星搭配文章列表返回 code 不是 200');
                return [];
            }
        });
    }

    static setFavorite(params, uid) {
        if (!uid) {
            return Promise.resolve({
                code: 401,
                message: '未登录'
            });
        }

        return api.get('', sign.apiSign({
            method: params.type === 'del' ? 'app.sns.cancelFavorBackCount' : 'app.sns.setFavorBackCount',
            client_type: 'h5',
            article_id: params.articleId,
            uid: uid
        }));
    }
}

module.exports = Star;