paginated 1.0.4.2 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 49f9695ec19cbd557cbd15ec981e775e3572371a428e0a6b0ae2abc6803e4201
4
- data.tar.gz: 2f59100f090ccac1c1696d925273f65a2e55de67f5a68cad6f3911700c31f8a0
3
+ metadata.gz: dc1e1341ee42864eac2a4ddfa5850bd346ebbdaa0af08f923b8cf817ae7007c1
4
+ data.tar.gz: e4229ce09bf53d673968e6b3a6f0fc3ec126c2fadbf8d4ce643c398abe304e0a
5
5
  SHA512:
6
- metadata.gz: 5b0d8b686bbf1ace12b48c1aa7059f6f55b82a2281aa36454eccadefb2814b04977071911f2b11482a79c678537bed0c40ccd18e23f3736e0331cda9b1cd13d4
7
- data.tar.gz: d6e047296b4a80fbdbe756b1f39e64c8ff505a5993d4cc4be713dc0b2b01d39a6ed97851678306f962b7cf06a66b29592a069b377289c2737de54d5f7136f6ef
6
+ metadata.gz: e893cbdf13ca2f5dca56230526d7f64241cb1508ec85b71ffd080db80331bf92fb0cb676e5dcca7965f45a2c443fbc91d38e10f58e044e689cfd5b5ba6e5933a
7
+ data.tar.gz: 0fa820a572cef4fa26014b72d5ec25c906532e0b979c313d0c1498020b7eb9bea105619a57db43b46e3949730328d4022552798de0bd0e27e6bb7ce168201b0c
data/README.md CHANGED
@@ -33,8 +33,6 @@ Paginated.collection()
33
33
 
34
34
  `params:` - передаваемые параметры для фильтрации записей.
35
35
 
36
- `order: :name` - название поля, по которому должна осуществляться сортировка.
37
-
38
36
  `search: %w[...]` - список полей, по которым должна осуществляться фильтрация (поиск).
39
37
 
40
38
  Например:
@@ -51,7 +49,20 @@ Paginated.collection(
51
49
  name|ilike
52
50
  role|custom.for_role
53
51
  ],
54
- params:,
55
- order: :name,
52
+ params:
56
53
  )
57
54
  ```
55
+
56
+ ## Параметры HTTP запроса
57
+
58
+ Поиск и сортировка осуществляется путем обработки параметров HTTP запроса.
59
+
60
+ Для поиска по полям необходимо передать их в запросе в виде `?field=value`. Для поиска по нескольким полям, параметры должны быть перечислены через `&`, например: `?field_1=value&field_2=value`.
61
+
62
+ Для сортировки выдачи необходимо передать в параметрах запроса:
63
+
64
+ - `sort_by` - название поля, по которому должна осуществляться сортировка.
65
+
66
+ - `sort_order` направление, по которому должна осуществляться сортировка (`asc/desc`).
67
+
68
+ По умолчанию сортировка осуществляется по `id` записей в направлении `DESC`.
@@ -5,7 +5,7 @@ module Serialization
5
5
  private
6
6
 
7
7
  def serialize
8
- # коллекция записей / сущность для применения аггрегирования
8
+ # коллекция записей ActiveRecord для применения аггрегирования
9
9
  list = @objects || @model.unscoped.merge(@scopes)
10
10
 
11
11
  # применение сортировки и пагинации к коллекции записей
@@ -31,39 +31,12 @@ module Serialization
31
31
  end
32
32
 
33
33
  def serialize_with_entity
34
- @objects = @objects.map { |i| @grape_entity.represent(i, current_user: @current_user).as_json }
35
- end
36
-
37
- def sort_proc
38
- # сортировка не задана явно, не передан параметр
39
- # или значение переданного параметра не совпадает с ожидаемым
40
- if @sort.blank? || @sort.map { |i| i.split('|')[0] }.exclude?(@params[:sort])
41
- field = @order
42
- return proc { order("#{field} DESC") }
43
- end
44
-
45
- @sort.each do |sort_option|
46
- sort, field = sort_option.split('|')
34
+ opts = { current_user: @current_user }
47
35
 
48
- # пропускаем, если поле для сортировки не совпадает с переданным параметром
49
- next if @params[:sort] != sort
36
+ # требуемый список колонок (если был передан)
37
+ opts[:only] = @only_columns if @only_columns
50
38
 
51
- # если поле для сортировки совпадает с ключом переданного параметра
52
- field = sort if field.blank?
53
-
54
- sort_order = "#{@params[:sort_order]} NULLS LAST"
55
-
56
- order_proc =
57
- if field.split('.').count > 1
58
- # сортировка по связанной таблице
59
- relation, column = field.split('.')
60
- proc { eager_load(relation).order("#{relation.tableize}.#{column} #{sort_order}") }
61
- else
62
- proc { order("#{field} #{sort_order}") }
63
- end
64
-
65
- return order_proc
66
- end
39
+ @objects = @objects.map { |i| @grape_entity.represent(i, opts).as_json }
67
40
  end
68
41
 
69
42
  def obtain_fields_values(record)
@@ -0,0 +1,12 @@
1
+ module Sorting
2
+
3
+ extend ActiveSupport::Concern
4
+
5
+ private
6
+
7
+ def sort_proc
8
+ query = Arel.sql("#{@sort_by} #{@sort_order} NULLS LAST")
9
+ proc { order(query) }
10
+ end
11
+
12
+ end
data/lib/paginated.rb CHANGED
@@ -1,10 +1,12 @@
1
1
  require 'paginated/search'
2
2
  require 'paginated/serialization'
3
+ require 'paginated/sorting'
3
4
 
4
5
  class Paginated
5
6
 
6
7
  include Search
7
8
  include Serialization
9
+ include Sorting
8
10
 
9
11
  def initialize(**args)
10
12
  # обработка переданных аргументов
@@ -27,6 +29,8 @@ class Paginated
27
29
  { count: @objects_count, objects: @objects }
28
30
  end
29
31
 
32
+ private
33
+
30
34
  def handle_args(**args)
31
35
  # обрабатываемая Rails модель
32
36
  @model = args[:model]
@@ -50,9 +54,12 @@ class Paginated
50
54
  @offset = @params['offset'].to_i
51
55
  @limit = @params['limit'] || 20
52
56
 
57
+ # требуемый список полей на списке
58
+ @only_columns = args[:only_columns]
59
+
53
60
  # сортировка
54
- @order = args[:order] || :id
55
- @sort = args[:sort]
61
+ @sort_by = @params['sort_by'] || :id
62
+ @sort_order = @params['sort_order'] || :desc
56
63
 
57
64
  # подсчет кол-ва записей
58
65
  @objects_count = records_count
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paginated
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4.2
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Павел Бабин
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-08 00:00:00.000000000 Z
11
+ date: 2024-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -62,6 +62,7 @@ files:
62
62
  - lib/paginated.rb
63
63
  - lib/paginated/search.rb
64
64
  - lib/paginated/serialization.rb
65
+ - lib/paginated/sorting.rb
65
66
  homepage:
66
67
  licenses:
67
68
  - MIT
@@ -81,7 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
81
82
  - !ruby/object:Gem::Version
82
83
  version: '0'
83
84
  requirements: []
84
- rubygems_version: 3.4.10
85
+ rubygems_version: 3.0.6
85
86
  signing_key:
86
87
  specification_version: 4
87
88
  summary: Пагинация для Rails-приложений