Skip to content

Commit 8c768fc

Browse files
committed
removed virtual fields
1 parent b21d95c commit 8c768fc

File tree

3 files changed

+8
-40
lines changed

3 files changed

+8
-40
lines changed

README.md

+1-5
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ You make your model JSON-encodable using Poison. You should also use `Ecto.UUID`
2222
The Crudex.Model also provides the following macros:
2323

2424
* `crudex_schema` => is like `schema` from Ecto.Model but defines ID/foreign keys to be UUID and creates timestamps. You should use this if you want to use the CRUD controller functionalities. It also allows using the two macros below
25-
* `virtual_field` => creates a virtual field, which value will be resolved during encoding, by invoking a callback.
2625
* `hidden_field` => creates a regular field which will be excluded when encoding
2726

2827
### Example
@@ -33,15 +32,12 @@ defmodule Example.User do
3332
crudex_schema "users" do
3433
field :name, :string
3534
field :surname, :string
36-
virtual_field :full_name, :string
3735
field :email, :string
3836
hidden_field :salt, Crudex.JSONBinary
3937
hidden_field :password, Crudex.JSONBinary
4038
field :role, :string
4139
end
42-
43-
def __crudex_virtuals__(:resolve, :full_name, %{name: name, surname: surname}), do: name <> " " <> surname
44-
40+
4541
...
4642
end
4743
```

lib/crudex/crud_controller.ex

+6-6
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@ defmodule Crudex.CrudController do
2525
end
2626

2727
def do_index(conn, repo, module, user_scoped, _) do
28-
json conn, module |> apply_scope(conn, user_scoped) |> repo.all |> Crudex.Model.resolve_all_virtuals(module)
28+
json conn, module |> apply_scope(conn, user_scoped) |> repo.all
2929
end
3030

3131
def do_create(conn, repo, module, user_scoped, %{"data" => data}) do
3232
changeset = module.changeset(struct(module), add_user_id(data, conn, user_scoped))
3333

3434
case changeset.valid? do
35-
true -> changeset |> repo.insert |> Crudex.Model.resolve_virtuals(module) |> send_data(conn)
35+
true -> changeset |> repo.insert |> send_data(conn)
3636
false -> send_error(conn, :bad_request, format_errors(changeset.errors))
3737
end
3838
end
@@ -43,7 +43,7 @@ defmodule Crudex.CrudController do
4343

4444
case from(r in module, where: r.id == ^data_id, preload: ^assocs) |> apply_scope(conn, user_scoped) |> repo.one do
4545
nil -> send_error(conn, :not_found, %{message: "not found"})
46-
data -> data |> Crudex.Model.resolve_virtuals_recursively(module, assocs) |> send_data(conn)
46+
data -> data |> send_data(conn)
4747
end
4848
end
4949
def do_show(conn, _repo, _module, _user_scoped, _params), do: send_error(conn, :not_found, %{message: "not found"})
@@ -52,7 +52,7 @@ defmodule Crudex.CrudController do
5252
sanitized_fields = sanitize(updated_fields, user_scoped)
5353
case from(r in module, where: r.id == ^data_id) |> apply_scope(conn, user_scoped) |> repo.one do
5454
nil -> send_error(conn, :not_found, %{message: "not found"})
55-
data -> data |> module.changeset(sanitized_fields) |> _update_data(module, conn, repo)
55+
data -> data |> module.changeset(sanitized_fields) |> _update_data(conn, repo)
5656
end
5757
end
5858
def do_update(conn, _repo, _module, _user_scoped, %{"data" => _updated_fields}), do: send_error(conn, :not_found, %{message: "not found"})
@@ -80,9 +80,9 @@ defmodule Crudex.CrudController do
8080
apply_scope(query, conn, true)
8181
end
8282

83-
defp _update_data(changeset, module, conn, repo) do
83+
defp _update_data(changeset, conn, repo) do
8484
case changeset.valid? do
85-
true -> changeset |> repo.update |> Crudex.Model.resolve_virtuals(module) |> send_data(conn)
85+
true -> changeset |> repo.update |> send_data(conn)
8686
false -> send_error(conn, :bad_request, format_errors(changeset.errors))
8787
end
8888
end

lib/crudex/model.ex

+1-29
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@ defmodule Crudex.Model do
44
defmacro __using__(_) do
55
quote do
66
use Ecto.Model
7-
import Crudex.Model, only: [crudex_schema: 2, virtual_field: 2, hidden_field: 2]
7+
import Crudex.Model, only: [crudex_schema: 2, hidden_field: 2]
88

9-
Module.register_attribute __MODULE__, :crudex_virtuals, accumulate: true, persist: false
109
Module.register_attribute __MODULE__, :crudex_hidden, accumulate: true, persist: false
1110

1211
defimpl Poison.Encoder, for: __MODULE__ do
@@ -24,23 +23,12 @@ defmodule Crudex.Model do
2423
timestamps inserted_at: :created_at
2524
end
2625

27-
def __crudex_virtuals__(:fields) do
28-
@crudex_virtuals
29-
end
30-
3126
def __crudex_hidden__ do
3227
@crudex_hidden
3328
end
3429
end
3530
end
3631

37-
defmacro virtual_field(name, type) do
38-
quote do
39-
Module.put_attribute __MODULE__, :crudex_virtuals, {unquote(name), unquote(type)}
40-
field unquote(name), unquote(type), virtual: true
41-
end
42-
end
43-
4432
defmacro hidden_field(name, type) do
4533
quote do
4634
Module.put_attribute __MODULE__, :crudex_hidden, unquote(name)
@@ -61,22 +49,6 @@ defmodule Crudex.Model do
6149
Enum.reduce(module.__crudex_hidden__, model, &Map.delete(&2, &1))
6250
end
6351

64-
def resolve_virtuals_recursively(model, module, assocs) do
65-
model = resolve_virtuals(model, module)
66-
Enum.reduce(assocs, model, &resolve_for_association(&1, &2, module))
67-
end
68-
69-
defp resolve_for_association(assoc, model, module) do
70-
Map.put(model, assoc, resolve_all_virtuals(Map.get(model, assoc), module))
71-
end
72-
73-
def resolve_all_virtuals(models, module) do
74-
for model <- models, do: resolve_virtuals(model, module)
75-
end
76-
77-
def resolve_virtuals(model, module), do: Enum.reduce(module.__crudex_virtuals__(:fields), model, &resolve_virtual(&1, &2, module))
78-
defp resolve_virtual({field, _type}, model, module), do: Map.put(model, field, module.__crudex_virtuals__(:resolve, field, model))
79-
8052
## Implementation
8153
defp encode_model_associations(model, module) do
8254
reduce_on_associations(model, module, fn field, model ->

0 commit comments

Comments
 (0)