sitemap.js 4.32 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 = (page) => {
    return redis.getAsync(`global:yoho:seo:keywords:allIds:page:${page}`).then(function(res) {
        let pages = [];

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

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

// 逛详情
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(`/guang/${val.articleId}.html`, null)}`,
                changefreq: 'daily',
                priority: 0.3
            });
        });

        return urls;
    });
};

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

// 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 siteMap = (req, res, next) => {

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

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

    let page = req.params[0] || 1;

    eval(subdomain + 'XmlData')(page).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
};