hensei-api/app/controllers/api/v1/job_skills_controller.rb

89 lines
2.9 KiB
Ruby

# frozen_string_literal: true
module Api
module V1
class JobSkillsController < Api::V1::ApiController
before_action :doorkeeper_authorize!, only: %i[create update destroy download_image]
before_action :ensure_editor_role, only: %i[create update destroy download_image]
def all
render json: JobSkillBlueprint.render(JobSkill.includes(:job).all)
end
# Returns skills that belong to a specific job
def job
job = Job.find_by(granblue_id: params[:id])
return render_not_found_response('job') unless job
@skills = JobSkill.includes(:job)
.where(job_id: job.id)
.order(:order)
render json: JobSkillBlueprint.render(@skills)
end
# Returns EMP skills from other jobs (for party skill selection)
def emp
@skills = JobSkill.includes(:job)
.where.not(job_id: params[:id])
.where(emp: true)
render json: JobSkillBlueprint.render(@skills)
end
# POST /jobs/:job_id/skills
def create
job = Job.find_by(granblue_id: params[:job_id])
return render_not_found_response('job') unless job
skill = job.skills.build(job_skill_params)
if skill.save
render json: JobSkillBlueprint.render(skill), status: :created
else
render_validation_error_response(skill)
end
end
# PUT /jobs/:job_id/skills/:id
def update
skill = JobSkill.find(params[:id])
if skill.update(job_skill_params)
render json: JobSkillBlueprint.render(skill)
else
render_validation_error_response(skill)
end
end
# DELETE /jobs/:job_id/skills/:id
def destroy
skill = JobSkill.find(params[:id])
skill.destroy
head :no_content
end
# POST /jobs/:job_id/skills/:id/download_image
def download_image
skill = JobSkill.find(params[:id])
return render json: { error: 'No image_id' }, status: :unprocessable_entity unless skill.image_id.present?
return render json: { error: 'No slug' }, status: :unprocessable_entity unless skill.slug.present?
downloader = Granblue::Downloaders::JobSkillDownloader.new(skill.image_id, slug: skill.slug, storage: :s3)
result = downloader.download
render json: { success: result[:success], filename: "#{skill.slug}.png" }
end
private
def job_skill_params
params.permit(:name_en, :name_jp, :slug, :color, :main, :base, :sub, :emp, :order,
:image_id, :action_id)
end
def ensure_editor_role
return if current_user&.role && current_user.role >= 7
Rails.logger.warn "[JOB_SKILLS] Unauthorized access attempt by user #{current_user&.id}"
render json: { error: 'Unauthorized - Editor role required' }, status: :unauthorized
end
end
end
end