72 lines
2.4 KiB
Ruby
72 lines
2.4 KiB
Ruby
class BoardProposalsController < ApplicationController
|
|
before_action :require_login
|
|
before_action :set_game
|
|
before_action :set_board
|
|
before_action :set_current_participant
|
|
|
|
def create
|
|
unless @board.member?(@current_participant)
|
|
return redirect_to game_board_path(@game, @board), alert: "権限がありません"
|
|
end
|
|
|
|
@proposal = @board.board_proposals.new(proposal_params)
|
|
@proposal.proposer = @current_participant
|
|
@proposal.status = "pending"
|
|
|
|
# フェーズ情報の保存
|
|
latest_turn = @game.turns.max_by(&:number)
|
|
if latest_turn
|
|
@proposal.phase = latest_turn.phase
|
|
else
|
|
@proposal.phase = "S1901M" # 初期値
|
|
end
|
|
|
|
if @proposal.save
|
|
redirect_to game_board_path(@game, @board), notice: "提案を作成しました"
|
|
else
|
|
redirect_to game_board_path(@game, @board), alert: "提案の作成に失敗しました"
|
|
end
|
|
end
|
|
|
|
def update
|
|
@proposal = @board.board_proposals.find(params[:id])
|
|
|
|
# 承認・拒否権限:
|
|
# 提案者本人以外が承認/拒否できるべきか、あるいは全員できるべきか?
|
|
# 通常は「相手」が承認するものだが、多国間の場合は?
|
|
# ここでは「メンバーであれば誰でもステータス変更可能」とする(簡易実装)
|
|
# ただし、提案者本人が自分で承認するのは変なので、他者のみとするのがベター
|
|
|
|
unless @board.member?(@current_participant)
|
|
return redirect_to game_board_path(@game, @board), alert: "権限がありません"
|
|
end
|
|
|
|
new_status = params[:board_proposal][:status]
|
|
if %w[accepted rejected].include?(new_status)
|
|
@proposal.update!(status: new_status)
|
|
# ログにも残す(投稿として自動投稿しても良いが、今回はステータス変更のみ)
|
|
redirect_to game_board_path(@game, @board), notice: "提案を#{new_status == 'accepted' ? '承認' : '拒否'}しました"
|
|
else
|
|
redirect_to game_board_path(@game, @board), alert: "不正なステータスです"
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def set_game
|
|
@game = Game.find(params[:game_id])
|
|
end
|
|
|
|
def set_board
|
|
@board = @game.boards.find(params[:board_id])
|
|
end
|
|
|
|
def set_current_participant
|
|
@current_participant = @game.participants.find_by(user: current_user)
|
|
end
|
|
|
|
def proposal_params
|
|
params.require(:board_proposal).permit(:body)
|
|
end
|
|
end
|