Achievements can have icons. Users now have their scores denormalized

This commit is contained in:
Ruben Vereecken 2014-05-22 16:59:01 +02:00
parent 287019242f
commit aa3fedeb02
6 changed files with 22 additions and 14 deletions

View file

@ -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'

View file

@ -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'

View file

@ -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:

View file

@ -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())

View file

@ -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) ->

View file

@ -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?