From 0ce76ee6894b60cb1e430c3922dd7a16653d2a87 Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Thu, 31 Oct 2013 17:49:51 -0700 Subject: [PATCH] [#1673] challenges: better tag-syncing, show tag bull-horn --- public/js/controllers/challengesCtrl.js | 1 + src/controllers/challenges.js | 53 +++++++++++++------------ src/models/user.js | 4 +- views/main/filters.jade | 4 +- 4 files changed, 34 insertions(+), 28 deletions(-) diff --git a/public/js/controllers/challengesCtrl.js b/public/js/controllers/challengesCtrl.js index 7c0a2c2c09..3fbcbc0f0d 100644 --- a/public/js/controllers/challengesCtrl.js +++ b/public/js/controllers/challengesCtrl.js @@ -68,6 +68,7 @@ habitrpg.controller("ChallengesCtrl", ['$scope', 'User', 'Challenges', 'Notifica Notification.text('Challenge Created'); $scope.discard(); $scope.challenges = Challenges.Challenge.query(); + User.sync(); } else { // TODO figure out a more elegant way about this //challenge._editing = false; diff --git a/src/controllers/challenges.js b/src/controllers/challenges.js index 2f3429e46b..141b7f3cae 100644 --- a/src/controllers/challenges.js +++ b/src/controllers/challenges.js @@ -35,19 +35,14 @@ var syncChalToUser = function(chal, user) { challenge: true }); } - tags = {}; - tags[chal._id] = true; // Sync new tasks and updated tasks _.each(chal.tasks, function(task){ - var type = task.type; - _.defaults(task, {tags: tags, challenge:{}}); - _.defaults(task.challenge, {id:chal._id}); - if (user.tasks[task.id]) { - _.merge(user.tasks[task.id], keepAttrs(task)); - } else { - user[type+'s'].push(task); - } + 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] + userTask.challenge = {id:chal._id}; + userTask.tags = userTask.tags || {}; + userTask.tags[chal._id] = true; + _.merge(userTask, keepAttrs(task)); }) // Flag deleted tasks as "broken" @@ -122,7 +117,6 @@ api.create = function(req, res){ var waterfall = []; if (+req.body.prize < 0) return res.json(401, {err: 'Challenge prize must be >= 0'}); if (+req.body.prize > 0) { - var net = 0; waterfall = [ function(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)) 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 if (groupBalance > 0) { @@ -143,23 +137,31 @@ api.create = function(req, res){ group.balance = 0; } } - group.save(cb) - }, - function(group, numRows, cb) { user.balance -= net; - user.save(cb); + group.save(cb) } ]; } - async.waterfall(waterfall, function(err){ - if (err) return res.json(401, {err:err}); - var challenge = new Challenge(req.body); // FIXME sanitize - challenge.members.push(user._id); - challenge.save(function(err, saved){ - if (err) return res.json(500, {err:err}); - Group.update({_id:saved.group}, {$addToSet:{challenges:saved._id}}) // fixme error-check, and also better to do in middleware? - res.json(saved); - }); + waterfall = waterfall.concat([ + function() { // if we're dealing with prize above, arguemnts will be `group, numRows, cb` - else `cb` + var cb = arguments[arguments.length-1]; + var challenge = new Challenge(req.body); // FIXME sanitize + challenge.members.push(user._id); + challenge.save(cb); + }, + 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) { var parallel = []; _.each(users, function(user){ + _.find(user.tags, {id:cid}).challenge = undefined; _.each(user.tasks, function(task){ if (task.challenge && task.challenge.id == removed._id) { _.merge(task.challenge, broken); diff --git a/src/models/user.js b/src/models/user.js index 23dee6f247..48ff54f540 100644 --- a/src/models/user.js +++ b/src/models/user.js @@ -183,9 +183,9 @@ var UserSchema = new Schema({ }, tags: [ { - // FIXME use refs? id: String, - name: String + name: String, + challenge: String } ], diff --git a/views/main/filters.jade b/views/main/filters.jade index 3c2ec1e9e8..23e3ebf662 100644 --- a/views/main/filters.jade +++ b/views/main/filters.jade @@ -11,7 +11,9 @@ span.add-on.tag-editing-pill a.pull-right(ng-click='delete(tag,$index)') 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 form.form-inline(ng-show='_editing', ng-submit='createTag(_newTag)') .input-append.tag-editing