Skip to content

Commit 17deb33

Browse files
committed
Pass lists explicitly to adapter and resource module
1 parent 929132d commit 17deb33

File tree

8 files changed

+57
-46
lines changed

8 files changed

+57
-46
lines changed

lib/backpex/adapter.ex

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,41 +27,51 @@ defmodule Backpex.Adapter do
2727
2828
Should return `nil` if no result was found.
2929
"""
30-
@callback get(term(), map(), module()) :: {:ok, struct() | nil} | {:error, term()}
30+
@callback get(primary_value :: term(), assigns :: map(), live_resource :: module(), fields :: list()) ::
31+
{:ok, struct() | nil} | {:error, term()}
3132

3233
@doc """
3334
Returns a list of items by given criteria.
3435
"""
35-
@callback list(keyword(), map(), module()) :: {:ok, list()}
36+
@callback list(criteria :: keyword(), assigns :: map(), live_resource :: module(), fields :: list()) :: {:ok, list()}
3637

3738
@doc """
3839
Gets the total count of the current live_resource.
3940
Possibly being constrained the item query and the search- and filter options.
4041
"""
41-
@callback count(keyword(), map(), module()) :: {:ok, non_neg_integer()}
42+
@callback count(criteria :: keyword(), assigns :: map(), live_resource :: module(), fields :: list()) ::
43+
{:ok, non_neg_integer()}
4244

4345
@doc """
4446
Inserts given item.
4547
"""
46-
@callback insert(struct(), module()) :: {:ok, struct()} | {:error, term()}
48+
@callback insert(item :: struct(), live_resource :: module()) :: {:ok, struct()} | {:error, term()}
4749

4850
@doc """
4951
Updates given item.
5052
"""
51-
@callback update(struct(), module()) :: {:ok, struct()} | {:error, term()}
53+
@callback update(item :: struct(), live_resource :: module()) :: {:ok, struct()} | {:error, term()}
5254

5355
@doc """
5456
Updates given items.
5557
"""
56-
@callback update_all(list(struct()), keyword(), module()) :: {:ok, non_neg_integer()}
58+
@callback update_all(items :: list(struct()), updates :: keyword(), live_resource :: module()) ::
59+
{:ok, non_neg_integer()}
5760

5861
@doc """
5962
Applies a change to a given item.
6063
"""
61-
@callback change(struct(), map(), term(), list(), module(), keyword()) :: Ecto.Changeset.t()
64+
@callback change(
65+
item :: struct(),
66+
attrs :: map(),
67+
fields :: term(),
68+
assigns :: list(),
69+
live_resource :: module(),
70+
opts :: keyword()
71+
) :: Ecto.Changeset.t()
6272

6373
@doc """
6474
Deletes multiple items.
6575
"""
66-
@callback delete_all(list(struct()), module()) :: {:ok, term()} | {:error, term()}
76+
@callback delete_all(items :: list(struct()), live_resource :: module()) :: {:ok, term()} | {:error, term()}
6777
end

lib/backpex/adapters/ash.ex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ if Code.ensure_loaded?(Ash) do
2929
Returns `nil` if no result was found.
3030
"""
3131
@impl Backpex.Adapter
32-
def get(primary_value, _assigns, live_resource) do
32+
def get(primary_value, _assigns, live_resource, _fields) do
3333
resource = live_resource.adapter_config(:resource)
3434
primary_key = live_resource.config(:primary_key)
3535

@@ -42,7 +42,7 @@ if Code.ensure_loaded?(Ash) do
4242
Returns a list of items by given criteria.
4343
"""
4444
@impl Backpex.Adapter
45-
def list(_criteria, _assigns, live_resource) do
45+
def list(_criteria, _assigns, live_resource, _fields) do
4646
live_resource.adapter_config(:resource)
4747
|> Ash.read()
4848
end
@@ -51,7 +51,7 @@ if Code.ensure_loaded?(Ash) do
5151
Returns the number of items matching the given criteria.
5252
"""
5353
@impl Backpex.Adapter
54-
def count(_criteria, _assigns, live_resource) do
54+
def count(_criteria, _assigns, live_resource, _fields) do
5555
live_resource.adapter_config(:resource)
5656
|> Ash.count()
5757
end

lib/backpex/adapters/ecto.ex

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,8 @@ defmodule Backpex.Adapters.Ecto do
7575
Gets a database record with the given primary key value.
7676
"""
7777
@impl Backpex.Adapter
78-
def get(primary_value, assigns, live_resource) do
78+
def get(primary_value, assigns, live_resource, fields) do
7979
repo = live_resource.adapter_config(:repo)
80-
fields = live_resource.fields(assigns.live_action, assigns)
8180

8281
record_query(primary_value, assigns, fields, live_resource)
8382
|> repo.one()
@@ -88,10 +87,10 @@ defmodule Backpex.Adapters.Ecto do
8887
Returns a list of items by given criteria.
8988
"""
9089
@impl Backpex.Adapter
91-
def list(criteria, assigns, live_resource) do
90+
def list(criteria, assigns, live_resource, fields) do
9291
repo = live_resource.adapter_config(:repo)
9392

94-
list_query(criteria, assigns, live_resource)
93+
list_query(criteria, assigns, live_resource, fields)
9594
|> repo.all()
9695
|> then(fn items -> {:ok, items} end)
9796
end
@@ -100,10 +99,10 @@ defmodule Backpex.Adapters.Ecto do
10099
Returns the number of items matching the given criteria.
101100
"""
102101
@impl Backpex.Adapter
103-
def count(criteria, assigns, live_resource) do
102+
def count(criteria, assigns, live_resource, fields) do
104103
repo = live_resource.adapter_config(:repo)
105104

106-
list_query(criteria, assigns, live_resource)
105+
list_query(criteria, assigns, live_resource, fields)
107106
|> exclude(:preload)
108107
|> exclude(:select)
109108
|> subquery()
@@ -116,11 +115,10 @@ defmodule Backpex.Adapters.Ecto do
116115
117116
TODO: Should be private.
118117
"""
119-
def list_query(criteria, assigns, live_resource) do
118+
def list_query(criteria, assigns, live_resource, fields) do
120119
schema = live_resource.adapter_config(:schema)
121120
item_query = live_resource.adapter_config(:item_query)
122121
full_text_search = live_resource.config(:full_text_search)
123-
fields = live_resource.fields(:index, assigns)
124122
associations = associations(fields, schema)
125123

126124
schema

lib/backpex/live_components/form_component.ex

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ defmodule Backpex.FormComponent do
203203
defp handle_save(socket, key, params, save_type \\ "save")
204204

205205
defp handle_save(socket, :new, params, save_type) do
206-
%{assigns: %{live_resource: live_resource, item: item, live_action: live_action} = assigns} = socket
206+
%{assigns: %{live_resource: live_resource, fields: fields, item: item, live_action: live_action} = assigns} = socket
207207

208208
opts = [
209209
assocs: Map.get(assigns, :assocs, []),
@@ -215,7 +215,7 @@ defmodule Backpex.FormComponent do
215215
end
216216
]
217217

218-
case Resource.insert(item, params, socket.assigns, live_resource, opts) do
218+
case Resource.insert(item, params, socket.assigns, live_resource, fields, opts) do
219219
{:ok, item} ->
220220
return_to = return_to_path(save_type, live_resource, socket, socket.assigns, live_action, item)
221221

@@ -248,7 +248,8 @@ defmodule Backpex.FormComponent do
248248
%{
249249
live_resource: live_resource,
250250
item: item,
251-
live_action: live_action
251+
live_action: live_action,
252+
fields: fields
252253
} = socket.assigns
253254

254255
opts = [
@@ -261,7 +262,7 @@ defmodule Backpex.FormComponent do
261262
end
262263
]
263264

264-
case Resource.update(item, params, socket.assigns, live_resource, opts) do
265+
case Resource.update(item, params, socket.assigns, fields, live_resource, opts) do
265266
{:ok, item} ->
266267
return_to = return_to_path(save_type, live_resource, socket, socket.assigns, live_action, item)
267268

lib/backpex/live_resource/form.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,12 @@ defmodule Backpex.LiveResource.Form do
7575
end
7676

7777
defp assign_item(socket, :edit = _live_action) do
78-
%{live_resource: live_resource, params: params} = socket.assigns
78+
%{live_resource: live_resource, fields: fields, params: params} = socket.assigns
7979

8080
backpex_id = Map.fetch!(params, "backpex_id")
8181
primary_value = URI.decode(backpex_id)
8282

83-
item = Resource.get!(primary_value, socket.assigns, live_resource)
83+
item = Resource.get!(primary_value, socket.assigns, live_resource, fields)
8484

8585
assign(socket, :item, item)
8686
end

lib/backpex/live_resource/index.ex

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -360,11 +360,11 @@ defmodule Backpex.LiveResource.Index do
360360
end
361361

362362
defp update_item(socket, item) do
363-
%{live_resource: live_resource, items: items} = socket.assigns
363+
%{live_resource: live_resource, fields: fields, items: items} = socket.assigns
364364

365365
primary_value = LiveResource.primary_value(item, live_resource)
366366
primary_value_str = to_string(primary_value)
367-
{:ok, updated_item} = Resource.get(primary_value, socket.assigns, live_resource)
367+
{:ok, updated_item} = Resource.get(primary_value, socket.assigns, live_resource, fields)
368368

369369
updated_items =
370370
Enum.map(items, fn current_item ->
@@ -446,7 +446,7 @@ defmodule Backpex.LiveResource.Index do
446446
filters: LiveResource.filter_options(valid_filter_params, filters)
447447
]
448448

449-
{:ok, item_count} = Resource.count(count_criteria, socket.assigns, live_resource)
449+
{:ok, item_count} = Resource.count(count_criteria, socket.assigns, live_resource, fields)
450450

451451
per_page =
452452
params
@@ -555,7 +555,7 @@ defmodule Backpex.LiveResource.Index do
555555
filters: LiveResource.filter_options(valid_filter_params, filters)
556556
]
557557

558-
{:ok, item_count} = Resource.count(count_criteria, socket.assigns, live_resource)
558+
{:ok, item_count} = Resource.count(count_criteria, socket.assigns, live_resource, fields)
559559
%{page: page, per_page: per_page} = query_options
560560
total_pages = LiveResource.calculate_total_pages(item_count, per_page)
561561
new_query_options = Map.put(query_options, :page, LiveResource.validate_page(page, total_pages))
@@ -588,7 +588,7 @@ defmodule Backpex.LiveResource.Index do
588588
filters: LiveResource.filter_options(query_options, filters)
589589
]
590590

591-
query = EctoAdapter.list_query(criteria, socket.assigns, live_resource)
591+
query = EctoAdapter.list_query(criteria, socket.assigns, live_resource, fields)
592592

593593
case Backpex.Metric.metrics_visible?(metric_visibility, live_resource) do
594594
true ->
@@ -611,8 +611,12 @@ defmodule Backpex.LiveResource.Index do
611611
end
612612

613613
defp assign_items(socket) do
614-
criteria = LiveResource.build_criteria(socket.assigns)
615-
{:ok, items} = Resource.list(criteria, socket.assigns, socket.assigns.live_resource)
614+
%{assigns: %{live_resource: live_resource, fields: fields} = assigns} = socket
615+
616+
{:ok, items} =
617+
assigns
618+
|> LiveResource.build_criteria()
619+
|> Resource.list(assigns, live_resource, fields)
616620

617621
assign(socket, :items, items)
618622
end

lib/backpex/live_resource/show.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,10 @@ defmodule Backpex.LiveResource.Show do
5151
end
5252

5353
defp assign_item(socket) do
54-
%{live_resource: live_resource, params: params} = socket.assigns
54+
%{live_resource: live_resource, fields: fields, params: params} = socket.assigns
5555
backpex_id = Map.fetch!(params, "backpex_id")
5656
primary_value = URI.decode(backpex_id)
57-
item = Resource.get!(primary_value, socket.assigns, live_resource)
57+
item = Resource.get!(primary_value, socket.assigns, live_resource, fields)
5858

5959
if not live_resource.can?(socket.assigns, :show, item), do: raise(Backpex.ForbiddenError)
6060

lib/backpex/resource.ex

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,20 @@ defmodule Backpex.Resource do
1919
search: {"hello", [:title, :description]}
2020
]
2121
"""
22-
def list(criteria, assigns, live_resource) do
22+
def list(criteria, assigns, live_resource, fields) do
2323
adapter = live_resource.config(:adapter)
2424

25-
adapter.list(criteria, assigns, live_resource)
25+
adapter.list(criteria, assigns, live_resource, fields)
2626
end
2727

2828
@doc """
2929
Gets the total count of the current live_resource.
3030
Possibly being constrained the item query and the search- and filter options.
3131
"""
32-
def count(criteria, assigns, live_resource) do
32+
def count(criteria, assigns, live_resource, fields) do
3333
adapter = live_resource.config(:adapter)
3434

35-
adapter.count(criteria, assigns, live_resource)
35+
adapter.count(criteria, assigns, live_resource, fields)
3636
end
3737

3838
@doc """
@@ -46,17 +46,17 @@ defmodule Backpex.Resource do
4646
* `assigns` (map): The current assigns of the socket.
4747
* `live_resource` (module): The `Backpex.LiveResource` module.
4848
"""
49-
def get(primary_value, assigns, live_resource) do
49+
def get(primary_value, assigns, live_resource, fields) do
5050
adapter = live_resource.config(:adapter)
5151

52-
adapter.get(primary_value, assigns, live_resource)
52+
adapter.get(primary_value, assigns, live_resource, fields)
5353
end
5454

5555
@doc """
5656
Same as `get/4` but returns the result or raises an error.
5757
"""
58-
def get!(primary_value, assigns, live_resource) do
59-
case get(primary_value, assigns, live_resource) do
58+
def get!(primary_value, assigns, live_resource, fields) do
59+
case get(primary_value, assigns, live_resource, fields) do
6060
{:ok, nil} -> raise Backpex.NoResultsError
6161
{:ok, result} -> result
6262
{:error, _error} -> raise Backpex.NoResultsError
@@ -92,11 +92,10 @@ defmodule Backpex.Resource do
9292
* `attrs` (map): A map of parameters that will be passed to the `changeset_function`.
9393
* TODO: docs
9494
"""
95-
def insert(item, attrs, assigns, live_resource, opts) do
95+
def insert(item, attrs, assigns, live_resource, fields, opts) do
9696
{after_save_fun, opts} = Keyword.pop(opts, :after_save_fun, &{:ok, &1})
9797

9898
adapter = live_resource.config(:adapter)
99-
fields = live_resource.fields(:new, assigns)
10099

101100
item
102101
|> change(attrs, fields, assigns, live_resource, Keyword.put(opts, :action, :insert))
@@ -114,11 +113,10 @@ defmodule Backpex.Resource do
114113
* `attrs` (map): A map of parameters that will be passed to the `changeset_function`.
115114
* TODO: docs
116115
"""
117-
def update(item, attrs, assigns, live_resource, opts \\ []) do
116+
def update(item, attrs, assigns, fields, live_resource, opts \\ []) do
118117
{after_save_fun, opts} = Keyword.pop(opts, :after_save_fun, &{:ok, &1})
119118

120119
adapter = live_resource.config(:adapter)
121-
fields = live_resource.fields(:edit, assigns)
122120

123121
item
124122
|> change(attrs, fields, assigns, live_resource, Keyword.put(opts, :action, :update))

0 commit comments

Comments
 (0)