89 lines
2.9 KiB
Ruby
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
|