This commit is contained in:
2026-07-04 19:27:17 +09:00
parent 34cd5ad2e7
commit ba6a0b2c17
30 changed files with 2935 additions and 247 deletions
+81
View File
@@ -0,0 +1,81 @@
defmodule Rsh26pool.Voting.Room do
@moduledoc """
A voting room. Identified publicly by a short `room_number` used in URLs.
"""
use Ecto.Schema
import Ecto.Changeset
alias Rsh26pool.Voting.{Idea, Participant}
schema "rooms" do
field :room_number, :string
field :name, :string
field :votes_per_user, :integer, default: 3
field :status, :string, default: "open"
field :grouping_mode, :boolean, default: false
field :leader_threshold, :integer, default: 2
field :closes_at, :utc_datetime
field :grouped_at, :utc_datetime
# Virtual field backing the `datetime-local` input (wall-clock JST).
field :closes_at_local, :string, virtual: true
has_many :participants, Participant
has_many :ideas, Idea
timestamps(type: :utc_datetime)
end
@doc "Changeset used when the owner creates a new room."
def create_changeset(room, attrs) do
room
|> cast(attrs, [
:name,
:votes_per_user,
:grouping_mode,
:leader_threshold,
:closes_at_local
])
|> validate_required([:name, :votes_per_user], message: "入力してください")
|> validate_length(:name, max: 80, message: "80文字以内で入力してください")
|> validate_number(:votes_per_user,
greater_than_or_equal_to: 1,
less_than_or_equal_to: 50,
message: "1〜50の数値を入力してください"
)
|> validate_number(:leader_threshold,
greater_than_or_equal_to: 1,
less_than_or_equal_to: 50,
message: "1〜50の数値を入力してください"
)
|> put_closes_at()
end
@doc "Changeset for owner-editable settings on the manage page."
def settings_changeset(room, attrs) do
room
|> cast(attrs, [:name])
|> validate_required([:name], message: "入力してください")
|> validate_length(:name, max: 80, message: "80文字以内で入力してください")
end
defp put_closes_at(changeset) do
case get_field(changeset, :closes_at_local) do
blank when blank in [nil, ""] ->
put_change(changeset, :closes_at, nil)
value ->
case Rsh26pool.JST.parse_local(value) do
{:ok, dt} ->
if DateTime.compare(dt, DateTime.utc_now()) == :gt do
put_change(changeset, :closes_at, dt)
else
add_error(changeset, :closes_at_local, "未来の日時を指定してください")
end
:error ->
add_error(changeset, :closes_at_local, "日時の形式が正しくありません")
end
end
end
end