power_api 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +93 -90
  5. data/README.md +329 -75
  6. data/app/helpers/power_api/application_helper.rb +57 -0
  7. data/bin/clean_test_app +2 -0
  8. data/lib/generators/power_api/controller/controller_generator.rb +27 -15
  9. data/lib/generators/power_api/exposed_api_config/USAGE +5 -0
  10. data/lib/generators/power_api/exposed_api_config/exposed_api_config_generator.rb +58 -0
  11. data/lib/generators/power_api/install/install_generator.rb +2 -44
  12. data/lib/generators/power_api/internal_api_config/USAGE +5 -0
  13. data/lib/generators/power_api/internal_api_config/internal_api_config_generator.rb +31 -0
  14. data/lib/generators/power_api/version/version_generator.rb +2 -2
  15. data/lib/power_api/engine.rb +8 -1
  16. data/lib/power_api/errors.rb +2 -0
  17. data/lib/power_api/generator_helper/active_record_resource.rb +10 -6
  18. data/lib/power_api/generator_helper/ams_helper.rb +5 -11
  19. data/lib/power_api/generator_helper/api_helper.rb +61 -0
  20. data/lib/power_api/generator_helper/controller_helper.rb +45 -15
  21. data/lib/power_api/generator_helper/routes_helper.rb +22 -7
  22. data/lib/power_api/generator_helper/rspec_controller_helper.rb +306 -0
  23. data/lib/power_api/generator_helper/swagger_helper.rb +14 -24
  24. data/lib/power_api/generator_helpers.rb +2 -1
  25. data/lib/power_api/version.rb +1 -1
  26. data/spec/dummy/app/controllers/api/base_controller.rb +2 -0
  27. data/spec/dummy/app/controllers/api/internal/base_controller.rb +5 -0
  28. data/spec/dummy/app/controllers/api/internal/blogs_controller.rb +36 -0
  29. data/spec/dummy/app/serializers/api/internal/blog_serializer.rb +12 -0
  30. data/spec/dummy/config/initializers/active_model_serializers.rb +1 -0
  31. data/spec/dummy/config/initializers/api_pagination.rb +32 -0
  32. data/spec/dummy/config/routes.rb +2 -7
  33. data/spec/dummy/spec/helpers/power_api/application_helper_spec.rb +171 -0
  34. data/spec/dummy/spec/lib/power_api/generator_helper/ams_helper_spec.rb +50 -12
  35. data/spec/dummy/spec/lib/power_api/generator_helper/api_helper_spec.rb +115 -0
  36. data/spec/dummy/spec/lib/power_api/generator_helper/controller_helper_spec.rb +126 -34
  37. data/spec/dummy/spec/lib/power_api/generator_helper/routes_helper_spec.rb +29 -5
  38. data/spec/dummy/spec/lib/power_api/generator_helper/rspec_controller_helper_spec.rb +559 -0
  39. data/spec/dummy/spec/lib/power_api/generator_helper/swagger_helper_spec.rb +10 -20
  40. data/spec/dummy/spec/support/shared_examples/active_record_resource_atrributes.rb +22 -3
  41. metadata +27 -5
  42. data/lib/power_api/generator_helper/version_helper.rb +0 -16
  43. data/spec/dummy/spec/lib/power_api/generator_helper/version_helper_spec.rb +0 -55
@@ -1,9 +1,9 @@
1
- # rubocop:disable Layout/AlignArguments
1
+ # rubocop:disable Layout/AlignParameters
2
2
  module PowerApi::GeneratorHelper::RoutesHelper
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- include PowerApi::GeneratorHelper::VersionHelper
6
+ include PowerApi::GeneratorHelper::ApiHelper
7
7
  include PowerApi::GeneratorHelper::ResourceHelper
8
8
  include PowerApi::GeneratorHelper::TemplateBuilderHelper
9
9
  end
@@ -13,13 +13,19 @@ module PowerApi::GeneratorHelper::RoutesHelper
13
13
  end
14
14
 
15
15
  def routes_line_to_inject_new_version
16
- return "routes.draw do\n" if first_version?
16
+ return routes_first_line if first_version?
17
17
 
18
18
  "'/api' do\n"
19
19
  end
20
20
 
21
- def api_version_routes_line_regex
22
- /Api::V#{version_number}[^\n]*/
21
+ def routes_first_line
22
+ "routes.draw do\n"
23
+ end
24
+
25
+ def api_current_route_namespace_line_regex
26
+ return /#{version_class}[^\n]*/ if versioned_api?
27
+
28
+ /namespace :internal[^\n]*/
23
29
  end
24
30
 
25
31
  def parent_resource_routes_line_regex
@@ -32,6 +38,15 @@ module PowerApi::GeneratorHelper::RoutesHelper
32
38
  new_version_route_tpl
33
39
  end
34
40
 
41
+ def internal_route_tpl
42
+ concat_tpl_statements(
43
+ "namespace :api, defaults: { format: :json } do",
44
+ "namespace :internal do",
45
+ "end",
46
+ "end\n"
47
+ )
48
+ end
49
+
35
50
  def resource_route_tpl(actions: [], is_parent: false)
36
51
  res = (is_parent ? parent_resource : resource).plural
37
52
  line = "resources :#{res}"
@@ -83,9 +98,9 @@ module PowerApi::GeneratorHelper::RoutesHelper
83
98
  end
84
99
 
85
100
  def api_version_params
86
- "module: 'Api::V#{version_number}', \
101
+ "module: '#{version_class}', \
87
102
  path: { value: 'v#{version_number}' }, \
88
103
  defaults: { format: 'json' }"
89
104
  end
90
105
  end
91
- # rubocop:enable Layout/AlignArguments
106
+ # rubocop:enable Layout/AlignParameters
@@ -0,0 +1,306 @@
1
+ # rubocop:disable Metrics/ModuleLength
2
+ # rubocop:disable Metrics/MethodLength
3
+ # rubocop:disable Layout/AlignParameters
4
+ module PowerApi::GeneratorHelper::RspecControllerHelper
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ include PowerApi::GeneratorHelper::ApiHelper
9
+ include PowerApi::GeneratorHelper::ResourceHelper
10
+ include PowerApi::GeneratorHelper::TemplateBuilderHelper
11
+ end
12
+
13
+ def resource_spec_path
14
+ "spec/requests/#{api_file_path}/#{resource.plural}_spec.rb"
15
+ end
16
+
17
+ def resource_spec_tpl
18
+ concat_tpl_statements(
19
+ "require 'rails_helper'\n",
20
+ concat_tpl_statements(
21
+ spec_initial_describe_line,
22
+ spec_authenticated_resource_tpl,
23
+ spec_let_parent_resource_tpl,
24
+ spec_index_tpl,
25
+ spec_create_tpl,
26
+ spec_show_tpl,
27
+ spec_update_tpl,
28
+ spec_destroy_tpl,
29
+ "end\n"
30
+ )
31
+ )
32
+ end
33
+
34
+ private
35
+
36
+ def spec_initial_describe_line
37
+ "RSpec.describe '#{api_class}::#{resource.camel_plural}Controllers', type: :request do"
38
+ end
39
+
40
+ def spec_authenticated_resource_tpl
41
+ return unless authenticated_resource?
42
+
43
+ res_name = authenticated_resource.snake_case
44
+ "let(:#{res_name}) { create(:#{res_name}) }"
45
+ end
46
+
47
+ def spec_let_parent_resource_tpl
48
+ return unless parent_resource?
49
+
50
+ concat_tpl_statements(
51
+ "let(:#{parent_resource.snake_case}) { create(:#{parent_resource.snake_case}) }",
52
+ "let(:#{parent_resource.id}) { #{parent_resource.snake_case}.id }\n"
53
+ )
54
+ end
55
+
56
+ def spec_index_tpl
57
+ return unless index?
58
+
59
+ concat_tpl_statements(
60
+ "describe 'GET /index' do",
61
+ "let!(:#{resource.plural}) { #{spec_index_creation_list_tpl} }",
62
+ "let(:collection) { JSON.parse(response.body)['#{resource.plural}'] }",
63
+ "let(:params) { {} }\n",
64
+ spec_perform_tpl,
65
+ with_authorized_resource_context,
66
+ perform_block_tpl,
67
+ "it { expect(collection.count).to eq(5) }",
68
+ "it { expect(response.status).to eq(200) }",
69
+ if authenticated_resource?
70
+ "end\n"
71
+ end,
72
+ unauthorized_spec_tpl,
73
+ "end\n"
74
+ )
75
+ end
76
+
77
+ def spec_create_tpl
78
+ return unless create?
79
+
80
+ concat_tpl_statements(
81
+ "describe 'POST /create' do",
82
+ "let(:params) do",
83
+ "{",
84
+ "#{resource.snake_case}: {#{resource_parameters}",
85
+ "}",
86
+ "}",
87
+ "end\n",
88
+ let_resource_attrs,
89
+ spec_perform_tpl(http_verb: 'post'),
90
+ with_authorized_resource_context,
91
+ perform_block_tpl,
92
+ "it { expect(attributes).to include(params[:#{resource.snake_case}]) }",
93
+ "it { expect(response.status).to eq(201) }",
94
+ spec_invalid_attrs_test_tpl,
95
+ if authenticated_resource?
96
+ "end\n"
97
+ end,
98
+ unauthorized_spec_tpl,
99
+ "end\n"
100
+ )
101
+ end
102
+
103
+ def spec_show_tpl
104
+ return unless show?
105
+
106
+ concat_tpl_statements(
107
+ "describe 'GET /show' do",
108
+ spec_let_existent_resource_tpl,
109
+ "let(:#{resource.snake_case}_id) { #{resource.snake_case}.id.to_s }\n",
110
+ let_resource_attrs,
111
+ spec_perform_tpl(http_verb: 'get', params: false, single_resource: true),
112
+ with_authorized_resource_context,
113
+ perform_block_tpl,
114
+ "it { expect(response.status).to eq(200) }",
115
+ "context 'with resource not found' do",
116
+ "let(:#{resource.snake_case}_id) { '666' }",
117
+ "it { expect(response.status).to eq(404) }",
118
+ "end",
119
+ if authenticated_resource?
120
+ "end\n"
121
+ end,
122
+ unauthorized_spec_tpl,
123
+ "end\n"
124
+ )
125
+ end
126
+
127
+ def spec_update_tpl
128
+ return unless update?
129
+
130
+ concat_tpl_statements(
131
+ "describe 'PUT /update' do",
132
+ spec_let_existent_resource_tpl,
133
+ "let(:#{resource.snake_case}_id) { #{resource.snake_case}.id.to_s }\n",
134
+ "let(:params) do",
135
+ "{",
136
+ "#{resource.snake_case}: {#{resource_parameters}",
137
+ "}",
138
+ "}",
139
+ "end\n",
140
+ let_resource_attrs,
141
+ spec_perform_tpl(http_verb: 'put', params: true, single_resource: true),
142
+ with_authorized_resource_context,
143
+ perform_block_tpl,
144
+ "it { expect(attributes).to include(params[:#{resource.snake_case}]) }",
145
+ "it { expect(response.status).to eq(200) }",
146
+ spec_invalid_attrs_test_tpl,
147
+ "context 'with resource not found' do",
148
+ "let(:#{resource.snake_case}_id) { '666' }",
149
+ "it { expect(response.status).to eq(404) }",
150
+ "end",
151
+ if authenticated_resource?
152
+ "end\n"
153
+ end,
154
+ unauthorized_spec_tpl,
155
+ "end\n"
156
+ )
157
+ end
158
+
159
+ def spec_destroy_tpl
160
+ return unless destroy?
161
+
162
+ concat_tpl_statements(
163
+ "describe 'DELETE /destroy' do",
164
+ spec_let_existent_resource_tpl,
165
+ "let(:#{resource.snake_case}_id) { #{resource.snake_case}.id.to_s }\n",
166
+ spec_perform_tpl(http_verb: 'get', params: false, single_resource: true),
167
+ with_authorized_resource_context,
168
+ perform_block_tpl,
169
+ "it { expect(response.status).to eq(200) }",
170
+ "context 'with resource not found' do",
171
+ "let(:#{resource.snake_case}_id) { '666' }",
172
+ "it { expect(response.status).to eq(404) }",
173
+ "end",
174
+ if authenticated_resource?
175
+ "end\n"
176
+ end,
177
+ unauthorized_spec_tpl,
178
+ "end\n"
179
+ )
180
+ end
181
+
182
+ def spec_let_existent_resource_tpl
183
+ statement = ["let(:#{resource.snake_case}) { create(:#{resource.snake_case}"]
184
+ load_owner_resource_factory_option(statement)
185
+ statement.join(', ') + ') }'
186
+ end
187
+
188
+ def spec_invalid_attrs_test_tpl
189
+ return if resource.required_resource_attributes.blank?
190
+
191
+ concat_tpl_statements(
192
+ "context 'with invalid attributes' do",
193
+ "let(:params) do",
194
+ "{",
195
+ "#{resource.snake_case}: {#{invalid_resource_params}}",
196
+ "}",
197
+ "end\n",
198
+ "it { expect(response.status).to eq(400) }",
199
+ "end\n"
200
+ )
201
+ end
202
+
203
+ def with_authorized_resource_context
204
+ if authenticated_resource?
205
+ "context 'with authorized #{authenticated_resource.snake_case}' do"
206
+ end
207
+ end
208
+
209
+ def let_resource_attrs
210
+ concat_tpl_statements(
211
+ "let(:attributes) do",
212
+ "JSON.parse(response.body)['#{resource.snake_case}'].symbolize_keys",
213
+ "end"
214
+ )
215
+ end
216
+
217
+ def perform_block_tpl(auth: true)
218
+ concat_tpl_statements(
219
+ "before do",
220
+ if auth && authenticated_resource?
221
+ "sign_in(#{authenticated_resource.snake_case})"
222
+ end,
223
+ "perform",
224
+ "end\n"
225
+ )
226
+ end
227
+
228
+ def spec_perform_tpl(http_verb: 'get', params: true, single_resource: false)
229
+ body = "#{http_verb} '/#{spec_collection_path(single_resource)}"
230
+ body += "/' + #{resource.snake_case}_id" if single_resource
231
+ body += "'" unless single_resource
232
+ body += ", params: params" if params
233
+
234
+ concat_tpl_statements(
235
+ "def perform",
236
+ body,
237
+ "end\n"
238
+ )
239
+ end
240
+
241
+ def spec_collection_path(single_resource)
242
+ path = ["api"]
243
+ path << (versioned_api? ? "v#{version_number}" : "internal")
244
+
245
+ if parent_resource? && !single_resource
246
+ path << parent_resource.plural
247
+ path << "' + #{parent_resource.snake_case}.id.to_s + '"
248
+ end
249
+
250
+ path << resource.plural
251
+ path.join("/")
252
+ end
253
+
254
+ def spec_index_creation_list_tpl
255
+ statement = ["create_list(:#{resource.snake_case}, 5"]
256
+ load_owner_resource_factory_option(statement)
257
+ statement.join(', ') + ')'
258
+ end
259
+
260
+ def load_owner_resource_factory_option(statement)
261
+ if parent_resource?
262
+ statement << "#{parent_resource.snake_case}: #{parent_resource.snake_case}"
263
+ end
264
+
265
+ if owned_by_authenticated_resource?
266
+ statement << "#{authenticated_resource.snake_case}: #{authenticated_resource.snake_case}"
267
+ end
268
+ end
269
+
270
+ def unauthorized_spec_tpl
271
+ return unless authenticated_resource?
272
+
273
+ authenticated_resource_name = authenticated_resource.snake_case
274
+ concat_tpl_statements(
275
+ "context 'with unauthenticated #{authenticated_resource_name}' do",
276
+ "before { perform }\n",
277
+ "it { expect(response.status).to eq(401) }",
278
+ "end\n"
279
+ )
280
+ end
281
+
282
+ def resource_parameters
283
+ attrs = if resource.required_resource_attributes.any?
284
+ resource.required_resource_attributes
285
+ else
286
+ resource.optional_resource_attributes
287
+ end
288
+
289
+ for_each_attribute(attrs) do |attr|
290
+ "#{attr[:name]}: #{attr[:example]},"
291
+ end
292
+ end
293
+
294
+ def for_each_attribute(attributes)
295
+ attributes.inject("") do |memo, attr|
296
+ next memo if parent_resource && attr[:name] == parent_resource.id.to_sym
297
+
298
+ memo += "\n"
299
+ memo += yield(attr)
300
+ memo
301
+ end.delete_suffix(",")
302
+ end
303
+ end
304
+ # rubocop:enable Metrics/ModuleLength
305
+ # rubocop:enable Metrics/MethodLength
306
+ # rubocop:enable Layout/AlignParameters
@@ -1,11 +1,11 @@
1
1
  # rubocop:disable Metrics/ModuleLength
2
2
  # rubocop:disable Metrics/MethodLength
3
- # rubocop:disable Layout/AlignArguments
3
+ # rubocop:disable Layout/AlignParameters
4
4
  module PowerApi::GeneratorHelper::SwaggerHelper
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  included do
8
- include PowerApi::GeneratorHelper::VersionHelper
8
+ include PowerApi::GeneratorHelper::ApiHelper
9
9
  include PowerApi::GeneratorHelper::ResourceHelper
10
10
  include PowerApi::GeneratorHelper::SimpleTokenAuthHelper
11
11
  include PowerApi::GeneratorHelper::TemplateBuilderHelper
@@ -118,44 +118,32 @@ module PowerApi::GeneratorHelper::SwaggerHelper
118
118
  <<~SCHEMA
119
119
  #{swagger_model_definition_const} = {
120
120
  type: :object,
121
- properties: {
122
- id: { type: :string, example: '1' },
123
- type: { type: :string, example: '#{resource.snake_case}' },
124
- attributes: {
125
- type: :object,
126
- properties: {#{get_swagger_schema_attributes_definitions}
127
- },
128
- required: [#{get_swagger_schema_attributes_names}
129
- ]
130
- }
121
+ properties: {#{get_swagger_schema_attributes_definitions}
131
122
  },
132
- required: [
133
- :id,
134
- :type,
135
- :attributes
123
+ required: [#{get_swagger_schema_attributes_names}
136
124
  ]
137
125
  }
138
126
 
139
127
  #{swagger_collection_definition_const} = {
140
128
  type: "object",
141
129
  properties: {
142
- data: {
130
+ #{resource.plural}: {
143
131
  type: "array",
144
132
  items: { "$ref" => "#/definitions/#{resource.snake_case}" }
145
133
  }
146
134
  },
147
135
  required: [
148
- :data
136
+ :#{resource.plural}
149
137
  ]
150
138
  }
151
139
 
152
140
  #{swagger_resource_definition_const} = {
153
141
  type: "object",
154
142
  properties: {
155
- data: { "$ref" => "#/definitions/#{resource.snake_case}" }
143
+ #{resource.snake_case}: { "$ref" => "#/definitions/#{resource.snake_case}" }
156
144
  },
157
145
  required: [
158
- :data
146
+ :#{resource.snake_case}
159
147
  ]
160
148
  }
161
149
  SCHEMA
@@ -268,7 +256,7 @@ swagger_doc: 'v#{version_number}/swagger.json' do"
268
256
  "response '200', '#{resource.plural_titleized} retrieved' do",
269
257
  "schema('$ref' => '#/definitions/#{resource.plural}_collection')\n",
270
258
  "run_test! do |response|",
271
- "expect(JSON.parse(response.body)['data'].count).to eq(expected_collection_count)",
259
+ "expect(JSON.parse(response.body)['#{resource.plural}'].count).to eq(expected_collection_count)",
272
260
  "end",
273
261
  "end\n",
274
262
  spec_tpl_invalid_credentials,
@@ -452,7 +440,7 @@ swagger_doc: 'v#{version_number}/swagger.json' do"
452
440
  def get_swagger_schema_attributes_definitions
453
441
  for_each_schema_attribute(resource.resource_attributes) do |attr|
454
442
  opts = ["example: #{attr[:example]}"]
455
- opts << "'x-nullable': true" unless attr[:required]
443
+ opts << "'x-nullable': true" unless attr[:required] || attr[:name] == :id
456
444
  opts
457
445
 
458
446
  "#{attr[:name]}: { type: :#{attr[:swagger_type]}, #{opts.join(', ')} },"
@@ -460,7 +448,9 @@ swagger_doc: 'v#{version_number}/swagger.json' do"
460
448
  end
461
449
 
462
450
  def get_swagger_schema_attributes_names
463
- for_each_schema_attribute(resource.required_resource_attributes) do |attr|
451
+ for_each_schema_attribute(
452
+ resource.required_resource_attributes(include_id: true)
453
+ ) do |attr|
464
454
  ":#{attr[:name]},"
465
455
  end
466
456
  end
@@ -475,4 +465,4 @@ swagger_doc: 'v#{version_number}/swagger.json' do"
475
465
  end
476
466
  # rubocop:enable Metrics/ModuleLength
477
467
  # rubocop:enable Metrics/MethodLength
478
- # rubocop:enable Layout/AlignArguments
468
+ # rubocop:enable Layout/AlignParameters
@@ -2,8 +2,9 @@ module PowerApi
2
2
  class GeneratorHelpers
3
3
  include GeneratorHelper::ControllerActionsHelper
4
4
  include GeneratorHelper::ResourceHelper
5
- include GeneratorHelper::VersionHelper
5
+ include GeneratorHelper::ApiHelper
6
6
  include GeneratorHelper::SwaggerHelper
7
+ include GeneratorHelper::RspecControllerHelper
7
8
  include GeneratorHelper::AmsHelper
8
9
  include GeneratorHelper::ControllerHelper
9
10
  include GeneratorHelper::RoutesHelper
@@ -1,3 +1,3 @@
1
1
  module PowerApi
2
- VERSION = '1.0.0'
2
+ VERSION = '2.0.0'
3
3
  end
@@ -0,0 +1,2 @@
1
+ class Api::BaseController < PowerApi::BaseController
2
+ end
@@ -0,0 +1,5 @@
1
+ class Api::Internal::BaseController < Api::BaseController
2
+ before_action do
3
+ self.namespace_for_serializer = ::Api::Internal
4
+ end
5
+ end
@@ -0,0 +1,36 @@
1
+ class Api::Internal::BlogsController < Api::Internal::BaseController
2
+ def index
3
+ respond_with Blog.all
4
+ end
5
+
6
+ def show
7
+ respond_with blog
8
+ end
9
+
10
+ def create
11
+ respond_with Blog.create!(blog_params)
12
+ end
13
+
14
+ def update
15
+ blog.update!(blog_params)
16
+ respond_with blog
17
+ end
18
+
19
+ def destroy
20
+ respond_with blog.destroy!
21
+ end
22
+
23
+ private
24
+
25
+ def blog
26
+ @blog ||= Blog.find_by!(id: params[:id])
27
+ end
28
+
29
+ def blog_params
30
+ params.require(:blog).permit(
31
+ :title,
32
+ :body,
33
+ :portfolio_id
34
+ )
35
+ end
36
+ end
@@ -0,0 +1,12 @@
1
+ class Api::Internal::BlogSerializer < ActiveModel::Serializer
2
+ type :blog
3
+
4
+ attributes(
5
+ :id,
6
+ :title,
7
+ :body,
8
+ :created_at,
9
+ :updated_at,
10
+ :portfolio_id
11
+ )
12
+ end
@@ -0,0 +1 @@
1
+ ActiveModelSerializers.config.adapter = :json
@@ -0,0 +1,32 @@
1
+ ApiPagination.configure do |config|
2
+ # If you have more than one gem included, you can choose a paginator.
3
+ config.paginator = :kaminari
4
+
5
+ # By default, this is set to 'Total'
6
+ config.total_header = 'X-Total'
7
+
8
+ # By default, this is set to 'Per-Page'
9
+ config.per_page_header = 'X-Per-Page'
10
+
11
+ # Optional: set this to add a header with the current page number.
12
+ config.page_header = 'X-Page'
13
+
14
+ # Optional: set this to add other response format. Useful with tools that define :jsonapi format
15
+ # config.response_formats = [:json, :xml, :jsonapi]
16
+ config.response_formats = [:jsonapi]
17
+
18
+ # Optional: what parameter should be used to set the page option
19
+ config.page_param do |params|
20
+ params[:page][:number] if params[:page].is_a?(ActionController::Parameters)
21
+ end
22
+
23
+ # Optional: what parameter should be used to set the per page option
24
+ config.per_page_param do |params|
25
+ params[:page][:size] if params[:page].is_a?(ActionController::Parameters)
26
+ end
27
+
28
+ # Optional: Include the total and last_page link header
29
+ # By default, this is set to true
30
+ # Note: When using kaminari, this prevents the count call to the database
31
+ config.include_total = true
32
+ end
@@ -1,11 +1,6 @@
1
1
  Rails.application.routes.draw do
2
- mount Rswag::Api::Engine => '/api-docs'
3
- mount Rswag::Ui::Engine => '/api-docs'
4
- scope path: '/api' do
5
- api_version(module: 'Api::V2', path: { value: 'v2' }, defaults: { format: 'json' }) do
6
- end
7
-
8
- api_version(module: 'Api::V1', path: { value: 'v1' }, defaults: { format: 'json' }) do
2
+ namespace :api, defaults: { format: :json } do
3
+ namespace :internal do
9
4
  resources :blogs
10
5
  end
11
6
  end