Skip to content

Commit 48012ac

Browse files
Merge pull request #43 from SwitchDreams/feat/set_all_resources_callback
feat: set_all_resources_callback
2 parents e0ddb4b + 8ae2566 commit 48012ac

File tree

7 files changed

+50
-5
lines changed

7 files changed

+50
-5
lines changed

app/controllers/rest_api_generator/child_resource_controller.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class ChildResourceController < RestApiGenerator.configuration.parent_controller
1010
before_action :set_resource, only: [:show, :update, :destroy]
1111

1212
def index
13-
@resources = resources
13+
set_all_resources
1414
@resources = @resources.filter_resource(params_for_filter) if resource_class.include?(Filterable)
1515
@resources = @resources.order(ordering_params(params[:sort])) if params[:sort]
1616
if pagination
@@ -40,6 +40,12 @@ def destroy
4040

4141
private
4242

43+
def set_all_resources
44+
run_callbacks :set_all_resources do
45+
@resources = resources
46+
end
47+
end
48+
4349
def resources
4450
@parent_resource.send(resource_class.to_s.downcase.pluralize)
4551
end

app/controllers/rest_api_generator/resource_controller.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ class ResourceController < RestApiGenerator.configuration.parent_controller.cons
77
include Serializable
88

99
before_action :set_resource, only: [:show, :update, :destroy]
10+
1011
def index
11-
@resources = resource_class.all
12+
set_all_resources
1213
@resources = @resources.filter_resource(params_for_filter) if resource_class.include?(Filterable)
1314
@resources = @resources.order(ordering_params(params[:sort])) if params[:sort]
1415
if pagination
@@ -68,6 +69,12 @@ def set_resource
6869
end
6970
end
7071

72+
def set_all_resources
73+
run_callbacks :set_all_resources do
74+
@resources = resource_class.all
75+
end
76+
end
77+
7178
# UsersController => User
7279
def resource_by_controller_name(controller_name = self.class.to_s)
7380
controller_name.split(Regexp.union(["Controller", "::"]))[-1].singularize.constantize

docs/features/callbacks.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
# Callbacks
22

33
You can use the callbacks in the controller to add some logic before, around or after `set_resource`
4-
or `set_parent_resource`:
4+
, `set_parent_resource` or `set_all_resources`:
5+
6+
- The `set_resource` method is called in [:show, :update, :destroy] actions
7+
- The `set_parent_resource` method is called in all actions if you are using nested resources
8+
- The `set_all_resources` method is called in [:index] actions
59

610
```ruby
711
# frozen_string_literal: true
812

913
class CarsController < RestApiGenerator::ResourceController
1014
after_set_resource :authorize_logic
15+
set_all_resources -> { @resources = authorized_resource(@resources) }
1116

1217
def authorize_logic
1318
# Custom authorization logic

lib/rest_api_generator/controller_callbacks.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ module ControllerCallbacks
88
included do
99
define_callbacks :set_resource
1010
define_callbacks :set_parent_resource
11+
define_callbacks :set_all_resources
1112
end
1213

1314
module ClassMethods
@@ -24,6 +25,12 @@ module ClassMethods
2425
set_callback(:set_parent_resource, callback, name, options)
2526
end
2627
end
28+
29+
define_method :"#{callback}_set_all_resources" do |*names, &blk|
30+
_insert_callbacks(names, blk) do |name, options|
31+
set_callback(:set_all_resources, callback, name, options)
32+
end
33+
end
2734
end
2835
end
2936
end

lib/rest_api_generator/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# frozen_string_literal: true
22

33
module RestApiGenerator
4-
VERSION = "0.3.0"
4+
VERSION = "0.4.0"
55
end

spec/dummy/app/controllers/cars_controller.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
class CarsController < RestApiGenerator::ResourceController
44
after_set_resource :authorize_logic
5+
after_set_all_resources :authorized_scope
6+
7+
def authorized_scope
8+
# Custom authorization logic
9+
# @resource = authorized_scope @resource
10+
end
511

612
def authorize_logic
713
# Custom authorization logic

spec/lib/rest_api_generator/resource_controller_spec.rb

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@
121121
end
122122

123123
describe "callbacks" do
124-
context "when callbacks exists" do
124+
context "when set resource callbacks exists" do
125125
it "calls callbacks" do
126126
car = Car.create!(name: "Car")
127127
controller = CarsController.new
@@ -135,5 +135,19 @@
135135
controller.send(:set_resource)
136136
end
137137
end
138+
139+
context "when set all resources callbacks exists" do
140+
it "calls callbacks" do
141+
Car.create!(name: "Car")
142+
controller = CarsController.new
143+
allow(controller).to receive(:params).and_return(ActionController::Parameters.new({}))
144+
145+
# rubocop:disable RSpec/MessageSpies
146+
expect(controller).to receive(:authorized_scope)
147+
# rubocop:enable RSpec/MessageSpies
148+
149+
controller.send(:set_all_resources)
150+
end
151+
end
138152
end
139153
end

0 commit comments

Comments
 (0)