'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 siteMapService = require('../models/site-map-service'); 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 (_.indexOf(siteList, subdomain) === -1) { 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); }; const _createSitemap = (req, res, rdata, startUrl, endUrl) => { sm.createSitemap({ hostname: 'https://www.yohobuy.com', xmlNs: ' ', urls: _.map(rdata, id => { return { url: `${startUrl}${id}${endUrl}`, changefreq: 'daily', priority: 0.3 }; }) }).toXML(function(err, xml) { rdata = []; if (err) { return res.status(500).end(); } res.header('Content-Type', 'application/xml'); res.send(xml); }); }; const guangMap = (req, res, next) => { req.ctx(siteMapService).guangList().then(rdata => { return _createSitemap(req, res, rdata, 'https://www.yohobuy.com/guang/', '.html'); }).catch(next); }; const newsMap = (req, res, next) => { req.ctx(siteMapService).newsList(1, []).then(rdata => { return _createSitemap(req, res, rdata, 'https://www.yohobuy.com/guang/news/', '.html'); }).catch(next); }; module.exports = { siteMap, guangMap, newsMap };