Skip to content

Commit

Permalink
add event schema
Browse files Browse the repository at this point in the history
  • Loading branch information
CorneliaKelinske committed Aug 3, 2024
1 parent 119cd9c commit fc494d0
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 0 deletions.
67 changes: 67 additions & 0 deletions lib/women_in_tech_vic/content/event.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
defmodule WomenInTechVic.Content.Event do
@moduledoc """
An scheduled event for the Women in Tech Vic meetup group.
Can be either in-person or online
"""

use Ecto.Schema
import Ecto.Changeset

@type t :: %__MODULE__{
id: pos_integer() | nil,
title: String.t(),
scheduled_at: DateTime.t(),
online: boolean(),
address: String.t(),
description: String.t(),
updated_at: DateTime.t() | nil,
inserted_at: DateTime.t() | nil
}

@required [:title, :scheduled_at, :online, :address, :description]
@enforce_keys @required

schema "events" do
field :title, :string
field :scheduled_at, :utc_datetime_usec
field :online, :boolean
field :address, :string
field :description, :string

timestamps(type: :utc_datetime_usec)
end

@doc false
@spec create_changeset(map) :: Ecto.Changeset.t()
def create_changeset(attrs) do
@enforce_keys
|> Map.new(&{&1, nil})
|> then(&struct!(__MODULE__, &1))
|> changeset(attrs)
end

@doc false
@spec changeset(t(), map()) :: Ecto.Changeset.t(t)
def changeset(%__MODULE__{} = event, params \\ %{}) do
event
|> cast(params, @required)
|> validate_required(@required)
|> maybe_validate_online_address()
|> unique_constraint(:scheduled_at)
end

defp maybe_validate_online_address(%Ecto.Changeset{valid?: true} = changeset) do
online = fetch_field!(changeset, :online)

if online do
validate_format(
changeset,
:address,
~r|meet.google.com\/|,
message: "Valid google meet link required for online meeting"
)
end
end

defp maybe_validate_online_address(changeset), do: changeset
end
2 changes: 2 additions & 0 deletions priv/repo/migrations/20240802171522_create_events.exs
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,7 @@ defmodule WomenInTechVic.Repo.Migrations.CreateEvents do

timestamps(type: :utc_datetime_usec)
end

create unique_index(:events, :scheduled_at)
end
end
39 changes: 39 additions & 0 deletions test/women_in_tech_vic/content/event_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
defmodule WomenInTechVic.Content.EventTest do
use WomenInTechVic.DataCase, async: true

alias WomenInTechVic.Content.Event

describe "changeset/2" do
test "validates required" do
assert %Ecto.Changeset{errors: errors} = Event.create_changeset(%{})

assert [
title: {"can't be blank", [validation: :required]},
scheduled_at: {"can't be blank", [validation: :required]},
online: {"can't be blank", [validation: :required]},
address: {"can't be blank", [validation: :required]},
description: {"can't be blank", [validation: :required]}
] = errors
end

test "validates google meet link for online meetings" do
params = %{
title: "Online meeting",
description: "Another online meeting",
online: true,
address: "meet.google.com/",
scheduled_at: DateTime.utc_now()
}

assert %Ecto.Changeset{valid?: true} = Event.create_changeset(params)

faulty_params = Map.put(params, :address, "not a valid google meet address")
assert %Ecto.Changeset{errors: errors} = Event.create_changeset(faulty_params)

assert [
address:
{"Valid google meet link required for online meeting", [validation: :format]}
] = errors
end
end
end

0 comments on commit fc494d0

Please sign in to comment.