- rename SuggestionParser → WikiDataParser - change response key from suggestions → parsed_data
98 lines
3.5 KiB
Ruby
98 lines
3.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Provides batch wiki preview functionality for entity controllers
|
|
module BatchPreviewable
|
|
extend ActiveSupport::Concern
|
|
|
|
private
|
|
|
|
# Process a single wiki page and return preview data
|
|
# @param wiki_page [String] The wiki page name to fetch
|
|
# @param entity_type [Symbol] The type of entity (:character, :weapon, :summon)
|
|
# @param wiki_raw [String, nil] Pre-fetched wiki text (from client-side fetch)
|
|
# @return [Hash] Preview data including status, parsed_data, and errors
|
|
def process_wiki_preview(wiki_page, entity_type, wiki_raw: nil)
|
|
result = {
|
|
wiki_page: wiki_page,
|
|
status: 'success'
|
|
}
|
|
|
|
begin
|
|
# Use provided wiki_raw or fetch from wiki
|
|
wiki_text = if wiki_raw.present?
|
|
wiki_raw
|
|
else
|
|
wiki = Granblue::Parsers::Wiki.new
|
|
wiki.fetch(wiki_page)
|
|
end
|
|
|
|
# Handle redirects (only if we fetched server-side)
|
|
if wiki_raw.blank?
|
|
redirect_match = wiki_text.match(/#REDIRECT \[\[(.*?)\]\]/)
|
|
if redirect_match
|
|
redirect_target = redirect_match[1]
|
|
result[:redirected_from] = wiki_page
|
|
result[:wiki_page] = redirect_target
|
|
wiki_text = wiki.fetch(redirect_target)
|
|
end
|
|
end
|
|
|
|
result[:wiki_raw] = wiki_text
|
|
|
|
# Parse data from wiki text based on entity type
|
|
parsed_data = case entity_type
|
|
when :character
|
|
Granblue::Parsers::WikiDataParser.parse_character(wiki_text)
|
|
when :weapon
|
|
Granblue::Parsers::WikiDataParser.parse_weapon(wiki_text)
|
|
when :summon
|
|
Granblue::Parsers::WikiDataParser.parse_summon(wiki_text)
|
|
end
|
|
|
|
result[:granblue_id] = parsed_data[:granblue_id] if parsed_data[:granblue_id].present?
|
|
result[:parsed_data] = parsed_data
|
|
|
|
# Queue image download if we have a granblue_id
|
|
if parsed_data[:granblue_id].present?
|
|
result[:image_status] = queue_image_download(parsed_data[:granblue_id], entity_type)
|
|
else
|
|
result[:image_status] = 'no_id'
|
|
end
|
|
rescue Granblue::WikiError => e
|
|
result[:status] = 'error'
|
|
result[:error] = "Wiki page not found: #{e.message}"
|
|
rescue StandardError => e
|
|
Rails.logger.error "[BATCH_PREVIEW] Error processing #{wiki_page}: #{e.message}"
|
|
result[:status] = 'error'
|
|
result[:error] = "Failed to process wiki page: #{e.message}"
|
|
end
|
|
|
|
result
|
|
end
|
|
|
|
# Queue an image download job for the entity
|
|
# @param granblue_id [String] The granblue ID to download images for
|
|
# @param entity_type [Symbol] The type of entity
|
|
# @return [String] Status of the image download ('queued', 'skipped', 'error')
|
|
def queue_image_download(granblue_id, entity_type)
|
|
# Check if entity already exists in database
|
|
model_class = case entity_type
|
|
when :character then Character
|
|
when :weapon then Weapon
|
|
when :summon then Summon
|
|
end
|
|
|
|
existing = model_class.find_by(granblue_id: granblue_id)
|
|
if existing
|
|
# Entity exists, skip download (images likely already exist)
|
|
return 'exists'
|
|
end
|
|
|
|
# For now, we don't queue the download since the entity doesn't exist yet
|
|
# The image download will happen after the entity is created
|
|
'pending'
|
|
rescue StandardError => e
|
|
Rails.logger.error "[BATCH_PREVIEW] Error queueing image download: #{e.message}"
|
|
'error'
|
|
end
|
|
end
|