From f229145aaec4beda07f062340672ab28fc49dd24 Mon Sep 17 00:00:00 2001 From: Daniel Saewitz Date: Mon, 18 Feb 2013 20:32:19 -0500 Subject: [PATCH 1/7] Remove serverRoutes --- src/server/index.coffee | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/server/index.coffee b/src/server/index.coffee index 3c93733c1c..8a1b29826b 100644 --- a/src/server/index.coffee +++ b/src/server/index.coffee @@ -9,7 +9,6 @@ MongoStore = require('connect-mongo')(express) auth = require 'derby-auth' priv = require './private' habitrpgStore = require('./store') -serverRoutes = require './serverRoutes' ## RACER CONFIGURATION ## @@ -105,7 +104,6 @@ mongo_store = new MongoStore {url: process.env.NODE_DB_URI}, -> model.set '_view', _view next() - .use(serverRoutes.API()) .use(auth.middleware(strategies, options)) # Creates an express middleware from the app's routes .use(app.router()) From fc49e57201a113f4b7e2bc3bf55109635a709777 Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Tue, 19 Feb 2013 16:49:38 -0500 Subject: [PATCH 2/7] try model.fetches for party members for now, with browser refreshes. --- src/app/party.coffee | 66 +++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/src/app/party.coffee b/src/app/party.coffee index 45e3d294b6..80efc6b3d1 100644 --- a/src/app/party.coffee +++ b/src/app/party.coffee @@ -41,14 +41,12 @@ module.exports.partySubscribe = partySubscribe = (model, cb) -> ## (1) User is solo, just return that subscription unless uObj.party?.current - model.ref '_user', u - browser.resetDom(model) if window? - return if cb then cb() else null + return finished() # User in a party partiesQ = model.query('parties').withId(uObj.party.current) - partiesQ.subscribe (err, res) -> + partiesQ.fetch (err, res) -> throw err if err p = res.at(0) model.ref '_party', p @@ -68,7 +66,7 @@ module.exports.partySubscribe = partySubscribe = (model, cb) -> else ## (3) Party has members, subscribe to those users too membersQ = model.query('users').party(ids) - membersQ.subscribe (err, members) -> + membersQ.fetch (err, members) -> throw err if err model.ref '_partyMembers', members finished() @@ -99,8 +97,9 @@ module.exports.app = (appExports, model) -> appExports.partyCreate = -> newParty = model.get("_newParty") id = model.add 'parties', { name: newParty, leader: user.get('id'), members: [user.get('id')], invites:[] } - user.set 'party', {current: id, invitation: null, leader: true} - partySubscribe model, -> $('#party-modal').modal('show') + user.set 'party', {current: id, invitation: null, leader: true}, -> + setTimeout (-> window.location.reload true), 10 +# partySubscribe model, -> $('#party-modal').modal('show') appExports.partyInvite = -> id = model.get('_newPartyMember').replace(/[\s"]/g, '') @@ -123,18 +122,22 @@ module.exports.app = (appExports, model) -> model.set "users.#{id}.party.invitation", p.get('id') $.bootstrapGrowl "Invitation Sent." $('#party-modal').modal('hide') - model.set '_newPartyMember', '' - partySubscribe model + model.set '_newPartyMember', '', -> + setTimeout (-> window.location.reload true), 10 + #partySubscribe model appExports.partyAccept = -> - user.set 'party.current', user.get('party.invitation') + partyId = user.get('party.invitation') user.set 'party.invitation', null - setTimeout (-> window.location.reload true), 10 - return - # FIXME This should handle not requiring a refresh, but alas. - partySubscribe model, -> - p = model.at('_party') - p.push 'members', user.get('id') + user.set 'party.current', partyId + model.fetch model.query('parties').withId(partyId), (err, p) -> + throw err if err + debugger + p.at(0).at('members').push user.get('id'), -> + setTimeout (-> window.location.reload true), 10 +# partySubscribe model, -> +# p = model.at('_party') +# p.push 'members', user.get('id') appExports.partyReject = -> user.set 'party.invitation', null @@ -148,21 +151,16 @@ module.exports.app = (appExports, model) -> members = p.get('members') index = members.indexOf(user.get('id')) members.splice(index,1) - p.set 'members', members - if (members.length == 0) - # last member out, kill the party - model.del "parties.#{id}" - model.set '_party', null - model.set '_partyMembers', null - setTimeout (-> window.location.reload true), 10 - return - - # FIXME This should handle not requiring a refresh, but alas. - partyUnsubscribe model, -> - selfQ = model.query('users').withId(model.get('_userId') or model.session.userId) - selfQ.subscribe (err, u) -> - model.ref '_user', u.at(0) - browser.resetDom model - - - #exports.partyDisband = -> + p.set 'members', members, -> + if (members.length == 0) + model.del "parties.#{id}" # last member out, kill the party + setTimeout (-> window.location.reload true), 10 + else + setTimeout (-> window.location.reload true), 10 +# model.set '_party', null +# model.set '_partyMembers', null +# partyUnsubscribe model, -> +# selfQ = model.query('users').withId(model.get('_userId') or model.session.userId) +# selfQ.subscribe (err, u) -> +# model.ref '_user', u.at(0) +# browser.resetDom model \ No newline at end of file From 6229a8e5bb678dc39403e559096e97f36320a3c5 Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Tue, 19 Feb 2013 17:08:48 -0500 Subject: [PATCH 3/7] model.fetch party, change members array, then push --- src/app/party.coffee | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/app/party.coffee b/src/app/party.coffee index 80efc6b3d1..dab379e617 100644 --- a/src/app/party.coffee +++ b/src/app/party.coffee @@ -130,11 +130,13 @@ module.exports.app = (appExports, model) -> partyId = user.get('party.invitation') user.set 'party.invitation', null user.set 'party.current', partyId - model.fetch model.query('parties').withId(partyId), (err, p) -> - throw err if err - debugger - p.at(0).at('members').push user.get('id'), -> - setTimeout (-> window.location.reload true), 10 +# model.push "parties.#{partyId}.members", user.get('id'), -> #FIXME why this not working? + model.query('parties').withId(partyId).fetch (err, p) -> + members = p.at(0).get('members') + members.push user.get('id') + p.at(0).set 'members', members, -> + debugger + window.location.reload true # partySubscribe model, -> # p = model.at('_party') # p.push 'members', user.get('id') From 08ec9a510eb1dcaa798f251b46d3635751c7fcda Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Tue, 19 Feb 2013 17:33:34 -0500 Subject: [PATCH 4/7] only one subscribe if user solo --- src/app/party.coffee | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/app/party.coffee b/src/app/party.coffee index dab379e617..1aed62c5ac 100644 --- a/src/app/party.coffee +++ b/src/app/party.coffee @@ -32,17 +32,16 @@ module.exports.partySubscribe = partySubscribe = (model, cb) -> u = self.at(0) uObj = u.get() + ## (1) User is solo, just return that subscription + unless uObj.party?.current? + model.ref '_user', u + return cb() + finished = -> model.unsubscribe selfQ, -> selfQ.subscribe (err, self) -> model.ref '_user', self.at(0) - browser.resetDom(model) if window? - cb() if cb? - - ## (1) User is solo, just return that subscription - unless uObj.party?.current - return finished() - + cb() # User in a party partiesQ = model.query('parties').withId(uObj.party.current) @@ -98,7 +97,7 @@ module.exports.app = (appExports, model) -> newParty = model.get("_newParty") id = model.add 'parties', { name: newParty, leader: user.get('id'), members: [user.get('id')], invites:[] } user.set 'party', {current: id, invitation: null, leader: true}, -> - setTimeout (-> window.location.reload true), 10 + window.location.reload true # partySubscribe model, -> $('#party-modal').modal('show') appExports.partyInvite = -> @@ -122,8 +121,7 @@ module.exports.app = (appExports, model) -> model.set "users.#{id}.party.invitation", p.get('id') $.bootstrapGrowl "Invitation Sent." $('#party-modal').modal('hide') - model.set '_newPartyMember', '', -> - setTimeout (-> window.location.reload true), 10 + model.set '_newPartyMember', '', -> window.location.reload true #partySubscribe model appExports.partyAccept = -> @@ -135,7 +133,6 @@ module.exports.app = (appExports, model) -> members = p.at(0).get('members') members.push user.get('id') p.at(0).set 'members', members, -> - debugger window.location.reload true # partySubscribe model, -> # p = model.at('_party') @@ -155,10 +152,10 @@ module.exports.app = (appExports, model) -> members.splice(index,1) p.set 'members', members, -> if (members.length == 0) - model.del "parties.#{id}" # last member out, kill the party - setTimeout (-> window.location.reload true), 10 + # last member out, kill the party + model.del "parties.#{id}", -> window.location.reload true else - setTimeout (-> window.location.reload true), 10 + window.location.reload true # model.set '_party', null # model.set '_partyMembers', null # partyUnsubscribe model, -> From 223355fecb0776e994383eb6d108582de404e18b Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Tue, 19 Feb 2013 18:49:57 -0500 Subject: [PATCH 5/7] try without unsubscribe --- src/app/party.coffee | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/party.coffee b/src/app/party.coffee index 1aed62c5ac..99cc6e1dfb 100644 --- a/src/app/party.coffee +++ b/src/app/party.coffee @@ -38,10 +38,10 @@ module.exports.partySubscribe = partySubscribe = (model, cb) -> return cb() finished = -> - model.unsubscribe selfQ, -> - selfQ.subscribe (err, self) -> - model.ref '_user', self.at(0) - cb() +# model.unsubscribe selfQ, -> + selfQ.subscribe (err, self) -> + model.ref '_user', self.at(0) + cb() # User in a party partiesQ = model.query('parties').withId(uObj.party.current) From 66a7716b4a182054fee3dce6f439de3a9f0f7ed1 Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Tue, 19 Feb 2013 19:36:57 -0500 Subject: [PATCH 6/7] add comments about unsubscribe issues --- src/app/party.coffee | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/app/party.coffee b/src/app/party.coffee index 99cc6e1dfb..2e5c269671 100644 --- a/src/app/party.coffee +++ b/src/app/party.coffee @@ -12,13 +12,10 @@ partyUnsubscribe = (model, cb) -> cb() ### - Subscribe to the user, the users's party (meta), and the party's members. 3 subscriptions. - If the user is solo, just subscribe to the user. If in a an empty party, just subscribe to the party. If full party, - subscribe to everything. - - Note a strange hack - later model.queries override previous model.queries' - returned fields. Aka, we need this here otherwise we only get the "public" fields for the current user, which - are defined in model.query('users').party(). So we need to subscribe to the main user last + Subscribe to the user, the users's party (meta info like party name, member ids, etc), and the party's members. 3 subscriptions. + 1) If the user is solo, just subscribe to the user. + 2) If in a an empty party, just subscribe to the user & party meta. + 3) If full party, subscribe to everything. ### module.exports.partySubscribe = partySubscribe = (model, cb) -> @@ -37,8 +34,18 @@ module.exports.partySubscribe = partySubscribe = (model, cb) -> model.ref '_user', u return cb() + ### + Note this strange hack - we subscribe to queries incrementally. First self, then party, then party members. + Party members come with limited fields, so you can't hack their stuff. Strangely, subscribing to the members after + already subscribing to self limits self's fields to the fields which members are limited to. As a result, we have + to re-subscribe to self to get all the fields (otherwise everything breaks). Weirdly, this last subscription doesn't + do the opposite - granting all the fields back to members. I dont' know what's going on here + + Another issue: `model.unsubscribe(selfQ)` would seem to mitigate the above, so we at least don't have a stray + subscription floating around - but alas, it doesn't seem to work (or at least never calls the callback) + ### finished = -> -# model.unsubscribe selfQ, -> + # model.unsubscribe selfQ, -> selfQ.subscribe (err, self) -> model.ref '_user', self.at(0) cb() From a777f6ce609ef934f6f9d3ec95dc4ccfbfdd81a4 Mon Sep 17 00:00:00 2001 From: Daniel Saewitz Date: Tue, 19 Feb 2013 20:57:33 -0500 Subject: [PATCH 7/7] Fix indentation --- src/server/api.coffee | 46 +++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/server/api.coffee b/src/server/api.coffee index 5b9ff498d4..f394945f09 100644 --- a/src/server/api.coffee +++ b/src/server/api.coffee @@ -55,30 +55,30 @@ router.post '/users/:uid/tasks/:taskId/:direction', (req, res) -> res.send(result) router.get '/users/:uid/calendar.ics', (req, res) -> - #return next() #disable for now - {uid} = req.params - {apiToken} = req.query + #return next() #disable for now + {uid} = req.params + {apiToken} = req.query - model = req.getModel() - query = model.query('users').withIdAndToken(uid, apiToken) - query.fetch (err, result) -> - return res.send(500, err) if err - tasks = result.at(0).get('tasks') - # tasks = result[0].tasks - tasksWithDates = _.filter tasks, (task) -> !!task.date - return res.send(500, "No events found") if _.isEmpty(tasksWithDates) + model = req.getModel() + query = model.query('users').withIdAndToken(uid, apiToken) + query.fetch (err, result) -> + return res.send(500, err) if err + tasks = result.at(0).get('tasks') + # tasks = result[0].tasks + tasksWithDates = _.filter tasks, (task) -> !!task.date + return res.send(500, "No events found") if _.isEmpty(tasksWithDates) - ical = new icalendar.iCalendar() - ical.addProperty('NAME', 'HabitRPG') - _.each tasksWithDates, (task) -> - event = new icalendar.VEvent(task.id); - event.setSummary(task.text); - d = new Date(task.date) - d.date_only = true - event.setDate d - ical.addComponent event - res.type('text/calendar') - formattedIcal = ical.toString().replace(/DTSTART\:/g, 'DTSTART;VALUE=DATE:') - res.send(200, formattedIcal) + ical = new icalendar.iCalendar() + ical.addProperty('NAME', 'HabitRPG') + _.each tasksWithDates, (task) -> + event = new icalendar.VEvent(task.id); + event.setSummary(task.text); + d = new Date(task.date) + d.date_only = true + event.setDate d + ical.addComponent event + res.type('text/calendar') + formattedIcal = ical.toString().replace(/DTSTART\:/g, 'DTSTART;VALUE=DATE:') + res.send(200, formattedIcal) module.exports = router