Skip to content

Commit cbea862

Browse files
authored
feat: entry entity (#46)
* feat: entry entity * fix: documentation * refactor: define required and optional fields
1 parent 9a463ce commit cbea862

5 files changed

Lines changed: 241 additions & 0 deletions

File tree

lib/yearbook/entries.ex

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
defmodule Yearbook.Entries do
2+
@moduledoc """
3+
The Entries context.
4+
"""
5+
6+
import Ecto.Query, warn: false
7+
alias Yearbook.Repo
8+
9+
alias Yearbook.Entries.Entry
10+
11+
@doc """
12+
Returns the list of entries.
13+
14+
## Examples
15+
16+
iex> list_entries()
17+
[%Entry{}, ...]
18+
19+
"""
20+
def list_entries do
21+
Repo.all(Entry)
22+
end
23+
24+
@doc """
25+
Gets a single entry.
26+
27+
Raises `Ecto.NoResultsError` if the Entry does not exist.
28+
29+
## Examples
30+
31+
iex> get_entry!(123)
32+
%Entry{}
33+
34+
iex> get_entry!(456)
35+
** (Ecto.NoResultsError)
36+
37+
"""
38+
def get_entry!(id), do: Repo.get!(Entry, id)
39+
40+
@doc """
41+
Creates a entry.
42+
43+
## Examples
44+
45+
iex> create_entry(%{field: value})
46+
{:ok, %Entry{}}
47+
48+
iex> create_entry(%{field: bad_value})
49+
{:error, %Ecto.Changeset{}}
50+
51+
"""
52+
def create_entry(attrs) do
53+
%Entry{}
54+
|> Entry.changeset(attrs)
55+
|> Repo.insert()
56+
end
57+
58+
@doc """
59+
Updates a entry.
60+
61+
## Examples
62+
63+
iex> update_entry(entry, %{field: new_value})
64+
{:ok, %Entry{}}
65+
66+
iex> update_entry(entry, %{field: bad_value})
67+
{:error, %Ecto.Changeset{}}
68+
69+
"""
70+
def update_entry(%Entry{} = entry, attrs) do
71+
entry
72+
|> Entry.changeset(attrs)
73+
|> Repo.update()
74+
end
75+
76+
@doc """
77+
Deletes a entry.
78+
79+
## Examples
80+
81+
iex> delete_entry(entry)
82+
{:ok, %Entry{}}
83+
84+
iex> delete_entry(entry)
85+
{:error, %Ecto.Changeset{}}
86+
87+
"""
88+
def delete_entry(%Entry{} = entry) do
89+
Repo.delete(entry)
90+
end
91+
92+
@doc """
93+
Returns an `%Ecto.Changeset{}` for tracking entry changes.
94+
95+
## Examples
96+
97+
iex> change_entry(entry)
98+
%Ecto.Changeset{data: %Entry{}}
99+
100+
"""
101+
def change_entry(%Entry{} = entry, attrs \\ %{}) do
102+
Entry.changeset(entry, attrs)
103+
end
104+
end

lib/yearbook/entries/entry.ex

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
defmodule Yearbook.Entries.Entry do
2+
@moduledoc """
3+
Schema for a yearbook entry.
4+
"""
5+
6+
use Ecto.Schema
7+
import Ecto.Changeset
8+
9+
@required_fields ~w(photo name text)a
10+
@optional_fields ~w(status)a
11+
@primary_key {:id, :binary_id, autogenerate: true}
12+
@foreign_key_type :binary_id
13+
schema "entries" do
14+
field :photo, :string
15+
field :name, :string
16+
field :text, :string
17+
field :status, Ecto.Enum, values: [:accepted, :pending, :denied], default: :pending
18+
19+
timestamps(type: :utc_datetime)
20+
end
21+
22+
@doc false
23+
def changeset(entry, attrs) do
24+
entry
25+
|> cast(attrs, @required_fields ++ @optional_fields)
26+
|> validate_required(@required_fields)
27+
end
28+
end
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
defmodule Yearbook.Repo.Migrations.CreateEntries do
2+
use Ecto.Migration
3+
4+
def change do
5+
create table(:entries, primary_key: false) do
6+
add :id, :binary_id, primary_key: true
7+
add :photo, :string
8+
add :name, :string
9+
add :text, :text
10+
add :status, :string, default: "pending"
11+
12+
timestamps(type: :utc_datetime)
13+
end
14+
end
15+
end
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
defmodule Yearbook.EntriesFixtures do
2+
@moduledoc """
3+
This module defines test helpers for creating
4+
entities via the `Yearbook.Entries` context.
5+
"""
6+
7+
@doc """
8+
Generate a entry.
9+
"""
10+
def entry_fixture(attrs \\ %{}) do
11+
{:ok, entry} =
12+
attrs
13+
|> Enum.into(%{
14+
name: "some name",
15+
photo: "some photo",
16+
status: :pending,
17+
text: "some text"
18+
})
19+
|> Yearbook.Entries.create_entry()
20+
21+
entry
22+
end
23+
end

test/yearbook/entries_test.exs

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
defmodule Yearbook.EntriesTest do
2+
use Yearbook.DataCase
3+
4+
alias Yearbook.Entries
5+
6+
describe "entries" do
7+
alias Yearbook.Entries.Entry
8+
9+
import Yearbook.EntriesFixtures
10+
11+
@invalid_attrs %{name: nil, status: nil, text: nil, photo: nil}
12+
13+
test "list_entries/0 returns all entries" do
14+
entry = entry_fixture()
15+
assert Entries.list_entries() == [entry]
16+
end
17+
18+
test "get_entry!/1 returns the entry with given id" do
19+
entry = entry_fixture()
20+
assert Entries.get_entry!(entry.id) == entry
21+
end
22+
23+
test "create_entry/1 with valid data creates a entry" do
24+
valid_attrs = %{name: "some name", status: :pending, text: "some text", photo: "some photo"}
25+
26+
assert {:ok, %Entry{} = entry} = Entries.create_entry(valid_attrs)
27+
assert entry.name == "some name"
28+
assert entry.status == :pending
29+
assert entry.text == "some text"
30+
assert entry.photo == "some photo"
31+
end
32+
33+
test "create_entry/1 with invalid data returns error changeset" do
34+
assert {:error, %Ecto.Changeset{}} = Entries.create_entry(@invalid_attrs)
35+
end
36+
37+
test "update_entry/2 with valid data updates the entry" do
38+
entry = entry_fixture()
39+
40+
update_attrs = %{
41+
name: "some updated name",
42+
status: :accepted,
43+
text: "some updated text",
44+
photo: "some updated photo"
45+
}
46+
47+
assert {:ok, %Entry{} = entry} = Entries.update_entry(entry, update_attrs)
48+
assert entry.name == "some updated name"
49+
assert entry.status == :accepted
50+
assert entry.text == "some updated text"
51+
assert entry.photo == "some updated photo"
52+
end
53+
54+
test "update_entry/2 with invalid data returns error changeset" do
55+
entry = entry_fixture()
56+
assert {:error, %Ecto.Changeset{}} = Entries.update_entry(entry, @invalid_attrs)
57+
assert entry == Entries.get_entry!(entry.id)
58+
end
59+
60+
test "delete_entry/1 deletes the entry" do
61+
entry = entry_fixture()
62+
assert {:ok, %Entry{}} = Entries.delete_entry(entry)
63+
assert_raise Ecto.NoResultsError, fn -> Entries.get_entry!(entry.id) end
64+
end
65+
66+
test "change_entry/1 returns a entry changeset" do
67+
entry = entry_fixture()
68+
assert %Ecto.Changeset{} = Entries.change_entry(entry)
69+
end
70+
end
71+
end

0 commit comments

Comments
 (0)