mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-18 15:17:25 +01:00
v3: fix unlinking multiple tasks
This commit is contained in:
@@ -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({});
|
||||||
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -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,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user