Move logic to JobsController
It was getting too heavy to keep in PartiesController
This commit is contained in:
parent
bd33ee44fc
commit
ec3b42101b
4 changed files with 232 additions and 142 deletions
|
|
@ -1,6 +1,152 @@
|
||||||
class Api::V1::JobsController < Api::V1::ApiController
|
class Api::V1::JobsController < Api::V1::ApiController
|
||||||
def all
|
before_action :set, only: %w[update_job update_job_skills]
|
||||||
@jobs = Job.all()
|
|
||||||
render :all, status: :ok
|
def all
|
||||||
|
@jobs = Job.all()
|
||||||
|
render :all, status: :ok
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_job
|
||||||
|
raise NoJobProvidedError unless job_params[:job_id].present?
|
||||||
|
|
||||||
|
# Extract job and find its main skills
|
||||||
|
job = Job.find(job_params[:job_id])
|
||||||
|
|
||||||
|
main_skills = JobSkill.where(job: job.id, main: true)
|
||||||
|
|
||||||
|
# Update the party
|
||||||
|
@party.job = job
|
||||||
|
main_skills.each_with_index do |skill, index|
|
||||||
|
@party["skill#{index}_id"] = skill.id
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Check for incompatible Base and EMP skills
|
||||||
|
%w[skill1_id skill2_id skill3_id].each do |key|
|
||||||
|
@party[key] = nil if mismatched_skill(@party.job, JobSkill.find(@party[key]))
|
||||||
|
end
|
||||||
|
|
||||||
|
render :update, status: :ok if @party.save!
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_job_skills
|
||||||
|
throw NoJobSkillProvidedError unless job_params[:skill1_id] || job_params[:skill2_id] || job_params[:skill3_id]
|
||||||
|
|
||||||
|
# Determine which incoming keys contain new skills
|
||||||
|
skill_keys = %w[skill1_id skill2_id skill3_id]
|
||||||
|
new_skill_keys = job_params.keys.select { |key| skill_keys.include?(key) }
|
||||||
|
|
||||||
|
# If there are new skills, merge them with the existing skills
|
||||||
|
unless new_skill_keys.empty?
|
||||||
|
existing_skills = {
|
||||||
|
1 => @party.skill1,
|
||||||
|
2 => @party.skill2,
|
||||||
|
3 => @party.skill3
|
||||||
|
}
|
||||||
|
new_skill_ids = new_skill_keys.map { |key| job_params[key] }
|
||||||
|
new_skill_ids.map do |id|
|
||||||
|
skill = JobSkill.find(id)
|
||||||
|
if mismatched_skill(@party.job, skill)
|
||||||
|
raise Api::V1::IncompatibleSkillError.new(job: @party.job, skill: skill)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
positions = extract_positions_from_keys(new_skill_keys)
|
||||||
|
new_skills = merge_skills_with_existing_skills(existing_skills, new_skill_ids, positions)
|
||||||
|
|
||||||
|
new_skill_ids = new_skills.each_with_object({}) do |(index, skill), memo|
|
||||||
|
memo["skill#{index}_id"] = skill.id
|
||||||
|
end
|
||||||
|
|
||||||
|
@party.attributes = new_skill_ids
|
||||||
|
end
|
||||||
|
|
||||||
|
render :update, status: :ok if @party.save!
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def merge_skills_with_existing_skills(
|
||||||
|
existing_skills,
|
||||||
|
new_skill_ids,
|
||||||
|
positions
|
||||||
|
)
|
||||||
|
new_skills = new_skill_ids.map { |id| JobSkill.find(id) }
|
||||||
|
|
||||||
|
new_skills.each_with_index do |skill, index|
|
||||||
|
existing_skills = place_skill_in_existing_skills(existing_skills, skill, positions[index])
|
||||||
|
end
|
||||||
|
|
||||||
|
existing_skills
|
||||||
|
end
|
||||||
|
|
||||||
|
def place_skill_in_existing_skills(existing_skills, skill, position)
|
||||||
|
old_position = existing_skills.key(existing_skills.detect { |_, value| value.id == skill.id })
|
||||||
|
|
||||||
|
if old_position
|
||||||
|
existing_skills = swap_skills_at_position(existing_skills, skill, position, old_position[0])
|
||||||
|
else
|
||||||
|
# Test if skill will exceed allowances of skill types
|
||||||
|
skill_type = skill.sub ? 'sub' : 'emp'
|
||||||
|
|
||||||
|
unless can_add_skill_of_type(existing_skills, position, skill_type)
|
||||||
|
raise Api::V1::TooManySkillsOfTypeError.new(skill_type: skill_type)
|
||||||
|
end
|
||||||
|
|
||||||
|
existing_skills[position] = skill
|
||||||
|
end
|
||||||
|
|
||||||
|
existing_skills
|
||||||
|
end
|
||||||
|
|
||||||
|
def swap_skills_at_position(skills, new_skill, position1, position2)
|
||||||
|
# Check desired position for a skill
|
||||||
|
displaced_skill = skills[position1] if skills[position1].present?
|
||||||
|
|
||||||
|
# Put skill in new position
|
||||||
|
skills[position1] = new_skill
|
||||||
|
skills[position2] = displaced_skill
|
||||||
|
|
||||||
|
skills
|
||||||
|
end
|
||||||
|
|
||||||
|
def extract_positions_from_keys(keys)
|
||||||
|
# Subtract by 1 because we won't operate on the 0th skill, so we don't pass it
|
||||||
|
keys.map { |key| key['skill'.length].to_i }
|
||||||
|
end
|
||||||
|
|
||||||
|
def can_add_skill_of_type(skills, position, type)
|
||||||
|
max_skill_of_type = 2
|
||||||
|
skills_to_check = skills.reject { |key, _| key == position }
|
||||||
|
|
||||||
|
sum = skills_to_check.values.count { |value| value.send(type) }
|
||||||
|
|
||||||
|
sum + 1 <= max_skill_of_type
|
||||||
|
end
|
||||||
|
|
||||||
|
def mismatched_skill(job, skill)
|
||||||
|
mismatched_emp = (skill.job.id != job.id) && skill.emp
|
||||||
|
mismatched_base = (job.row != 'ex2' || skill.job.base_job.id != job.base_job.id) && skill.base
|
||||||
|
|
||||||
|
if %w[4 5 ex2].include?(job.row)
|
||||||
|
true if mismatched_emp || mismatched_base
|
||||||
|
elsif mismatched_emp
|
||||||
|
true
|
||||||
|
else
|
||||||
|
false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def set
|
||||||
|
@party = Party.where('id = ?', params[:id]).first
|
||||||
|
end
|
||||||
|
|
||||||
|
def job_params
|
||||||
|
params.require(:party).permit(
|
||||||
|
:job_id,
|
||||||
|
:skill0_id,
|
||||||
|
:skill1_id,
|
||||||
|
:skill2_id,
|
||||||
|
:skill3_id
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,13 @@ class Api::V1::PartiesController < Api::V1::ApiController
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@party = Party.new(shortcode: random_string)
|
@party = Party.new(shortcode: random_string)
|
||||||
@party.extra = party_params["extra"]
|
@party.extra = party_params['extra']
|
||||||
|
|
||||||
|
job = Job.find(party_params['job_id']) if party_params['job_id'].present?
|
||||||
|
job_skills = JobSkill.where(job: job.id, main: true)
|
||||||
|
job_skills.each_with_index do |skill, index|
|
||||||
|
@party["skill#{index}_id"] = skill.id
|
||||||
|
end
|
||||||
|
|
||||||
@party.user = current_user if current_user
|
@party.user = current_user if current_user
|
||||||
|
|
||||||
|
|
@ -21,28 +27,6 @@ class Api::V1::PartiesController < Api::V1::ApiController
|
||||||
render_unauthorized_response
|
render_unauthorized_response
|
||||||
else
|
else
|
||||||
@party.attributes = party_params.except(:skill1_id, :skill2_id, :skill3_id)
|
@party.attributes = party_params.except(:skill1_id, :skill2_id, :skill3_id)
|
||||||
ap party_params
|
|
||||||
# Determine which incoming keys contain new skills
|
|
||||||
skill_keys = %w[skill1_id skill2_id skill3_id]
|
|
||||||
if (party_params.keys & skill_keys).any?
|
|
||||||
new_skill_keys = party_params.keys - skill_keys
|
|
||||||
|
|
||||||
# If there are new skills, merge them with the existing skills
|
|
||||||
unless new_skill_keys.empty?
|
|
||||||
existing_skills = [@party.skill1, @party.skill2, @party.skill3]
|
|
||||||
new_skill_ids = new_skill_keys.map { |key| party_params[key] }
|
|
||||||
positions = extract_positions_from_keys(new_skill_keys)
|
|
||||||
|
|
||||||
new_skills = merge_skills_with_existing_skills(existing_skills, new_skill_ids, positions)
|
|
||||||
|
|
||||||
new_skill_ids = {}
|
|
||||||
new_skills.each_with_index do |skill, index|
|
|
||||||
new_skill_ids["skill#{index + 1}_id"] = skill.id
|
|
||||||
end
|
|
||||||
|
|
||||||
@party.attributes = new_skill_ids
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
render :update, status: :ok if @party.save!
|
render :update, status: :ok if @party.save!
|
||||||
|
|
@ -121,8 +105,8 @@ class Api::V1::PartiesController < Api::V1::ApiController
|
||||||
def destroy
|
def destroy
|
||||||
if @party.user != current_user
|
if @party.user != current_user
|
||||||
render_unauthorized_response
|
render_unauthorized_response
|
||||||
else
|
elsif @party.destroy
|
||||||
render :destroyed, status: :ok if @party.destroy
|
render :destroyed, status: :ok
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -143,69 +127,6 @@ class Api::V1::PartiesController < Api::V1::ApiController
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def merge_skills_with_existing_skills(
|
|
||||||
existing_skills,
|
|
||||||
new_skill_ids,
|
|
||||||
positions
|
|
||||||
)
|
|
||||||
new_skills = []
|
|
||||||
new_skill_ids.each { |id| new_skills << JobSkill.find(id) }
|
|
||||||
|
|
||||||
progress = existing_skills
|
|
||||||
new_skills.each do |skill, index|
|
|
||||||
progress = place_skill_in_existing_skills(progress, skill, positions[0])
|
|
||||||
end
|
|
||||||
|
|
||||||
progress
|
|
||||||
end
|
|
||||||
|
|
||||||
def place_skill_in_existing_skills(existing_skills, skill, position)
|
|
||||||
old_position = existing_skills.index { |x| x.id == skill.id }
|
|
||||||
|
|
||||||
if old_position
|
|
||||||
existing_skills = swap_skills_at_position(existing_skills, skill, position, old_position)
|
|
||||||
else
|
|
||||||
# Test if skill will exceed allowances of skill types
|
|
||||||
skill_type = skill.sub ? 'sub' : 'emp'
|
|
||||||
unless can_add_skill_of_type(existing_skills, position, skill_type)
|
|
||||||
raise Api::V1::TooManySkillsOfTypeError.new(skill_type: skill_type)
|
|
||||||
end
|
|
||||||
|
|
||||||
existing_skills[position] = skill
|
|
||||||
end
|
|
||||||
|
|
||||||
existing_skills
|
|
||||||
end
|
|
||||||
|
|
||||||
def swap_skills_at_position(skills, new_skill, position1, position2)
|
|
||||||
# Check desired position for a skill
|
|
||||||
displaced_skill = skills[position1] if skills[position1].present?
|
|
||||||
|
|
||||||
# Put skill in new position
|
|
||||||
skills[position1] = new_skill
|
|
||||||
skills[position2] = displaced_skill
|
|
||||||
|
|
||||||
skills
|
|
||||||
end
|
|
||||||
|
|
||||||
def can_add_skill_of_type(skills, position, type)
|
|
||||||
max_skill_of_type = 2
|
|
||||||
|
|
||||||
count = skills.reject
|
|
||||||
.with_index { |_el, index| index == position }
|
|
||||||
.reduce(0) do |sum, skill|
|
|
||||||
sum + 1 if type == 'emp' && skill.emp
|
|
||||||
sum + 1 if type == 'sub' && skill.sub
|
|
||||||
end
|
|
||||||
|
|
||||||
count + 1 <= max_skill_of_type
|
|
||||||
end
|
|
||||||
|
|
||||||
def extract_positions_from_keys(keys)
|
|
||||||
# Subtract by 1 because we won't operate on the 0th skill, so we don't pass it
|
|
||||||
keys.map { |key| key["skill".length].to_i - 1 }
|
|
||||||
end
|
|
||||||
|
|
||||||
def random_string
|
def random_string
|
||||||
numChars = 6
|
numChars = 6
|
||||||
o = [("a".."z"), ("A".."Z"), (0..9)].map(&:to_a).flatten
|
o = [("a".."z"), ("A".."Z"), (0..9)].map(&:to_a).flatten
|
||||||
|
|
|
||||||
20
app/views/api/v1/jobs/update.json.rabl
Normal file
20
app/views/api/v1/jobs/update.json.rabl
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
object @party
|
||||||
|
|
||||||
|
attributes :id, :user_id, :shortcode
|
||||||
|
|
||||||
|
node :is_extra do |p|
|
||||||
|
p.extra
|
||||||
|
end
|
||||||
|
|
||||||
|
node :job do |p|
|
||||||
|
partial("jobs/base", object: p.job)
|
||||||
|
end
|
||||||
|
|
||||||
|
node :job_skills do |p|
|
||||||
|
{
|
||||||
|
"0" => partial("job_skills/base", object: p.skill0),
|
||||||
|
"1" => partial("job_skills/base", object: p.skill1),
|
||||||
|
"2" => partial("job_skills/base", object: p.skill2),
|
||||||
|
"3" => partial("job_skills/base", object: p.skill3),
|
||||||
|
}
|
||||||
|
end
|
||||||
105
config/routes.rb
105
config/routes.rb
|
|
@ -1,54 +1,57 @@
|
||||||
Rails.application.routes.draw do
|
Rails.application.routes.draw do
|
||||||
use_doorkeeper do
|
use_doorkeeper do
|
||||||
controllers :tokens => 'tokens'
|
controllers :tokens => 'tokens'
|
||||||
skip_controllers :applications, :authorized_applications
|
skip_controllers :applications, :authorized_applications
|
||||||
end
|
end
|
||||||
|
|
||||||
namespace :api, defaults: { format: :json } do
|
namespace :api, defaults: { format: :json } do
|
||||||
namespace :v1 do
|
namespace :v1 do
|
||||||
resources :parties, only: [:index, :create, :update, :destroy]
|
resources :parties, only: [:index, :create, :update, :destroy]
|
||||||
resources :users, only: [:create, :update, :show]
|
resources :users, only: [:create, :update, :show]
|
||||||
resources :grid_weapons, only: [:update]
|
resources :grid_weapons, only: [:update]
|
||||||
resources :favorites, only: [:create]
|
resources :favorites, only: [:create]
|
||||||
|
|
||||||
get 'users/info/:id', to: 'users#info'
|
get 'users/info/:id', to: 'users#info'
|
||||||
|
|
||||||
get 'parties/favorites', to: 'parties#favorites'
|
get 'parties/favorites', to: 'parties#favorites'
|
||||||
get 'parties/:id', to: 'parties#show'
|
get 'parties/:id', to: 'parties#show'
|
||||||
get 'parties/:id/weapons', to: 'parties#weapons'
|
get 'parties/:id/weapons', to: 'parties#weapons'
|
||||||
get 'parties/:id/summons', to: 'parties#summons'
|
get 'parties/:id/summons', to: 'parties#summons'
|
||||||
get 'parties/:id/characters', to: 'parties#characters'
|
get 'parties/:id/characters', to: 'parties#characters'
|
||||||
|
|
||||||
post 'check/email', to: 'users#check_email'
|
put 'parties/:id/job', to: 'jobs#update_job'
|
||||||
post 'check/username', to: 'users#check_username'
|
put 'parties/:id/job_skills', to: 'jobs#update_job_skills'
|
||||||
|
|
||||||
post 'search/characters', to: 'search#characters'
|
post 'check/email', to: 'users#check_email'
|
||||||
post 'search/weapons', to: 'search#weapons'
|
post 'check/username', to: 'users#check_username'
|
||||||
post 'search/summons', to: 'search#summons'
|
|
||||||
post 'search/job_skills', to: 'search#job_skills'
|
post 'search/characters', to: 'search#characters'
|
||||||
|
post 'search/weapons', to: 'search#weapons'
|
||||||
get 'jobs', to: 'jobs#all'
|
post 'search/summons', to: 'search#summons'
|
||||||
|
post 'search/job_skills', to: 'search#job_skills'
|
||||||
get 'jobs/skills', to: 'job_skills#all'
|
|
||||||
get 'jobs/:id/skills', to: 'job_skills#job'
|
get 'jobs', to: 'jobs#all'
|
||||||
|
|
||||||
get 'raids', to: 'raids#all'
|
get 'jobs/skills', to: 'job_skills#all'
|
||||||
get 'weapon_keys', to: 'weapon_keys#all'
|
get 'jobs/:id/skills', to: 'job_skills#job'
|
||||||
|
|
||||||
post 'characters', to: 'grid_characters#create'
|
get 'raids', to: 'raids#all'
|
||||||
post 'characters/resolve', to: 'grid_characters#resolve'
|
get 'weapon_keys', to: 'weapon_keys#all'
|
||||||
post 'characters/update_uncap', to: 'grid_characters#update_uncap_level'
|
|
||||||
delete 'characters', to: 'grid_characters#destroy'
|
post 'characters', to: 'grid_characters#create'
|
||||||
|
post 'characters/resolve', to: 'grid_characters#resolve'
|
||||||
post 'weapons', to: 'grid_weapons#create'
|
post 'characters/update_uncap', to: 'grid_characters#update_uncap_level'
|
||||||
post 'weapons/update_uncap', to: 'grid_weapons#update_uncap_level'
|
delete 'characters', to: 'grid_characters#destroy'
|
||||||
delete 'weapons', to: 'grid_weapons#destroy'
|
|
||||||
|
post 'weapons', to: 'grid_weapons#create'
|
||||||
post 'summons', to: 'grid_summons#create'
|
post 'weapons/update_uncap', to: 'grid_weapons#update_uncap_level'
|
||||||
post 'summons/update_uncap', to: 'grid_summons#update_uncap_level'
|
delete 'weapons', to: 'grid_weapons#destroy'
|
||||||
delete 'summons', to: 'grid_summons#destroy'
|
|
||||||
|
post 'summons', to: 'grid_summons#create'
|
||||||
delete 'favorites', to: 'favorites#destroy'
|
post 'summons/update_uncap', to: 'grid_summons#update_uncap_level'
|
||||||
end
|
delete 'summons', to: 'grid_summons#destroy'
|
||||||
|
|
||||||
|
delete 'favorites', to: 'favorites#destroy'
|
||||||
end
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue