UNPKG

paradigm-core

Version:
376 lines (289 loc) 8.45 kB
const { r, RootController } = require('structure-core') const {CategoryModel} = require('../../categories') const {ChannelModel} = require('../../channels') const {DocumentModel} = require('../../documents') const {PageModel} = require('../../pages') const SiteMapModel = require('../models/sitemap') /** * SiteMapController Class * * @public * @class SiteMapController */ class Controller extends RootController { /** * SiteMapController constructor * * @public * @constructor * @param {Object} options - Options */ constructor(options = {}) { super(Object.assign({}, { name: 'sitemaps' }, options)) } /** * Create new sitemap * * @public * @param {Object} req - Express req * @param {Object} res - Express res */ create(req, res) { const pkg = req.body const applicationId = req.headers.applicationid const organizationId = req.headers.organizationid const sitemap = new SiteMapModel({ applicationId, logger: this.logger, organizationId }) if(!pkg.applicationId) { pkg.applicationId = req.headers.applicationid } if(!pkg.organizationId) { pkg.organizationId = req.headers.organizationid } return sitemap.create(pkg, { applicationId: req.headers.applicationid, organizationId: req.headers.organizationid }) } deleteById(req, res) { const applicationId = req.headers.applicationid const organizationId = req.headers.organizationid const sitemap = new SiteMapModel({ applicationId, logger: this.logger, organizationId }) return sitemap.deleteById(req.params.id, { applicationId: req.headers.applicationid, organizationId: req.headers.organizationid }) } /** * Get all sitemaps * * @public * @param {Object} req - Express req * @param {Object} res - Express res */ getAll(req, res) { const applicationId = req.headers.applicationid const organizationId = req.headers.organizationid const sitemap = new SiteMapModel({ applicationId, logger: this.logger, organizationId }) return sitemap.getAll([], { applicationId: req.headers.applicationid, organizationId: req.headers.organizationid }) } /** * Get sitemap by id * * @public * @param {Object} req - Express req * @param {Object} res - Express res */ getById(req, res) { const applicationId = req.headers.applicationid const organizationId = req.headers.organizationid const sitemapModel = new SiteMapModel({ applicationId, logger: this.logger, organizationId }) const channelModel = new ChannelModel({ applicationId, logger: this.logger, organizationId }) const pageModel = new PageModel({ applicationId, logger: this.logger, organizationId }) return new Promise( async (resolve, reject) => { try { const sitemap = await sitemapModel.getById(req.params.id) const channelIds = [] const items = [] const pageIds = [] if(sitemap.items && sitemap.items.length > 0) { // Figure out what type of item for(let i = 0, l = sitemap.items.length; i < l; i++) { const item = sitemap.items[i] switch(item.type) { case 'channel': channelIds.push(item.id); break; case 'page': pageIds.push(item.id); break; } } // Get the items const res = await Promise.all([ (channelIds.length > 0) ? channelModel.getAll(channelIds, { applicationId: req.headers.applicationid, organizationId: req.headers.organizationid }) : [], (pageIds.length > 0) ? pageModel.getAll(pageIds, { applicationId: req.headers.applicationid, organizationId: req.headers.organizationid }) : [], ]) const resMap = new Map() const channels = res[0] const pages = res[1] // Map the items to retrieve easily for(let i = 0, l = channels.length; i < l; i++) { const item = channels[i] resMap.set(item.id, item) } for(let i = 0, l = pages.length; i < l; i++) { const item = pages[i] resMap.set(item.id, item) } // Merge the items into their respective order for(let i = 0, l = sitemap.items.length; i < l; i++) { const item = sitemap.items[i] items.push(Object.assign(item, resMap.get(item.id))) } } sitemap.items = items resolve(sitemap) } catch(e) { this.logger.error(e) reject(e) } }) } getById2(req, res) { const applicationId = this.applicationId || req.headers.applicationid const organizationId = this.organizationId || req.headers.organizationid const sitemapModel = new SiteMapModel({ applicationId, logger: this.logger, organizationId }) const categoryModel = new CategoryModel({ applicationId, logger: this.logger, organizationId }) const channelModel = new ChannelModel({ applicationId, logger: this.logger, organizationId }) const documentModel = new DocumentModel({ applicationId, logger: this.logger, organizationId }) const pageModel = new PageModel({ applicationId, logger: this.logger, organizationId }) return new Promise( async (resolve, reject) => { try { const sitemap = {} const urls = [] const res = await Promise.all([ categoryModel.getAll([]), channelModel.getAll([]), r .table('documents') .getAll(applicationId, {index: 'applicationId'}) .filter({ status: 'published' }) .orderBy(r.desc('publishedAt')) .limit(50000) ]) const categories = res[0] const categoriesMap = new Map() const channels = res[1] const documents = res[2] for(let i = 0, l = categories.length; i < l; i++) { const category = categories[i] categoriesMap.set(category.id, category) } for(let i = 0, l = channels.length; i < l; i++) { const channel = channels[i] urls.push({ changefreq: 'daily', priority: 0.7, url: `/${channel.slug}`, description: channel.desc || '', }) } for(let i = 0, l = documents.length; i < l; i++) { const document = documents[i] let permalink = documentModel.generatePermalink2(document) const category = categoriesMap.get(document.categoryIds[0]) /* NOTE: The permalink applies `archive` because the document does not have a joined/expanded `categories` property. */ if(category && category.slug) { permalink = permalink.replace('archive', category.slug) } urls.push({ changefreq: 'monthly', priority: 0.3, url: permalink, description: document.title || '', }) } sitemap.urls = urls resolve(sitemap) } catch(e) { this.logger.error(e) reject(e) } }) } getPublished(req, res) { const applicationId = this.applicationId const organizationId = this.organizationId /*const applicationModel = new ApplicationModel({ applicationId, logger: this.logger, organizationId })*/ return new Promise( async (resolve, reject) => { try { //const application = await applicationModel.getById(applicationId) const sitemap = await this.getById2(req, res) resolve(sitemap) } catch(e) { this.logger.error(e) reject(e) } }) } /** * Update a sitemap * * @public * @param {Object} req - Express req * @param {Object} res - Express res */ updateById(req, res) { const sitemap = new SiteMapModel() const pkg = req.body return sitemap.updateById(req.params.id, pkg) } } module.exports = Controller