|
| 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 |
0 commit comments