From 98f1e0e6900b4cbdd52f0cb8cae33024aef107ce Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Tue, 5 Feb 2013 18:12:39 -0500 Subject: [PATCH] bunch of model subscription fixes, mostly due to @lackac's racer session fix --- src/app/index.coffee | 89 ++++++++++++++++++++--------------------- src/app/party.coffee | 73 ++++++++++++++++++++------------- src/server/store.coffee | 13 +++--- 3 files changed, 95 insertions(+), 80 deletions(-) diff --git a/src/app/index.coffee b/src/app/index.coffee index c5839f69f8..33b63cd5a8 100644 --- a/src/app/index.coffee +++ b/src/app/index.coffee @@ -38,55 +38,54 @@ get '/', (page, model, next) -> # This used to be in party.server(model, cb), but was getting `TypeError: Object # has no method 'server'` # on the second load for some reason - partyQueries = (cb) -> - selfQ = model.query('users').withId(model.session.userId) - model.fetch selfQ, (err, self) -> - console.error err if err - currentParty = self.at(0).get('party.current') - console.log {self: self.get()} - console.log {currentParty:currentParty} - if currentParty - partiesQ = model.query('parties').withId(currentParty) - model.fetch partiesQ, (err, parties) -> - console.error err if err - membersQ = model.query('users').party(parties.at(0).get('members')) - cb([partiesQ, membersQ, selfQ]) - else - cb([selfQ]) + selfQ = model.query('users').withId(model.session.userId) + model.subscribe selfQ, (err, users) -> + console.log err if err - partyQueries (queries) -> - subscribeCb = -> - [err, user] = [arguments[0], null] - throw err if err - if arguments.length == 4 - [party, members, user] = [arguments[1].at(0), arguments[2], arguments[3].at(0)] - console.log {err:err, user:user.get(), party:party.get(), members:members.get()} + user = users.at(0) + model.ref '_user', user + obj = user.get() + + batch = new schema.BatchUpdate(model) + batch.startTransaction() + obj = batch.obj() + + # Setup Item Store + _view.items = + armor: content.items.armor[parseInt(obj.items?.armor || 0) + 1] + weapon: content.items.weapon[parseInt(obj.items?.weapon || 0) + 1] + potion: content.items.potion + reroll: content.items.reroll + + model.set '_view', _view + + schema.updateUser(batch) + batch.commit() + + setupListReferences(model) + setupModelFns(model) + + if obj.party?.current? + console.log obj.party.current + console.log err if err + partiesQ = model.query('parties').withId(obj.party.current) + model.subscribe partiesQ, (err, parties) -> + console.log err if err + party = parties.at(0) model.ref '_party', party - model.ref '_partyMembers', members - else - user = arguments[1].at(0) - model.ref '_user', user - batch = new schema.BatchUpdate(model) - batch.startTransaction() - obj = batch.obj() - - # Setup Item Store - _view.items = - armor: content.items.armor[parseInt(obj.items?.armor || 0) + 1] - weapon: content.items.weapon[parseInt(obj.items?.weapon || 0) + 1] - potion: content.items.potion - reroll: content.items.reroll - - model.set '_view', _view - - schema.updateUser(batch) - batch.commit() - - setupListReferences(model) - setupModelFns(model) + membersQ = model.query('users').party(parties.at(0).get('members')) + model.subscribe membersQ, (err, members) -> + throw err if err + model.ref '_partyMembers', members + # Here's a hack we need to get fixed (hopefully Lever will) - 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() + model.subscribe selfQ, (err, users) -> + model.ref '_user', users.at(0) + page.render() + else page.render() - model.subscribe.apply model, queries.concat(subscribeCb) # ========== CONTROLLER FUNCTIONS ========== diff --git a/src/app/party.coffee b/src/app/party.coffee index 2da7929f54..7d212f46d9 100644 --- a/src/app/party.coffee +++ b/src/app/party.coffee @@ -1,15 +1,18 @@ _ = require('underscore') schema = require './schema' -module.exports.app = (exports, model) -> +module.exports.app = (appExports, model) -> user = model.at('_user') - exports.partyCreate = -> + appExports.partyCreate = -> newParty = model.get("_newParty") - id = model.add 'parties', { name: newParty, leader: user.get('id'), members: [user.get('id')] } + id = model.add 'parties', { name: newParty, leader: user.get('id'), members: [user.get('id')], invites:[] } user.set 'party', {current: id, invitation: null, leader: true} + model.subscribe model.query('parties').withId(id), (err, party) -> + throw err if err + model.ref '_party', party.at(0) - exports.partyInvite = -> + appExports.partyInvite = -> id = model.get('_newPartyMember').replace(/[\s"]/g, '') return if _.isEmpty(id) @@ -25,42 +28,56 @@ module.exports.app = (exports, model) -> model.set "_view.partyError", "User already in a party or pending invitation." return else - model.push "parties.#{obj.party.current}.invites", id - model.set "users.#{id}.party.invitation", obj.party.current + party = model.at '_party' + party.push "invites", id + model.set "users.#{id}.party.invitation", party.get('id') $.bootstrapGrowl "Invitation Sent." $('#party-modal').modal('hide') - #model.set '_newPartyMember', '' - #window.location.reload() #TODO break old subscription, setup new subscript, remove this reload + model.subscribe model.query('uesres').party(party.get('members')), (err, members) -> + throw err if err + model.ref '_partyMembers', members + model.set '_newPartyMember', '' + #TODO break old subscription, setup new subscript, remove this reload - exports.partyAccept = -> + appExports.partyAccept = -> invitation = user.get('party.invitation') - model.push "parties.#{invitation}.members", user.get('id') - user.set 'party.invitation', null, -> - user.set 'party.current', invitation, -> - window.location.reload() + debugger + model.subscribe model.query("parties").withId(invitation), (err, parties) -> + debugger + throw err if err + party = parties.at(0) + party.push 'members', user.get('id') + user.set 'party.invitation', null + user.set 'party.current', party.get('id') + model.ref '_party', party + model.subscribe model.query('users').party(party.get('members')), (err, members) -> + debugger + throw err if err + model.ref '_partyMembers', members - exports.partyReject = -> + appExports.partyReject = -> user.set 'party.invitation', null + # TODO splice parties.*.invites[key] # TODO notify sender - exports.partyLeave = -> - id = user.get('party.current') - user.set 'party.current', null, -> - members = model.get "parties.#{id}.members" - index = members.indexOf(user.get('id')) - newMembers = members.slice(index) - model.set "parties.#{id}.members", newMembers -> - if (newMembers.length == 0) - # last member out, kill the party - model.del "parties.#{id}", -> window.location.reload() - else - window.location.reload() + appExports.partyLeave = -> + user.set 'party.current', null + party = model.at '_party' + members = party.get('members') + index = members.indexOf(user.get('id')) + newMembers = members.slice(index) + party.set 'members', newMembers + if (newMembers.length == 0) + # last member out, kill the party + model.del "parties.#{id}", -> window.location.reload() + else + window.location.reload() - exports.partyDisband = -> + #exports.partyDisband = -> user.on 'set', 'party.invitation', (id) -> - model.fetch "parties.#{id}", (err, party) -> model.set '_party', party + model.fetch model.query('parties').withId(id), (err, party) -> model.set '_party', party # # model.on '*', '_party.members', (ids) -> # # TODO unsubscribe to previous subscription diff --git a/src/server/store.coffee b/src/server/store.coffee index 07e2357af1..dda967b41d 100644 --- a/src/server/store.coffee +++ b/src/server/store.coffee @@ -11,8 +11,7 @@ module.exports.customAccessControl = (store) -> # return next(true) store.readPathAccess "users.*", -> # captures, next) -> - return unless @session and @session.userId # https://github.com/codeparty/racer/issues/37 - console.log arguments + #return unless @session and @session.userId # https://github.com/codeparty/racer/issues/37 captures = arguments[0] next = arguments[arguments.length - 1] sameSession = captures is @session.userId @@ -20,7 +19,7 @@ module.exports.customAccessControl = (store) -> next sameSession or isServer store.writeAccess "*", "users.*", -> # captures, value, next) -> - return unless @session and @session.userId # https://github.com/codeparty/racer/issues/37 + #return unless @session and @session.userId # https://github.com/codeparty/racer/issues/37 [captures, next] = [arguments[0].split('.'), arguments[arguments.length-1]] uid = captures.shift() attrPath = captures.join('.') # new array shifted left, after shift() was run @@ -29,10 +28,10 @@ module.exports.customAccessControl = (store) -> #return next(true) if !this.req.socket; # public access to users.*.party.invitation (TODO, lock down a bit more) - console.log attrPath return next(true) if (attrPath == 'party.invitation') # Same session (user.id = this.session.userId) + console.log {uid:uid, sess:@session.userId} return next(true) if uid is @session.userId next(false) @@ -45,7 +44,7 @@ module.exports.customAccessControl = (store) -> # next(purchasingSomethingOnClient or isServer) store.writeAccess "*", "users.*.flags.ads", -> # captures, value, next -> - return unless @session and @session.userId # https://github.com/codeparty/racer/issues/37 + #return unless @session and @session.userId # https://github.com/codeparty/racer/issues/37 next = arguments[arguments.length - 1] isServer = not @req.socket next(isServer) @@ -59,7 +58,7 @@ module.exports.customAccessControl = (store) -> .limit(1) store.queryAccess "users", "withIdAndToken", (id, token, next) -> - return next(false) unless @session and @session.userId # https://github.com/codeparty/racer/issues/37 + #return next(false) unless @session and @session.userId # https://github.com/codeparty/racer/issues/37 isServer = not @req.socket next(isServer) @@ -88,4 +87,4 @@ module.exports.customAccessControl = (store) -> arguments[arguments.length-1](true) store.writeAccess "*", "parties.*", -> - arguments[arguments.length-1](true) + arguments[arguments.length-1](true) \ No newline at end of file