mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-04-26 22:13:32 -04:00
Refactor getNameById to use mongo db's $in instead of parallel and use a new generic method in Handler.coffee
This commit is contained in:
parent
fced3e821a
commit
b20f8fd260
4 changed files with 20 additions and 29 deletions
app
server
|
@ -12,6 +12,6 @@ class NameLoader extends CocoClass
|
|||
loadedNames: (newNames) =>
|
||||
_.extend namesCache, newNames
|
||||
|
||||
getName: (id) -> namesCache[id]
|
||||
getName: (id) -> namesCache[id].name
|
||||
|
||||
module.exports = new NameLoader()
|
||||
|
|
|
@ -35,7 +35,7 @@ module.exports = class MyMatchesTabView extends CocoView
|
|||
for session in @sessions.models
|
||||
for match in session.get('matches') or []
|
||||
opponent = match.opponents[0]
|
||||
@nameMap[opponent.userID] ?= nameMap[opponent.userID]
|
||||
@nameMap[opponent.userID] ?= nameMap[opponent.userID].name
|
||||
@finishRendering()
|
||||
|
||||
$.ajax('/db/user/-/names', {
|
||||
|
|
|
@ -375,3 +375,17 @@ module.exports = class Handler
|
|||
return done(validation) unless validation.valid
|
||||
|
||||
document.save (err) -> done(err)
|
||||
|
||||
getPropertiesFromMultipleDocuments: (res, model, properties, ids) ->
|
||||
query = model.find()
|
||||
ids = ids.split(',') if _.isString ids
|
||||
ids = _.uniq ids
|
||||
for id in ids
|
||||
return errors.badInput(res, "Given an invalid id: #{id}") unless Handler.isID(id)
|
||||
query.where({'_id': { $in: ids} })
|
||||
query.select(properties).exec (err, documents) ->
|
||||
dict = {}
|
||||
_.each documents, (document) ->
|
||||
dict[document.id] = document
|
||||
res.send dict
|
||||
res.end()
|
||||
|
|
|
@ -120,34 +120,11 @@ UserHandler = class UserHandler extends Handler
|
|||
return @sendSuccess(res, @formatEntity(req, req.user, 256))
|
||||
super(req, res, id)
|
||||
|
||||
getNamesByIds: (req, res) ->
|
||||
getNamesByIDs: (req, res) ->
|
||||
ids = req.query.ids or req.body.ids
|
||||
ids = ids.split(',') if _.isString ids
|
||||
ids = _.uniq ids
|
||||
|
||||
# TODO: Extend and repurpose this handler to return other public info about a user more flexibly,
|
||||
# say by a query parameter that lists public properties to return.
|
||||
returnWizard = req.query.wizard or req.body.wizard
|
||||
query = if returnWizard then {name:1, wizard:1} else {name:1}
|
||||
|
||||
makeFunc = (id) ->
|
||||
(callback) ->
|
||||
User.findById(id, query).exec (err, document) ->
|
||||
return done(err) if err
|
||||
if document and returnWizard
|
||||
callback(null, {name:document.get('name'), wizard:document.get('wizard') or {}})
|
||||
else
|
||||
callback(null, document?.get('name') or '')
|
||||
|
||||
funcs = {}
|
||||
for id in ids
|
||||
return errors.badInput(res, "Given an invalid id: #{id}") unless Handler.isID(id)
|
||||
funcs[id] = makeFunc(id)
|
||||
|
||||
async.parallel funcs, (err, results) ->
|
||||
return errors.serverError err if err
|
||||
res.send results
|
||||
res.end()
|
||||
properties = if returnWizard then "name wizard" else "name"
|
||||
@getPropertiesFromMultipleDocuments res, User, properties, ids
|
||||
|
||||
nameToID: (req, res, name) ->
|
||||
User.findOne({nameLower:name.toLowerCase()}).exec (err, otherUser) ->
|
||||
|
@ -206,7 +183,7 @@ UserHandler = class UserHandler extends Handler
|
|||
getByRelationship: (req, res, args...) ->
|
||||
return @agreeToCLA(req, res) if args[1] is 'agreeToCLA'
|
||||
return @avatar(req, res, args[0]) if args[1] is 'avatar'
|
||||
return @getNamesByIds(req, res) if args[1] is 'names'
|
||||
return @getNamesByIDs(req, res) if args[1] is 'names'
|
||||
return @nameToID(req, res, args[0]) if args[1] is 'nameToID'
|
||||
return @getLevelSessions(req, res, args[0]) if args[1] is 'level.sessions'
|
||||
return @getCandidates(req, res) if args[1] is 'candidates'
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue