Files
Claper/lib/claper/events/event.ex
2024-04-06 11:48:47 +02:00

83 lines
2.0 KiB
Elixir

defmodule Claper.Events.Event do
use Ecto.Schema
import Ecto.Changeset
schema "events" do
field :uuid, :binary_id
field :name, :string
field :code, :string
field :audience_peak, :integer, default: 1
field :started_at, :naive_datetime
field :expired_at, :naive_datetime
has_many :posts, Claper.Posts.Post
has_many :leaders, Claper.Events.ActivityLeader, on_replace: :delete
has_one :presentation_file, Claper.Presentations.PresentationFile
belongs_to :user, Claper.Accounts.User
timestamps()
end
@doc false
def changeset(event, attrs) do
event
|> cast(attrs, [
:name,
:code,
:started_at,
:expired_at,
:audience_peak
])
|> cast_assoc(:presentation_file)
|> cast_assoc(:leaders)
|> validate_required([:code, :name])
end
def create_changeset(event, attrs) do
event
|> cast(attrs, [:name, :code, :user_id, :started_at, :expired_at])
|> cast_assoc(:presentation_file)
|> cast_assoc(:leaders)
|> validate_required([:code, :started_at])
|> downcase_code
end
def downcase_code(changeset) do
update_change(
changeset,
:code,
&(&1 |> String.downcase() |> String.split(~r"[^\w\d]", trim: true) |> List.first())
)
end
def update_changeset(event, attrs) do
event
|> cast(attrs, [:name, :code, :started_at, :expired_at, :audience_peak])
|> cast_assoc(:presentation_file)
|> cast_assoc(:leaders)
|> validate_required([:code, :started_at])
|> downcase_code
end
def restart_changeset(event) do
expiry =
NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second) |> NaiveDateTime.add(48 * 3600)
change(event, expired_at: expiry)
end
def subscribe(event_id) do
Phoenix.PubSub.subscribe(Claper.PubSub, "event:#{event_id}")
end
def started?(event) do
NaiveDateTime.compare(NaiveDateTime.utc_now(), event.started_at) == :gt
end
def finished?(event) do
event.expired_at && NaiveDateTime.compare(NaiveDateTime.utc_now(), event.expired_at) == :gt
end
end