UNPKG

dcms

Version:

CMS library for Node.js

64 lines (50 loc) 1.54 kB
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); }); }); }); };