88 lines
2.3 KiB
Ruby
88 lines
2.3 KiB
Ruby
class ParticipantsController < ApplicationController
|
|
before_action :set_game
|
|
|
|
# POST /games/:game_id/participants
|
|
def create
|
|
# パスワード確認
|
|
if @game.password_protected?
|
|
unless @game.authenticate_password(params[:password])
|
|
redirect_to @game, alert: "パスワードが正しくありません"
|
|
return
|
|
end
|
|
end
|
|
|
|
# 参加処理
|
|
@participant = @game.participants.build(
|
|
user: current_user,
|
|
is_administrator: false
|
|
)
|
|
|
|
if @participant.save
|
|
# 定員到達チェック
|
|
if @game.participants.count == @game.participants_count
|
|
@game.update(status: "power_selection")
|
|
end
|
|
|
|
redirect_to @game, notice: "ゲームに参加しました"
|
|
else
|
|
redirect_to @game, alert: @participant.errors.full_messages.join(", ")
|
|
end
|
|
end
|
|
|
|
# PATCH /games/:game_id/participants/:id/select_power
|
|
def select_power
|
|
@participant = @game.participants.find(params[:id])
|
|
|
|
unless @participant.user == current_user
|
|
redirect_to @game, alert: "権限がありません"
|
|
return
|
|
end
|
|
|
|
if @participant.update(power: params[:power])
|
|
# 全員が国を選択したかチェック
|
|
if @game.all_powers_assigned?
|
|
service = GameSetupService.new(@game)
|
|
result = service.setup_initial_turn
|
|
|
|
if result[:success]
|
|
@game.update(status: "in_progress")
|
|
flash[:notice] = "国を選択し、ゲームが開始されました!"
|
|
else
|
|
flash[:alert] = "ゲーム開始に失敗しました: #{result[:message]}"
|
|
end
|
|
else
|
|
flash[:notice] = "国を選択しました"
|
|
end
|
|
|
|
redirect_to @game
|
|
else
|
|
redirect_to @game, alert: @participant.errors.full_messages.join(", ")
|
|
end
|
|
end
|
|
|
|
# DELETE /games/:game_id/participants/:id
|
|
def destroy
|
|
@participant = @game.participants.find(params[:id])
|
|
|
|
unless @participant.user == current_user || current_user&.admin?
|
|
redirect_to @game, alert: "権限がありません"
|
|
return
|
|
end
|
|
|
|
@participant.destroy
|
|
|
|
# ゲーム状態を更新
|
|
if @game.status == "power_selection"
|
|
@game.update(status: "recruiting")
|
|
end
|
|
|
|
redirect_to games_path, notice: "ゲームから退出しました"
|
|
end
|
|
|
|
private
|
|
|
|
def set_game
|
|
@game = Game.find(params[:game_id])
|
|
end
|
|
end
|