paradigm-core
Version:
Paradigm Core Modules
376 lines (289 loc) • 8.45 kB
JavaScript
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