shamjs
Version:
Mock data generator.
93 lines (89 loc) • 2.83 kB
JavaScript
var extend = require('extend')
var fuzzyMatch = require('./fuzzy')
var query = function (data, request) {
data = extend(true, [], data)
request = request || {}
if (request.query) {
if (request.query.page) {
request.page = request.query.page
delete request.query.page
}
if (request.query.pageSize) {
request.pageSize = request.query.pageSize
delete request.query.pageSize
}
}
request = extend(true, {
pageSize: 10
}, request)
var filterType = typeof request.filter
if (filterType === 'object' && Array.isArray(request.filter)) {
filterType = 'array'
}
switch(filterType) {
case 'undefined':
break
case 'function':
data = data.filter(request.filter)
break
default:
throw new Error('node_modules/shamjs/lib/query.js: query(data, request) request.filter must be a function')
}
if (request.query) {
var queryKeys = Object.keys(request.query)
if (queryKeys.length !== 0) {
data = data.filter(function (item) {
return queryKeys.some(function (name, index) {
var value = request.query[name]
return fuzzyMatch(item[name], value)
})
})
}
}
switch(typeof request.sort) {
case 'function':
data = data.sort(request.sort)
break
case 'string':
data = data.sort(function (a, b) {
var aValue = a[request.sort]
var bValue = b[request.sort]
var output = bValue - aValue
if (isNaN(output)) {
if ([aValue, bValue].sort().indexOf(aValue) === 0) {
return 1
}
else {
return -1
}
}
return output
})
break
case 'undefined':
break
default:
throw new Error('node_modules/shamjs/lib/query.js: query(data, request) request.sort must be a function or string')
}
var dataCount = data.length
var pageCount = Math.ceil(dataCount/request.pageSize)
var output = {}
if (typeof request.page !== 'undefined') {
var page = request.page
if (page > pageCount) {
page = pageCount
}
// query data
var startIndex = ( page - 1) * request.pageSize
var endIndex = page * request.pageSize
data = data.slice(startIndex, endIndex)
output.page = page
output.dataCount = dataCount
output.pageCount = pageCount
}
output.data = data
return output
}
module.exports = query
module.exports.full = require('./full')
module.exports.fuzzy = require('./fuzzy')