mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-04-01 07:40:22 -04:00
Achievements can have icons. Users now have their scores denormalized
This commit is contained in:
parent
287019242f
commit
aa3fedeb02
6 changed files with 22 additions and 14 deletions
app
server
|
@ -26,7 +26,7 @@ MongoFindQuerySchema =
|
|||
#{ $ref: '#/definitions/' + MongoQueryOperatorSchema.id},
|
||||
{ type: 'string' }
|
||||
]
|
||||
additionalProperties: false
|
||||
additionalProperties: true
|
||||
definitions: {}
|
||||
|
||||
MongoFindQuerySchema.definitions[MongoQueryOperatorSchema.id] = MongoQueryOperatorSchema
|
||||
|
@ -38,13 +38,14 @@ c.extendSearchableProperties AchievementSchema
|
|||
|
||||
_.extend(AchievementSchema.properties,
|
||||
query:
|
||||
type:'object'
|
||||
#$ref: '#/definitions/' + MongoFindQuerySchema.id
|
||||
#type:'object'
|
||||
$ref: '#/definitions/' + MongoFindQuerySchema.id
|
||||
worth: { type: 'number' }
|
||||
collection: { type: 'string' }
|
||||
description: { type: 'string' }
|
||||
userField: { type: 'string' }
|
||||
related: c.objectId
|
||||
related: c.objectId(description: 'Related entity')
|
||||
icon: { type: 'string', format: 'image-file', title: 'Icon' }
|
||||
proportionalTo:
|
||||
type: 'string'
|
||||
description: 'For repeatables only. Denotes the field a repeatable achievement needs for its calculations'
|
||||
|
|
|
@ -114,6 +114,7 @@ UserSchema = c.object {},
|
|||
linkedinID: c.shortString {title:"LinkedInID", description: "The user's LinkedIn ID when they signed the contract."}
|
||||
date: c.date {title: "Date signed employer agreement"}
|
||||
data: c.object {description: "Cached LinkedIn data slurped from profile."}
|
||||
points: {type:'number'}
|
||||
|
||||
|
||||
c.extendBasicProperties UserSchema, 'user'
|
||||
|
|
|
@ -39,7 +39,7 @@ module.exports = class AchievementEditView extends View
|
|||
data = $.extend(true, {}, @achievement.attributes)
|
||||
options =
|
||||
data: data
|
||||
#filePath: "db/thang.type/#{@article.get('original')}"
|
||||
filePath: "db/achievement/#{@achievement.get('_id')}"
|
||||
schema: Achievement.schema
|
||||
readOnly: me.get('anonymous')
|
||||
callbacks:
|
||||
|
|
|
@ -18,11 +18,9 @@ AchievementSchema.methods.objectifyQuery = () ->
|
|||
catch error
|
||||
#log.error "Couldn't convert query string to object because of #{error}"
|
||||
@set('query', {})
|
||||
console.log @
|
||||
|
||||
AchievementSchema.methods.stringifyQuery = () ->
|
||||
@set('query', JSON.stringify(@get('query'))) if typeof @get('query') != "string"
|
||||
console.log @
|
||||
|
||||
AchievementSchema.post('init', (doc) -> doc.objectifyQuery())
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ class AchievementHandler extends Handler
|
|||
modelClass: Achievement
|
||||
|
||||
# Used to determine which properties requests may edit
|
||||
editableProperties: ['name', 'query', 'worth', 'collection', 'description', 'userField', 'proportionalTo']
|
||||
editableProperties: ['name', 'query', 'worth', 'collection', 'description', 'userField', 'proportionalTo', 'icon']
|
||||
jsonSchema = require '../../app/schemas/models/achievement.coffee'
|
||||
|
||||
hasAccess: (req) ->
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
mongoose = require('mongoose')
|
||||
Achievement = require('../achievements/Achievement')
|
||||
EarnedAchievement = require '../achievements/EarnedAchievement'
|
||||
User = require '../users/User'
|
||||
LocalMongo = require '../../app/lib/LocalMongo'
|
||||
util = require '../../app/lib/utils'
|
||||
|
||||
|
@ -58,17 +59,24 @@ module.exports = AchievablePlugin = (schema, options) ->
|
|||
if isRepeatable
|
||||
console.log 'Upserting repeatable achievement called \'' + (achievement.get 'name') + '\' for ' + userID
|
||||
proportionalTo = achievement.get 'proportionalTo'
|
||||
originalValue = util.getByPath(originalDocObj, proportionalTo)
|
||||
newValue = docObj.get proportionalTo
|
||||
originalAmount = util.getByPath(originalDocObj, proportionalTo) or 0
|
||||
newAmount = docObj.get proportionalTo
|
||||
|
||||
if originalValue != newValue
|
||||
if originalAmount isnt newAmount
|
||||
earned.notified = false
|
||||
earned.achievedAmount = newValue
|
||||
earned.achievedAmount = newAmount
|
||||
earned.changed = Date.now()
|
||||
upsertQuery = EarnedAchievement.findOneAndUpdate earned, upsert:true
|
||||
upsertQuery.exec (err, docs) ->
|
||||
console.log err if err?
|
||||
else # alreadyAchieved
|
||||
return console.log err if err?
|
||||
|
||||
# Update user's denormalized score
|
||||
userQuery = User.findOne(_id: userID)
|
||||
userQuery.exec (err, user) ->
|
||||
return console.error(err) if err?
|
||||
previousPoints = user.get('points') - achievement.get('worth') * originalAmount
|
||||
user.set('points', previousPoints + achievement.get('worth') * newAmount)
|
||||
else # not alreadyAchieved
|
||||
console.log 'Creating a new earned achievement called \'' + (achievement.get 'name') + '\' for ' + userID
|
||||
(new EarnedAchievement(earned)).save (err, doc) ->
|
||||
console.log err if err?
|
||||
|
|
Loading…
Add table
Reference in a new issue