mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-15 21:57:22 +01:00
* 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>
70 lines
3.0 KiB
JavaScript
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;
|