# frozen_string_literal: true class WowItemsWorker < WowSidekiqWorker def perform(item_id, batch_size, keep_going_on) RBattlenet.authenticate(client_id: ENV['BLIZZARD_API_CLIENT_ID'], client_secret: ENV['BLIZZARD_API_CLIENT_SECRET']) RBattlenet.set_options(locale: 'all') params = { _page: 1, _pageSize: batch_size, orderby: 'id', filters: { id: "[#{item_id},]" } } result = RBattlenet::Wow::Search::Item.find(params) return unless result.status_code == 200 result.results&.each do |item| wow_item = WowItem.find_or_initialize_by(item_id: item.data.id) wow_item.level = item.data.level if item.data.level wow_item.required_level = item.data.required_level if item.data.required_level wow_item.sell_price = item.data.sell_price if item.data.sell_price wow_item.purchase_price = item.data.purchase_price if item.data.purchase_price wow_item.is_equippable = item.data.is_equippable if item.data.is_equippable wow_item.is_stackable = item.data.is_stackable if item.data.is_stackable wow_item.media_id = item.data.media.id if item.data.media.id wow_item.max_count = item.data.max_count if item.data.max_count wow_item.wow_item_class = WowItemClass.find_by(item_class_id: item.data.item_class.id) wow_item.wow_item_sub_class = WowItemSubClass.joins(:wow_item_class).where(item_sub_class_id: item.data.item_subclass.id, wow_item_class: { item_class_id: item.data.item_class.id }).first wow_item.wow_item_quality = find_or_create_wow_item_quality(item.data.quality) wow_item.wow_item_inventory_type = find_or_create_wow_item_inventory_type(item.data.inventory_type) # Localisation data locales.each do |locale| Mobility.with_locale(locale[0]) do wow_item.name = item.data.name[locale[1]] end end wow_item.save end # Create a new job for the next batch if keep_going_on is true return unless keep_going_on && !result.results.count.zero? WowItemsWorker.perform_async(result.results.last.data.id + 1, batch_size, keep_going_on) end private def find_or_create_wow_item_quality(item_quality) wow_item_quality = WowItemQuality.find_or_initialize_by(item_quality_type: item_quality.type) # Localisation data locales.each do |locale| Mobility.with_locale(locale[0]) do wow_item_quality.name = item_quality.name[locale[1]] end end wow_item_quality.save wow_item_quality.persisted? ? wow_item_quality : nil end def find_or_create_wow_item_inventory_type(item_inventory_type) wow_item_inventory_type = WowItemInventoryType.find_or_initialize_by(item_inventory_type: item_inventory_type.type) # Localisation data locales.each do |locale| Mobility.with_locale(locale[0]) do wow_item_inventory_type.name = item_inventory_type.name[locale[1]] end end wow_item_inventory_type.save wow_item_inventory_type.persisted? ? wow_item_inventory_type : nil end end