[#1673] challenges: better tag-syncing, show tag bull-horn

This commit is contained in:
Tyler Renelle
2013-10-31 17:49:51 -07:00
parent 287beb363f
commit 0ce76ee689
4 changed files with 34 additions and 28 deletions

View File

@@ -68,6 +68,7 @@ habitrpg.controller("ChallengesCtrl", ['$scope', 'User', 'Challenges', 'Notifica
Notification.text('Challenge Created'); Notification.text('Challenge Created');
$scope.discard(); $scope.discard();
$scope.challenges = Challenges.Challenge.query(); $scope.challenges = Challenges.Challenge.query();
User.sync();
} else { } else {
// TODO figure out a more elegant way about this // TODO figure out a more elegant way about this
//challenge._editing = false; //challenge._editing = false;

View File

@@ -35,19 +35,14 @@ var syncChalToUser = function(chal, user) {
challenge: true challenge: true
}); });
} }
tags = {};
tags[chal._id] = true;
// Sync new tasks and updated tasks // Sync new tasks and updated tasks
_.each(chal.tasks, function(task){ _.each(chal.tasks, function(task){
var type = task.type; var userTask = user.tasks[task.id] || (user[task.type+'s'].push(task), user.tasks[task.id]); //user[task.type+'s'][user[task.type+'s'].length-1]
_.defaults(task, {tags: tags, challenge:{}}); userTask.challenge = {id:chal._id};
_.defaults(task.challenge, {id:chal._id}); userTask.tags = userTask.tags || {};
if (user.tasks[task.id]) { userTask.tags[chal._id] = true;
_.merge(user.tasks[task.id], keepAttrs(task)); _.merge(userTask, keepAttrs(task));
} else {
user[type+'s'].push(task);
}
}) })
// Flag deleted tasks as "broken" // Flag deleted tasks as "broken"
@@ -122,7 +117,6 @@ api.create = function(req, res){
var waterfall = []; var waterfall = [];
if (+req.body.prize < 0) return res.json(401, {err: 'Challenge prize must be >= 0'}); if (+req.body.prize < 0) return res.json(401, {err: 'Challenge prize must be >= 0'});
if (+req.body.prize > 0) { if (+req.body.prize > 0) {
var net = 0;
waterfall = [ waterfall = [
function(cb){ function(cb){
Group.findById(req.body.group).select('balance leader').exec(cb); Group.findById(req.body.group).select('balance leader').exec(cb);
@@ -133,7 +127,7 @@ api.create = function(req, res){
if (req.body.prize > (user.balance*4 + groupBalance*4)) if (req.body.prize > (user.balance*4 + groupBalance*4))
return cb("Challenge.prize > (your gems + group balance). Purchase more gems or lower prize amount.s") return cb("Challenge.prize > (your gems + group balance). Purchase more gems or lower prize amount.s")
net = req.body.prize/4; // I really should have stored user.balance as gems rather than dollars... stupid... var net = req.body.prize/4; // I really should have stored user.balance as gems rather than dollars... stupid...
// user is group leader, and group has balance. Subtract from that first, then take the rest from user // user is group leader, and group has balance. Subtract from that first, then take the rest from user
if (groupBalance > 0) { if (groupBalance > 0) {
@@ -143,23 +137,31 @@ api.create = function(req, res){
group.balance = 0; group.balance = 0;
} }
} }
group.save(cb)
},
function(group, numRows, cb) {
user.balance -= net; user.balance -= net;
user.save(cb); group.save(cb)
} }
]; ];
} }
async.waterfall(waterfall, function(err){ waterfall = waterfall.concat([
if (err) return res.json(401, {err:err}); function() { // if we're dealing with prize above, arguemnts will be `group, numRows, cb` - else `cb`
var challenge = new Challenge(req.body); // FIXME sanitize var cb = arguments[arguments.length-1];
challenge.members.push(user._id); var challenge = new Challenge(req.body); // FIXME sanitize
challenge.save(function(err, saved){ challenge.members.push(user._id);
if (err) return res.json(500, {err:err}); challenge.save(cb);
Group.update({_id:saved.group}, {$addToSet:{challenges:saved._id}}) // fixme error-check, and also better to do in middleware? },
res.json(saved); function(chal, num, cb) {
}); // Auto-join creator to challenge (see members.push above)
syncChalToUser(chal, user);
user.save(function(err){
if (err) return cb(err);
cb(null, chal);
});
}
]);
async.waterfall(waterfall, function(err, chal){
if (err) return res.json(500, {err:err});
Group.update({_id:chal.group}, {$addToSet:{challenges:chal._id}}) // fixme error-check, and also better to do in middleware?
res.json(chal);
}); });
} }
@@ -243,6 +245,7 @@ function closeChal(cid, broken, cb) {
function(users, cb2) { function(users, cb2) {
var parallel = []; var parallel = [];
_.each(users, function(user){ _.each(users, function(user){
_.find(user.tags, {id:cid}).challenge = undefined;
_.each(user.tasks, function(task){ _.each(user.tasks, function(task){
if (task.challenge && task.challenge.id == removed._id) { if (task.challenge && task.challenge.id == removed._id) {
_.merge(task.challenge, broken); _.merge(task.challenge, broken);

View File

@@ -183,9 +183,9 @@ var UserSchema = new Schema({
}, },
tags: [ tags: [
{ {
// FIXME use refs?
id: String, id: String,
name: String name: String,
challenge: String
} }
], ],

View File

@@ -11,7 +11,9 @@
span.add-on.tag-editing-pill span.add-on.tag-editing-pill
a.pull-right(ng-click='delete(tag,$index)') a.pull-right(ng-click='delete(tag,$index)')
i.icon-trash i.icon-trash
a(ng-hide='_editing && !tag.challenge', data-tag-id='{{tag.id}}', ng-click='toggleFilter(tag)') {{tag.name}} a(ng-hide='_editing', ng-click='toggleFilter(tag)')
i.icon-bullhorn(ng-if="tag.challenge")
| {{tag.name}}
li li
form.form-inline(ng-show='_editing', ng-submit='createTag(_newTag)') form.form-inline(ng-show='_editing', ng-submit='createTag(_newTag)')
.input-append.tag-editing .input-append.tag-editing