codecombat/app/models/Poll.coffee

48 lines
2.1 KiB
CoffeeScript

CocoModel = require './CocoModel'
schema = require 'schemas/models/poll.schema'
module.exports = class Poll extends CocoModel
@className: 'Poll'
@schema: schema
urlRoot: '/db/poll'
applyDelta: (delta) ->
# Hackiest hacks ever, just manually mauling the delta (whose format I don't understand) to not overwrite votes and other languages' nested translations.
# One still must be careful about patches that accidentally delete keys from the top-level i18n object.
i18nDelta = {}
if delta.i18n
i18nDelta.i18n = $.extend true, {}, delta.i18n
for answerIndex, answerChanges of delta.answers ? {}
i18nDelta.answers ?= {}
if _.isArray answerChanges
i18nDelta.answers[answerIndex] ?= []
for change in answerChanges
if _.isNumber change
pickedChange = change
else
pickedChange = $.extend true, {}, change
for key of pickedChange
answerIndexNum = parseInt(answerIndex.replace('_', ''), 10)
unless _.isNaN answerIndexNum
oldValue = @get('answers')[answerIndexNum][key]
isDeletion = _.string.startsWith answerIndex, '_'
isI18N = key is 'i18n'
if isI18N and not isDeletion
# Use the new change, but make sure we're not deleting any other languages' translations.
value = pickedChange[key]
for language, oldTranslations of oldValue ? {}
for translationKey, translationValue of oldTranslations ? {}
value[language] ?= {}
value[language][translationKey] ?= translationValue
else
value = oldValue
pickedChange[key] = value
i18nDelta.answers[answerIndex].push pickedChange
else
i18nDelta.answers[answerIndex] = answerChanges
if answerChanges?.votes
i18nDelta.answers[answerIndex] = _.omit answerChanges, 'votes'
#console.log 'got delta', delta
#console.log 'got i18nDelta', i18nDelta
super i18nDelta