hensei-api/app/blueprints/api/v1/character_blueprint.rb
Justin Edmund b91ef0a4dd standardize links format in blueprints
return wiki: {en, ja} + gamewith, kamigame at top level
2025-12-15 12:47:11 -08:00

160 lines
3.4 KiB
Ruby

# frozen_string_literal: true
module Api
module V1
class CharacterBlueprint < ApiBlueprint
field :name do |c|
{
en: c.name_en,
ja: c.name_jp
}
end
fields :granblue_id, :character_id, :rarity,
:element, :gender, :special, :season
field :season_name do |c|
c.season_name
end
field :series do |c|
# Use new lookup table if available
if c.character_series_records.any?
c.character_series_records.ordered.map do |cs|
{
id: cs.id,
slug: cs.slug,
name: {
en: cs.name_en,
ja: cs.name_jp
}
}
end
else
# Legacy fallback - return integer array
c.series
end
end
field :series_names do |c|
c.series_names
end
field :uncap do |c|
{
flb: c.flb,
ulb: c.ulb
}
end
field :race do |c|
[c.race1, c.race2].compact
end
field :proficiency do |c|
[c.proficiency1, c.proficiency2].compact
end
view :full do
include_view :stats
include_view :rates
include_view :dates
field :awakenings do
Character::AWAKENINGS.map do |awakening|
AwakeningBlueprint.render_as_hash(OpenStruct.new(awakening))
end
end
field :nicknames do |c|
{
en: c.nicknames_en,
ja: c.nicknames_jp
}
end
field :wiki do |c|
{
en: c.wiki_en,
ja: c.wiki_ja
}
end
fields :gamewith, :kamigame
end
# Separate view for recruitment info - only include when needed (e.g., character detail page)
view :with_recruitment do
include_view :full
field :recruited_by do |c|
weapon = Weapon.find_by(recruits: c.granblue_id)
next nil unless weapon
{
id: weapon.id,
granblue_id: weapon.granblue_id,
name: {
en: weapon.name_en,
ja: weapon.name_jp
},
promotions: weapon.promotions,
promotion_names: weapon.promotion_names
}
end
end
# Separate view for raw data - only used by dedicated endpoint
view :raw do
excludes :name, :granblue_id, :character_id, :rarity, :element, :gender, :special, :uncap, :race, :proficiency
field :wiki_raw do |c|
c.wiki_raw
end
field :game_raw_en do |c|
c.game_raw_en
end
field :game_raw_jp do |c|
c.game_raw_jp
end
end
view :stats do
field :hp do |c|
{
min_hp: c.min_hp,
max_hp: c.max_hp,
max_hp_flb: c.max_hp_flb
}
end
field :atk do |c|
{
min_atk: c.min_atk,
max_atk: c.max_atk,
max_atk_flb: c.max_atk_flb
}
end
end
view :rates do
fields :base_da, :base_ta
field :ougi_ratio do |c|
{
ougi_ratio: c.ougi_ratio,
ougi_ratio_flb: c.ougi_ratio_flb
}
end
end
view :dates do
field :release_date
field :flb_date
field :ulb_date
end
end
end
end