Skip to content

Commit e96d958

Browse files
Add opts support for assets listing and counting
1 parent 742ddb0 commit e96d958

File tree

1 file changed

+69
-15
lines changed

1 file changed

+69
-15
lines changed

lib/beacon/media_library.ex

Lines changed: 69 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -164,25 +164,79 @@ defmodule Beacon.MediaLibrary do
164164
end
165165

166166
@doc """
167-
Returns the list of all uploaded assetf of `site`.
167+
Returns the list of all uploaded assets of `site`.
168168
169-
## Examples
169+
## Options
170170
171-
iex> list_assets(:my_site)
172-
[%Asset{}, ...]
171+
* `:per_page` - limit how many records are returned, or pass `:infinity` to return all records. Defaults to 20.
172+
* `:page` - returns records from a specfic page. Defaults to 1.
173+
* `:query` - search pages by path or title.
174+
* `:preloads` - a list of preloads to load.
175+
* `:sort` - column in which the result will be ordered by.
173176
174177
"""
175-
@spec list_assets(Site.t()) :: [Asset.t()]
176-
def list_assets(site) do
177-
Repo.all(
178-
from(asset in Asset,
179-
where: asset.site == ^site,
180-
where: is_nil(asset.deleted_at),
181-
where: is_nil(asset.source_id),
182-
order_by: [desc: asset.inserted_at],
183-
preload: [:thumbnail]
184-
)
185-
)
178+
@doc type: :assets
179+
@spec list_assets(Site.t(), keyword()) :: [Asset.t()]
180+
def list_assets(site, opts \\ []) do
181+
per_page = Keyword.get(opts, :per_page, 20)
182+
page = Keyword.get(opts, :page, 1)
183+
search = Keyword.get(opts, :query)
184+
preloads = Keyword.get(opts, :preloads, [:thumbnail])
185+
sort = Keyword.get(opts, :sort, :inserted_at)
186+
187+
site
188+
|> query_list_assets_base()
189+
|> query_list_assets_limit(per_page)
190+
|> query_list_assets_offset(per_page, page)
191+
|> query_list_assets_search(search)
192+
|> query_list_assets_preloads(preloads)
193+
|> query_list_assets_sort(sort)
194+
|> Repo.all()
195+
end
196+
197+
defp query_list_assets_base(site) do
198+
from(asset in Asset, where: asset.site == ^site and is_nil(asset.deleted_at) and is_nil(asset.source_id))
199+
end
200+
201+
defp query_list_assets_limit(query, limit) when is_integer(limit), do: from(q in query, limit: ^limit)
202+
defp query_list_assets_limit(query, :infinity = _limit), do: query
203+
defp query_list_assets_limit(query, _per_page), do: from(q in query, limit: 20)
204+
205+
defp query_list_assets_offset(query, per_page, page) when is_integer(per_page) and is_integer(page) do
206+
offset = page * per_page - per_page
207+
from(q in query, offset: ^offset)
208+
end
209+
210+
defp query_list_assets_offset(query, _per_page, _page), do: from(q in query, offset: 0)
211+
212+
defp query_list_assets_search(query, search) when is_binary(search) do
213+
from(q in query, where: ilike(q.file_name, ^"%#{search}%"))
214+
end
215+
216+
defp query_list_assets_search(query, _search), do: query
217+
218+
defp query_list_assets_preloads(query, [_preload | _] = preloads), do: from(q in query, preload: ^preloads)
219+
defp query_list_assets_preloads(query, _preloads), do: query
220+
221+
defp query_list_assets_sort(query, sort), do: from(q in query, order_by: [desc: ^sort])
222+
223+
@doc """
224+
Counts the total number of assets based on the amount of pages.
225+
226+
## Options
227+
228+
* `:query` - filter rows count by query
229+
230+
"""
231+
@doc type: :assets
232+
@spec count_assets(Site.t(), keyword()) :: integer()
233+
def count_assets(site, opts \\ []) do
234+
search = Keyword.get(opts, :query)
235+
base = from asset in Asset, where: asset.site == ^site, select: count(asset.id)
236+
237+
base
238+
|> query_list_assets_search(search)
239+
|> Repo.one()
186240
end
187241

188242
@doc """

0 commit comments

Comments
 (0)