Files
habitica/website/server/controllers/api-v4/tasks.js
Alec Brickner f33720e9fd Drag challenge tasks (#12204)
* Allow challenge tasks to be draggable by leaders and admins

* Drag challenge tasks, ensure they're ordered

* Ensure group tasks are ordered properly, make draggable

* Add tests, fix broken tests

* Resolve merge conflict

* Remove console.log()

* Address code review comments

* Code review fixes

* Fix lint

* Fix importing

* taskManager

* Lint

* Fix collapseChecklist test

Co-authored-by: Sabe Jones <sabrecat@gmail.com>
2021-04-30 16:23:27 -05:00

70 lines
3.0 KiB
JavaScript

import _ from 'lodash';
import { authWithHeaders } from '../../middlewares/auth';
import { scoreTasks } from '../../libs/tasks';
const api = {};
/**
* @apiIgnore
* @api {post} /api/v4/tasks/bulk-score Score multiple tasks
* @apiName ScoreTasks
* @apiGroup Task
*
* @apiParam (Body) {Object[]} body An array with the data on the tasks to score
* @apiParam (Body) {String} body.*.id A task identifier, either the id or alias
* @apiParam (Body) {String="up","down"} body.*.direction The direction in which to score the task
*
* @apiParamExample {json} Request-Example:
* [{ "id": "a task id", "direction": "up" },
* { "id": "a 2nd task id", "direction": "down" }]
*
* @apiSuccess {Object} data The user stats and a tasks object
* @apiSuccess {Object[]} data.tasks An array of results with an object for each scored task
* @apiSuccess {Object[]} data.tasks.*.id The id of the task scored
* @apiSuccess {Object[]} data.tasks.*.delta The delta
* @apiSuccess {Object[]} data.tasks.*._tmp If an item was dropped when scoring a task it'll
* be returned in the _tmp object for that task
*
* @apiSuccess {Boolean} data.requiresApproval Approval was requested for team task
* @apiSuccess {String} message Acknowledgment of team task approval request
*
* @apiSuccessExample {json} Example result:
* {"success":true,"data":{"tasks": [{"id": "task id", "delta":0.9746999906450404,
* "_tmp":{}],"hp":50,
* "mp":37.2008917491047,"exp":101.93810026267543,"gp":77.09694176716997,
* "lvl":19,"class":"rogue","points":0,"str":5,"con":3,"int":3,
* "per":8,"buffs":{"str":9,"int":9,"per":9,"con":9,"stealth":0,"streaks":false,
* "snowball":false,"spookySparkles":false,"shinySeed":false,"seafoam":false},
* "training":{"int":0,"per":0,"str":0,"con":0}},"notifications":[]}
*
* @apiSuccessExample {json} Example result with item drop:
* {"success":true,"data":{"tasks": [{"id": "task-id", delta":1.0259567046270648,
* "_tmp":{"quest":{"progressDelta":1.2362778290756147,"collection":1},"drop":{"target":"Zombie",
* "canDrop":true,"value":1,"key":"RottenMeat","type":"Food",
* "dialog":"You've found Rotten Meat! Feed this to a pet and it may grow into a sturdy steed."}}],
* "hp":50,"mp":66.2390716654227,"exp":143.93810026267545,"gp":135.12889840462591,"lvl":20,
* "class":"rogue","points":0,"str":6,"con":3,"int":3,"per":8,"buffs":{"str":10,"int":10,"per":10,
* "con":10,"stealth":0,"streaks":false,"snowball":false,"spookySparkles":false,
* "shinySeed":false,"seafoam":false},"training":{"int":0,"per":0,"str":0,"con":0}},
* "notifications":[]}
*
* @apiUse TaskNotFound
*/
api.scoreTasks = {
method: 'POST',
url: '/tasks/bulk-score',
middlewares: [authWithHeaders()],
async handler (req, res) {
// Body is validated in scoreTasks
const { user } = res.locals;
const tasksResponses = await scoreTasks(user, req.body, req, res);
const userStats = user.stats.toJSON();
const resJsonData = _.assign({ tasks: tasksResponses }, userStats);
res.respond(200, resJsonData);
},
};
export default api;