The HeroVictoryModal now has the server check for and upsert any missing items, levels and heroes earned.

This commit is contained in:
Scott Erickson 2014-11-26 12:02:42 -08:00
parent e8ed205038
commit c4fdcab6fe
2 changed files with 51 additions and 38 deletions
app/views/play/level/modal
server/achievements

View file

@ -64,37 +64,24 @@ module.exports = class HeroVictoryModal extends ModalView
thangType.project = ['original', 'rasterIcon', 'name', 'soundTriggers']
@thangTypes[thangTypeOriginal] = @supermodel.loadModel(thangType, 'thang').model
if achievementIDs.length
url = "/db/earned_achievement?view=get-by-achievement-ids&achievementIDs=#{achievementIDs.join(',')}"
earnedAchievements = new CocoCollection([], {
url: url
model: EarnedAchievement
@newEarnedAchievements = []
for achievement in @achievements.models
continue unless achievement.completed
ea = new EarnedAchievement({
collection: achievement.get('collection')
triggeredBy: @session.id
achievement: achievement.id
})
earnedAchievements.sizeShouldBe = achievementIDs.length
res = @supermodel.loadCollection(earnedAchievements, 'earned_achievements')
@earnedAchievements = res.model
@listenToOnce @earnedAchievements, 'sync', ->
@newEarnedAchievements = []
recorded = (earned.get('achievement') for earned in @earnedAchievements.length)
for achievement in @achievements.models
continue unless achievement.completed
earnedObjects = []
if achievement.id not in recorded
ea = new EarnedAchievement({
collection: achievement.get('collection')
triggeredBy: @session.id
achievement: achievement.id
})
ea.save()
@newEarnedAchievements.push ea
@listenToOnce ea, 'sync', ->
if _.all((ea.id for ea in @newEarnedAchievements))
@listenToOnce me, 'sync', ->
@readyToContinue = true
@updateSavingProgressStatus()
me.fetch() unless me.loading
else
@readyToContinue = true
ea.save()
@newEarnedAchievements.push ea
@listenToOnce ea, 'sync', ->
if _.all((ea.id for ea in @newEarnedAchievements))
@listenToOnce me, 'sync', ->
@readyToContinue = true
@updateSavingProgressStatus()
me.fetch() unless me.loading
@readyToContinue = true if not @achievements.models.length
getRenderData: ->
c = super()

View file

@ -61,19 +61,45 @@ class EarnedAchievementHandler extends Handler
EarnedAchievement.findOne q, (err, earned) -> callback(err, earned)
}, (err, { achievement, trigger, earned } ) =>
return @sendDatabaseError(res, err) if err
if earned
return @sendSuccess(res, earned.toObject())
if not achievement
return @sendNotFoundError(res, 'Could not find achievement.')
if not trigger
else if not trigger
return @sendNotFoundError(res, 'Could not find trigger.')
if achievement.get('proportionalTo')
else if earned
achievementEarned = achievement.get('rewards')
actuallyEarned = earned.get('earnedRewards')
if not _.isEqual(achievementEarned, actuallyEarned)
earned.set('earnedRewards', achievementEarned)
earned.save((err) =>
return @sendDatabaseError(res, err) if err
@upsertNonNumericRewards(req.user, achievement, (err) =>
return @sendDatabaseError(res, err) if err
return @sendSuccess(res, earned.toObject())
)
)
else
@upsertNonNumericRewards(req.user, achievement, (err) =>
return @sendDatabaseError(res, err) if err
return @sendSuccess(res, earned.toObject())
)
else if achievement.get('proportionalTo')
return @sendBadInputError(res, 'Cannot currently do this to repeatable docs...')
EarnedAchievement.createForAchievement(achievement, trigger, null, (earnedAchievementDoc) =>
@sendCreated(res, earnedAchievementDoc.toObject())
)
else
EarnedAchievement.createForAchievement(achievement, trigger, null, (earnedAchievementDoc) =>
@sendCreated(res, earnedAchievementDoc.toObject())
)
)
upsertNonNumericRewards: (user, achievement, done) ->
update = {}
for rewardType, rewards of achievement.get('rewards') ? {}
continue if rewardType is 'gems'
if rewards.length
update.$addToSet ?= {}
update.$addToSet["earned.#{rewardType}"] = $each: rewards
User.update {_id: user._id}, update, {}, (err, count) ->
log.error err if err?
done?(err)
getByAchievementIDs: (req, res) ->
query = { user: req.user._id+''}