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

96 lines
3.8 KiB
Ruby

# frozen_string_literal: true
module Api
module V1
class CrewGwParticipationsController < Api::V1::ApiController
include CrewAuthorizationConcern
before_action :restrict_access
before_action :set_crew
before_action :authorize_crew_member!
before_action :set_participation, only: %i[show update]
before_action :authorize_crew_officer!, only: %i[create update]
# GET /crew/gw_participations
def index
participations = @crew.crew_gw_participations.includes(:gw_event).order('gw_events.start_date DESC')
render json: CrewGwParticipationBlueprint.render(participations, view: :with_event, root: :crew_gw_participations)
end
# GET /crew/gw_participations/:id
def show
render json: CrewGwParticipationBlueprint.render(@participation, view: :with_individual_scores, root: :crew_gw_participation, current_user: current_user)
end
# GET /crew/gw_participations/by_event/:event_id
def by_event
# Support lookup by event_id (UUID) or event_number (integer)
event = if params[:event_id].match?(/\A\d+\z/)
GwEvent.find_by(event_number: params[:event_id])
else
GwEvent.find_by(id: params[:event_id])
end
return render json: { gw_event: nil, crew_gw_participation: nil, members_during_event: [] } unless event
participation = @crew.crew_gw_participations
.includes(:gw_event, gw_individual_scores: [{ crew_membership: :user }, :phantom_player])
.find_by(gw_event: event)
# Get all members who were active during the event (includes retired members who left after event started)
# Also include all currently active members for score entry purposes
# Uses joined_at (editable) for historical accuracy
members_during_event = @crew.crew_memberships
.includes(:user)
.active_during(event.start_date, event.end_date)
# Get all phantom players who were active during the event (excludes claimed/deleted phantoms)
phantom_players = @crew.phantom_players.not_deleted.active_during(event.start_date, event.end_date)
render json: {
gw_event: GwEventBlueprint.render_as_hash(event),
crew_gw_participation: participation ? CrewGwParticipationBlueprint.render_as_hash(participation, view: :with_individual_scores, current_user: current_user) : nil,
members_during_event: CrewMembershipBlueprint.render_as_hash(members_during_event, view: :with_user),
phantom_players: PhantomPlayerBlueprint.render_as_hash(phantom_players)
}
end
# POST /gw_events/:id/participations
def create
event = GwEvent.find(params[:id])
participation = @crew.crew_gw_participations.build(gw_event: event)
if participation.save
render json: CrewGwParticipationBlueprint.render(participation, view: :with_event, root: :crew_gw_participation), status: :created
else
render_validation_error_response(participation)
end
end
# PUT /crew/gw_participations/:id
def update
if @participation.update(participation_params)
render json: CrewGwParticipationBlueprint.render(@participation, view: :with_event, root: :crew_gw_participation)
else
render_validation_error_response(@participation)
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[:id])
end
def participation_params
params.require(:crew_gw_participation).permit(:preliminary_ranking, :final_ranking)
end
end
end
end