90 lines
2.8 KiB
Elixir
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
|