mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-17 22:57:21 +01:00
90 lines
3.0 KiB
JavaScript
90 lines
3.0 KiB
JavaScript
var _ = require('lodash');
|
|
var nconf = require('nconf');
|
|
var async = require('async');
|
|
var shared = require('../../../../common');
|
|
import {
|
|
model as User,
|
|
} from '../../models/user';
|
|
import {
|
|
model as Group,
|
|
} from '../../models/group';
|
|
var api = module.exports;
|
|
|
|
api.ensureAdmin = function(req, res, next) {
|
|
var user = res.locals.user;
|
|
if (!(user.contributor && user.contributor.admin)) return res.status(401).json({err:"You don't have admin access"});
|
|
next();
|
|
}
|
|
|
|
api.getHeroes = function(req,res,next) {
|
|
User.find({'contributor.level':{$gt:0}})
|
|
.select('contributor backer balance profile.name')
|
|
.sort('-contributor.level')
|
|
.exec(function(err, users){
|
|
if (err) return next(err);
|
|
res.json(users);
|
|
});
|
|
}
|
|
|
|
api.getPatrons = function(req,res,next){
|
|
var page = req.query.page || 0,
|
|
perPage = 50;
|
|
User.find({'backer.tier':{$gt:0}})
|
|
.select('contributor backer profile.name')
|
|
.sort('-backer.tier')
|
|
.skip(page*perPage)
|
|
.limit(perPage)
|
|
.exec(function(err, users){
|
|
if (err) return next(err);
|
|
res.json(users);
|
|
});
|
|
}
|
|
|
|
api.getHero = function(req,res,next) {
|
|
User.findById(req.params.uid)
|
|
.select('contributor balance profile.name purchased items')
|
|
.select('auth.local.username auth.local.email auth.facebook auth.blocked')
|
|
.exec(function(err, user){
|
|
if (err) return next(err)
|
|
if (!user) return res.status(400).json({err:'User not found'});
|
|
res.json(user);
|
|
});
|
|
}
|
|
|
|
api.updateHero = function(req,res,next) {
|
|
async.waterfall([
|
|
function(cb){
|
|
User.findById(req.params.uid, cb);
|
|
},
|
|
function(member, cb){
|
|
if (!member) return res.status(404).json({err: "User not found"});
|
|
member.balance = req.body.balance || 0;
|
|
var newTier = req.body.contributor.level; // tier = level in this context
|
|
var oldTier = member.contributor && member.contributor.level || 0;
|
|
if (newTier > oldTier) {
|
|
member.flags.contributor = true;
|
|
var gemsPerTier = {1:3, 2:3, 3:3, 4:4, 5:4, 6:4, 7:4, 8:0, 9:0}; // e.g., tier 5 gives 4 gems. Tier 8 = moderator. Tier 9 = staff
|
|
var tierDiff = newTier - oldTier; // can be 2+ tier increases at once
|
|
while (tierDiff) {
|
|
member.balance += gemsPerTier[newTier] / 4; // balance is in $
|
|
tierDiff--;
|
|
newTier--; // give them gems for the next tier down if they weren't aready that tier
|
|
}
|
|
}
|
|
member.contributor = req.body.contributor;
|
|
member.purchased.ads = req.body.purchased.ads;
|
|
if (member.contributor.level >= 6) member.items.pets['Dragon-Hydra'] = 5;
|
|
if (req.body.itemPath && req.body.itemVal
|
|
&& req.body.itemPath.indexOf('items.') === 0
|
|
&& User.schema.paths[req.body.itemPath]) {
|
|
shared.dotSet(member, req.body.itemPath, req.body.itemVal); // Sanitization at 5c30944 (deemed unnecessary)
|
|
}
|
|
if (_.isBoolean(req.body.auth.blocked)) member.auth.blocked = req.body.auth.blocked;
|
|
member.save(cb);
|
|
}
|
|
], function(err, saved){
|
|
if (err) return next(err);
|
|
res.status(204).json({});
|
|
})
|
|
}
|