power_api 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +9 -0
- data/.hound.yml +4 -0
- data/.rspec +3 -0
- data/.rubocop.yml +479 -0
- data/.ruby-version +1 -0
- data/.travis.yml +15 -0
- data/CHANGELOG.md +7 -0
- data/Gemfile +18 -0
- data/Gemfile.lock +310 -0
- data/Guardfile +15 -0
- data/LICENSE.txt +21 -0
- data/README.md +904 -0
- data/Rakefile +10 -0
- data/app/assets/config/power_api_manifest.js +2 -0
- data/app/assets/images/power_api/.keep +0 -0
- data/app/assets/javascripts/power_api/application.js +13 -0
- data/app/assets/stylesheets/power_api/application.css +15 -0
- data/app/controllers/concerns/api/deprecated.rb +23 -0
- data/app/controllers/concerns/api/error.rb +37 -0
- data/app/controllers/concerns/api/filtered.rb +15 -0
- data/app/controllers/concerns/api/versioned.rb +36 -0
- data/app/controllers/power_api/base_controller.rb +14 -0
- data/app/helpers/power_api/application_helper.rb +4 -0
- data/app/jobs/power_api/application_job.rb +4 -0
- data/app/mailers/power_api/application_mailer.rb +6 -0
- data/app/models/power_api/application_record.rb +5 -0
- data/app/responders/api_responder.rb +13 -0
- data/app/views/layouts/power_api/application.html.erb +14 -0
- data/bin/rails +14 -0
- data/config/routes.rb +2 -0
- data/lib/generators/power_api/controller/USAGE +5 -0
- data/lib/generators/power_api/controller/controller_generator.rb +152 -0
- data/lib/generators/power_api/install/USAGE +5 -0
- data/lib/generators/power_api/install/install_generator.rb +67 -0
- data/lib/generators/power_api/version/USAGE +5 -0
- data/lib/generators/power_api/version/version_generator.rb +54 -0
- data/lib/power_api.rb +35 -0
- data/lib/power_api/engine.rb +28 -0
- data/lib/power_api/errors.rb +4 -0
- data/lib/power_api/generator_helper/active_record_resource.rb +192 -0
- data/lib/power_api/generator_helper/ams_helper.rb +43 -0
- data/lib/power_api/generator_helper/controller_helper.rb +184 -0
- data/lib/power_api/generator_helper/pagination_helper.rb +48 -0
- data/lib/power_api/generator_helper/resource_helper.rb +33 -0
- data/lib/power_api/generator_helper/routes_helper.rb +91 -0
- data/lib/power_api/generator_helper/rubocop_helper.rb +11 -0
- data/lib/power_api/generator_helper/simple_token_auth_helper.rb +124 -0
- data/lib/power_api/generator_helper/swagger_helper.rb +463 -0
- data/lib/power_api/generator_helper/template_builder_helper.rb +23 -0
- data/lib/power_api/generator_helper/version_helper.rb +16 -0
- data/lib/power_api/generator_helpers.rb +25 -0
- data/lib/power_api/version.rb +3 -0
- data/lib/tasks/power_api_tasks.rake +4 -0
- data/power_api.gemspec +44 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/config/manifest.js +5 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/javascripts/cable.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
- data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/controllers/concerns/api/deprecated_spec.rb +37 -0
- data/spec/dummy/app/controllers/concerns/api/error_spec.rb +97 -0
- data/spec/dummy/app/controllers/concerns/api/filtered_spec.rb +42 -0
- data/spec/dummy/app/controllers/concerns/api/versioned_spec.rb +64 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/jobs/application_job.rb +2 -0
- data/spec/dummy/app/mailers/application_mailer.rb +4 -0
- data/spec/dummy/app/models/application_record.rb +3 -0
- data/spec/dummy/app/models/blog.rb +5 -0
- data/spec/dummy/app/models/portfolio.rb +5 -0
- data/spec/dummy/app/models/user.rb +3 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +38 -0
- data/spec/dummy/bin/update +29 -0
- data/spec/dummy/bin/yarn +11 -0
- data/spec/dummy/config.ru +5 -0
- data/spec/dummy/config/application.rb +26 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/cable.yml +10 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +54 -0
- data/spec/dummy/config/environments/production.rb +91 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
- data/spec/dummy/config/initializers/assets.rb +14 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +33 -0
- data/spec/dummy/config/puma.rb +56 -0
- data/spec/dummy/config/routes.rb +12 -0
- data/spec/dummy/config/secrets.yml +32 -0
- data/spec/dummy/config/spring.rb +6 -0
- data/spec/dummy/db/migrate/20190322205209_create_blogs.rb +10 -0
- data/spec/dummy/db/migrate/20200215225917_create_users.rb +9 -0
- data/spec/dummy/db/migrate/20200227150449_create_portfolios.rb +10 -0
- data/spec/dummy/db/migrate/20200227150548_add_portfolio_id_blogs.rb +5 -0
- data/spec/dummy/db/schema.rb +38 -0
- data/spec/dummy/package.json +5 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
- data/spec/dummy/public/apple-touch-icon.png +0 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/spec/assets/image.png +0 -0
- data/spec/dummy/spec/assets/video.mp4 +0 -0
- data/spec/dummy/spec/factories/blogs.rb +7 -0
- data/spec/dummy/spec/factories/portfolios.rb +6 -0
- data/spec/dummy/spec/factories/users.rb +5 -0
- data/spec/dummy/spec/lib/power_api/generator_helper/ams_helper_spec.rb +87 -0
- data/spec/dummy/spec/lib/power_api/generator_helper/controller_helper_spec.rb +361 -0
- data/spec/dummy/spec/lib/power_api/generator_helper/pagination_helper_spec.rb +56 -0
- data/spec/dummy/spec/lib/power_api/generator_helper/resource_helper_spec.rb +31 -0
- data/spec/dummy/spec/lib/power_api/generator_helper/routes_helper_spec.rb +179 -0
- data/spec/dummy/spec/lib/power_api/generator_helper/simple_token_auth_helper_spec.rb +164 -0
- data/spec/dummy/spec/lib/power_api/generator_helper/swagger_helper_spec.rb +451 -0
- data/spec/dummy/spec/lib/power_api/generator_helper/version_helper_spec.rb +55 -0
- data/spec/dummy/spec/support/shared_examples/active_record_resource.rb +101 -0
- data/spec/dummy/spec/support/shared_examples/active_record_resource_atrributes.rb +164 -0
- data/spec/dummy/spec/support/test_generator_helpers.rb +29 -0
- data/spec/dummy/spec/support/test_helpers.rb +11 -0
- data/spec/rails_helper.rb +49 -0
- data/spec/spec_helper.rb +9 -0
- metadata +602 -0
@@ -0,0 +1,54 @@
|
|
1
|
+
class PowerApi::VersionGenerator < Rails::Generators::NamedBase
|
2
|
+
source_root File.expand_path('templates', __dir__)
|
3
|
+
|
4
|
+
def modify_routes
|
5
|
+
insert_into_file(
|
6
|
+
helper.routes_path,
|
7
|
+
after: helper.routes_line_to_inject_new_version
|
8
|
+
) do
|
9
|
+
helper.version_route_tpl
|
10
|
+
end
|
11
|
+
|
12
|
+
helper.format_ruby_file(helper.routes_path)
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_base_controller
|
16
|
+
create_file(
|
17
|
+
helper.base_controller_path,
|
18
|
+
helper.base_controller_tpl
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
def add_serializers_directory
|
23
|
+
create_file(helper.ams_serializers_path)
|
24
|
+
end
|
25
|
+
|
26
|
+
def add_swagger_related
|
27
|
+
create_file(helper.swagger_schemas_path)
|
28
|
+
|
29
|
+
create_file(
|
30
|
+
helper.swagger_version_definition_path,
|
31
|
+
helper.swagger_definition_tpl
|
32
|
+
)
|
33
|
+
|
34
|
+
insert_into_file(
|
35
|
+
helper.rswag_ui_initializer_path,
|
36
|
+
after: helper.rswag_ui_configure_line
|
37
|
+
) do
|
38
|
+
helper.rswag_ui_swagger_endpoint
|
39
|
+
end
|
40
|
+
|
41
|
+
insert_into_file(
|
42
|
+
helper.swagger_helper_path,
|
43
|
+
after: helper.swagger_helper_api_definition_line
|
44
|
+
) do
|
45
|
+
helper.swagger_helper_api_definition
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def helper
|
52
|
+
@helper ||= PowerApi::GeneratorHelpers.new(version_number: file_name)
|
53
|
+
end
|
54
|
+
end
|
data/lib/power_api.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require "active_model_serializers"
|
2
|
+
require "api-pagination"
|
3
|
+
require "kaminari"
|
4
|
+
require "ransack"
|
5
|
+
require "responders"
|
6
|
+
require "rswag/api"
|
7
|
+
require "rswag/ui"
|
8
|
+
require "simple_token_authentication"
|
9
|
+
require "versionist"
|
10
|
+
|
11
|
+
require "power_api/engine"
|
12
|
+
|
13
|
+
module PowerApi
|
14
|
+
extend self
|
15
|
+
|
16
|
+
# You can add, in this module, your own configuration options as in the example below...
|
17
|
+
#
|
18
|
+
# attr_writer :my_option
|
19
|
+
#
|
20
|
+
# def my_option
|
21
|
+
# return "Default Value" unless @my_option
|
22
|
+
# @my_option
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# Then, you can customize the default behaviour (typically in a Rails initializer) like this:
|
26
|
+
#
|
27
|
+
# PowerApi.setup do |config|
|
28
|
+
# config.root_url = "Another value"
|
29
|
+
# end
|
30
|
+
|
31
|
+
def setup
|
32
|
+
yield self
|
33
|
+
require "power_api"
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module PowerApi
|
2
|
+
module GeneratorHelper; end
|
3
|
+
|
4
|
+
class Engine < ::Rails::Engine
|
5
|
+
isolate_namespace PowerApi
|
6
|
+
|
7
|
+
config.generators do |g|
|
8
|
+
g.test_framework :rspec, fixture: false
|
9
|
+
g.fixture_replacement :factory_bot, dir: "spec/factories"
|
10
|
+
end
|
11
|
+
|
12
|
+
initializer "initialize" do
|
13
|
+
require_relative "./errors"
|
14
|
+
require_relative "./generator_helper/active_record_resource"
|
15
|
+
require_relative "./generator_helper/version_helper"
|
16
|
+
require_relative "./generator_helper/resource_helper"
|
17
|
+
require_relative "./generator_helper/swagger_helper"
|
18
|
+
require_relative "./generator_helper/ams_helper"
|
19
|
+
require_relative "./generator_helper/controller_helper"
|
20
|
+
require_relative "./generator_helper/routes_helper"
|
21
|
+
require_relative "./generator_helper/pagination_helper"
|
22
|
+
require_relative "./generator_helper/simple_token_auth_helper"
|
23
|
+
require_relative "./generator_helper/rubocop_helper"
|
24
|
+
require_relative "./generator_helper/template_builder_helper"
|
25
|
+
require_relative "./generator_helpers"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,192 @@
|
|
1
|
+
# rubocop:disable Metrics/ModuleLength
|
2
|
+
module PowerApi::GeneratorHelper::ActiveRecordResource
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
attr_reader :resource_attributes
|
7
|
+
end
|
8
|
+
|
9
|
+
def resource_name=(value)
|
10
|
+
@resource_name = value
|
11
|
+
|
12
|
+
if !resource_class
|
13
|
+
raise PowerApi::GeneratorError.new(
|
14
|
+
"Invalid resource name. Must be the snake_case representation of a ruby class"
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
if !resource_is_active_record_model?
|
19
|
+
raise PowerApi::GeneratorError.new("resource is not an active record model")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def resource_attributes=(collection)
|
24
|
+
attributes = format_attributes(collection)
|
25
|
+
raise PowerApi::GeneratorError.new("at least one attribute must be added") if attributes.none?
|
26
|
+
|
27
|
+
@resource_attributes = attributes
|
28
|
+
end
|
29
|
+
|
30
|
+
def id
|
31
|
+
"#{snake_case}_id"
|
32
|
+
end
|
33
|
+
|
34
|
+
def upcase
|
35
|
+
snake_case.upcase
|
36
|
+
end
|
37
|
+
|
38
|
+
def upcase_plural
|
39
|
+
plural.upcase
|
40
|
+
end
|
41
|
+
|
42
|
+
def camel
|
43
|
+
resource_name.camelize
|
44
|
+
end
|
45
|
+
|
46
|
+
def camel_plural
|
47
|
+
camel.pluralize
|
48
|
+
end
|
49
|
+
|
50
|
+
def plural
|
51
|
+
snake_case.pluralize
|
52
|
+
end
|
53
|
+
|
54
|
+
def snake_case
|
55
|
+
resource_name.underscore
|
56
|
+
end
|
57
|
+
|
58
|
+
def titleized
|
59
|
+
resource_name.titleize
|
60
|
+
end
|
61
|
+
|
62
|
+
def plural_titleized
|
63
|
+
plural.titleize
|
64
|
+
end
|
65
|
+
|
66
|
+
def path
|
67
|
+
"app/models/#{snake_case}.rb"
|
68
|
+
end
|
69
|
+
|
70
|
+
def class_definition_line
|
71
|
+
"class #{camel} < ApplicationRecord\n"
|
72
|
+
end
|
73
|
+
|
74
|
+
def attributes_names
|
75
|
+
extract_attrs_names(resource_attributes)
|
76
|
+
end
|
77
|
+
|
78
|
+
def required_attributes_names
|
79
|
+
extract_attrs_names(required_resource_attributes)
|
80
|
+
end
|
81
|
+
|
82
|
+
def permitted_attributes_names
|
83
|
+
extract_attrs_names(permitted_attributes)
|
84
|
+
end
|
85
|
+
|
86
|
+
def permitted_attributes
|
87
|
+
resource_attributes.reject do |attr|
|
88
|
+
[:created_at, :updated_at].include?(attr[:name])
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def required_resource_attributes
|
93
|
+
permitted_attributes.select { |attr| attr[:required] }
|
94
|
+
end
|
95
|
+
|
96
|
+
def optional_resource_attributes
|
97
|
+
permitted_attributes.reject { |attr| attr[:required] }
|
98
|
+
end
|
99
|
+
|
100
|
+
def attributes_symbols_text_list
|
101
|
+
attrs_to_symobls_text_list(attributes_names)
|
102
|
+
end
|
103
|
+
|
104
|
+
def permitted_attributes_symbols_text_list
|
105
|
+
attrs_to_symobls_text_list(permitted_attributes_names)
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
|
110
|
+
def resource_name
|
111
|
+
@resource_name
|
112
|
+
end
|
113
|
+
|
114
|
+
def extract_attrs_names(attrs)
|
115
|
+
attrs.map { |attr| attr[:name] }
|
116
|
+
end
|
117
|
+
|
118
|
+
def attrs_to_symobls_text_list(attrs)
|
119
|
+
attrs.map { |a| ":#{a}" }.join(",\n") + "\n"
|
120
|
+
end
|
121
|
+
|
122
|
+
def format_attributes(attrs)
|
123
|
+
columns = resource_class.columns.inject([]) do |memo, col|
|
124
|
+
col_name = col.name.to_sym
|
125
|
+
next memo if col_name == :id
|
126
|
+
|
127
|
+
memo << {
|
128
|
+
name: col_name,
|
129
|
+
type: col.type,
|
130
|
+
swagger_type: get_swagger_type(col.type),
|
131
|
+
required: required_attribute?(col_name),
|
132
|
+
example: get_attribute_example(col.type, col_name)
|
133
|
+
}
|
134
|
+
|
135
|
+
memo
|
136
|
+
end
|
137
|
+
|
138
|
+
return columns if attrs.blank?
|
139
|
+
|
140
|
+
attrs = attrs.map(&:to_sym)
|
141
|
+
columns.select { |col| attrs.include?(col[:name]) }
|
142
|
+
end
|
143
|
+
|
144
|
+
def get_swagger_type(data_type)
|
145
|
+
case data_type
|
146
|
+
when :integer
|
147
|
+
:integer
|
148
|
+
when :float, :decimal
|
149
|
+
:float
|
150
|
+
when :boolean
|
151
|
+
:boolean
|
152
|
+
else
|
153
|
+
:string
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def get_attribute_example(data_type, col_name)
|
158
|
+
case data_type
|
159
|
+
when :date
|
160
|
+
"'1984-06-04'"
|
161
|
+
when :datetime
|
162
|
+
"'1984-06-04 09:00'"
|
163
|
+
when :integer
|
164
|
+
666
|
165
|
+
when :float, :decimal
|
166
|
+
6.66
|
167
|
+
when :boolean
|
168
|
+
true
|
169
|
+
else
|
170
|
+
"'Some #{col_name}'"
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def required_attribute?(col_name)
|
175
|
+
validator_names = resource_class.validators_on(col_name).map do |validator|
|
176
|
+
validator.class.name
|
177
|
+
end
|
178
|
+
|
179
|
+
validator_names.include?("ActiveRecord::Validations::PresenceValidator")
|
180
|
+
end
|
181
|
+
|
182
|
+
def resource_class
|
183
|
+
resource_name.classify.constantize
|
184
|
+
rescue NameError
|
185
|
+
false
|
186
|
+
end
|
187
|
+
|
188
|
+
def resource_is_active_record_model?
|
189
|
+
!!ActiveRecord::Base.descendants.find { |model_class| model_class == resource_class }
|
190
|
+
end
|
191
|
+
end
|
192
|
+
# rubocop:enable Metrics/ModuleLength
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module PowerApi::GeneratorHelper::AmsHelper
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
included do
|
5
|
+
include PowerApi::GeneratorHelper::VersionHelper
|
6
|
+
include PowerApi::GeneratorHelper::ResourceHelper
|
7
|
+
end
|
8
|
+
|
9
|
+
def ams_initializer_path
|
10
|
+
"config/initializers/active_model_serializers.rb"
|
11
|
+
end
|
12
|
+
|
13
|
+
def ams_serializer_path
|
14
|
+
"app/serializers/api/v#{version_number}/#{resource.snake_case}_serializer.rb"
|
15
|
+
end
|
16
|
+
|
17
|
+
def ams_serializers_path
|
18
|
+
"app/serializers/api/v#{version_number}/.gitkeep"
|
19
|
+
end
|
20
|
+
|
21
|
+
def ams_initializer_tpl
|
22
|
+
<<~INITIALIZER
|
23
|
+
class ActiveModelSerializers::Adapter::JsonApi
|
24
|
+
def self.default_key_transform
|
25
|
+
:unaltered
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
ActiveModelSerializers.config.adapter = :json_api
|
30
|
+
INITIALIZER
|
31
|
+
end
|
32
|
+
|
33
|
+
def ams_serializer_tpl
|
34
|
+
<<~SERIALIZER
|
35
|
+
class Api::V#{version_number}::#{resource.camel}Serializer < ActiveModel::Serializer
|
36
|
+
type :#{resource.snake_case}
|
37
|
+
|
38
|
+
attributes(
|
39
|
+
#{resource.attributes_symbols_text_list})
|
40
|
+
end
|
41
|
+
SERIALIZER
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,184 @@
|
|
1
|
+
# rubocop:disable Metrics/ModuleLength
|
2
|
+
module PowerApi::GeneratorHelper::ControllerHelper
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
include PowerApi::GeneratorHelper::VersionHelper
|
7
|
+
include PowerApi::GeneratorHelper::ResourceHelper
|
8
|
+
include PowerApi::GeneratorHelper::PaginationHelper
|
9
|
+
include PowerApi::GeneratorHelper::SimpleTokenAuthHelper
|
10
|
+
include PowerApi::GeneratorHelper::TemplateBuilderHelper
|
11
|
+
|
12
|
+
attr_accessor :allow_filters
|
13
|
+
end
|
14
|
+
|
15
|
+
def api_base_controller_path
|
16
|
+
"app/controllers/api/base_controller.rb"
|
17
|
+
end
|
18
|
+
|
19
|
+
def base_controller_path
|
20
|
+
"app/controllers/api/v#{version_number}/base_controller.rb"
|
21
|
+
end
|
22
|
+
|
23
|
+
def resource_controller_path
|
24
|
+
"app/controllers/api/v#{version_number}/#{resource.plural}_controller.rb"
|
25
|
+
end
|
26
|
+
|
27
|
+
def api_base_controller_tpl
|
28
|
+
<<~CONTROLLER
|
29
|
+
class Api::BaseController < PowerApi::BaseController
|
30
|
+
end
|
31
|
+
CONTROLLER
|
32
|
+
end
|
33
|
+
|
34
|
+
def base_controller_tpl
|
35
|
+
<<~CONTROLLER
|
36
|
+
class Api::V#{version_number}::BaseController < Api::BaseController
|
37
|
+
before_action do
|
38
|
+
self.namespace_for_serializer = ::Api::V#{version_number}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
CONTROLLER
|
42
|
+
end
|
43
|
+
|
44
|
+
def resource_controller_tpl
|
45
|
+
tpl_class(
|
46
|
+
ctrl_tpl_class_definition_line,
|
47
|
+
ctrl_tpl_acts_as_token_authentication_handler,
|
48
|
+
ctrl_tpl_index,
|
49
|
+
ctrl_tpl_show,
|
50
|
+
ctrl_tpl_create,
|
51
|
+
ctrl_tpl_update,
|
52
|
+
ctrl_tpl_destroy,
|
53
|
+
"private",
|
54
|
+
ctrl_tpl_resource,
|
55
|
+
ctrl_tpl_resources_from_authenticated_resource,
|
56
|
+
ctrl_tpl_find_parent_resource,
|
57
|
+
ctrl_tpl_permitted_params
|
58
|
+
)
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def ctrl_tpl_class_definition_line
|
64
|
+
"Api::V#{version_number}::#{resource.camel_plural}Controller < \
|
65
|
+
Api::V#{version_number}::BaseController"
|
66
|
+
end
|
67
|
+
|
68
|
+
def ctrl_tpl_acts_as_token_authentication_handler
|
69
|
+
return unless authenticated_resource?
|
70
|
+
|
71
|
+
"acts_as_token_authentication_handler_for #{authenticated_resource.camel}, \
|
72
|
+
fallback: :exception\n"
|
73
|
+
end
|
74
|
+
|
75
|
+
def ctrl_tpl_index
|
76
|
+
concat_tpl_method("index", "respond_with #{ctrl_tpl_index_resources}")
|
77
|
+
end
|
78
|
+
|
79
|
+
def ctrl_tpl_show
|
80
|
+
concat_tpl_method("show", "respond_with #{resource.snake_case}")
|
81
|
+
end
|
82
|
+
|
83
|
+
def ctrl_tpl_create
|
84
|
+
concat_tpl_method("create", "respond_with #{ctrl_tpl_create_resource}")
|
85
|
+
end
|
86
|
+
|
87
|
+
def ctrl_tpl_update
|
88
|
+
concat_tpl_method(
|
89
|
+
"update",
|
90
|
+
"respond_with #{resource.snake_case}.update!(#{resource.snake_case}_params)"
|
91
|
+
)
|
92
|
+
end
|
93
|
+
|
94
|
+
def ctrl_tpl_destroy
|
95
|
+
concat_tpl_method("destroy", "respond_with #{resource.snake_case}.destroy!")
|
96
|
+
end
|
97
|
+
|
98
|
+
def ctrl_tpl_resource
|
99
|
+
concat_tpl_method(resource.snake_case, "@#{resource.snake_case} ||= #{ctrl_tpl_find_resource}")
|
100
|
+
end
|
101
|
+
|
102
|
+
def ctrl_tpl_permitted_params
|
103
|
+
concat_tpl_method(
|
104
|
+
"#{resource.snake_case}_params",
|
105
|
+
"params.require(:#{resource.snake_case}).permit(",
|
106
|
+
"#{resource.permitted_attributes_symbols_text_list})"
|
107
|
+
)
|
108
|
+
end
|
109
|
+
|
110
|
+
def ctrl_tpl_find_resource
|
111
|
+
find_statement = "find_by!(id: params[:id])"
|
112
|
+
resource_source = if owned_by_authenticated_resource?
|
113
|
+
if parent_resource?
|
114
|
+
"#{resource.camel}.where(#{parent_resource.snake_case}: \
|
115
|
+
#{current_authenticated_resource}.#{parent_resource.plural})"
|
116
|
+
else
|
117
|
+
resource.plural
|
118
|
+
end
|
119
|
+
else
|
120
|
+
resource.camel
|
121
|
+
end
|
122
|
+
|
123
|
+
"#{resource_source}.#{find_statement}"
|
124
|
+
end
|
125
|
+
|
126
|
+
def ctrl_tpl_index_resources
|
127
|
+
return ctrl_tpl_index_collection unless use_paginator
|
128
|
+
|
129
|
+
"paginate(#{ctrl_tpl_index_collection})"
|
130
|
+
end
|
131
|
+
|
132
|
+
def ctrl_tpl_index_collection
|
133
|
+
collection = owned_resource? ? resource.plural : "#{resource.camel}.all"
|
134
|
+
return collection unless allow_filters
|
135
|
+
|
136
|
+
"filtered_collection(#{collection})"
|
137
|
+
end
|
138
|
+
|
139
|
+
def ctrl_tpl_create_resource
|
140
|
+
create_statement = "create!(#{resource.snake_case}_params)"
|
141
|
+
|
142
|
+
if owned_resource?
|
143
|
+
"#{resource.plural}.#{create_statement}"
|
144
|
+
else
|
145
|
+
"#{resource.camel}.#{create_statement}"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def ctrl_tpl_resources_from_authenticated_resource
|
150
|
+
return unless owned_resource?
|
151
|
+
|
152
|
+
resource_source = if owned_by_authenticated_resource? && !parent_resource?
|
153
|
+
current_authenticated_resource
|
154
|
+
else
|
155
|
+
parent_resource.snake_case
|
156
|
+
end
|
157
|
+
|
158
|
+
concat_tpl_method(
|
159
|
+
resource.plural,
|
160
|
+
"@#{resource.plural} ||= #{resource_source}.#{resource.plural}"
|
161
|
+
)
|
162
|
+
end
|
163
|
+
|
164
|
+
def ctrl_tpl_find_parent_resource
|
165
|
+
return unless parent_resource?
|
166
|
+
|
167
|
+
resource_source = if owned_by_authenticated_resource?
|
168
|
+
"#{current_authenticated_resource}.#{parent_resource.plural}"
|
169
|
+
else
|
170
|
+
parent_resource.camel
|
171
|
+
end
|
172
|
+
|
173
|
+
concat_tpl_method(
|
174
|
+
parent_resource.snake_case,
|
175
|
+
"@#{parent_resource.snake_case} ||= #{resource_source}.\
|
176
|
+
find_by!(id: params[:#{parent_resource.id}])"
|
177
|
+
)
|
178
|
+
end
|
179
|
+
|
180
|
+
def owned_resource?
|
181
|
+
owned_by_authenticated_resource? || parent_resource?
|
182
|
+
end
|
183
|
+
end
|
184
|
+
# rubocop:enable Metrics/ModuleLength
|