mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-25 08:38:09 -05:00
48 lines
2.1 KiB
CoffeeScript
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
|