Used the feedback from Scott to improve endpoints

This commit is contained in:
Ruben Vereecken 2014-05-20 01:25:41 +02:00
parent 2003b37343
commit a3ca382dcd
7 changed files with 38 additions and 25 deletions

View file

@ -10,6 +10,10 @@ module.exports =
model: { type: 'string' } model: { type: 'string' }
description: { type: 'string' } description: { type: 'string' }
userField: { type: 'string' } userField: { type: 'string' }
<<<<<<< HEAD
=======
related: c.objectId
>>>>>>> 97602db... Refactored achievements and their endpoints as per the feedback by Scott.
proportionalTo: proportionalTo:
type: 'string' type: 'string'
description: 'For repeatables only. Denotes the field a repeatable achievement needs for its calculations' description: 'For repeatables only. Denotes the field a repeatable achievement needs for its calculations'

View file

@ -17,9 +17,11 @@ module.exports =
[ [
{ {
rel: 'extra' rel: 'extra'
href: '/db/user/{($)}' href: '/db/achievement/{($)}'
} }
] ]
collection:
type: 'string'
achievementName: achievementName:
type: 'string' type: 'string'
created: created:

View file

@ -4,8 +4,12 @@ forms = require('lib/forms')
app = require('application') app = require('application')
class SearchCollection extends Backbone.Collection class SearchCollection extends Backbone.Collection
initialize: (modelURL, @model, @term) -> initialize: (modelURL, @model, @term, @projection) ->
@url = "#{modelURL}/search?project=true" @url = "#{modelURL}/search?project="
if @projection? and not @projection == []
@url += projection[0]
@url += ',' + projected for projected in projection[1..]
else @url += "true"
@url += "&term=#{term}" if @term @url += "&term=#{term}" if @term
module.exports = class SearchView extends View module.exports = class SearchView extends View
@ -17,6 +21,7 @@ module.exports = class SearchView extends View
model: null # Article model: null # Article
modelURL: null # '/db/article' modelURL: null # '/db/article'
tableTemplate: null # require 'templates/editor/article/table' tableTemplate: null # require 'templates/editor/article/table'
projected: null # ['name', 'description', 'version'] or null for default
events: events:
'change input#search': 'runSearch' 'change input#search': 'runSearch'

View file

@ -13,4 +13,7 @@ EarnedAchievementSchema = new mongoose.Schema({
default: false default: false
}, {strict:false}) }, {strict:false})
# Maybe consider indexing on changed: -1 as well?
EarnedAchievementSchema.index({user: 1, achievement: 1}, {unique: true, name: 'earned achievement index'})
module.exports = EarnedAchievement = mongoose.model('EarnedAchievement', EarnedAchievementSchema) module.exports = EarnedAchievement = mongoose.model('EarnedAchievement', EarnedAchievementSchema)

View file

@ -5,7 +5,7 @@ class AchievementHandler extends Handler
modelClass: Achievement modelClass: Achievement
# Used to determine which properties requests may edit # Used to determine which properties requests may edit
editableProperties: ['name', 'query', 'worth', 'model', 'description', 'userField', 'proportionalTo'] editableProperties: ['name', 'query', 'worth', 'collection', 'description', 'userField', 'proportionalTo']
jsonSchema = require '../../app/schemas/models/achievement.coffee' jsonSchema = require '../../app/schemas/models/achievement.coffee'
hasAccess: (req) -> hasAccess: (req) ->

View file

@ -11,7 +11,7 @@ loadAchievements = ->
query = Achievement.find({}) query = Achievement.find({})
query.exec (err, docs) -> query.exec (err, docs) ->
_.each docs, (achievement) -> _.each docs, (achievement) ->
category = achievement.get 'model' category = achievement.get 'collection'
achievements[category] = [] unless category of achievements achievements[category] = [] unless category of achievements
achievements[category].push achievement achievements[category].push achievement
@ -49,29 +49,28 @@ module.exports = AchievablePlugin = (schema, options) ->
userObjectID = doc.get(achievement.get('userField')) userObjectID = doc.get(achievement.get('userField'))
userID = if _.isObject userObjectID then userObjectID.toHexString() else userObjectID # Standardize! Use strings, not ObjectId's userID = if _.isObject userObjectID then userObjectID.toHexString() else userObjectID # Standardize! Use strings, not ObjectId's
if newlyAchieved and not alreadyAchieved if newlyAchieved and (not alreadyAchieved or isRepeatable)
console.log 'Creating a new earned achievement called \'' + (achievement.get 'name') + '\' for ' + userID earned = {
earned = new EarnedAchievement(
user: userID user: userID
achievement: achievement._id.toHexString() achievement: achievement._id.toHexString()
achievementName: achievement.get 'name' achievementName: achievement.get 'name'
) }
earned.save (err, doc) -> if isRepeatable
console.log err if err? console.log 'Upserting repeatable achievement called \'' + (achievement.get 'name') + '\' for ' + userID
else if newlyAchieved and isRepeatable proportionalTo = achievement.get 'proportionalTo'
proportionalTo = achievement.get 'proportionalTo' originalValue = util.getByPath(originalDocObj, proportionalTo)
originalValue = util.getByPath(originalDocObj, proportionalTo) newValue = docObj.get proportionalTo
newValue = docObj.get proportionalTo
if originalValue != newValue if originalValue != newValue
upsertQuery = EarnedAchievement.findOneAndUpdate earned.notified = false
user: userID earned.achievedAmount = newValue
achievement: achievement._id.toHexString(), earned.changed = Date.now()
notified: false upsertQuery = EarnedAchievement.findOneAndUpdate earned, upsert:true
achievedAmount: newValue upsertQuery.exec (err, docs) ->
changed: Date.now(), console.log err if err?
upsert: true else # alreadyAchieved
upsertQuery.exec (err, docs) -> console.log 'Creating a new earned achievement called \'' + (achievement.get 'name') + '\' for ' + userID
(new EarnedAchievement(earned)).save (err, doc) ->
console.log err if err? console.log err if err?

View file

@ -10,7 +10,7 @@ async = require 'async'
log = require 'winston' log = require 'winston'
LevelSession = require('../levels/sessions/LevelSession') LevelSession = require('../levels/sessions/LevelSession')
LevelSessionHandler = require '../levels/sessions/level_session_handler' LevelSessionHandler = require '../levels/sessions/level_session_handler'
EarnedAchievement = require '../achievements/earned_achievement_handler' EarnedAchievement = require '../achievements/EarnedAchievement'
serverProperties = ['passwordHash', 'emailLower', 'nameLower', 'passwordReset'] serverProperties = ['passwordHash', 'emailLower', 'nameLower', 'passwordReset']
privateProperties = [ privateProperties = [