Files
2026-07-04 19:27:17 +09:00

90 lines
2.8 KiB
Elixir

defmodule Rsh26poolWeb.RoomController do
use Rsh26poolWeb, :controller
import Phoenix.Component, only: [to_form: 1, to_form: 2]
alias Rsh26pool.Voting
alias Rsh26poolWeb.Auth
def new(conn, _params) do
render(conn, :new,
form: to_form(Voting.change_room_creation()),
page_title: "ルームを作成"
)
end
def create(conn, %{"room" => room_params}) do
case Voting.create_room(room_params) do
{:ok, %{room: room, owner: owner}} ->
conn
|> Auth.log_in_participant(owner)
|> put_flash(
:info,
"ルーム「#{room.name}」を作成しました。ルーム番号は #{room.room_number} です。"
)
|> redirect(to: ~p"/manage/#{room.room_number}")
{:error, changeset} ->
conn
|> put_flash(:error, "ルームを作成できませんでした。入力内容を確認してください。")
|> render(:new, form: to_form(changeset), page_title: "ルームを作成")
end
end
def enter_form(conn, params) do
render(conn, :enter,
form: enter_form_data(params["room"] || "", ""),
page_title: "ルームに参加"
)
end
def enter(conn, %{"enter" => %{"room_number" => number, "name" => name}}) do
number = String.trim(number || "")
name = String.trim(name || "")
cond do
number == "" or name == "" ->
conn
|> put_flash(:error, "ルーム番号と名前を入力してください。")
|> render(:enter, form: enter_form_data(number, name), page_title: "ルームに参加")
true ->
enter_room(conn, number, name)
end
end
def logout(conn, _params) do
conn
|> Auth.log_out_participant()
|> put_flash(:info, "ログアウトしました。")
|> redirect(to: ~p"/")
end
defp enter_room(conn, number, name) do
case Voting.get_room_by_number(number) do
nil ->
conn
|> put_flash(:error, "ルーム番号「#{number}」のルームが見つかりません。")
|> render(:enter, form: enter_form_data(number, name), page_title: "ルームに参加")
room ->
case Voting.join_room(room, %{"name" => name}) do
{:ok, participant} ->
conn
|> Auth.log_in_participant(participant)
|> put_flash(:info, "ルーム「#{room.name}」に参加しました。")
|> redirect(to: ~p"/vote/#{room.room_number}")
{:error, _changeset} ->
conn
|> put_flash(:error, "参加できませんでした。名前は40文字以内で入力してください。")
|> render(:enter, form: enter_form_data(number, name), page_title: "ルームに参加")
end
end
end
defp enter_form_data(number, name) do
to_form(%{"room_number" => number, "name" => name}, as: :enter)
end
end