@@ -164,25 +164,79 @@ defmodule Beacon.MediaLibrary do
164
164
end
165
165
166
166
@ doc """
167
- Returns the list of all uploaded assetf of `site`.
167
+ Returns the list of all uploaded assets of `site`.
168
168
169
- ## Examples
169
+ ## Options
170
170
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.
173
176
174
177
"""
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 ( )
186
240
end
187
241
188
242
@ doc """
0 commit comments