mirror of
https://github.com/sudoxnym/habitica-self-host.git
synced 2026-08-01 11:40:25 +00:00
bunch of model subscription fixes, mostly due to @lackac's racer
session fix
This commit is contained in:
parent
966d81b9b8
commit
98f1e0e690
3 changed files with 95 additions and 80 deletions
|
|
@ -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 ==========
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
Loading…
Reference in a new issue