Skip to content

Commit 83228c5

Browse files
add todo projector
1 parent c188df2 commit 83228c5

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

lib/todo_backend/application.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ defmodule TodoBackend.Application do
99
def start(_type, _args) do
1010
children = [
1111
TodoBackend.App,
12+
TodoBackend.Todos.Supervisor,
1213
# Start the Ecto repository
1314
TodoBackend.Repo,
1415
# Start the Telemetry supervisor
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
defmodule TodoBackend.Todos.Projectors.Todo do
2+
use Commanded.Projections.Ecto,
3+
name: "Todos.Projectors.Todo",
4+
application: TodoBackend.App,
5+
consistency: :strong
6+
7+
alias TodoBackend.Repo
8+
9+
alias TodoBackend.Todos.Events.TodoCreated
10+
alias TodoBackend.Todos.Events.TodoDeleted
11+
alias TodoBackend.Todos.Events.TodoCompleted
12+
alias TodoBackend.Todos.Events.TodoUncompleted
13+
alias TodoBackend.Todos.Events.TodoTitleUpdated
14+
alias TodoBackend.Todos.Events.TodoOrderUpdated
15+
16+
alias TodoBackend.Todos.Projections.Todo
17+
18+
project(%TodoCreated{} = created, _, fn multi ->
19+
Ecto.Multi.insert(multi, :todo, %Todo{
20+
uuid: created.uuid,
21+
title: created.title,
22+
completed: created.completed,
23+
order: created.order
24+
})
25+
end)
26+
27+
project(%TodoDeleted{uuid: uuid}, _, fn multi ->
28+
Ecto.Multi.delete(multi, :todo, fn _ -> %Todo{uuid: uuid} end)
29+
end)
30+
31+
project(%TodoCompleted{uuid: uuid}, _, fn multi ->
32+
case Repo.get(Todo, uuid) do
33+
nil -> multi
34+
todo -> Ecto.Multi.update(multi, :todo, Todo.update_changeset(todo, %{completed: true}))
35+
end
36+
end)
37+
38+
project(%TodoUncompleted{uuid: uuid}, _, fn multi ->
39+
case Repo.get(Todo, uuid) do
40+
nil -> multi
41+
todo -> Ecto.Multi.update(multi, :todo, Todo.update_changeset(todo, %{completed: false}))
42+
end
43+
end)
44+
45+
project(%TodoTitleUpdated{uuid: uuid, title: title}, _, fn multi ->
46+
case Repo.get(Todo, uuid) do
47+
nil -> multi
48+
todo -> Ecto.Multi.update(multi, :todo, Todo.update_changeset(todo, %{title: title}))
49+
end
50+
end)
51+
52+
project(%TodoOrderUpdated{uuid: uuid, order: order}, _, fn multi ->
53+
case Repo.get(Todo, uuid) do
54+
nil -> multi
55+
todo -> Ecto.Multi.update(multi, :todo, Todo.update_changeset(todo, %{order: order}))
56+
end
57+
end)
58+
end
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
defmodule TodoBackend.Todos.Supervisor do
2+
use Supervisor
3+
4+
alias TodoBackend.Todos
5+
6+
def start_link(arg) do
7+
Supervisor.start_link(__MODULE__, arg, name: __MODULE__)
8+
end
9+
10+
def init(_arg) do
11+
Supervisor.init(
12+
[
13+
Todos.Projectors.Todo
14+
],
15+
strategy: :one_for_one
16+
)
17+
end
18+
end

0 commit comments

Comments
 (0)