From 8f77a1f6132581af1c78e71eaf1795ad7e4e233f Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Sun, 9 Feb 2025 18:03:35 -0800 Subject: [PATCH] Refactor grid blueprints - **GridCharacterBlueprint:** - Removed `:minimal` view restriction on `party` association. - Improved nil checks for `ring1`, `ring2`, and `earring` to prevent errors. - Converted string values in `awakening_level`, `over_mastery`, and `aetherial_mastery` fields to integers for consistency. - Ensured `over_mastery` and `aetherial_mastery` only include valid entries, filtering out blank or zero-modifier values. - **GridWeaponBlueprint:** - Removed `:minimal` view restriction on `party` association. - Ensured `weapon` association exists before accessing `ax`, `series`, or `awakening`. - Improved conditional checks for `weapon_keys` to prevent errors when `weapon` or `series` is nil. - Converted `awakening_level` field to integer for consistency. - **GridCharacterBlueprint:** - Removed `:minimal` view restriction on `party` association. --- .../api/v1/grid_character_blueprint.rb | 30 ++++++++++++++----- .../api/v1/grid_summon_blueprint.rb | 4 +-- .../api/v1/grid_weapon_blueprint.rb | 18 +++++++---- 3 files changed, 37 insertions(+), 15 deletions(-) diff --git a/app/blueprints/api/v1/grid_character_blueprint.rb b/app/blueprints/api/v1/grid_character_blueprint.rb index 5ee1d14..766e6b4 100644 --- a/app/blueprints/api/v1/grid_character_blueprint.rb +++ b/app/blueprints/api/v1/grid_character_blueprint.rb @@ -19,7 +19,7 @@ module Api end view :uncap do - association :party, blueprint: PartyBlueprint, view: :minimal + association :party, blueprint: PartyBlueprint fields :position, :uncap_level end @@ -31,19 +31,35 @@ module Api field :awakening, if: ->(_field_name, gc, _options) { gc.association(:awakening).loaded? } do |gc| { type: AwakeningBlueprint.render_as_hash(gc.awakening), - level: gc.awakening_level + level: gc.awakening_level.to_i } end field :over_mastery, if: lambda { |_fn, obj, _opt| - !obj.ring1['modifier'].nil? && !obj.ring2['modifier'].nil? + obj.ring1.present? && obj.ring2.present? && !obj.ring1['modifier'].nil? && !obj.ring2['modifier'].nil? } do |c| - [c.ring1, c.ring2, c.ring3, c.ring4].reject { |ring| ring['modifier'].nil? } + mapped_rings = [c.ring1, c.ring2, c.ring3, c.ring4].each_with_object([]) do |ring, arr| + # Skip if the ring is nil or its modifier is blank. + next if ring.blank? || ring['modifier'].blank? + + # Convert the string values to numbers. + mod = ring['modifier'].to_i + + # Only include if modifier is non-zero. + next if mod.zero? + + arr << { modifier: mod, strength: ring['strength'].to_i } + end + + mapped_rings end - field :aetherial_mastery, if: lambda { |_fn, obj, _opt| - !obj.earring['modifier'].nil? - }, &:earring + field :aetherial_mastery, if: ->(_fn, obj, _opt) { obj.earring.present? && !obj.earring['modifier'].nil? } do |gc, _options| + { + modifier: gc.earring['modifier'].to_i, + strength: gc.earring['strength'].to_i + } + end end end end diff --git a/app/blueprints/api/v1/grid_summon_blueprint.rb b/app/blueprints/api/v1/grid_summon_blueprint.rb index c4516af..a4c3df1 100644 --- a/app/blueprints/api/v1/grid_summon_blueprint.rb +++ b/app/blueprints/api/v1/grid_summon_blueprint.rb @@ -15,11 +15,11 @@ module Api view :full do include_view :nested - association :party, blueprint: PartyBlueprint, view: :minimal + association :party, blueprint: PartyBlueprint end view :uncap do - association :party, blueprint: PartyBlueprint, view: :minimal + association :party, blueprint: PartyBlueprint fields :position, :uncap_level, :transcendence_step end diff --git a/app/blueprints/api/v1/grid_weapon_blueprint.rb b/app/blueprints/api/v1/grid_weapon_blueprint.rb index 2530955..1c82935 100644 --- a/app/blueprints/api/v1/grid_weapon_blueprint.rb +++ b/app/blueprints/api/v1/grid_weapon_blueprint.rb @@ -10,33 +10,39 @@ module Api end view :nested do - field :ax, if: ->(_field_name, w, _options) { w.weapon.ax } do |w| + field :ax, if: ->(_field_name, w, _options) { w.weapon.present? && w.weapon.ax } do |w| [ { modifier: w.ax_modifier1, strength: w.ax_strength1 }, { modifier: w.ax_modifier2, strength: w.ax_strength2 } ] end - field :awakening, if: ->(_field_name, w, _options) { w.association(:awakening).loaded? } do |w| + field :awakening, if: ->(_field_name, w, _options) { w.awakening.present? } do |w| { type: AwakeningBlueprint.render_as_hash(w.awakening), level: w.awakening_level } end - association :weapon, name: :object, blueprint: WeaponBlueprint, view: :full + association :weapon, name: :object, blueprint: WeaponBlueprint, view: :full, + if: ->(_field_name, w, _options) { w.weapon.present? } + association :weapon_keys, blueprint: WeaponKeyBlueprint, - if: ->(_field_name, w, _options) { [2, 3, 17, 24, 34].include?(w.weapon.series) } + if: ->(_field_name, w, _options) { + w.weapon.present? && + w.weapon.series.present? && + [2, 3, 17, 24, 34].include?(w.weapon.series) + } end view :full do include_view :nested - association :party, blueprint: PartyBlueprint, view: :minimal + association :party, blueprint: PartyBlueprint end view :uncap do - association :party, blueprint: PartyBlueprint, view: :minimal + association :party, blueprint: PartyBlueprint fields :position, :uncap_level end