mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-05-02 17:03:42 -04:00
Used the feedback from Scott to improve endpoints
This commit is contained in:
parent
2003b37343
commit
a3ca382dcd
7 changed files with 38 additions and 25 deletions
app
server
achievements
plugins
users
|
@ -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'
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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)
|
|
@ -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) ->
|
||||||
|
|
|
@ -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?
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 = [
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue