hensei-api/app/blueprints/api/v1/weapon_blueprint.rb

173 lines
4.3 KiB
Ruby

# frozen_string_literal: true
module Api
module V1
class WeaponBlueprint < ApiBlueprint
field :name do |w|
{
en: w.name_en,
ja: w.name_jp
}
end
# Primary information
fields :granblue_id, :element, :proficiency,
:max_level, :max_skill_level, :max_awakening_level, :max_exorcism_level,
:limit, :rarity, :ax, :ax_type, :gacha, :promotions, :forge_order, :extra
# Series - returns full object with flags if weapon_series is present, fallback to legacy integer
field :series do |w|
if w.weapon_series.present?
{
id: w.weapon_series_id,
slug: w.weapon_series.slug,
name: {
en: w.weapon_series.name_en,
ja: w.weapon_series.name_jp
},
has_weapon_keys: w.weapon_series.has_weapon_keys,
has_awakening: w.weapon_series.has_awakening,
augment_type: w.weapon_series.augment_type,
extra: w.weapon_series.extra,
element_changeable: w.weapon_series.element_changeable
}
else
# Legacy fallback for backwards compatibility
w.series
end
end
field :promotion_names do |w|
w.promotion_names
end
# Uncap information
field :uncap do |w|
{
flb: w.flb,
ulb: w.ulb,
transcendence: w.transcendence,
extra_prerequisite: w.extra_prerequisite
}
end
view :stats do
field :hp do |w|
{
min_hp: w.min_hp,
max_hp: w.max_hp,
max_hp_flb: w.max_hp_flb,
max_hp_ulb: w.max_hp_ulb
}
end
field :atk do |w|
{
min_atk: w.min_atk,
max_atk: w.max_atk,
max_atk_flb: w.max_atk_flb,
max_atk_ulb: w.max_atk_ulb
}
end
end
view :dates do
field :release_date
field :flb_date
field :ulb_date
field :transcendence_date
end
view :full do
include_view :stats
include_view :dates
association :awakenings,
blueprint: AwakeningBlueprint,
if: ->(_field_name, weapon, _options) { weapon.awakenings.any? }
field :nicknames do |w|
{
en: w.nicknames_en,
ja: w.nicknames_jp
}
end
field :wiki do |w|
{
en: w.wiki_en,
ja: w.wiki_ja
}
end
fields :gamewith, :kamigame
field :recruits do |w|
next nil unless w.recruits.present?
character = Character.find_by(granblue_id: w.recruits)
next nil unless character
{
id: character.id,
granblue_id: character.granblue_id,
name: {
en: character.name_en,
ja: character.name_jp
}
}
end
# Forge chain fields
field :forged_from do |w|
next nil unless w.forged_from.present?
parent = w.forged_from_weapon
next nil unless parent
{
id: parent.id,
granblue_id: parent.granblue_id,
name: {
en: parent.name_en,
ja: parent.name_jp
}
}
end
field :forge_chain do |w|
next nil unless w.forge_chain_id.present?
w.forge_chain.map do |weapon|
{
id: weapon.id,
granblue_id: weapon.granblue_id,
name: {
en: weapon.name_en,
ja: weapon.name_jp
},
forge_order: weapon.forge_order
}
end
end
end
# Separate view for raw data - only used by dedicated endpoint
view :raw do
excludes :name, :granblue_id, :element, :proficiency, :max_level, :max_skill_level,
:max_awakening_level, :limit, :rarity, :series, :ax, :ax_type, :uncap
field :wiki_raw do |w|
w.wiki_raw
end
field :game_raw_en do |w|
w.game_raw_en
end
field :game_raw_jp do |w|
w.game_raw_jp
end
end
end
end
end