lib/locomotive/steam/middlewares/missing_translations.rb
module Locomotive
module Steam
module Middlewares
class MissingTranslations
def initialize(app, opts = {})
@app = app
end
def call(env)
find_and_persist_missing_translations(env['locomotive.site']) do
@app.call(env)
end
end
def find_and_persist_missing_translations(site)
translations = []
subscription = ActiveSupport::Notifications.subscribe('steam.missing_translation') do |name, start, finish, id, payload|
translations << { key: payload[:input], values: { payload[:input] => false } }
end
yield.tap do
ActiveSupport::Notifications.unsubscribe(subscription)
persist_missing_translations(site, translations) unless translations.empty?
end
end
def persist_missing_translations(site, translations)
new_translations = []
translations.each do |attributes|
if existing = site.translations.where(key: attributes[:key]).first
# don't need to call the DB if we already have the values in DB
next if existing.values == attributes[:values]
existing.update_attribute :values, existing.values.merge(attributes[:values])
else
new_translations << attributes
end
end
site.translations.create(new_translations) unless new_translations.empty?
end
end
end
end
end