add by-event score endpoints that auto-create participation
This commit is contained in:
parent
b4f4f9c304
commit
0337bc1e92
2 changed files with 70 additions and 27 deletions
|
|
@ -8,7 +8,8 @@ module Api
|
||||||
before_action :restrict_access
|
before_action :restrict_access
|
||||||
before_action :set_crew
|
before_action :set_crew
|
||||||
before_action :authorize_crew_member!
|
before_action :authorize_crew_member!
|
||||||
before_action :set_participation
|
before_action :set_participation, except: %i[create_by_event batch_by_event]
|
||||||
|
before_action :set_or_create_participation_by_event, only: %i[create_by_event batch_by_event]
|
||||||
before_action :set_score, only: %i[update destroy]
|
before_action :set_score, only: %i[update destroy]
|
||||||
|
|
||||||
# POST /crew/gw_participations/:gw_participation_id/individual_scores
|
# POST /crew/gw_participations/:gw_participation_id/individual_scores
|
||||||
|
|
@ -56,6 +57,68 @@ module Api
|
||||||
def batch
|
def batch
|
||||||
return render_unauthorized_response unless current_user.crew_officer?
|
return render_unauthorized_response unless current_user.crew_officer?
|
||||||
|
|
||||||
|
process_batch_scores
|
||||||
|
end
|
||||||
|
|
||||||
|
# POST /crew/gw_events/:gw_event_id/individual_scores
|
||||||
|
# Auto-creates participation if needed, officers only
|
||||||
|
def create_by_event
|
||||||
|
return render_unauthorized_response unless current_user.crew_officer?
|
||||||
|
|
||||||
|
score = @participation.gw_individual_scores.build(score_params_with_player)
|
||||||
|
score.recorded_by = current_user
|
||||||
|
|
||||||
|
if score.save
|
||||||
|
render json: GwIndividualScoreBlueprint.render(score, view: :with_member, root: :individual_score), status: :created
|
||||||
|
else
|
||||||
|
render_validation_error_response(score)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# POST /crew/gw_events/:gw_event_id/individual_scores/batch
|
||||||
|
# Auto-creates participation if needed, officers only
|
||||||
|
def batch_by_event
|
||||||
|
return render_unauthorized_response unless current_user.crew_officer?
|
||||||
|
|
||||||
|
process_batch_scores
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_crew
|
||||||
|
@crew = current_user.crew
|
||||||
|
raise CrewErrors::NotInCrewError unless @crew
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_participation
|
||||||
|
@participation = @crew.crew_gw_participations.find(params[:gw_participation_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_or_create_participation_by_event
|
||||||
|
event = GwEvent.find(params[:gw_event_id])
|
||||||
|
@participation = @crew.crew_gw_participations.find_or_create_by!(gw_event: event)
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_score
|
||||||
|
@score = @participation.gw_individual_scores.find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def score_params
|
||||||
|
params.require(:individual_score).permit(:crew_membership_id, :round, :score, :is_cumulative)
|
||||||
|
end
|
||||||
|
|
||||||
|
def score_params_with_player
|
||||||
|
params.require(:individual_score).permit(:crew_membership_id, :phantom_player_id, :round, :score, :is_cumulative)
|
||||||
|
end
|
||||||
|
|
||||||
|
def can_record_score_for?(membership_id)
|
||||||
|
return true if current_user.crew_officer?
|
||||||
|
|
||||||
|
# Regular members can only record their own scores
|
||||||
|
current_user.active_crew_membership&.id == membership_id
|
||||||
|
end
|
||||||
|
|
||||||
|
def process_batch_scores
|
||||||
scores_params = params.require(:scores)
|
scores_params = params.require(:scores)
|
||||||
results = []
|
results = []
|
||||||
errors = []
|
errors = []
|
||||||
|
|
@ -63,6 +126,7 @@ module Api
|
||||||
scores_params.each_with_index do |score_data, index|
|
scores_params.each_with_index do |score_data, index|
|
||||||
score = @participation.gw_individual_scores.find_or_initialize_by(
|
score = @participation.gw_individual_scores.find_or_initialize_by(
|
||||||
crew_membership_id: score_data[:crew_membership_id],
|
crew_membership_id: score_data[:crew_membership_id],
|
||||||
|
phantom_player_id: score_data[:phantom_player_id],
|
||||||
round: score_data[:round]
|
round: score_data[:round]
|
||||||
)
|
)
|
||||||
score.assign_attributes(
|
score.assign_attributes(
|
||||||
|
|
@ -85,32 +149,6 @@ module Api
|
||||||
status: :multi_status
|
status: :multi_status
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def set_crew
|
|
||||||
@crew = current_user.crew
|
|
||||||
raise CrewErrors::NotInCrewError unless @crew
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_participation
|
|
||||||
@participation = @crew.crew_gw_participations.find(params[:gw_participation_id])
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_score
|
|
||||||
@score = @participation.gw_individual_scores.find(params[:id])
|
|
||||||
end
|
|
||||||
|
|
||||||
def score_params
|
|
||||||
params.require(:individual_score).permit(:crew_membership_id, :round, :score, :is_cumulative)
|
|
||||||
end
|
|
||||||
|
|
||||||
def can_record_score_for?(membership_id)
|
|
||||||
return true if current_user.crew_officer?
|
|
||||||
|
|
||||||
# Regular members can only record their own scores
|
|
||||||
current_user.active_crew_membership&.id == membership_id
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -217,6 +217,11 @@ Rails.application.routes.draw do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
get 'gw_participations/by_event/:event_id', to: 'crew_gw_participations#by_event', as: :gw_participation_by_event
|
||||||
|
|
||||||
|
# Create individual scores by event (auto-creates participation if needed)
|
||||||
|
post 'gw_events/:gw_event_id/individual_scores', to: 'gw_individual_scores#create_by_event'
|
||||||
|
post 'gw_events/:gw_event_id/individual_scores/batch', to: 'gw_individual_scores#batch_by_event'
|
||||||
end
|
end
|
||||||
|
|
||||||
# Reading collections - works for any user with privacy check
|
# Reading collections - works for any user with privacy check
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue