diff --git a/app/schemas/models/achievement.coffee b/app/schemas/models/achievement.coffee index f1ce6351b..1443d99cd 100644 --- a/app/schemas/models/achievement.coffee +++ b/app/schemas/models/achievement.coffee @@ -7,8 +7,9 @@ module.exports = name: c.shortString({title: 'Display Name'}) query: { $ref: 'mongoFindQuery' } # TODO make this happen worth: { type: 'number' } - collection: { type: 'string' } + model: { type: 'string' } description: { type: 'string' } + userField: { type: 'string' } proportionalTo: type: 'string' description: 'For repeatables only. Denotes the field a repeatable achievement needs for its calculations' diff --git a/app/schemas/models/achievement_earned.coffee b/app/schemas/models/earned_achievement.coffee similarity index 86% rename from app/schemas/models/achievement_earned.coffee rename to app/schemas/models/earned_achievement.coffee index 719266067..d56787ffb 100644 --- a/app/schemas/models/achievement_earned.coffee +++ b/app/schemas/models/earned_achievement.coffee @@ -20,6 +20,10 @@ module.exports = href: '/db/user/{($)}' } ] + achievementName: + type: 'string' + created: + type: 'date' achievedAmount: type: 'number' notified: diff --git a/server/achievements/Achievement.coffee b/server/achievements/Achievement.coffee index 3dedd0b78..6ad5e5c71 100644 --- a/server/achievements/Achievement.coffee +++ b/server/achievements/Achievement.coffee @@ -10,4 +10,4 @@ AchievementSchema = new mongoose.Schema({ query: Object }, {strict: false}) -module.exports = Achievement = mongoose.model('achievements', AchievementSchema) \ No newline at end of file +module.exports = Achievement = mongoose.model('achievement', AchievementSchema) \ No newline at end of file diff --git a/server/achievements/EarnedAchievement.coffee b/server/achievements/EarnedAchievement.coffee new file mode 100644 index 000000000..dd46c20d0 --- /dev/null +++ b/server/achievements/EarnedAchievement.coffee @@ -0,0 +1,13 @@ +mongoose = require 'mongoose' +jsonschema = require '../../app/schemas/models/earned_achievement' + +EarnedAchievementSchema = new mongoose.Schema({ + created: + type: Date + default: Date.now + notified: + type: Boolean + default: false +}, {strict:false}) + +module.exports = EarnedAchievement = mongoose.model('earned_achievement', EarnedAchievementSchema) \ No newline at end of file diff --git a/server/achievements/earned/AchievementEarned.coffee b/server/achievements/earned/AchievementEarned.coffee deleted file mode 100644 index 7020ea4ab..000000000 --- a/server/achievements/earned/AchievementEarned.coffee +++ /dev/null @@ -1,8 +0,0 @@ -mongoose = require 'mongoose' -jsonschema = require '../../../app/schemas/models/achievement_earned' - -AchievementEarnedSchema = new mongoose.Schema({ - user: Object -}, {strict:false}) - -module.exports = AchievementEarned = mongoose.model('achievements.earned', AchievementEarnedSchema) \ No newline at end of file diff --git a/server/plugins/achievements.coffee b/server/plugins/achievements.coffee index 379caa41a..5a115dbfd 100644 --- a/server/plugins/achievements.coffee +++ b/server/plugins/achievements.coffee @@ -1,6 +1,7 @@ mongoose = require('mongoose') Achievement = require('../achievements/Achievement') -AchievementEarned = require '../achievements/earned/AchievementEarned' +EarnedAchievement = require '../achievements/EarnedAchievement' +LocalMongo = require '../../app/lib/LocalMongo' achievements = {} @@ -9,13 +10,13 @@ loadAchievements = -> query = Achievement.find({}) query.exec (err, docs) -> _.each docs, (achievement) -> - achievements[achievement.get 'collection'] = [] unless achievement.collection in achievements - achievements[achievement.get 'collection'].push achievement + category = achievement.get 'model' + achievements[category] = [] unless category of achievements + achievements[category].push achievement loadAchievements() - # TODO make a difference between '$userID' and '$userObjectID' ? module.exports = AchievablePlugin = (schema, options) -> checkForAchievement = (doc) -> @@ -24,18 +25,41 @@ module.exports = AchievablePlugin = (schema, options) -> for achievement in achievements[collectionName] console.log achievement.get 'name' - fetched = {} + before = {} schema.post 'init', (doc) -> - fetched[doc.id] = doc - collectionName = doc.constructor.modelName - for achievement in achievements[collectionName] - console.log achievement.get 'name' - + before[doc.id] = doc schema.post 'save', (doc) -> - collectionName = doc.constructor.modelName - docBefore = fetched?.doc.id - for achievement in achievements[collectionName] - "placeholder" - # continue if init'd and already achieved - # else if new doc validates, new achievement! make the fucker \ No newline at end of file + isNew = not doc.isInit('_id') + console.log doc + console.log 'is new: ' + isNew + + category = doc.constructor.modelName + console.log 'category: ' + category + + if category of achievements + docObj = doc.toObject() + for achievement in achievements[category] + query = achievement.get('query') + isRepeatable = achievement.get('proportionalTo')? + console.log 'isRepeatable: ' + isRepeatable + alreadyAchieved = false + unless isNew + previousDocObj = before[doc.id].toObject() + alreadyAchieved = LocalMongo.matchesQuery previousDocObj, query + console.log 'Already achieved: ' + alreadyAchieved + console.log 'Matches: ' + LocalMongo.matchesQuery(docObj, query) + if LocalMongo.matchesQuery(docObj, query) and (isRepeatable or not alreadyAchieved) + userID = doc.get(achievement.get('userField')) + console.log 'Creating a new earned achievement for \'' + (achievement.get 'name') + '\' for ' + userID + earned = new EarnedAchievement( + user: if _.isObject userID then userID else new mongoose.Types.ObjectId(userID) # Standardize! Use ObjectId's + achievement: achievement._id + achievementName: achievement.get 'name' + ) + console.log earned + earned.save (err, doc) -> + console.log 'so something went wrong' if err? + + delete before[doc.id] unless isNew # This assumes everything we patch has a _id + return \ No newline at end of file