power_api 1.0.0 → 2.0.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 +4 -4
- data/CHANGELOG.md +5 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +93 -90
- data/README.md +329 -75
- data/app/helpers/power_api/application_helper.rb +57 -0
- data/bin/clean_test_app +2 -0
- data/lib/generators/power_api/controller/controller_generator.rb +27 -15
- data/lib/generators/power_api/exposed_api_config/USAGE +5 -0
- data/lib/generators/power_api/exposed_api_config/exposed_api_config_generator.rb +58 -0
- data/lib/generators/power_api/install/install_generator.rb +2 -44
- data/lib/generators/power_api/internal_api_config/USAGE +5 -0
- data/lib/generators/power_api/internal_api_config/internal_api_config_generator.rb +31 -0
- data/lib/generators/power_api/version/version_generator.rb +2 -2
- data/lib/power_api/engine.rb +8 -1
- data/lib/power_api/errors.rb +2 -0
- data/lib/power_api/generator_helper/active_record_resource.rb +10 -6
- data/lib/power_api/generator_helper/ams_helper.rb +5 -11
- data/lib/power_api/generator_helper/api_helper.rb +61 -0
- data/lib/power_api/generator_helper/controller_helper.rb +45 -15
- data/lib/power_api/generator_helper/routes_helper.rb +22 -7
- data/lib/power_api/generator_helper/rspec_controller_helper.rb +306 -0
- data/lib/power_api/generator_helper/swagger_helper.rb +14 -24
- data/lib/power_api/generator_helpers.rb +2 -1
- data/lib/power_api/version.rb +1 -1
- data/spec/dummy/app/controllers/api/base_controller.rb +2 -0
- data/spec/dummy/app/controllers/api/internal/base_controller.rb +5 -0
- data/spec/dummy/app/controllers/api/internal/blogs_controller.rb +36 -0
- data/spec/dummy/app/serializers/api/internal/blog_serializer.rb +12 -0
- data/spec/dummy/config/initializers/active_model_serializers.rb +1 -0
- data/spec/dummy/config/initializers/api_pagination.rb +32 -0
- data/spec/dummy/config/routes.rb +2 -7
- data/spec/dummy/spec/helpers/power_api/application_helper_spec.rb +171 -0
- data/spec/dummy/spec/lib/power_api/generator_helper/ams_helper_spec.rb +50 -12
- data/spec/dummy/spec/lib/power_api/generator_helper/api_helper_spec.rb +115 -0
- data/spec/dummy/spec/lib/power_api/generator_helper/controller_helper_spec.rb +126 -34
- data/spec/dummy/spec/lib/power_api/generator_helper/routes_helper_spec.rb +29 -5
- data/spec/dummy/spec/lib/power_api/generator_helper/rspec_controller_helper_spec.rb +559 -0
- data/spec/dummy/spec/lib/power_api/generator_helper/swagger_helper_spec.rb +10 -20
- data/spec/dummy/spec/support/shared_examples/active_record_resource_atrributes.rb +22 -3
- metadata +27 -5
- data/lib/power_api/generator_helper/version_helper.rb +0 -16
- data/spec/dummy/spec/lib/power_api/generator_helper/version_helper_spec.rb +0 -55
@@ -1,9 +1,9 @@
|
|
1
|
-
# rubocop:disable Layout/
|
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::
|
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
|
16
|
+
return routes_first_line if first_version?
|
17
17
|
|
18
18
|
"'/api' do\n"
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
22
|
-
|
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: '
|
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/
|
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/
|
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::
|
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
|
-
|
130
|
+
#{resource.plural}: {
|
143
131
|
type: "array",
|
144
132
|
items: { "$ref" => "#/definitions/#{resource.snake_case}" }
|
145
133
|
}
|
146
134
|
},
|
147
135
|
required: [
|
148
|
-
|
136
|
+
:#{resource.plural}
|
149
137
|
]
|
150
138
|
}
|
151
139
|
|
152
140
|
#{swagger_resource_definition_const} = {
|
153
141
|
type: "object",
|
154
142
|
properties: {
|
155
|
-
|
143
|
+
#{resource.snake_case}: { "$ref" => "#/definitions/#{resource.snake_case}" }
|
156
144
|
},
|
157
145
|
required: [
|
158
|
-
|
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)['
|
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(
|
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/
|
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::
|
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
|
data/lib/power_api/version.rb
CHANGED
@@ -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 @@
|
|
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
|
data/spec/dummy/config/routes.rb
CHANGED
@@ -1,11 +1,6 @@
|
|
1
1
|
Rails.application.routes.draw do
|
2
|
-
|
3
|
-
|
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
|