Refactor job skill assignment a bit
This commit is contained in:
parent
f6613d6e91
commit
5c9a2b8d7a
1 changed files with 57 additions and 37 deletions
|
|
@ -20,25 +20,20 @@ class Api::V1::PartiesController < Api::V1::ApiController
|
|||
if @party.user != current_user
|
||||
render_unauthorized_response
|
||||
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
|
||||
new_skill_keys =
|
||||
party_params.keys - %i[skill0_id skill1_id skill2_id skill3_id]
|
||||
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 !new_skill_keys.empty?
|
||||
# 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_skills = merge_skills_with_existing_skills(existing_skills, new_skill_ids, positions)
|
||||
|
||||
new_skill_ids = {}
|
||||
new_skills.each_with_index do |skill, index|
|
||||
|
|
@ -47,10 +42,11 @@ class Api::V1::PartiesController < Api::V1::ApiController
|
|||
|
||||
@party.attributes = new_skill_ids
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
render :update, status: :ok if @party.save!
|
||||
end
|
||||
end
|
||||
|
||||
def index
|
||||
@per_page = 15
|
||||
|
|
@ -80,7 +76,7 @@ class Api::V1::PartiesController < Api::V1::ApiController
|
|||
.paginate(page: request.params[:page], per_page: @per_page)
|
||||
.each do |party|
|
||||
party.favorited =
|
||||
(current_user) ? party.is_favorited(current_user) : false
|
||||
current_user ? party.is_favorited(current_user) : false
|
||||
end
|
||||
@count = Party.where(conditions).count
|
||||
|
||||
|
|
@ -160,26 +156,49 @@ class Api::V1::PartiesController < Api::V1::ApiController
|
|||
progress = place_skill_in_existing_skills(progress, skill, positions[0])
|
||||
end
|
||||
|
||||
return progress
|
||||
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
|
||||
# Check desired position for a skill
|
||||
displaced_skill = existing_skills[position] if existing_skills[
|
||||
position
|
||||
].present?
|
||||
|
||||
# Put skill in new position
|
||||
existing_skills[position] = skill
|
||||
existing_skills[old_position] = displaced_skill
|
||||
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
|
||||
|
||||
return existing_skills
|
||||
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)
|
||||
|
|
@ -196,7 +215,7 @@ class Api::V1::PartiesController < Api::V1::ApiController
|
|||
def set_from_slug
|
||||
@party = Party.where("shortcode = ?", params[:id]).first
|
||||
@party.favorited =
|
||||
(current_user && @party) ? @party.is_favorited(current_user) : false
|
||||
current_user && @party ? @party.is_favorited(current_user) : false
|
||||
end
|
||||
|
||||
def set
|
||||
|
|
@ -211,9 +230,10 @@ class Api::V1::PartiesController < Api::V1::ApiController
|
|||
:description,
|
||||
:raid_id,
|
||||
:job_id,
|
||||
:skill0_id,
|
||||
:skill1_id,
|
||||
:skill2_id,
|
||||
:skill3_id,
|
||||
:skill3_id
|
||||
)
|
||||
end
|
||||
end
|
||||
|
|
|
|||
Loading…
Reference in a new issue