v3: fix unlinking multiple tasks

This commit is contained in:
Matteo Pagliazzi
2016-05-17 16:24:54 +02:00
parent d648b0e0c8
commit 41152157c2
3 changed files with 92 additions and 11 deletions

View File

@@ -129,10 +129,17 @@ habitrpg.controller("TasksCtrl", ['$scope', '$rootScope', '$location', 'User','N
}; };
$scope.unlink = function(task, keep) { $scope.unlink = function(task, keep) {
Tasks.unlinkTask(task._id, keep) if (keep.search('-all') !== -1) { // unlink all tasks
.success(function () { Tasks.unlinkAllTasks(task.challenge.id, keep)
User.log({}); .success(function () {
}); User.sync({});
});
} else { // unlink a task
Tasks.unlinkOneTask(task._id, keep)
.success(function () {
User.sync({});
});
}
}; };
/* /*

View File

@@ -120,14 +120,25 @@ angular.module('habitrpg')
}); });
}; };
function unlinkTask (taskId, keep) { function unlinkOneTask (taskId, keep) { // single task
if (!keep) {
keep = "keep";
}
return $http({
method: 'POST',
url: '/api/v3/tasks/unlink-one/' + taskId + '?keep=' + keep,
});
};
function unlinkAllTasks (challengeId, keep) { // all tasks
if (!keep) { if (!keep) {
keep = "keep-all"; keep = "keep-all";
} }
return $http({ return $http({
method: 'POST', method: 'POST',
url: '/api/v3/tasks/unlink/' + taskId + '?keep=' + keep, url: '/api/v3/tasks/unlink-all/' + challengeId + '?keep=' + keep,
}); });
}; };

View File

@@ -761,18 +761,81 @@ api.removeTagFromTask = {
}; };
/** /**
* @api {post} /api/v3/tasks/unlink/:taskId Unlink a challenge task * @api {post} /api/v3/tasks/unlink-all/:challengeId Unlink all tasks from a challenge
* @apiVersion 3.0.0 * @apiVersion 3.0.0
* @apiName UnlinkTask * @apiName UnlinkAllTasks
* @apiGroup Task * @apiGroup Task
* *
* @apiParam {UUID} taskId The task _id * @apiParam {UUID} challengeId The challenge _id
* @apiParam {string} keep Query parameter - keep-all or remove-all
* *
* @apiSuccess {object} data An empty object * @apiSuccess {object} data An empty object
*/ */
api.unlinkTask = { api.unlinkAllTasks = {
method: 'POST', method: 'POST',
url: '/tasks/unlink/:taskId', url: '/tasks/unlink-all/:challengeId',
middlewares: [authWithHeaders()],
async handler (req, res) {
req.checkParams('challengeId', res.t('challengeIdRequired')).notEmpty().isUUID();
req.checkQuery('keep', res.t('keepOrRemoveAll')).notEmpty().isIn(['keep-all', 'remove-all']);
let validationErrors = req.validationErrors();
if (validationErrors) throw validationErrors;
let user = res.locals.user;
let keep = req.query.keep;
let challengeId = req.params.challengeId;
let tasks = await Tasks.Task.find({
'challenge.id': challengeId,
userId: user._id,
}).exec();
let validTasks = tasks.every(task => {
return task.challenge.broken;
});
if (!validTasks) throw new BadRequest(res.t('cantOnlyUnlinkChalTask'));
if (keep === 'keep-all') {
await Bluebird.all(tasks.map(task => {
task.challenge = {};
return task.save();
}));
} else { // remove
let toSave = [];
tasks.forEach(task => {
if (task.type !== 'todo' || !task.completed) { // eslint-disable-line no-lonely-if
removeFromArray(user.tasksOrder[`${task.type}s`], task._id);
}
toSave.push(task.remove());
});
toSave.push(user.save());
await Bluebird.all(toSave);
}
res.respond(200, {});
},
};
/**
* @api {post} /api/v3/tasks/unlink-one/:taskId Unlink a challenge task
* @apiVersion 3.0.0
* @apiName UnlinkOneTask
* @apiGroup Task
*
* @apiParam {UUID} taskId The task _id
* @apiParam {string} keep Query parameter - keep or remove
*
* @apiSuccess {object} data An empty object
*/
api.unlinkOneTask = {
method: 'POST',
url: '/tasks/unlink-one/:taskId',
middlewares: [authWithHeaders()], middlewares: [authWithHeaders()],
async handler (req, res) { async handler (req, res) {
req.checkParams('taskId', res.t('taskIdRequired')).notEmpty().isUUID(); req.checkParams('taskId', res.t('taskIdRequired')).notEmpty().isUUID();