snfoil-rails 1.0.0.pre.1 → 1.0.2

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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/CODE_OF_CONDUCT.md +74 -0
  4. data/Gemfile +17 -0
  5. data/LICENSE.txt +201 -0
  6. data/README.md +207 -0
  7. data/lib/generators/snfoil/all/USAGE +21 -0
  8. data/lib/generators/snfoil/all/all_generator.rb +64 -0
  9. data/lib/generators/snfoil/context/USAGE +14 -0
  10. data/lib/generators/snfoil/context/context_generator.rb +55 -0
  11. data/lib/generators/snfoil/context/templates/context.erb +9 -0
  12. data/lib/generators/snfoil/controller/USAGE +15 -0
  13. data/lib/generators/snfoil/controller/controller_generator.rb +66 -0
  14. data/lib/generators/snfoil/controller/templates/api_controller.erb +14 -0
  15. data/lib/generators/snfoil/controller/templates/controller.erb +14 -0
  16. data/lib/generators/snfoil/jsonapi_deserializer/USAGE +14 -0
  17. data/lib/generators/snfoil/jsonapi_deserializer/jsonapi_deserializer_generator.rb +55 -0
  18. data/lib/generators/snfoil/jsonapi_deserializer/templates/jsonapi_deserializer.erb +12 -0
  19. data/lib/generators/snfoil/jsonapi_serializer/USAGE +14 -0
  20. data/lib/generators/snfoil/jsonapi_serializer/jsonapi_serializer_generator.rb +55 -0
  21. data/lib/generators/snfoil/jsonapi_serializer/templates/jsonapi_serializer.erb +20 -0
  22. data/lib/generators/snfoil/policy/USAGE +14 -0
  23. data/lib/generators/snfoil/policy/policy_generator.rb +55 -0
  24. data/lib/generators/snfoil/policy/templates/policy.erb +22 -0
  25. data/lib/generators/snfoil/searcher/USAGE +14 -0
  26. data/lib/generators/snfoil/searcher/searcher_generator.rb +55 -0
  27. data/lib/generators/snfoil/searcher/templates/searcher.erb +7 -0
  28. data/lib/snfoil/rails/api/create.rb +56 -0
  29. data/lib/snfoil/rails/api/destroy.rb +54 -0
  30. data/lib/snfoil/rails/api/index.rb +53 -0
  31. data/lib/snfoil/rails/api/show.rb +53 -0
  32. data/lib/snfoil/rails/api/update.rb +60 -0
  33. data/lib/snfoil/rails/api_controller.rb +33 -0
  34. data/lib/snfoil/rails/concerns/inject_deserialized.rb +31 -0
  35. data/lib/snfoil/rails/concerns/inject_id.rb +33 -0
  36. data/lib/snfoil/rails/concerns/inject_include.rb +35 -0
  37. data/lib/snfoil/rails/concerns/inject_request_id.rb +31 -0
  38. data/lib/snfoil/rails/concerns/inject_request_params.rb +34 -0
  39. data/lib/snfoil/rails/concerns/process_pagination.rb +71 -0
  40. data/lib/snfoil/rails/engine.rb +38 -0
  41. data/lib/snfoil/rails/searcher.rb +127 -0
  42. data/lib/snfoil/rails/version.rb +21 -0
  43. data/lib/snfoil/rails.rb +7 -0
  44. data/lib/tasks/snfoil/rails_tasks.rake +5 -0
  45. data/snfoil-rails.gemspec +53 -0
  46. metadata +86 -30
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_modules %><%= class_name %>Context
4
+ include SnFoil::Context
5
+
6
+ model <%= class_name %>
7
+ searcher <%= class_name.pluralize %>Searcher
8
+ policy <%= class_name %>Policy
9
+ end
@@ -0,0 +1,15 @@
1
+ Description:
2
+ Creates a SnFoil::Controller Scaffold
3
+
4
+ Arguments:
5
+ model: *required* The name of the model
6
+
7
+ Options:
8
+ path: The path the files will be created at. default: app/controllers
9
+ type: The type of controller to create (base, api). default: base
10
+
11
+ Example:
12
+ rails generate snfoil:controller User
13
+
14
+ This will create:
15
+ app/controllers/users_controller.rb
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2021 Matthew Howes
4
+
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ module SnFoil
18
+ class ControllerGenerator < Rails::Generators::Base
19
+ source_root File.expand_path('templates', __dir__)
20
+
21
+ argument :model, type: :string
22
+
23
+ class_option :type, desc: 'Generate Base or API', type: :string, default: 'base'
24
+ class_option :path, desc: 'Base path for file', type: :string, default: 'app/controllers'
25
+
26
+ def add_app_file
27
+ template(template_name, "#{options[:path]}/#{file_name}_controller.rb")
28
+ end
29
+
30
+ private
31
+
32
+ def file_name
33
+ @file_name ||= if modules.length.zero?
34
+ name
35
+ else
36
+ "#{modules.join('/')}/#{name}"
37
+ end
38
+ end
39
+
40
+ def template_name
41
+ @template_name ||= if options[:type] == 'api'
42
+ 'api_controller.erb'
43
+ else
44
+ 'controller.erb'
45
+ end
46
+ end
47
+
48
+ def name
49
+ @name ||= model.split('/').last.underscore.pluralize
50
+ end
51
+
52
+ def class_name
53
+ @class_name ||= name.camelize
54
+ end
55
+
56
+ def modules
57
+ @modules ||= model.split('/')[0..-2].map(&:underscore)
58
+ end
59
+
60
+ def class_modules
61
+ return if modules.length.zero?
62
+
63
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_modules %><%= class_name %>Controller < SnFoil::Controller::API
4
+ context <%= class_name.singularize %>Context
5
+ serializer <%= class_name.singularize %>JsonapiSerializer
6
+ deserializer <%= class_name.singularize %>JsonapiDeserializer
7
+
8
+ # SnFoil::Controller requires current_entity or current_user defined to properly scope
9
+ # all queries, otherwise data leaks could occur
10
+ #
11
+ # def current_entity
12
+ # # logic to find authenticated user
13
+ # end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_modules %><%= class_name %>Controller < SnFoil::Controller::Base
4
+ context <%= name.singularize.camelcase %>Context
5
+ serializer <%= name.singularize.camelcase %>JsonapiSerializer
6
+ deserializer <%= name.singularize.camelcase %>JsonapiDeserializer
7
+
8
+ # SnFoil::Controller requires current_entity or current_user defined to properly scope
9
+ # all queries, otherwise data leaks could occur
10
+ #
11
+ # def current_entity
12
+ # # logic to find authenticated user
13
+ # end
14
+ end
@@ -0,0 +1,14 @@
1
+ Description:
2
+ Creates a SnFoil::JsonapiDeSerializer Scaffold
3
+
4
+ Arguments:
5
+ model: *required* The name of the model
6
+
7
+ Options:
8
+ path: The path the files will be created at. default: app/jsonapi_deserializers
9
+
10
+ Example:
11
+ rails generate snfoil:jsonapi_deserializer User
12
+
13
+ This will create:
14
+ app/jsonapi_deserializers/user_jsonapi_deserializer.rb
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2021 Matthew Howes
4
+
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ module SnFoil
18
+ class JsonapiDeserializerGenerator < Rails::Generators::Base
19
+ source_root File.expand_path('templates', __dir__)
20
+
21
+ argument :model, type: :string
22
+
23
+ class_option :path, desc: 'Base path for file', type: :string, default: 'app/jsonapi_deserializers'
24
+
25
+ def add_app_file
26
+ file_name = if modules.length.zero?
27
+ name
28
+ else
29
+ "#{modules.join('/')}/#{name}"
30
+ end
31
+
32
+ template('jsonapi_deserializer.erb', "#{options[:path]}/#{file_name}_jsonapi_deserializer.rb")
33
+ end
34
+
35
+ private
36
+
37
+ def name
38
+ @name ||= model.split('/').last.underscore.singularize
39
+ end
40
+
41
+ def class_name
42
+ @class_name ||= name.camelize
43
+ end
44
+
45
+ def modules
46
+ @modules ||= model.split('/')[0..-2].map(&:underscore)
47
+ end
48
+
49
+ def class_modules
50
+ return if modules.length.zero?
51
+
52
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_modules %><%= class_name %>JsonapiDeserializer
4
+ include SnFoil::JsonapiDeserializer
5
+
6
+ # Add attributes of the model you want to serializer with the following syntax
7
+ attributes :id
8
+
9
+ # Add relationships with the following syntax
10
+ # belongs_to :store, serializer: Jsonapi::StoreJsonapiSerializer
11
+ # has_many :locations, serializer: Jsonapi::LocationJsonapiSerializer
12
+ end
@@ -0,0 +1,14 @@
1
+ Description:
2
+ Creates a SnFoil::JsonapiSerializer Scaffold
3
+
4
+ Arguments:
5
+ model: *required* The name of the model
6
+
7
+ Options:
8
+ path: The path the files will be created at. default: app/jsonapi_serializers
9
+
10
+ Example:
11
+ rails generate snfoil:jsonapi_serializer User
12
+
13
+ This will create:
14
+ app/jsonapi_serializers/user_jsonapi_serializer.rb
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2021 Matthew Howes
4
+
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ module SnFoil
18
+ class JsonapiSerializerGenerator < Rails::Generators::Base
19
+ source_root File.expand_path('templates', __dir__)
20
+
21
+ argument :model, type: :string
22
+
23
+ class_option :path, desc: 'Base path for file', type: :string, default: 'app/jsonapi_serializers'
24
+
25
+ def add_app_file
26
+ file_name = if modules.length.zero?
27
+ name
28
+ else
29
+ "#{modules.join('/')}/#{name}"
30
+ end
31
+
32
+ template('jsonapi_serializer.erb', "#{options[:path]}/#{file_name}_jsonapi_serializer.rb")
33
+ end
34
+
35
+ private
36
+
37
+ def name
38
+ @name ||= model.split('/').last.underscore.singularize
39
+ end
40
+
41
+ def class_name
42
+ @class_name ||= name.camelize
43
+ end
44
+
45
+ def modules
46
+ @modules ||= model.split('/')[0..-2].map(&:underscore)
47
+ end
48
+
49
+ def class_modules
50
+ return if modules.length.zero?
51
+
52
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_modules %><%= class_name %>JsonapiSerializer
4
+ include SnFoil::JsonapiSerializer
5
+
6
+ set_id :id
7
+ set_type :<%= name.pluralize.dasherize %>
8
+
9
+ # SnFoil::JsonapiSerializer is just a wrapper for jsonapi-serializer (https://github.com/jsonapi-serializer/jsonapi-serializer)
10
+ # with some defaults added in
11
+
12
+ # Add attributes of the model you want to serializer with the following syntax
13
+ # attributes :name
14
+ # :description
15
+ # :logo_url
16
+
17
+ # Add relationships with the following syntax
18
+ # belongs_to :store, serializer: Jsonapi::StoreJsonapiSerializer
19
+ # has_many :locations, serializer: Jsonapi::LocationJsonapiSerializer
20
+ end
@@ -0,0 +1,14 @@
1
+ Description:
2
+ Creates a SnFoil::Policy Scaffold
3
+
4
+ Arguments:
5
+ model: *required* The name of the model
6
+
7
+ Options:
8
+ path: The path the files will be created at. default: app/policies
9
+
10
+ Example:
11
+ rails generate snfoil:policy User
12
+
13
+ This will create:
14
+ app/policies/user_policy.rb
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2021 Matthew Howes
4
+
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ module SnFoil
18
+ class PolicyGenerator < Rails::Generators::Base
19
+ source_root File.expand_path('templates', __dir__)
20
+
21
+ argument :model, type: :string
22
+
23
+ class_option :path, desc: 'Base path for file', type: :string, default: 'app/policies'
24
+
25
+ def add_app_file
26
+ file_name = if modules.length.zero?
27
+ name
28
+ else
29
+ "#{modules.join('/')}/#{name}"
30
+ end
31
+
32
+ template('policy.erb', "#{options[:path]}/#{file_name}_policy.rb")
33
+ end
34
+
35
+ private
36
+
37
+ def name
38
+ @name ||= model.split('/').last.underscore.singularize
39
+ end
40
+
41
+ def class_name
42
+ @class_name ||= name.camelize
43
+ end
44
+
45
+ def modules
46
+ @modules ||= model.split('/')[0..-2].map(&:underscore)
47
+ end
48
+
49
+ def class_modules
50
+ return if modules.length.zero?
51
+
52
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_modules %><%= class_name %>Policy
4
+ include SnFoil::Policy
5
+ # A SnFoil::Policy is just a Pundit policy (https://github.com/varvet/pundit)
6
+ # with some defaults
7
+ # Available methods: show?, create?, update?, destroy?, index?, associate?
8
+
9
+ # def show?
10
+ # true
11
+ # end
12
+
13
+ # class Scope
14
+ # # available read-only attributes
15
+ # # - scope: the default scope passed into the policy (ex: an ActiveRecord::Relation)
16
+ # # - entity: the object that the scope is build around (ex: a User)
17
+
18
+ # def resolve
19
+ # # the new default scope
20
+ # end
21
+ # end
22
+ end
@@ -0,0 +1,14 @@
1
+ Description:
2
+ Creates a SnFoil::Searcher Scaffold
3
+
4
+ Arguments:
5
+ model: *required* The name of the model
6
+
7
+ Options:
8
+ path: The path the files will be created at. default: app/searcher
9
+
10
+ Example:
11
+ rails generate snfoil:searcher User
12
+
13
+ This will create:
14
+ app/searchers/users_searcher.rb
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2021 Matthew Howes
4
+
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ module SnFoil
18
+ class SearcherGenerator < Rails::Generators::Base
19
+ source_root File.expand_path('templates', __dir__)
20
+
21
+ argument :model, type: :string
22
+
23
+ class_option :path, desc: 'Base path for file', type: :string, default: 'app/searchers'
24
+
25
+ def add_app_file
26
+ file_name = if modules.length.zero?
27
+ name
28
+ else
29
+ "#{modules.join('/')}/#{name}"
30
+ end
31
+
32
+ template('searcher.erb', "#{options[:path]}/#{file_name}_searcher.rb")
33
+ end
34
+
35
+ private
36
+
37
+ def name
38
+ @name ||= model.split('/').last.underscore.pluralize
39
+ end
40
+
41
+ def class_name
42
+ @class_name ||= name.camelize
43
+ end
44
+
45
+ def modules
46
+ @modules ||= model.split('/')[0..-2].map(&:underscore)
47
+ end
48
+
49
+ def class_modules
50
+ return if modules.length.zero?
51
+
52
+ @class_modules ||= "#{modules.map(&:camelize).join('::')}::"
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_modules %><%= class_name %>Searcher
4
+ include SnFoil::Searcher
5
+
6
+ model <%= class_name.singularize %>
7
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2021 Matthew Howes
4
+
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require_relative '../concerns/inject_deserialized'
18
+ require_relative '../concerns/inject_request_params'
19
+ require_relative '../concerns/inject_request_id'
20
+ require 'snfoil/controller'
21
+
22
+ module SnFoil
23
+ module Rails
24
+ module API
25
+ module Create
26
+ extend ActiveSupport::Concern
27
+
28
+ included do
29
+ include SnFoil::Controller
30
+
31
+ include InjectRequestId
32
+ include InjectDeserialized
33
+ include InjectInclude
34
+ include InjectRequestParams
35
+
36
+ endpoint :create, with: :render_create
37
+
38
+ setup_create with: :inject_request_id
39
+ setup_create with: :inject_request_params
40
+ setup_create with: :inject_deserialized
41
+ setup_create with: :inject_include
42
+
43
+ process_create with: :run_context
44
+
45
+ def render_create(**options)
46
+ if options[:object].errors.empty?
47
+ render json: serialize(options[:object], **options), status: :created
48
+ else
49
+ render json: options[:object].errors, status: :unprocessable_entity
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2021 Matthew Howes
4
+
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require_relative '../concerns/inject_id'
18
+ require_relative '../concerns/inject_request_params'
19
+ require_relative '../concerns/inject_request_id'
20
+ require 'snfoil/controller'
21
+
22
+ module SnFoil
23
+ module Rails
24
+ module API
25
+ module Destroy
26
+ extend ActiveSupport::Concern
27
+
28
+ included do
29
+ include SnFoil::Controller
30
+
31
+ include InjectRequestId
32
+ include InjectId
33
+ include InjectRequestParams
34
+
35
+ endpoint :destroy, with: :render_destroy
36
+
37
+ setup_destroy with: :inject_request_id
38
+ setup_destroy with: :inject_request_params
39
+ setup_destroy with: :inject_id
40
+
41
+ process_destroy with: :run_context
42
+
43
+ def render_destroy(**options)
44
+ if options[:object].errors.empty?
45
+ render json: {}, status: :no_content
46
+ else
47
+ render json: options[:object].errors, status: :unprocessable_entity
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2021 Matthew Howes
4
+
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require_relative '../concerns/inject_include'
18
+ require_relative '../concerns/inject_request_params'
19
+ require_relative '../concerns/inject_request_id'
20
+ require_relative '../concerns/process_pagination'
21
+ require 'snfoil/controller'
22
+
23
+ module SnFoil
24
+ module Rails
25
+ module API
26
+ module Index
27
+ extend ActiveSupport::Concern
28
+
29
+ included do
30
+ include SnFoil::Controller
31
+
32
+ include InjectRequestId
33
+ include InjectInclude
34
+ include InjectRequestParams
35
+ include ProcessPagination
36
+
37
+ endpoint :index, with: :render_index
38
+
39
+ setup_index with: :inject_request_id
40
+ setup_index with: :inject_request_params
41
+ setup_index with: :inject_include
42
+
43
+ process_index with: :run_context
44
+ process_index with: :process_pagination
45
+
46
+ def render_index(**options)
47
+ render json: serialize(options[:object], **options), status: :ok
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end