Skip to content

Commit 2d959dc

Browse files
replace todo context implementations with command dispatch
1 parent 7d2c1fa commit 2d959dc

2 files changed

Lines changed: 36 additions & 23 deletions

File tree

lib/todo_backend/todos.ex

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ defmodule TodoBackend.Todos do
44
"""
55

66
import Ecto.Query, warn: false
7+
alias TodoBackend.App
78
alias TodoBackend.Repo
9+
alias TodoBackend.Todos.Commands.CreateTodo
10+
alias TodoBackend.Todos.Commands.DeleteTodo
11+
alias TodoBackend.Todos.Commands.UpdateTodo
812

913
alias TodoBackend.Todos.Projections.Todo
1014

@@ -50,9 +54,18 @@ defmodule TodoBackend.Todos do
5054
5155
"""
5256
def create_todo(attrs \\ %{}) do
53-
%Todo{}
54-
|> Todo.changeset(attrs)
55-
|> Repo.insert()
57+
uuid = Ecto.UUID.generate()
58+
59+
command =
60+
attrs
61+
|> CreateTodo.new()
62+
|> CreateTodo.assign_uuid(uuid)
63+
64+
with :ok <- App.dispatch(command, consistency: :strong) do
65+
{:ok, get_todo!(uuid)}
66+
else
67+
reply -> reply
68+
end
5669
end
5770

5871
@doc """
@@ -67,10 +80,17 @@ defmodule TodoBackend.Todos do
6780
{:error, %Ecto.Changeset{}}
6881
6982
"""
70-
def update_todo(%Todo{} = todo, attrs) do
71-
todo
72-
|> Todo.changeset(attrs)
73-
|> Repo.update()
83+
def update_todo(%Todo{uuid: uuid}, attrs) do
84+
command =
85+
attrs
86+
|> UpdateTodo.new()
87+
|> UpdateTodo.assign_uuid(uuid)
88+
89+
with :ok <- App.dispatch(command, consistency: :strong) do
90+
{:ok, get_todo!(uuid)}
91+
else
92+
reply -> reply
93+
end
7494
end
7595

7696
@doc """
@@ -85,8 +105,14 @@ defmodule TodoBackend.Todos do
85105
{:error, %Ecto.Changeset{}}
86106
87107
"""
88-
def delete_todo(%Todo{} = todo) do
89-
Repo.delete(todo)
108+
def delete_todo(%Todo{uuid: uuid}) do
109+
command = DeleteTodo.new(%{uuid: uuid})
110+
111+
with :ok <- App.dispatch(command) do
112+
:ok
113+
else
114+
reply -> reply
115+
end
90116
end
91117

92118
@doc """
@@ -101,17 +127,4 @@ defmodule TodoBackend.Todos do
101127
def delete_all_todos() do
102128
Repo.delete_all(Todo)
103129
end
104-
105-
@doc """
106-
Returns an `%Ecto.Changeset{}` for tracking todo changes.
107-
108-
## Examples
109-
110-
iex> change_todo(todo)
111-
%Ecto.Changeset{data: %Todo{}}
112-
113-
"""
114-
def change_todo(%Todo{} = todo, attrs \\ %{}) do
115-
Todo.changeset(todo, attrs)
116-
end
117130
end

lib/todo_backend_web/controllers/todo_controller.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ defmodule TodoBackendWeb.TodoController do
3838
def delete(conn, %{"id" => id}) do
3939
todo = Todos.get_todo!(id)
4040

41-
with {:ok, %Todo{}} <- Todos.delete_todo(todo) do
41+
with :ok <- Todos.delete_todo(todo) do
4242
send_resp(conn, :no_content, "")
4343
end
4444
end

0 commit comments

Comments
 (0)