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