add weapon_series API endpoints and update blueprints

This commit is contained in:
Justin Edmund 2025-12-03 10:45:57 -08:00
parent c395acaefc
commit bd5f1b0240
5 changed files with 123 additions and 3 deletions

View file

@ -31,8 +31,8 @@ module Api
blueprint: WeaponKeyBlueprint,
if: ->(_field_name, w, _options) {
w.weapon.present? &&
w.weapon.series.present? &&
[2, 3, 17, 24, 34].include?(w.weapon.series)
w.weapon.weapon_series.present? &&
w.weapon.weapon_series.has_weapon_keys
}
end

View file

@ -13,7 +13,24 @@ module Api
# Primary information
fields :granblue_id, :element, :proficiency,
:max_level, :max_skill_level, :max_awakening_level, :limit, :rarity,
:series, :ax, :ax_type, :promotions
:ax, :ax_type, :promotions
# Series - returns full object 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
}
}
else
# Legacy fallback for backwards compatibility
w.series
end
end
field :promotion_names do |w|
w.promotion_names

View file

@ -0,0 +1,25 @@
# frozen_string_literal: true
module Api
module V1
class WeaponSeriesBlueprint < ApiBlueprint
field :name do |ws|
{
en: ws.name_en,
ja: ws.name_jp
}
end
fields :slug, :order
view :full do
fields :extra, :element_changeable, :has_weapon_keys,
:has_awakening, :has_ax_skills
field :weapon_count do |ws|
ws.weapons.count
end
end
end
end
end

View file

@ -0,0 +1,76 @@
# frozen_string_literal: true
module Api
module V1
class WeaponSeriesController < Api::V1::ApiController
before_action :set_weapon_series, only: %i[show update destroy]
before_action :ensure_editor_role, only: %i[create update destroy]
# GET /weapon_series
def index
weapon_series = WeaponSeries.ordered
render json: WeaponSeriesBlueprint.render(weapon_series)
end
# GET /weapon_series/:id
def show
render json: WeaponSeriesBlueprint.render(@weapon_series, view: :full)
end
# POST /weapon_series
def create
weapon_series = WeaponSeries.new(weapon_series_params)
if weapon_series.save
render json: WeaponSeriesBlueprint.render(weapon_series, view: :full), status: :created
else
render_validation_error_response(weapon_series)
end
end
# PATCH/PUT /weapon_series/:id
def update
if @weapon_series.update(weapon_series_params)
render json: WeaponSeriesBlueprint.render(@weapon_series, view: :full)
else
render_validation_error_response(@weapon_series)
end
end
# DELETE /weapon_series/:id
def destroy
if @weapon_series.weapons.exists?
render json: ErrorBlueprint.render(nil, error: {
message: 'Cannot delete series with associated weapons',
code: 'has_dependencies'
}), status: :unprocessable_entity
else
@weapon_series.destroy!
head :no_content
end
end
private
def set_weapon_series
# Support lookup by slug or UUID
@weapon_series = WeaponSeries.find_by(slug: params[:id]) || WeaponSeries.find(params[:id])
end
def ensure_editor_role
return if current_user&.role && current_user.role >= 7
Rails.logger.warn "[WEAPON_SERIES] Unauthorized access attempt by user #{current_user&.id}"
render json: { error: 'Unauthorized - Editor role required' }, status: :unauthorized
end
def weapon_series_params
params.require(:weapon_series).permit(
:name_en, :name_jp, :slug, :order,
:extra, :element_changeable, :has_weapon_keys,
:has_awakening, :has_ax_skills
)
end
end
end
end

View file

@ -99,6 +99,8 @@ Rails.application.routes.draw do
get 'raids/:id', to: 'raids#show'
get 'weapon_keys', to: 'weapon_keys#all'
resources :weapon_series, only: %i[index show create update destroy]
# Grid endpoints - new prefixed versions
post 'grid_characters/resolve', to: 'grid_characters#resolve'
post 'grid_characters/update_uncap', to: 'grid_characters#update_uncap_level'