make sure that tasks are returned in the correct order

This commit is contained in:
Matteo Pagliazzi
2016-02-02 12:23:56 +01:00
parent 4aa6545c79
commit 337b68ce43

View File

@@ -139,7 +139,29 @@ async function _getTasks (req, res, user, challenge) {
} }
let tasks = await Tasks.Task.find(query).exec(); let tasks = await Tasks.Task.find(query).exec();
res.respond(200, tasks);
// Order tasks based on tasksOrder
if (type && type !== 'completedTodos') {
let order = (challenge || user).tasksOrder[type];
let orderedTasks = new Array(tasks.length);
let unorderedTasks = []; // what we want to add later
tasks.forEach((task, index) => {
let taskId = task._id;
let i = order[index] === taskId ? index : order.indexOf(taskId);
if (i === -1) {
unorderedTasks.push(task);
} else {
orderedTasks[i] = task;
}
});
// Remove empty values from the array and add any unordered task
orderedTasks = _.compact(orderedTasks).concat(unorderedTasks);
res.respond(200, orderedTasks);
} else {
res.respond(200, tasks);
}
} }
/** /**
@@ -148,7 +170,7 @@ async function _getTasks (req, res, user, challenge) {
* @apiName GetUserTasks * @apiName GetUserTasks
* @apiGroup Task * @apiGroup Task
* *
* @apiParam {string="habits","dailys","todos","rewards","completeTodos"} type Optional query parameter to return just a type of tasks. By default all types will be returned except completed todos that requested separately. * @apiParam {string="habits","dailys","todos","rewards","completedTodos"} type Optional query parameter to return just a type of tasks. By default all types will be returned except completed todos that requested separately.
* *
* @apiSuccess {Array} tasks An array of task objects * @apiSuccess {Array} tasks An array of task objects
*/ */
@@ -194,7 +216,7 @@ api.getChallengeTasks = {
let user = res.locals.user; let user = res.locals.user;
let challengeId = req.params.challengeId; let challengeId = req.params.challengeId;
let challenge = await Challenge.findOne({_id: challengeId}).select('groupId leader').exec(); let challenge = await Challenge.findOne({_id: challengeId}).select('groupId leader tasksOrder').exec();
if (!challenge) throw new NotFound(res.t('challengeNotFound')); if (!challenge) throw new NotFound(res.t('challengeNotFound'));
let group = await Group.getGroup({user, groupId: challenge.groupId, fields: '_id type privacy', optionalMembership: true}); let group = await Group.getGroup({user, groupId: challenge.groupId, fields: '_id type privacy', optionalMembership: true});
if (!group || !challenge.canView(user, group)) throw new NotFound(res.t('challengeNotFound')); if (!group || !challenge.canView(user, group)) throw new NotFound(res.t('challengeNotFound'));