arkaan 1.4.7 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cf1b485990b9b205c0ec44f7b8ba3139c7d2e013
4
- data.tar.gz: 241f47f572cf1684690063588dda394e53290dba
3
+ metadata.gz: c39aa671150c915b8a1b26d7bc4ec8101eaa3128
4
+ data.tar.gz: 47aecda9bdc9b5a2973687d8a732c4fe029522d5
5
5
  SHA512:
6
- metadata.gz: 74769ac2754786ff14dda033668f4c74a94e986160b689a1336b1213a550fe76a4b0a0f0162ca8589421dcc32d6c67aa13db02857fec491179ad9408f920b926
7
- data.tar.gz: da2aac145bb6b69bdbf3eb9d3289ef8f7376a496a25c465a417cd95dc15ac71c0495c2a13b52affac6ad33590ab564c33536f5060c5e53029442aabf4b003ad8
6
+ metadata.gz: a7585c99ec2d678ce02a022b494793b6d28a929ac903121c90fe91ea4459079140cce09991e546c7ab52a2c0ad8e6860ecf2a1c875a0e7327ae8c3bab924f284
7
+ data.tar.gz: 94defbac662fe38f06ed30a557f7ee4dd50f1a5021989ba52ebfd7338d7fbc01c634e7407473389188b85f97de4c2392bbe3bd376d677b0004cef65c22a72514
@@ -2,9 +2,9 @@ module Arkaan
2
2
  # Utility classes for the different micro-services of the suite.
3
3
  # @author Vincent Courtois <courtois.vincent@outlook.com>
4
4
  module Utils
5
- autoload :Controller , 'arkaan/utils/controller'
6
- autoload :ControllerWithoutFilter, 'arkaan/utils/controller_without_filter'
7
- autoload :Errors , 'arkaan/utils/errors'
8
- autoload :MicroService , 'arkaan/utils/micro_service'
5
+ autoload :Controllers , 'arkaan/utils/controllers'
6
+ autoload :Errors , 'arkaan/utils/errors'
7
+ autoload :Loaders , 'arkaan/utils/loaders'
8
+ autoload :MicroService, 'arkaan/utils/micro_service'
9
9
  end
10
10
  end
@@ -0,0 +1,8 @@
1
+ module Arkaan
2
+ module Utils
3
+ module Controllers
4
+ autoload :Base , 'arkaan/utils/controllers/base'
5
+ autoload :Checked, 'arkaan/utils/controllers/checked'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,193 @@
1
+ module Arkaan
2
+ module Utils
3
+ module Controllers
4
+ # Base controller to handle the standard error when accessing the API.
5
+ # @author Vincent Courtois <courtois.vincenet@outlook.com>
6
+ class Base < Sinatra::Base
7
+ register Sinatra::ConfigFile
8
+ helpers Sinatra::CustomLogger
9
+
10
+ configure do
11
+ set :logger, Logger.new(STDOUT)
12
+ logger.level = Logger::ERROR if ENV['RACK_ENV'] == 'test'
13
+ end
14
+
15
+ # Creates a premium route whithin the Sinatra application, and registers it in the database if it does not already exists.
16
+ # @param verb [String] the HTTP method used to create this route.
17
+ # @param path [String] the path, beginning with a /, of the route to create.
18
+ def self.declare_route(verb, path, options: {}, &block)
19
+ self.declare_route_with(verb, path, false, options, &block)
20
+ end
21
+
22
+ # Creates a non premium route whithin the Sinatra application, and registers it in the database if it does not already exists.
23
+ # @param verb [String] the HTTP method used to create this route.
24
+ # @param path [String] the path, beginning with a /, of the route to create.
25
+ def self.declare_premium_route(verb, path, options: {}, &block)
26
+ self.declare_route_with(verb, path, true, options, &block)
27
+ end
28
+
29
+ # Creates a route whithin the Sinatra application, and registers it in the database if it does not already exists.
30
+ # @param verb [String] the HTTP method used to create this route.
31
+ # @param path [String] the path, beginning with a /, of the route to create.
32
+ # @param premium [Boolean] TRUE to make the route premium, FALSE otherwise.
33
+ def self.declare_route_with(verb, path, premium, options, &block)
34
+ service = Arkaan::Utils::MicroService.instance.service
35
+ complete_path = "#{Arkaan::Utils::MicroService.instance.path}#{path == '/' ? '' : path}"
36
+
37
+ unless service.nil? || !service.routes.where(path: path, verb: verb).first.nil?
38
+ route = Arkaan::Monitoring::Route.create(path: path, verb: verb, premium: premium, service: service)
39
+ if !options.nil? && !options[:authenticated].nil?
40
+ route.update_attribute(:authenticated, false)
41
+ end
42
+ Arkaan::Permissions::Group.where(is_superuser: true).each do |group|
43
+ group.routes << route
44
+ group.save!
45
+ end
46
+ end
47
+ if premium
48
+ self.public_send(verb, complete_path) do
49
+ @sinatra_route = parse_current_route
50
+ if !@application.premium?
51
+ custom_error(403, 'common.app_key.forbidden')
52
+ end
53
+ instance_eval(&block)
54
+ end
55
+ else
56
+ logger.info "#{verb} #{complete_path}"
57
+ self.public_send(verb, complete_path, &block)
58
+ end
59
+ end
60
+
61
+ # Loads the errors configuration file from the config folder.
62
+ # @param file [String] send __FILE__
63
+ def self.load_errors_from(file)
64
+ config_file File.join(File.dirname(file), '..', 'config', 'errors.yml')
65
+ end
66
+
67
+ def before_checks
68
+ add_body_to_params
69
+
70
+ check_presence('token', 'app_key', route: 'common')
71
+
72
+ gateway = Arkaan::Monitoring::Gateway.where(token: params['token']).first
73
+ @application = Arkaan::OAuth::Application.where(key: params['app_key']).first
74
+
75
+ if gateway.nil?
76
+ custom_error(404, 'common.token.unknown')
77
+ elsif @application.nil?
78
+ custom_error(404, 'common.app_key.unknown')
79
+ end
80
+ end
81
+
82
+ # Checks the presence of several fields given as parameters and halts the execution if it's not present.
83
+ # @param fields [Array<String>] an array of fields names to search in the parameters
84
+ # @param route [String] the name of the route you're requiring to put in the error message.
85
+ def check_presence(*fields, route:)
86
+ fields.each do |field|
87
+ custom_error(400, "#{route}.#{field}.required") if params[field].nil? || params[field] == ''
88
+ end
89
+ end
90
+
91
+ # Checks the presence of either fields given in parameters. It halts with an error only if ALL parameters are not given.
92
+ # @param fields [Array<String>] an array of fields names to search in the parameters
93
+ # @param route [String] the name of the route you're requiring to put in the error message.
94
+ # @param key [String] the key to search in the errors configuration file.
95
+ def check_either_presence(*fields, route:, key:)
96
+ fields.each do |field|
97
+ return true if !params[field].nil? && params[field] != ''
98
+ end
99
+ custom_error 400, "#{route}.#{key}.required"
100
+ end
101
+
102
+ # Checks if the session ID is given in the parameters and if the session exists.
103
+ # @param action [String] the action used to get the errors from the errors file.
104
+ # @return [Arkaan::Authentication::Session] the session when it exists.
105
+ def check_session(action)
106
+ check_presence('session_id', route: action)
107
+ session = Arkaan::Authentication::Session.where(token: params['session_id']).first
108
+ if session.nil?
109
+ custom_error(404, "#{action}.session_id.unknown")
110
+ end
111
+ return session
112
+ end
113
+
114
+ def check_application(action)
115
+ check_presence('app_key', route: action)
116
+ application = Arkaan::OAuth::Application.where(key: params['app_key']).first
117
+ custom_error(404, "#{action}.app_key.unknown") if application.nil?
118
+ return application
119
+ end
120
+
121
+ # Adds the parsed body to the parameters, overwriting the parameters of the querystring with the values
122
+ # of the SON body if they have similar keys.
123
+ def add_body_to_params
124
+ if request.body.respond_to?(:rewind) && request.body.respond_to?(:read)
125
+ request.body.rewind
126
+ parsed_body = JSON.parse(request.body.read.to_s) rescue {}
127
+ parsed_body.keys.each do |key|
128
+ params[key] = parsed_body[key]
129
+ end
130
+ end
131
+ end
132
+
133
+ # Gets the current route in the database from the sinatra route.
134
+ # @return [Arkaan::Monitoring::Route] the route declared in the services registry.
135
+ def parse_current_route
136
+ splitted = request.env['sinatra.route'].split(' ')
137
+ return Arkaan::Monitoring::Route.where(verb: splitted.first.downcase, path: splitted.last).first
138
+ end
139
+
140
+ # Halts the application and creates the returned body from the parameters and the errors config file.
141
+ # @param status [Integer] the HTTP status to halt the application with.
142
+ # @param path [String] the path in the configuration file to access the URL.
143
+ def custom_error(status, path)
144
+ route, field, error = path.split('.')
145
+ docs = settings.errors[route][field][error] rescue ''
146
+ halt status, {status: status, field: field, error: error, docs: docs}.to_json
147
+ end
148
+
149
+ # Halts the application with a Bad Request error affecting a field of a model.
150
+ # @param instance [Mongoid::Document] the document having a field in error.
151
+ # @param route [String] the type of action you're currently doing (e.g: 'creation')
152
+ def model_error(instance, route)
153
+ messages = instance.errors.messages
154
+ field = messages.keys.first
155
+ custom_error(400, "#{route}.#{field}.#{messages[field].first}")
156
+ end
157
+
158
+ # Select parameters in the params hash, by its keys.
159
+ # @param fields [Array<String>] the keys to select in the params hash.
160
+ # @return [Hash] the selected chunk of the params hash.
161
+ def select_params(*fields)
162
+ return params.select { |key, value| fields.include?(key) }
163
+ end
164
+
165
+ # Creates a custom error from an existing Arkaan exception class.
166
+ # @param exception {StandardError} the exception to transform in a usable error.
167
+ def handle_arkaan_exception(exception)
168
+ custom_error(exception.status, "#{exception.action}.#{exception.field}.#{exception.error}")
169
+ end
170
+
171
+ error Arkaan::Utils::Errors::BadRequest do |exception|
172
+ handle_arkaan_exception(exception)
173
+ end
174
+
175
+ error Arkaan::Utils::Errors::Forbidden do |exception|
176
+ handle_arkaan_exception(exception)
177
+ end
178
+
179
+ error Arkaan::Utils::Errors::NotFound do |exception|
180
+ handle_arkaan_exception(exception)
181
+ end
182
+
183
+ error Arkaan::Factories::Errors::GatewayNotFound do |exception|
184
+ handle_arkaan_exception(exception)
185
+ end
186
+
187
+ error StandardError do |exception|
188
+ custom_error(500, 'system_error.unknown_field.unknown_error')
189
+ end
190
+ end
191
+ end
192
+ end
193
+ end
@@ -0,0 +1,14 @@
1
+ module Arkaan
2
+ module Utils
3
+ module Controllers
4
+ # Base controller to handle the standard error when accessing the API.
5
+ # @author Vincent Courtois <courtois.vincenet@outlook.com>
6
+ class Checked < Arkaan::Utils::Controllers::Base
7
+
8
+ before do
9
+ before_checks
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ module Arkaan
2
+ module Utils
3
+ module Loaders
4
+ autoload :Heroku, 'arkaaan/utils/loaders/heroku'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,20 @@
1
+ module Arkaan
2
+ module Utils
3
+ module Plugins
4
+ class Heroku
5
+ # Loads the heroku informations inside the data of the instance.
6
+ # @param instance [Arkaan::Monitoring::Instance] the instance to put the enrichment inside.
7
+ def self.load!(instance)
8
+ if !ENV['OAUTH_TOKEN'].nil? && instance != false && instance.persisted?
9
+ heroku = PlatformAPI.connect_oauth(ENV['OAUTH_TOKEN'])
10
+ regex = /\Ahttps?:\/\/([a-z\-]+).herokuapp.com\/?\z/
11
+ if instance.url.match(regex)
12
+ app_name = instance.url.scan(regex).first.first
13
+ instance.update_attribute(:data, heroku.app.info(app_name))
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -108,10 +108,10 @@ module Arkaan
108
108
  # @return [Arkaan::Monitoring::Instance] the instance of the micro service currently running.
109
109
  def register_instance
110
110
  @instance = @service.instances.where(url: ENV['SERVICE_URL']).first
111
- if instance.nil?
111
+ if @instance.nil?
112
112
  @instance = Arkaan::Monitoring::Instance.create(service: @service, url: ENV['SERVICE_URL'], type: type)
113
113
  end
114
- instance.update_attribute(:running, true)
114
+ @instance.update_attribute(:running, true)
115
115
  return @instance
116
116
  end
117
117
 
@@ -128,7 +128,7 @@ module Arkaan
128
128
  @service.update_attribute(:test_mode, true)
129
129
  end
130
130
  register_instance
131
- get_heroku_infos if type == :heroku && !test_mode
131
+ load_plugin!
132
132
  if service
133
133
  load_standard_files
134
134
  load_test_files if test_mode
@@ -137,16 +137,11 @@ module Arkaan
137
137
  return self
138
138
  end
139
139
 
140
- def get_heroku_infos
141
- if !ENV['OAUTH_TOKEN'].nil? && instance != false && instance.persisted?
142
- heroku = PlatformAPI.connect_oauth(ENV['OAUTH_TOKEN'])
143
- regex = /\Ahttps?:\/\/([a-z\-]+).herokuapp.com\/?\z/
144
- if instance.url.match(regex)
145
- app_name = instance.url.scan(regex).first.first
146
- instance.update_attribute(:data, heroku.app.info(app_name))
147
- end
140
+ def load_plugin!
141
+ plugin = ENV['ADDITIONAL_PLUGIN']
142
+ if !plugin.nil? && Arkaan::Utils::Plugins.constants.include?(plugin)
143
+ Arkaan::Utils::Plugins.const_get(plugin).load!(@instance)
148
144
  end
149
- return self
150
145
  end
151
146
 
152
147
  def load_mongoid_configuration(test_mode: false)
@@ -0,0 +1,3 @@
1
+ module Arkaan
2
+ VERSION = '1.5.0'
3
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arkaan
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.7
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vincent Courtois
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-18 00:00:00.000000000 Z
11
+ date: 2019-06-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -325,15 +325,19 @@ files:
325
325
  - lib/arkaan/rulesets/fields/integer.rb
326
326
  - lib/arkaan/specs.rb
327
327
  - lib/arkaan/utils.rb
328
- - lib/arkaan/utils/controller.rb
329
- - lib/arkaan/utils/controller_without_filter.rb
328
+ - lib/arkaan/utils/controllers.rb
329
+ - lib/arkaan/utils/controllers/base.rb
330
+ - lib/arkaan/utils/controllers/checked.rb
330
331
  - lib/arkaan/utils/errors.rb
331
332
  - lib/arkaan/utils/errors/bad_request.rb
332
333
  - lib/arkaan/utils/errors/forbidden.rb
333
334
  - lib/arkaan/utils/errors/http_error.rb
334
335
  - lib/arkaan/utils/errors/not_found.rb
336
+ - lib/arkaan/utils/loaders.rb
337
+ - lib/arkaan/utils/loaders/heroku.rb
335
338
  - lib/arkaan/utils/micro_service.rb
336
339
  - lib/arkaan/utils/seeder.rb
340
+ - lib/arkaan/version.rb
337
341
  homepage: https://rubygems.org/gems/arkaan
338
342
  licenses:
339
343
  - MIT
@@ -1,12 +0,0 @@
1
- module Arkaan
2
- module Utils
3
- # Base controller to handle the standard error when accessing the API.
4
- # @author Vincent Courtois <courtois.vincenet@outlook.com>
5
- class Controller < Arkaan::Utils::ControllerWithoutFilter
6
-
7
- before do
8
- before_checks
9
- end
10
- end
11
- end
12
- end
@@ -1,191 +0,0 @@
1
- module Arkaan
2
- module Utils
3
- # Base controller to handle the standard error when accessing the API.
4
- # @author Vincent Courtois <courtois.vincenet@outlook.com>
5
- class ControllerWithoutFilter < Sinatra::Base
6
- register Sinatra::ConfigFile
7
- helpers Sinatra::CustomLogger
8
-
9
- configure do
10
- set :logger, Logger.new(STDOUT)
11
- logger.level = Logger::ERROR if ENV['RACK_ENV'] == 'test'
12
- end
13
-
14
- # Creates a premium route whithin the Sinatra application, and registers it in the database if it does not already exists.
15
- # @param verb [String] the HTTP method used to create this route.
16
- # @param path [String] the path, beginning with a /, of the route to create.
17
- def self.declare_route(verb, path, options: {}, &block)
18
- self.declare_route_with(verb, path, false, options, &block)
19
- end
20
-
21
- # Creates a non premium route whithin the Sinatra application, and registers it in the database if it does not already exists.
22
- # @param verb [String] the HTTP method used to create this route.
23
- # @param path [String] the path, beginning with a /, of the route to create.
24
- def self.declare_premium_route(verb, path, options: {}, &block)
25
- self.declare_route_with(verb, path, true, options, &block)
26
- end
27
-
28
- # Creates a route whithin the Sinatra application, and registers it in the database if it does not already exists.
29
- # @param verb [String] the HTTP method used to create this route.
30
- # @param path [String] the path, beginning with a /, of the route to create.
31
- # @param premium [Boolean] TRUE to make the route premium, FALSE otherwise.
32
- def self.declare_route_with(verb, path, premium, options, &block)
33
- service = Arkaan::Utils::MicroService.instance.service
34
- complete_path = "#{Arkaan::Utils::MicroService.instance.path}#{path == '/' ? '' : path}"
35
-
36
- unless service.nil? || !service.routes.where(path: path, verb: verb).first.nil?
37
- route = Arkaan::Monitoring::Route.create(path: path, verb: verb, premium: premium, service: service)
38
- if !options.nil? && !options[:authenticated].nil?
39
- route.update_attribute(:authenticated, false)
40
- end
41
- Arkaan::Permissions::Group.where(is_superuser: true).each do |group|
42
- group.routes << route
43
- group.save!
44
- end
45
- end
46
- if premium
47
- self.public_send(verb, complete_path) do
48
- @sinatra_route = parse_current_route
49
- if !@application.premium?
50
- custom_error(403, 'common.app_key.forbidden')
51
- end
52
- instance_eval(&block)
53
- end
54
- else
55
- logger.info "#{verb} #{complete_path}"
56
- self.public_send(verb, complete_path, &block)
57
- end
58
- end
59
-
60
- # Loads the errors configuration file from the config folder.
61
- # @param file [String] send __FILE__
62
- def self.load_errors_from(file)
63
- config_file File.join(File.dirname(file), '..', 'config', 'errors.yml')
64
- end
65
-
66
- def before_checks
67
- add_body_to_params
68
-
69
- check_presence('token', 'app_key', route: 'common')
70
-
71
- gateway = Arkaan::Monitoring::Gateway.where(token: params['token']).first
72
- @application = Arkaan::OAuth::Application.where(key: params['app_key']).first
73
-
74
- if gateway.nil?
75
- custom_error(404, 'common.token.unknown')
76
- elsif @application.nil?
77
- custom_error(404, 'common.app_key.unknown')
78
- end
79
- end
80
-
81
- # Checks the presence of several fields given as parameters and halts the execution if it's not present.
82
- # @param fields [Array<String>] an array of fields names to search in the parameters
83
- # @param route [String] the name of the route you're requiring to put in the error message.
84
- def check_presence(*fields, route:)
85
- fields.each do |field|
86
- custom_error(400, "#{route}.#{field}.required") if params[field].nil? || params[field] == ''
87
- end
88
- end
89
-
90
- # Checks the presence of either fields given in parameters. It halts with an error only if ALL parameters are not given.
91
- # @param fields [Array<String>] an array of fields names to search in the parameters
92
- # @param route [String] the name of the route you're requiring to put in the error message.
93
- # @param key [String] the key to search in the errors configuration file.
94
- def check_either_presence(*fields, route:, key:)
95
- fields.each do |field|
96
- return true if !params[field].nil? && params[field] != ''
97
- end
98
- custom_error 400, "#{route}.#{key}.required"
99
- end
100
-
101
- # Checks if the session ID is given in the parameters and if the session exists.
102
- # @param action [String] the action used to get the errors from the errors file.
103
- # @return [Arkaan::Authentication::Session] the session when it exists.
104
- def check_session(action)
105
- check_presence('session_id', route: action)
106
- session = Arkaan::Authentication::Session.where(token: params['session_id']).first
107
- if session.nil?
108
- custom_error(404, "#{action}.session_id.unknown")
109
- end
110
- return session
111
- end
112
-
113
- def check_application(action)
114
- check_presence('app_key', route: action)
115
- application = Arkaan::OAuth::Application.where(key: params['app_key']).first
116
- custom_error(404, "#{action}.app_key.unknown") if application.nil?
117
- return application
118
- end
119
-
120
- # Adds the parsed body to the parameters, overwriting the parameters of the querystring with the values
121
- # of the SON body if they have similar keys.
122
- def add_body_to_params
123
- if request.body.respond_to?(:rewind) && request.body.respond_to?(:read)
124
- request.body.rewind
125
- parsed_body = JSON.parse(request.body.read.to_s) rescue {}
126
- parsed_body.keys.each do |key|
127
- params[key] = parsed_body[key]
128
- end
129
- end
130
- end
131
-
132
- # Gets the current route in the database from the sinatra route.
133
- # @return [Arkaan::Monitoring::Route] the route declared in the services registry.
134
- def parse_current_route
135
- splitted = request.env['sinatra.route'].split(' ')
136
- return Arkaan::Monitoring::Route.where(verb: splitted.first.downcase, path: splitted.last).first
137
- end
138
-
139
- # Halts the application and creates the returned body from the parameters and the errors config file.
140
- # @param status [Integer] the HTTP status to halt the application with.
141
- # @param path [String] the path in the configuration file to access the URL.
142
- def custom_error(status, path)
143
- route, field, error = path.split('.')
144
- docs = settings.errors[route][field][error] rescue ''
145
- halt status, {status: status, field: field, error: error, docs: docs}.to_json
146
- end
147
-
148
- # Halts the application with a Bad Request error affecting a field of a model.
149
- # @param instance [Mongoid::Document] the document having a field in error.
150
- # @param route [String] the type of action you're currently doing (e.g: 'creation')
151
- def model_error(instance, route)
152
- messages = instance.errors.messages
153
- field = messages.keys.first
154
- custom_error(400, "#{route}.#{field}.#{messages[field].first}")
155
- end
156
-
157
- # Select parameters in the params hash, by its keys.
158
- # @param fields [Array<String>] the keys to select in the params hash.
159
- # @return [Hash] the selected chunk of the params hash.
160
- def select_params(*fields)
161
- return params.select { |key, value| fields.include?(key) }
162
- end
163
-
164
- # Creates a custom error from an existing Arkaan exception class.
165
- # @param exception {StandardError} the exception to transform in a usable error.
166
- def handle_arkaan_exception(exception)
167
- custom_error(exception.status, "#{exception.action}.#{exception.field}.#{exception.error}")
168
- end
169
-
170
- error Arkaan::Utils::Errors::BadRequest do |exception|
171
- handle_arkaan_exception(exception)
172
- end
173
-
174
- error Arkaan::Utils::Errors::Forbidden do |exception|
175
- handle_arkaan_exception(exception)
176
- end
177
-
178
- error Arkaan::Utils::Errors::NotFound do |exception|
179
- handle_arkaan_exception(exception)
180
- end
181
-
182
- error Arkaan::Factories::Errors::GatewayNotFound do |exception|
183
- handle_arkaan_exception(exception)
184
- end
185
-
186
- error StandardError do |exception|
187
- custom_error(500, 'system_error.unknown_field.unknown_error')
188
- end
189
- end
190
- end
191
- end