From f589f58eb5cfdaa5ed42d84979a33149aca2d72a Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Sun, 14 Dec 2025 13:12:25 -0800 Subject: [PATCH] batch_preview: accept pre-fetched wiki_data from client --- .../api/v1/characters_controller.rb | 3 +- app/controllers/api/v1/summons_controller.rb | 3 +- app/controllers/api/v1/weapons_controller.rb | 3 +- app/controllers/concerns/batch_previewable.rb | 29 ++++++++++++------- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/app/controllers/api/v1/characters_controller.rb b/app/controllers/api/v1/characters_controller.rb index 71412b9..b98b27d 100644 --- a/app/controllers/api/v1/characters_controller.rb +++ b/app/controllers/api/v1/characters_controller.rb @@ -163,6 +163,7 @@ module Api # Fetches wiki data and suggestions for multiple wiki page names def batch_preview wiki_pages = params[:wiki_pages] + wiki_data = params[:wiki_data] || {} unless wiki_pages.is_a?(Array) && wiki_pages.any? return render json: { error: 'wiki_pages must be a non-empty array' }, status: :unprocessable_entity @@ -172,7 +173,7 @@ module Api wiki_pages = wiki_pages.first(10) results = wiki_pages.map do |wiki_page| - process_wiki_preview(wiki_page, :character) + process_wiki_preview(wiki_page, :character, wiki_raw: wiki_data[wiki_page]) end render json: { results: results } diff --git a/app/controllers/api/v1/summons_controller.rb b/app/controllers/api/v1/summons_controller.rb index 2f748c1..3c124c5 100644 --- a/app/controllers/api/v1/summons_controller.rb +++ b/app/controllers/api/v1/summons_controller.rb @@ -154,6 +154,7 @@ module Api # Fetches wiki data and suggestions for multiple wiki page names def batch_preview wiki_pages = params[:wiki_pages] + wiki_data = params[:wiki_data] || {} unless wiki_pages.is_a?(Array) && wiki_pages.any? return render json: { error: 'wiki_pages must be a non-empty array' }, status: :unprocessable_entity @@ -163,7 +164,7 @@ module Api wiki_pages = wiki_pages.first(10) results = wiki_pages.map do |wiki_page| - process_wiki_preview(wiki_page, :summon) + process_wiki_preview(wiki_page, :summon, wiki_raw: wiki_data[wiki_page]) end render json: { results: results } diff --git a/app/controllers/api/v1/weapons_controller.rb b/app/controllers/api/v1/weapons_controller.rb index cda58f0..b7bb044 100644 --- a/app/controllers/api/v1/weapons_controller.rb +++ b/app/controllers/api/v1/weapons_controller.rb @@ -154,6 +154,7 @@ module Api # Fetches wiki data and suggestions for multiple wiki page names def batch_preview wiki_pages = params[:wiki_pages] + wiki_data = params[:wiki_data] || {} unless wiki_pages.is_a?(Array) && wiki_pages.any? return render json: { error: 'wiki_pages must be a non-empty array' }, status: :unprocessable_entity @@ -163,7 +164,7 @@ module Api wiki_pages = wiki_pages.first(10) results = wiki_pages.map do |wiki_page| - process_wiki_preview(wiki_page, :weapon) + process_wiki_preview(wiki_page, :weapon, wiki_raw: wiki_data[wiki_page]) end render json: { results: results } diff --git a/app/controllers/concerns/batch_previewable.rb b/app/controllers/concerns/batch_previewable.rb index 324c6f1..a1671ee 100644 --- a/app/controllers/concerns/batch_previewable.rb +++ b/app/controllers/concerns/batch_previewable.rb @@ -9,25 +9,32 @@ module BatchPreviewable # 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, suggestions, and errors - def process_wiki_preview(wiki_page, entity_type) + def process_wiki_preview(wiki_page, entity_type, wiki_raw: nil) result = { wiki_page: wiki_page, status: 'success' } begin - # Fetch wiki content - wiki = Granblue::Parsers::Wiki.new - wiki_text = wiki.fetch(wiki_page) + # 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 - 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) + # 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