groups: optimize public groups fetch by putting in same fetch as

myGroups (but before, due to projections bug)
This commit is contained in:
Tyler Renelle
2013-06-03 00:16:02 -04:00
parent 4bd6246e75
commit fbcf21cd9d
+44 -45
View File
@@ -34,55 +34,54 @@ setupSubscriptions = (page, model, params, next, cb) ->
# Fetch public groups as _publicGroups
# Note: due to https://github.com/codeparty/racer/issues/57, this has to come at the very beginning. The more limited
# the returned fields in motifs, the sooner they must come in fetch / subscribes.
model.query('groups').publicGroups().fetch (err, pg) ->
publicGroupsQuery = model.query('groups').publicGroups()
myGroupsQuery = model.query('groups').withMember(uuid)
model.fetch publicGroupsQuery, myGroupsQuery, (err, publicGroups, groups) ->
return next(err) if err
model.set '_publicGroups', _.sortBy(pg.get(), (g) -> -_.size(g.members))
model.set '_publicGroups', _.sortBy(publicGroups.get(), (g) -> -_.size(g.members))
finished = (descriptors, paths) ->
# Add public "Tavern" guild in
descriptors.push('groups.habitrpg'); paths.push('_habitRPG')
model.query('groups').withMember(uuid).fetch (err, groups) ->
return next(err) if err
finished = (descriptors, paths) ->
# Add public "Tavern" guild in
descriptors.push('groups.habitrpg'); paths.push('_habitRPG')
# Subscribe to each descriptor
model.subscribe.apply model, descriptors.concat ->
[err, refs] = [arguments[0], arguments]
return next(err) if err
_.each paths, (path, idx) -> model.ref path, refs[idx+1]; true
unless model.get('_user')
console.error "User not found - this shouldn't be happening!"
return page.redirect('/logout') #delete model.session.userId
return cb()
groupsObj = groups.get()
# (1) Solo player
return finished([selfQ], ['_user']) if _.isEmpty(groupsObj)
## (2) Party or Guild has members, fetch those users too
# Subscribe to the groups themselves. We separate them by _party, _guilds, and _habitRPG (the "global" guild).
groupsInfo = _.reduce groupsObj, ((m,g)->
if g.type is 'guild' then m.guildIds.push(g.id) else m.partyId = g.id
m.members = m.members.concat(g.members)
m
), {guildIds:[], partyId:null, members:[]}
# Fetch, not subscribe. There's nothing dynamic we need from members, just the the Group (below) which includes chat, challenges, etc
model.query('users').publicInfo(groupsInfo.members).fetch (err, members) ->
# Subscribe to each descriptor
model.subscribe.apply model, descriptors.concat ->
[err, refs] = [arguments[0], arguments]
return next(err) if err
# we need _members as an object in the view, so we can iterate over _party.members as :id, and access _members[:id] for the info
mObj = members.get()
model.set "_members", _.object(_.pluck(mObj,'id'), mObj)
model.set "_membersArray", mObj
_.each paths, (path, idx) -> model.ref path, refs[idx+1]; true
unless model.get('_user')
console.error "User not found - this shouldn't be happening!"
return page.redirect('/logout') #delete model.session.userId
# Note - selfQ *must* come after membersQ in subscribe, otherwise _user will only get the fields restricted by party-members in store.coffee. Strang bug, but easy to get around
partyQ = model.query('groups').withIds(groupsInfo.partyId)
if _.isEmpty(groupsInfo.guildIds)
finished [partyQ, selfQ], ['_party', '_user']
else
guildsQ = model.query('groups').withIds(groupsInfo.guildIds)
finished [partyQ, guildsQ, selfQ], ['_party', '_guilds', '_user']
return cb()
groupsObj = groups.get()
# (1) Solo player
return finished([selfQ], ['_user']) if _.isEmpty(groupsObj)
## (2) Party or Guild has members, fetch those users too
# Subscribe to the groups themselves. We separate them by _party, _guilds, and _habitRPG (the "global" guild).
groupsInfo = _.reduce groupsObj, ((m,g)->
if g.type is 'guild' then m.guildIds.push(g.id) else m.partyId = g.id
m.members = m.members.concat(g.members)
m
), {guildIds:[], partyId:null, members:[]}
# Fetch, not subscribe. There's nothing dynamic we need from members, just the the Group (below) which includes chat, challenges, etc
model.query('users').publicInfo(groupsInfo.members).fetch (err, members) ->
return next(err) if err
# we need _members as an object in the view, so we can iterate over _party.members as :id, and access _members[:id] for the info
mObj = members.get()
model.set "_members", _.object(_.pluck(mObj,'id'), mObj)
model.set "_membersArray", mObj
# Note - selfQ *must* come after membersQ in subscribe, otherwise _user will only get the fields restricted by party-members in store.coffee. Strang bug, but easy to get around
partyQ = model.query('groups').withIds(groupsInfo.partyId)
if _.isEmpty(groupsInfo.guildIds)
finished [partyQ, selfQ], ['_party', '_user']
else
guildsQ = model.query('groups').withIds(groupsInfo.guildIds)
finished [partyQ, guildsQ, selfQ], ['_party', '_guilds', '_user']
# ========== ROUTES ==========