rao-api-resources_controller 0.0.48.pre → 0.0.49.pre

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: cc5902a08fb2d5bb7d71e7cff3235f41c6a24a2f10c22c72d85ed161a5b79689
4
- data.tar.gz: 7bf5109b3949fcfbf37af6de82126fed7899eb18fa65a571b9361555fad878b4
3
+ metadata.gz: 7502d725f38fe2455137199dc9ae053918c5f94621ad475b26166290de74d3e6
4
+ data.tar.gz: 201c4dc8a40768f51cc941998c140d043c333096884df865eee73d7f27e1b476
5
5
  SHA512:
6
- metadata.gz: ed4f2cb90c0da490ab9cd5bd47b56bc725b2a540ad56bc55d7aaced3edd30c3f9390af80376e01bf4f8163292f405b9e73c9e31e41115e81c3f013a58371a264
7
- data.tar.gz: fdca91415be7fea9647d88b26138838066a9d78a6139e328cf0863edf092ca7d4f44cd49826eb7241a258e39ddab548de171ce04a9103a3495c5274953e6e032
6
+ metadata.gz: 5a59c63daf6e4b05bb82dd7f9ced2dcceb1faef3bf23fc709149944d43b8a4fd6500af38055ac20bfa4f54902808af81ea54a34663726d832ae119cc99e4434d
7
+ data.tar.gz: 3571ce0c54415b95c17df3683e6437262885631f046965561774bbffcae8ee26803f8b94a673a7e5e8bc1d162f2352e3113c9afacfed6e1bea514300500c0cf1
data/README.md CHANGED
@@ -42,6 +42,35 @@ module Api
42
42
  end
43
43
  ```
44
44
 
45
+ ### Sorting collections
46
+
47
+ You can specify the sorting via the params "sort_by" and "sort_direction".
48
+
49
+ ### Including associated records
50
+
51
+ See rao-query.
52
+
53
+ ### Filtering collections
54
+
55
+ See rao-query.
56
+
57
+ ### Using the modules instead inheritance
58
+
59
+ Sometimes you want your controller to inherit from a specific controller. In
60
+ that case you can't use Rao::Api::ResourcesController::Base as the base controller.
61
+ Instead of using inheritance you can include the needed modules directly:
62
+
63
+ class CountriesController < ApplicationController
64
+ include Rao::Api::ResourcesController::RestActionsConcern
65
+ include Rao::Api::ResourcesController::ResourcesConcern
66
+ include Rao::Api::ResourcesController::SerializationConcern
67
+ include Rao::Api::ResourcesController::CountActionConcern
68
+ include Rao::Api::ResourcesController::DestroyAllActionConcern
69
+ include Rao::Api::ResourcesController::DeleteAllActionConcern
70
+ include Rao::Api::ResourcesController::FirstActionConcern
71
+ include Rao::Api::ResourcesController::LastActionConcern
72
+ include Rao::Api::ResourcesController::ExceptionHandlingConcern
73
+ end
45
74
 
46
75
  ## Installation
47
76
  Add this line to your application's Gemfile:
@@ -0,0 +1,42 @@
1
+ module Rao
2
+ module Api
3
+ module ResourceController::ExceptionHandlingConcern
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ rescue_from Exception do |exception|
8
+ handle_exception(exception)
9
+ end
10
+
11
+ rescue_from ActiveRecord::RecordNotFound do |exception|
12
+ handle_404(exception)
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def handle_404(exception = nil)
19
+ respond_to do |format|
20
+ format.json { render json: { error: (exception.try(:message) || 'Not found') }, status: 404 }
21
+ end
22
+ end
23
+
24
+ def handle_exception(exception)
25
+ if Rails.env.development? || Rails.env.test?
26
+ error = { message: exception.message }
27
+
28
+ error[:application_trace] = Rails.backtrace_cleaner.clean(exception.backtrace)
29
+ error[:full_trace] = exception.backtrace
30
+
31
+ respond_to do |format|
32
+ format.json { render json: error, status: 500 }
33
+ end
34
+ else
35
+ respond_to do |format|
36
+ format.json { render json: { error: 'Internal server error.' }, status: 500 }
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,11 @@
1
+ module Rao
2
+ module Api
3
+ module ResourceController::ResourceConcern
4
+ extend ActiveSupport::Concern
5
+
6
+ def resource_class
7
+ self.class.resource_class
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,87 @@
1
+ module Rao
2
+ module Api
3
+ module ResourceController::RestActionsConcern
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ include ActionController::MimeResponds
8
+
9
+ respond_to :json
10
+
11
+ before_action :load_resource_for_show, only: [:show]
12
+ before_action :load_resource, only: [:update, :destroy, :delete]
13
+ before_action :initialize_resource_for_create, only: [:create]
14
+ end
15
+
16
+ def show
17
+ respond_to do |format|
18
+ if @resource.nil?
19
+ format.json { render json: { error: "Couldn't find #{resource_class} with ID=#{params[:id]}" }, status: :not_found }
20
+ else
21
+ format.json { render json: serialize_resource(@resource), status: :ok }
22
+ end
23
+ end
24
+ end
25
+
26
+ def create
27
+ respond_to do |format|
28
+ if @resource.save
29
+ format.json { render json: serialize_resource(@resource), status: :created }
30
+ else
31
+ format.json { render json: { errors: serialize_errors(@resource.errors) }, status: 422 }
32
+ end
33
+ end
34
+ end
35
+
36
+ def update
37
+ respond_to do |format|
38
+ if @resource.update(permitted_params)
39
+ format.json { render json: serialize_resource(@resource) }
40
+ else
41
+ format.json { render json: { errors: serialize_errors(@resource.errors) }, status: 422 }
42
+ end
43
+ end
44
+ end
45
+
46
+ def destroy
47
+ @resource.destroy
48
+ respond_to do |format|
49
+ format.json { render json: serialize_resource(@resource) }
50
+ end
51
+ end
52
+
53
+ def delete
54
+ @resource.delete
55
+ respond_to do |format|
56
+ format.json { render json: serialize_resource(@resource) }
57
+ end
58
+ end
59
+
60
+ private
61
+
62
+ def load_resource
63
+ raise "Please define #load_resource in #{self.class.name} and tell me how to load @resource."
64
+ end
65
+
66
+ def load_resource_for_show
67
+ begin
68
+ @resource = load_resource
69
+ rescue ActiveRecord::RecordNotFound
70
+ @resource = nil
71
+ end
72
+ end
73
+
74
+ def initialize_resource
75
+ @resource = resource_class.new
76
+ end
77
+
78
+ def initialize_resource_for_create
79
+ @resource = resource_class.new(permitted_params)
80
+ end
81
+
82
+ def permitted_params
83
+ raise "not implemented"
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,19 @@
1
+ module Rao
2
+ module Api
3
+ module ResourceController::SerializationConcern
4
+ extend ActiveSupport::Concern
5
+
6
+ private
7
+
8
+ def serialize_resource(resource)
9
+ json = resource.as_json
10
+ json[:errors] = serialize_errors(resource.errors) if resource.errors.any?
11
+ json
12
+ end
13
+
14
+ def serialize_errors(errors)
15
+ errors.as_json(full_messages: true)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -49,7 +49,7 @@ module Rao
49
49
 
50
50
  def update
51
51
  respond_to do |format|
52
- if @resource.update_attributes(permitted_params)
52
+ if @resource.update(permitted_params)
53
53
  format.json { render json: serialize_resource(@resource) }
54
54
  else
55
55
  format.json { render json: { errors: serialize_errors(@resource.errors) }, status: 422 }
@@ -0,0 +1,30 @@
1
+ module Rao
2
+ module Api
3
+ module ResourcesController::SortingConcern
4
+ private
5
+
6
+ def load_collection_scope
7
+ add_order_scope(super)
8
+ end
9
+
10
+ def add_order_scope(base_scope)
11
+ if params[:sort_by].present?
12
+ if params[:sort_by].include?(' ') || params[:sort_direction].include?(' ')
13
+ raise "Possible SQL Injection attempt while trying to sort by #{params[:sort_by]} #{params[:sort_direction]}"
14
+ end
15
+
16
+ sort_by = params[:sort_by]
17
+ sort_direction = (params[:sort_direction] || :asc)
18
+
19
+ if sort_by.include?('.')
20
+ base_scope.reorder("#{sort_by} #{sort_direction}")
21
+ else
22
+ base_scope.reorder(sort_by => sort_direction)
23
+ end
24
+ else
25
+ base_scope
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,12 @@
1
+ module Rao
2
+ module Api
3
+ module ResourceController
4
+ class Base < Rao::Api::ResourcesController::Configuration.resources_controller_base_class_name.constantize
5
+ include RestActionsConcern
6
+ include ResourceConcern
7
+ include SerializationConcern
8
+ include ExceptionHandlingConcern
9
+ end
10
+ end
11
+ end
12
+ end
@@ -11,6 +11,7 @@ module Rao
11
11
  include FirstActionConcern
12
12
  include LastActionConcern
13
13
  include ExceptionHandlingConcern
14
+ include SortingConcern
14
15
  end
15
16
  end
16
17
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rao-api-resources_controller
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.48.pre
4
+ version: 0.0.49.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roberto Vasquez Angel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-21 00:00:00.000000000 Z
11
+ date: 2023-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -160,6 +160,10 @@ files:
160
160
  - MIT-LICENSE
161
161
  - README.md
162
162
  - Rakefile
163
+ - app/concerns/rao/api/resource_controller/exception_handling_concern.rb
164
+ - app/concerns/rao/api/resource_controller/resource_concern.rb
165
+ - app/concerns/rao/api/resource_controller/rest_actions_concern.rb
166
+ - app/concerns/rao/api/resource_controller/serialization_concern.rb
163
167
  - app/concerns/rao/api/resources_controller/count_action_concern.rb
164
168
  - app/concerns/rao/api/resources_controller/delete_all_action_concern.rb
165
169
  - app/concerns/rao/api/resources_controller/destroy_all_action_concern.rb
@@ -169,6 +173,8 @@ files:
169
173
  - app/concerns/rao/api/resources_controller/resources_concern.rb
170
174
  - app/concerns/rao/api/resources_controller/rest_actions_concern.rb
171
175
  - app/concerns/rao/api/resources_controller/serialization_concern.rb
176
+ - app/concerns/rao/api/resources_controller/sorting_concern.rb
177
+ - app/controllers/rao/api/resource_controller/base.rb
172
178
  - app/controllers/rao/api/resources_controller/base.rb
173
179
  - config/locales/de.yml
174
180
  - config/locales/en.yml
@@ -199,7 +205,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
199
205
  - !ruby/object:Gem::Version
200
206
  version: 1.3.1
201
207
  requirements: []
202
- rubygems_version: 3.2.24
208
+ rubygems_version: 3.4.11
203
209
  signing_key:
204
210
  specification_version: 4
205
211
  summary: API Resources Controller for Ruby on Rails.