mirror of
https://github.com/sudoxnym/habitica.git
synced 2026-08-05 20:12:19 +00:00
refactor(challenges): cleanup challenge-creation. can use async.auto to
keep variables around, no need to set parent closure vars
This commit is contained in:
parent
3027ccff83
commit
ae762837e2
1 changed files with 49 additions and 55 deletions
|
|
@ -147,69 +147,63 @@ api.getMember = function(req, res, next) {
|
||||||
// CREATE
|
// CREATE
|
||||||
api.create = function(req, res, next){
|
api.create = function(req, res, next){
|
||||||
var user = res.locals.user;
|
var user = res.locals.user;
|
||||||
var group, chal;
|
|
||||||
|
|
||||||
// First, make sure they've selected a legit group, and store it for later
|
async.auto({
|
||||||
var waterfall = [
|
get_group: function(cb){
|
||||||
function(cb){
|
var q = {_id:req.body.group};
|
||||||
Group.findById(req.body.group).exec(cb);
|
if (req.body.group!='habitrpg') q.members = {$in:[user._id]}; // make sure they're a member of the group
|
||||||
|
Group.findOne(q, cb);
|
||||||
},
|
},
|
||||||
function(_group, cb){
|
save_chal: ['get_group', function(cb, results){
|
||||||
if (!_group) return cb("Group." + req.body.group + " not found");
|
var group = results.get_group,
|
||||||
group = _group;
|
prize = +req.body.prize;
|
||||||
cb(null);
|
if (!group)
|
||||||
}
|
return cb({code:404, err:"Group." + req.body.group + " not found"});
|
||||||
];
|
//if (group.leaderOnly.challenges && group.leader !== user._id)
|
||||||
|
// return cb({code:401, err: "Only the group leader can create challenges"});
|
||||||
|
// If they're adding a prize, do some validation
|
||||||
|
if (prize < 0)
|
||||||
|
return cb({code:401, err: 'Challenge prize must be >= 0'});
|
||||||
|
if (req.body.group=='habitrpg' && prize < 1)
|
||||||
|
return cb({code:401, err: 'Prize must be at least 1 Gem for public challenges.'});
|
||||||
|
if (prize > 0) {
|
||||||
|
var groupBalance = ((group.balance && group.leader==user._id) ? group.balance : 0);
|
||||||
|
var prizeCost = prize/4; // I really should have stored user.balance as gems rather than dollars... stupid...
|
||||||
|
if (prizeCost > user.balance + groupBalance)
|
||||||
|
return cb("You can't afford this prize. Purchase more gems or lower the prize amount.")
|
||||||
|
|
||||||
// If they're adding a prize, do some validation
|
if (groupBalance >= prizeCost) {
|
||||||
if (+req.body.prize < 0) return res.json(401, {err: 'Challenge prize must be >= 0'});
|
// Group pays for all of prize
|
||||||
if (req.body.group=='habitrpg' && +req.body.prize < 1) return res.json(401, {err: 'Prize must be at least 1 Gem for public challenges.'});
|
group.balance -= prizeCost;
|
||||||
if (+req.body.prize > 0) {
|
} else if (groupBalance > 0) {
|
||||||
waterfall.push(function(cb){
|
// User pays remainder of prize cost after group
|
||||||
var groupBalance = ((group.balance && group.leader==user._id) ? group.balance : 0);
|
var remainder = prizeCost - group.balance;
|
||||||
var prizeCost = req.body.prize/4; // I really should have stored user.balance as gems rather than dollars... stupid...
|
group.balance = 0;
|
||||||
if (prizeCost > user.balance + groupBalance)
|
user.balance -= remainder;
|
||||||
return cb("You can't afford this prize. Purchase more gems or lower the prize amount.")
|
} else {
|
||||||
|
// User pays for all of prize
|
||||||
if (groupBalance >= prizeCost) {
|
user.balance -= prizeCost;
|
||||||
// Group pays for all of prize
|
}
|
||||||
group.balance -= prizeCost;
|
}
|
||||||
} else if (groupBalance > 0) {
|
|
||||||
// User pays remainder of prize cost after group
|
|
||||||
var remainder = prizeCost - group.balance;
|
|
||||||
group.balance = 0;
|
|
||||||
user.balance -= remainder;
|
|
||||||
} else {
|
|
||||||
// User pays for all of prize
|
|
||||||
user.balance -= prizeCost;
|
|
||||||
}
|
|
||||||
cb(null);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
waterfall = waterfall.concat([
|
|
||||||
function(cb) { // if we're dealing with prize above, arguemnts will be `group, numRows, cb` - else `cb`
|
|
||||||
req.body.leader = user._id;
|
req.body.leader = user._id;
|
||||||
req.body.official = user.contributor.admin && req.body.official;
|
req.body.official = user.contributor.admin && req.body.official;
|
||||||
var chal = new Challenge(req.body); // FIXME sanitize
|
var chal = new Challenge(req.body); // FIXME sanitize
|
||||||
chal.members.push(user._id);
|
chal.members.push(user._id);
|
||||||
chal.save(cb)
|
chal.save(cb);
|
||||||
},
|
}],
|
||||||
function(_chal, num, cb){
|
save_group: ['save_chal', function(cb, results){
|
||||||
chal = _chal;
|
results.get_group.challenges.push(results.save_chal[0]._id);
|
||||||
group.challenges.push(chal._id);
|
results.get_group.save(cb);
|
||||||
group.save(cb);
|
}],
|
||||||
},
|
sync_user: ['save_group', function(cb, results){
|
||||||
function(_group, num, cb) {
|
|
||||||
// Auto-join creator to challenge (see members.push above)
|
// Auto-join creator to challenge (see members.push above)
|
||||||
chal.syncToUser(user, cb);
|
results.save_chal[0].syncToUser(user, cb);
|
||||||
}
|
}]
|
||||||
]);
|
}, function(err, results){
|
||||||
async.waterfall(waterfall, function(err){
|
if (err) return err.code? res.json(err.code, err) : next(err);
|
||||||
if (err) return next(err);
|
return res.json(results.save_chal[0]);
|
||||||
res.json(chal);
|
user = null;
|
||||||
user = group = chal = null;
|
})
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// UPDATE
|
// UPDATE
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue