dcms
Version:
CMS library for Node.js
64 lines (50 loc) • 1.54 kB
JavaScript
module.exports = function(options, callback) {
if(options.query) {
options.offset = parseInt(options.query.offset) || 0;
options.source = parseInt(options.query.source) || 0;
options.target = parseInt(options.query.target) || 0;
}
var model = options.model,
find = options.find || {},
offset = Math.max(options.offset, 0),
source = offset + Math.max(options.source, 0),
target = offset + Math.max(options.target, 0),
sort = options.sort || {},
order = options.order || 1,
priority = options.field || 'priority';
sort[priority] = order;
model.find(find)
.sort(sort)
.skip(source)
.limit(1)
.exec(function(err, entity) {
if(err) return next(err);
if(!entity.length)
return callback(new Error('Source not found'));
entity = entity[0];
model.find(find)
.sort(sort)
.skip(target ? target-1 : target)
.limit(2)
.exec(function(err, between) {
if(err) return next(err);
if(!between.length)
return callback(new Error('Target not found'));
if(between.length > 1 && target > 0) {
entity[priority] = (between[0][priority] + between[1][priority]) * 0.5;
var floor = Math.floor(entity[priority]);
if(between[0][priority] !== floor && between[1][priority] !== floor)
entity[priority] = floor;
} else {
entity[priority] = between[0][priority];
if(target)
entity[priority] += (1000 * order);
else
entity[priority] -= (1000 * order);
}
entity.save(function(err) {
callback(err, entity, between);
});
});
});
};