I'm not sure whether we should rename the class instead. I'm renaming the method because renaming the class would require more changes.
53 lines
1.6 KiB
Ruby
53 lines
1.6 KiB
Ruby
class RemoteTranslation < ApplicationRecord
|
|
belongs_to :remote_translatable, polymorphic: true
|
|
|
|
validates :remote_translatable_id, presence: true
|
|
validates :remote_translatable_type, presence: true
|
|
validates :locale, presence: true
|
|
validates :locale, inclusion: { in: ->(_) { RemoteTranslations::Microsoft::AvailableLocales.locales }}
|
|
validate :already_translated_resource
|
|
after_create :enqueue_remote_translation
|
|
|
|
def enqueue_remote_translation
|
|
RemoteTranslations::Caller.new(self).delay.call
|
|
end
|
|
|
|
def self.for(*args)
|
|
resources_groups(*args).flatten.select { |resource| translation_empty?(resource) }.map do |resource|
|
|
new(remote_translatable: resource, locale: I18n.locale)
|
|
end
|
|
end
|
|
|
|
def self.resources_groups(*args)
|
|
feeds = args.find { |arg| arg&.first.class == Widget::Feed } || []
|
|
|
|
args.compact - [feeds] + feeds.map(&:items)
|
|
end
|
|
|
|
def self.translation_empty?(resource)
|
|
resource.class.translates? && resource.translations.where(locale: I18n.locale).empty?
|
|
end
|
|
|
|
def self.create_all(remote_translations_params)
|
|
remote_translations_params.map do |remote_translation_params|
|
|
new(remote_translation_params)
|
|
end.reject(&:already_translated?).reject(&:enqueued?).each(&:save!)
|
|
end
|
|
|
|
def already_translated_resource
|
|
if already_translated?
|
|
errors.add(:locale, :already_translated)
|
|
end
|
|
end
|
|
|
|
def enqueued?
|
|
self.class.where(remote_translatable: remote_translatable,
|
|
locale: locale,
|
|
error_message: nil).any?
|
|
end
|
|
|
|
def already_translated?
|
|
remote_translatable&.translations&.where(locale: locale).present?
|
|
end
|
|
end
|