bunch of model subscription fixes, mostly due to @lackac's racer

session fix
This commit is contained in:
Tyler Renelle 2013-02-05 18:12:39 -05:00
parent 966d81b9b8
commit 98f1e0e690
3 changed files with 95 additions and 80 deletions

View file

@ -38,55 +38,54 @@ get '/', (page, model, next) ->
# This used to be in party.server(model, cb), but was getting `TypeError: Object #<Model> 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 ==========

View file

@ -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

View file

@ -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)