habitica/website/server/controllers/api-v3/user/stats.js

142 lines
3.5 KiB
JavaScript
Raw Permalink Normal View History

// @TODO: Can we import only the functions we need instead of the large object?
import common from '../../../../common';
import { authWithHeaders } from '../../../middlewares/auth';
2019-10-08 14:57:10 +00:00
const api = {};
/**
2020-02-12 20:40:44 +00:00
* @api {post} /api/v3/user/allocate
* Allocate a single Stat Point (previously called Attribute Point)
* @apiName UserAllocate
* @apiGroup User
* @apiDescription Allocates a single Stat Point.
*
* @apiParam (Query) {String="str","con","int","per"} stat The Stat to increase. Default is 'str'
*
2020-02-12 20:40:44 +00:00
* @apiParamExample {curl} Example call:
* curl -X POST -d "" https://habitica.com/api/v3/user/allocate?stat=int
*
* @apiSuccess {Object} data Returns stats and notifications from the user profile
*
* @apiError {NotAuthorized} NoPoints You don't have enough Stat Points.
*
2020-02-12 20:40:44 +00:00
* @apiErrorExample {json} Example error:
* {
* "success": false,
* "error": "NotAuthorized",
* "message": "You don't have enough Stat Points."
* }
*/
api.allocate = {
method: 'POST',
Move inbox to its own model (#10428) * shared model for chat and inbox * disable inbox schema * inbox: use separate model * remove old code that used group.chat * add back chat field (not used) and remove old tests * remove inbox exclusions when loading user * add GET /api/v3/inbox/messages * add comment * implement DELETE /inbox/messages/:messageid in v4 * implement GET /inbox/messages in v4 and update tests * implement DELETE /api/v4/inbox/clear * fix url * fix doc * update /export/inbox.html * update other data exports * add back messages in user schema * add user.toJSONWithInbox * add compativility until migration is done * more compatibility * fix tojson called twice * add compatibility methods * fix common tests * fix v4 integration tests * v3 get user -> with inbox * start to fix tests * fix v3 integration tests * wip * wip, client use new route * update tests for members/send-private-message * tests for get user in v4 * add tests for DELETE /inbox/messages/:messageId * add tests for DELETE /inbox/clear in v4 * update docs * fix tests * initial migration * fix migration * fix migration * migration fixes * migrate api.enterCouponCode * migrate api.castSpell * migrate reset, reroll, rebirth * add routes to v4 version * fix tests * fixes * api.updateUser * remove .only * get user -> userLib * refactor inbox.vue to work with new data model * fix return message when messaging yourself * wip fix bug with new conversation * wip * fix remaining ui issues * move api.registerLocal, fixes * keep only v3 version of GET /inbox/messages
2018-09-21 13:12:20 +00:00
middlewares: [authWithHeaders()],
url: '/user/allocate',
async handler (req, res) {
2019-10-08 14:57:10 +00:00
const { user } = res.locals;
const allocateRes = common.ops.allocate(user, req);
await user.save();
res.respond(200, ...allocateRes);
},
};
/**
* @api {post} /api/v3/user/allocate-bulk Allocate multiple Stat Points
* @apiName UserAllocateBulk
* @apiGroup User
*
* @apiParam (Body) { Object } stats Body parameter
*
* @apiParamExample {json} Example request
* {
* stats: {
* "int": int,
* "str": str,
* "con": con,
* "per": per
* }
* }
*
* @apiSuccess {Object} data Returns stats and notifications from the user profile
*
* @apiError {NotAuthorized} NoPoints You don't have enough Stat Points.
*
2020-02-12 20:40:44 +00:00
* @apiErrorExample {json} Example error:
* {
* "success": false,
* "error": "NotAuthorized",
* "message": "You don't have enough Stat Points."
* }
*/
api.allocateBulk = {
method: 'POST',
Move inbox to its own model (#10428) * shared model for chat and inbox * disable inbox schema * inbox: use separate model * remove old code that used group.chat * add back chat field (not used) and remove old tests * remove inbox exclusions when loading user * add GET /api/v3/inbox/messages * add comment * implement DELETE /inbox/messages/:messageid in v4 * implement GET /inbox/messages in v4 and update tests * implement DELETE /api/v4/inbox/clear * fix url * fix doc * update /export/inbox.html * update other data exports * add back messages in user schema * add user.toJSONWithInbox * add compativility until migration is done * more compatibility * fix tojson called twice * add compatibility methods * fix common tests * fix v4 integration tests * v3 get user -> with inbox * start to fix tests * fix v3 integration tests * wip * wip, client use new route * update tests for members/send-private-message * tests for get user in v4 * add tests for DELETE /inbox/messages/:messageId * add tests for DELETE /inbox/clear in v4 * update docs * fix tests * initial migration * fix migration * fix migration * migration fixes * migrate api.enterCouponCode * migrate api.castSpell * migrate reset, reroll, rebirth * add routes to v4 version * fix tests * fixes * api.updateUser * remove .only * get user -> userLib * refactor inbox.vue to work with new data model * fix return message when messaging yourself * wip fix bug with new conversation * wip * fix remaining ui issues * move api.registerLocal, fixes * keep only v3 version of GET /inbox/messages
2018-09-21 13:12:20 +00:00
middlewares: [authWithHeaders()],
url: '/user/allocate-bulk',
async handler (req, res) {
2019-10-08 14:57:10 +00:00
const { user } = res.locals;
const allocateRes = common.ops.allocateBulk(user, req);
await user.save();
res.respond(200, ...allocateRes);
},
};
/**
* @api {post} /api/v3/user/allocate-now Allocate all Stat Points
2019-10-11 11:03:05 +00:00
* @apiDescription Uses the user's chosen automatic allocation method,
* or if none, assigns all to STR. Note: will return success,
* even if there are 0 points to allocate.
* @apiName UserAllocateNow
* @apiGroup User
*
* @apiSuccessExample {json} Success-Response:
* {
* "success": true,
* "data": {
* "hp": 50,
* "mp": 38,
* "exp": 7,
* "gp": 284.8637271160258,
* "lvl": 10,
* "class": "rogue",
* "points": 0,
* "str": 2,
* "con": 2,
* "int": 3,
* "per": 3,
* "buffs": {
* "str": 0,
* "int": 0,
* "per": 0,
* "con": 0,
* "stealth": 0,
* "streaks": false,
* "snowball": false,
* "spookySparkles": false,
* "shinySeed": false,
* "seafoam": false
* },
* "training": {
* "int": 0,
* "per": 0,
* "str": 0,
* "con": 0
* },
* "notifications": [ .... ],
* }
* }
*
* @apiSuccess {Object} data user.stats
*/
api.allocateNow = {
method: 'POST',
Move inbox to its own model (#10428) * shared model for chat and inbox * disable inbox schema * inbox: use separate model * remove old code that used group.chat * add back chat field (not used) and remove old tests * remove inbox exclusions when loading user * add GET /api/v3/inbox/messages * add comment * implement DELETE /inbox/messages/:messageid in v4 * implement GET /inbox/messages in v4 and update tests * implement DELETE /api/v4/inbox/clear * fix url * fix doc * update /export/inbox.html * update other data exports * add back messages in user schema * add user.toJSONWithInbox * add compativility until migration is done * more compatibility * fix tojson called twice * add compatibility methods * fix common tests * fix v4 integration tests * v3 get user -> with inbox * start to fix tests * fix v3 integration tests * wip * wip, client use new route * update tests for members/send-private-message * tests for get user in v4 * add tests for DELETE /inbox/messages/:messageId * add tests for DELETE /inbox/clear in v4 * update docs * fix tests * initial migration * fix migration * fix migration * migration fixes * migrate api.enterCouponCode * migrate api.castSpell * migrate reset, reroll, rebirth * add routes to v4 version * fix tests * fixes * api.updateUser * remove .only * get user -> userLib * refactor inbox.vue to work with new data model * fix return message when messaging yourself * wip fix bug with new conversation * wip * fix remaining ui issues * move api.registerLocal, fixes * keep only v3 version of GET /inbox/messages
2018-09-21 13:12:20 +00:00
middlewares: [authWithHeaders()],
url: '/user/allocate-now',
async handler (req, res) {
2019-10-08 14:57:10 +00:00
const { user } = res.locals;
const allocateNowRes = common.ops.allocateNow(user);
await user.save();
res.respond(200, ...allocateNowRes);
},
};
export default api;