jsreport-express
Version:
jsreport extension adding API
86 lines (75 loc) • 3.17 kB
JavaScript
const ODataServer = require('simple-odata-server')
const Promise = require('bluebird')
const omit = require('lodash.omit')
module.exports = (reporter) => {
const odataServer = ODataServer()
const hiddenProps = {}
Object.keys(reporter.documentStore.model.entitySets).forEach((es) => {
const entitySet = reporter.documentStore.model.entitySets[es]
const entityTypeName = entitySet.entityType.replace(`${reporter.documentStore.model.namespace}.`, '')
const entityType = reporter.documentStore.model.entityTypes[entityTypeName]
hiddenProps[es] = Object.keys(entityType).filter((p) => entityType[p].visible === false)
})
odataServer
.model(reporter.documentStore.model)
.beforeQuery((col, query, req, cb) => {
reporter.logger.debug('OData query on ' + col)
cb()
}).beforeUpdate((col, query, update, req, cb) => {
reporter.logger.debug('OData update on ' + col)
cb()
}).beforeRemove((col, query, req, cb) => {
reporter.logger.debug('OData remove from ' + col)
cb()
}).beforeInsert((col, doc, req, cb) => {
reporter.logger.debug('OData insert into ' + col)
cb()
}).update((col, query, update, req, cb) => {
return Promise.resolve(reporter.documentStore.collection(col).update(query, update, req)).asCallback(cb)
})
.insert((col, doc, req, cb) => {
return Promise.resolve(reporter.documentStore.collection(col).insert(doc, req)).asCallback(cb)
})
.remove((col, query, req, cb) => {
return Promise.resolve(reporter.documentStore.collection(col).remove(query, req)).asCallback(cb)
})
.query((col, query, req, cb) => {
const localReq = reporter.Request(req)
// we put here this value in context as a hint that this call should execute under strict user permissions check
localReq.context.userFindCall = true
let cursor = reporter.documentStore.collection(col).find(query.$filter, query.$select || {}, localReq)
if (query.$sort) {
cursor = cursor.sort(query.$sort)
}
if (query.$skip) {
cursor = cursor.skip(query.$skip)
}
if (query.$limit) {
cursor = cursor.limit(query.$limit)
}
if (query.$count) {
return Promise.resolve(cursor.count()).asCallback(cb)
}
if (!query.$inlinecount) {
return Promise.resolve(cursor.toArray())
.then((items) => items.map((i) => omit(i, hiddenProps[col])))
.asCallback(cb)
}
Promise.resolve(cursor.toArray().then((res) => {
return reporter.documentStore.collection(col).find(query.$filter, localReq).count().then((c) => {
return {
value: res.map((i) => omit(i, hiddenProps[col])),
count: c
}
})
})).asCallback(cb)
}).error((req, res, err, def) => {
if (err.code === 'UNAUTHORIZED') {
res.error(err)
} else {
reporter.logger.error('Error when processing OData ' + req.method + ': ' + req.originalUrl + ' ' + err.stack)
def(err)
}
})
return odataServer
}