restme 1.1.0 → 1.2.0

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: 852b2273c90c0c2eb2673bed5fe62a28df112f2eddd55287c415afff487647db
4
- data.tar.gz: 746415d80a0fd053b9fb89e86f06116416c16c978727472475d6e22bf2c974ae
3
+ metadata.gz: 0f3c9d79dc88d267a1198ec23b54f05d8af00367125b1cf1f3fcd6c458633b35
4
+ data.tar.gz: 48c79f664b0fb61dea85fdd4d2d56d63520f7389c6b31adbead1c41a6b945268
5
5
  SHA512:
6
- metadata.gz: 981cfa7a02a73c7024cab361704daf3151660abf062324ce3ad44ecf121083349272782a72df26349f58c0550d7f3b7287b71e03e2fdb8502e386267ef1b3464
7
- data.tar.gz: a5d92fa8e80b2f1ff7fceee0c0e0c5d42067b4908d07e45fcf461ebcc6528559dec7b4422ba4c8ae42ab0f7c422482c08fdbe57425d4b0efed0f115975221fc7
6
+ metadata.gz: 80455f1ab99ddec14145d9ed3229c491abfd48c1d2db0fae6532d56ca3304783749d2cba38216ef6529ed6a2985743ed41c3feb2e3fb72273eb8c1a87eae332a
7
+ data.tar.gz: e7033c0ded95c20fb3df221af86dff3801a67c80cd7b9f3ac4d070f4f64b979d385e01874bbceccdf0affac556752261ffc24e22acd485651d9163650083f8c8
data/README.md CHANGED
@@ -13,7 +13,7 @@ This gem manages your controller's responsibilities for:
13
13
 
14
14
  GEMFILE:
15
15
  ```bash
16
- gem 'restme', '~> 1.0', '>= 1.0.2'
16
+ gem 'restme', '~> 1.1'
17
17
  ```
18
18
 
19
19
  INSTALL:
@@ -28,6 +28,35 @@ gem 'restme'
28
28
  - You must create a folder inside app named restfy to define controller rules for authorization, scoping, creation, updating, and field selection (see example below).
29
29
 
30
30
 
31
+ <br>
32
+
33
+ ## Optional Configuration (Available from version 1.1 or higher)
34
+
35
+ You can create a `restme.rb` file inside `config/initializers` to customize Restme's behavior:
36
+
37
+ - Define the name of the controller variable that holds the current user (default: `current_user`).
38
+ - Define the name of the user field that identifies the user's role (default: `role`).
39
+ - Set the default number of items returned per page (default: `12`).
40
+ - Set the default starting page (default: `1`).
41
+ - Define the maximum number of items allowed per page (default: `100`).
42
+
43
+ Example:
44
+
45
+ ```ruby
46
+ # config/initializers/restme.rb
47
+
48
+ Restme.configure do |config|
49
+ config.current_user_variable = :current_user
50
+ config.user_role_field = :role
51
+ config.pagination_default_per_page = 12
52
+ config.pagination_default_page = 1
53
+ config.pagination_max_per_page = 100
54
+ end
55
+ ```
56
+
57
+ <br>
58
+
59
+
31
60
  ### Usage examples
32
61
 
33
62
  Rails API project example here: https://github.com/everson-ever/restme-example/pull/1
@@ -186,6 +215,10 @@ module ProductsController::Field
186
215
  },
187
216
  category: {
188
217
  table_name: :categories
218
+ },
219
+ producer: { # When a nested field can be nil, Restme will not return the primary model unless a LEFT JOIN is explicitly used.
220
+ table_name: :producers,
221
+ join_type: :left_joins # Use that so Restme will generate a LEFT JOIN instead of an INNER JOIN. This will
189
222
  }
190
223
  }.freeze
191
224
  end
@@ -8,19 +8,35 @@ module Restme
8
8
  def insert_attachments(scope)
9
9
  unallowed_attachment_fields_error
10
10
 
11
- return scope.uniq if attachment_fields_select.blank?
11
+ return scope.as_json(json_options) if attachment_fields_select.blank?
12
12
 
13
- scope = scope.includes(attachment_fields_select_includes).uniq
13
+ define_attachment_methods
14
14
 
15
- scope.map do |record|
16
- attachment_fields_select.each do |field|
17
- @record = record.as_json.merge({ "#{field}": record.send(field).url })
18
- end
15
+ scope.includes(attachment_fields_select_includes)
16
+ .as_json(json_options)
17
+ end
18
+
19
+ def json_options
20
+ {
21
+ include: valid_nested_fields_select,
22
+ methods: attachment_methods
23
+ }
24
+ end
19
25
 
20
- @record
26
+ def define_attachment_methods
27
+ attachment_fields_select.each do |attachment_field_name|
28
+ klass.class_eval do
29
+ define_method(:"#{attachment_field_name}_url") do
30
+ send(attachment_field_name).url
31
+ end
32
+ end
21
33
  end
22
34
  end
23
35
 
36
+ def attachment_methods
37
+ attachment_fields_select&.map { |field| "#{field}_url" }
38
+ end
39
+
24
40
  def attachment_fields_select_includes
25
41
  attachment_fields_select.map { |field| { "#{field}_attachment": :blob } }
26
42
  end
@@ -22,23 +22,13 @@ module Restme
22
22
  end
23
23
 
24
24
  def select_nested_scope(scoped)
25
- scoped.joins(nested_fields_joins)
26
- .left_joins(nested_fields_left_joins)
27
- .preload(valid_nested_fields_select)
28
- .select(nesteds_table)
25
+ scoped.preload(valid_nested_fields_select)
29
26
  end
30
27
 
31
28
  def select_any_field?
32
29
  fields_select || nested_fields_select || attachment_fields_select
33
30
  end
34
31
 
35
- def nesteds_table
36
- valid_nested_fields_select&.map do |field|
37
- table = nested_selectable_fields_keys.dig(field, :table_name)
38
- table.present? ? "#{table}::text AS #{field}" : nil
39
- end
40
- end
41
-
42
32
  def model_fields_select
43
33
  @model_fields_select ||= begin
44
34
  fields = fields_select&.split(",")
@@ -51,22 +41,10 @@ module Restme
51
41
  @model_attributes ||= klass.new.attributes.keys
52
42
  end
53
43
 
54
- def nested_fields_joins
55
- @nested_fields_joins ||= valid_nested_fields_select.select do |field|
56
- nested_selectable_fields_keys[field.to_sym][:join_type].blank?
57
- end
58
- end
59
-
60
- def nested_fields_left_joins
61
- @nested_fields_left_joins ||= valid_nested_fields_select.select do |field|
62
- nested_selectable_fields_keys[field.to_sym][:join_type] == :left_joins
63
- end
64
- end
65
-
66
44
  def valid_nested_fields_select
67
45
  @valid_nested_fields_select ||=
68
46
  nested_fields_select&.split(",")&.select do |field|
69
- nested_selectable_fields_keys[field.to_sym].present?
47
+ nested_selectable_fields_keys.key?(field.to_sym)
70
48
  end&.map(&:to_sym)
71
49
  end
72
50
 
@@ -64,8 +64,8 @@ module Restme
64
64
  def pagination
65
65
  {
66
66
  page: page_no,
67
- pages: pages(model_scope),
68
- total_items: total_items(model_scope)
67
+ pages: pages(filtered_scope),
68
+ total_items: total_items(filtered_scope)
69
69
  }
70
70
  end
71
71
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Restme
4
- VERSION = "1.1.0"
4
+ VERSION = "1.2.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: restme
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - everson-ever