sitemap.js 4.33 KB
'use strict';

const helpers = global.yoho.helpers;
const Promise = require('bluebird');
const _ = require('lodash');
const sm = require('sitemap');
const staticUrls = require('../../../config/staticUrls');
const api = global.yoho.API;
const Service = global.yoho.ServiceAPI;
const headerModel = require('../../../doraemon/models/header');
const redis = global.yoho.redis;


const getStaticUrls = (currentStatics) => {
    let urls = [];

    _.forEach(_.get(currentStatics, 'loc', []), url => {
        urls.push({
            url: url,
            changefreq: currentStatics.changefreq,
            priority: currentStatics.priority
        });
    });


    _.forEach(currentStatics, (value) => {
        _.forEach(value.loc, url => {
            urls.push({
                url: url,
                changefreq: value.changefreq,
                priority: value.priority
            });
        });
    });

    return Promise.resolve(urls);
};

// 关键词页面
const keywordsPage = () => {
    return redis.getAsync('golobal:yoho:seo:keywords:allIds').then(function(res) {
        let page = [];

        _.forEach(JSON.parse(res), val => {
            page.push({
                url: `https://www.yohobuy.com/chanpin/${val}.html`,
                changefreq: 'daily',
                priority: 0.5
            });
        });

        return page;
    }).catch(()=>{
        return {};
    });
};

// www 地图数据
const wwwXmlData = () => {// eslint-disable-line
    return Promise.all([keywordsPage(), getStaticUrls(_.get(staticUrls, 'www'))]).then(result => {
        return _.concat(result[1], result[0]);
    });
};

// list 地图数据
const listXmlData = () => {// eslint-disable-line
    return Promise.all([getStaticUrls(_.get(staticUrls, 'list')), headerModel.requestHeaderData()]).then(result => {

        // 获取导航中的列表链接
        let listNav = [],
            listPatten = /list\.yohobuy\.com/;

        _.forEach(_.get(result[1], 'headerData.subNavGroup'), val => {
            _.forEach(val.subNav, sub => {
                if (listPatten.test(sub.link)) {
                    listNav.push({url: sub.link, changefreq: 'daily', priority: 0.3});
                }
                _.forEach(_.get(sub, 'thirdNav'), third => {
                    if (listPatten.test(third.link)) {
                        listNav.push({url: third.link, changefreq: 'daily', priority: 0.3});
                    }
                });
            });
        });

        return _.union(result[0], _.uniqBy(listNav, 'url'));
    });
};

// item 地图数据
const itemXmlData = () => {// eslint-disable-line
    let urls = [];

    return api.get('', {method: 'web.product.bdPromotion'}, {cache: 86400}).then(res => {
        _.forEach(_.get(res, 'data', ''), val => {
            urls.push({
                url: `https:${helpers.getUrlBySkc(val.erpProductId)}`,
                changefreq: 'daily',
                priority: 0.3
            });
        });

        return urls;
    });
};

const getArticleUrls = () => {
    let urls = [];

    return Service.get('/guang/api/v2/article/getLastArticleList', {limit: 1000}, {cache: 86400}).then(res => {

        _.forEach(_.get(res, 'data.artList', ''), val => {
            urls.push({
                url: `https:${helpers.urlFormat(`/${val.articleId}.html`, '', 'guang')}`,
                changefreq: 'daily',
                priority: 0.3
            });
        });

        return urls;
    });
};

// guang 地图数据
const guangXmlData = () => {// eslint-disable-line
    return Promise.all([getStaticUrls(_.get(staticUrls, 'guang')), getArticleUrls()]).then(res => {
        return _.union(res[0], res[1]);
    });
};

//  站点地图
const siteMap = (req, res, next) => {

    let siteList = ['www', 'list', 'item', 'guang'],
        subdomain = req.subdomains[0] || 'www';

    if (_.find(siteList, subdomain)) {
        res.end('end');
        return;
    }

    eval(subdomain + 'XmlData')().then(urls => {// eslint-disable-line
        sm.createSitemap({
            hostname: `https://${subdomain}.yohobuy.com`,
            xmlNs: ' ',
            urls: urls
        }).toXML(function(err, xml) {
            if (err) {
                return res.status(500).end();
            }
            res.header('Content-Type', 'application/xml');
            res.send(xml);
        });
    }).catch(next);
};

module.exports = {
    siteMap
};