First step towards fetching related by slug

This commit is contained in:
Ruben Vereecken 2014-07-28 21:25:11 +02:00
parent 735a7082ee
commit cc7474538f
2 changed files with 34 additions and 23 deletions

View file

@ -30,6 +30,10 @@ module.exports.NamedPlugin = (schema) ->
schema.add({name: String, slug: String}) schema.add({name: String, slug: String})
schema.index({'slug': 1}, {unique: true, sparse: true, name: 'slug index'}) schema.index({'slug': 1}, {unique: true, sparse: true, name: 'slug index'})
schema.statics.getBySlug = (slug, done) ->
@findOne {slug: slug}, (err, doc) ->
if err then done err else done doc
schema.pre('save', (next) -> schema.pre('save', (next) ->
if schema.uses_coco_versions if schema.uses_coco_versions
v = @get('version') v = @get('version')

View file

@ -239,31 +239,38 @@ UserHandler = class UserHandler extends Handler
documents = (LevelSessionHandler.formatEntity(req, doc) for doc in documents) documents = (LevelSessionHandler.formatEntity(req, doc) for doc in documents)
@sendSuccess(res, documents) @sendSuccess(res, documents)
getLevelSessions: (req, res, userID) -> IDify: (idOrSlug, done) ->
query = creator: userID if Handler.isID idOrSlug
isAuthorized = req.user._id+'' is userID or req.user.isAdmin() done idOrSlug
projection = {} else
if req.query.project User.getBySlug idOrSlug, (user) -> done user?.get '_id'
projection[field] = 1 for field in req.query.project.split(',') when isAuthorized or not (field in LevelSessionHandler.privateProperties)
else unless isAuthorized
projection[field] = 0 for field in LevelSessionHandler.privateProperties
LevelSession.find(query).select(projection).exec (err, documents) => getLevelSessions: (req, res, userIDOrSlug) ->
return @sendDatabaseError(res, err) if err @IDify userIDOrSlug, (userID) =>
documents = (LevelSessionHandler.formatEntity(req, doc) for doc in documents) query = creator: userID + ''
@sendSuccess(res, documents) isAuthorized = req.user._id+'' is userID or req.user.isAdmin()
projection = {}
if req.query.project
projection[field] = 1 for field in req.query.project.split(',') when isAuthorized or not (field in LevelSessionHandler.privateProperties)
else unless isAuthorized
projection[field] = 0 for field in LevelSessionHandler.privateProperties
getEarnedAchievements: (req, res, userID) -> LevelSession.find(query).select(projection).exec (err, documents) =>
queryObject = {$query: {user: userID}, $orderby: {changed: -1}} return @sendDatabaseError(res, err) if err
queryObject.$query.notified = false if req.query.notified is 'false' documents = (LevelSessionHandler.formatEntity(req, doc) for doc in documents)
query = EarnedAchievement.find(queryObject) @sendSuccess(res, documents)
query.exec (err, documents) =>
return @sendDatabaseError(res, err) if err? getEarnedAchievements: (req, res, userIDOrSlug) ->
cleandocs = (@formatEntity(req, doc) for doc in documents) @IDify userIDOrSlug, (userID) =>
for doc in documents # Maybe move this logic elsewhere query = user: userID + ''
doc.set('notified', true) query.notified = false if req.query.notified is 'false'
doc.save() EarnedAchievement.find(query).sort(changed: -1).exec (err, documents) =>
@sendSuccess(res, cleandocs) return @sendDatabaseError(res, err) if err?
cleandocs = (@formatEntity(req, doc) for doc in documents)
for doc in documents # TODO Ruben Maybe move this logic elsewhere
doc.set('notified', true)
doc.save()
@sendSuccess(res, cleandocs)
trackActivity: (req, res, userID, activityName, increment=1) -> trackActivity: (req, res, userID, activityName, increment=1) ->
return @sendMethodNotAllowed res unless req.method is 'POST' return @sendMethodNotAllowed res unless req.method is 'POST'