motor-admin 0.1.28 → 0.1.29

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: 5799ce999fa943638fa7c4d655400c1418ee80977bf47f64a71e6d5c496d02de
4
- data.tar.gz: da99ec7b1c48708d983b663a7f9cb79b6d0e270b2fc9f5538a8121cfabdbc209
3
+ metadata.gz: 2f18c5fae6ca2c70b739f68d0a9b45f456b6c9f9592b4c44d216210a067b2e33
4
+ data.tar.gz: 4a65316ecce576b9de027fe93ff14bf9307826269af771fbfc9a7bbf3699f051
5
5
  SHA512:
6
- metadata.gz: c5fc31a79b01ad0e716700a7c3daed980b293d13081294d1013918cce6f4d24cf4c104e0c44144cde225fd3b1ce07253f9b3ddaf44f1eca2252a01ff9124c52e
7
- data.tar.gz: efca3a6d85ce6e33c83a63f3cd5addbd75b2baf099bd96c5efbac40445520a7725d68a5c3d0564792f06bdf12fed8958b13a6189047303d3c77f7f0af0ff0bd4
6
+ metadata.gz: f51029e47fe84f67f34ced365523f2214c44986f241ad35a77405f067a556bbca8ca124cb09812b007a709101729ae3dfc35aa94284c46dbbf2f63a990459001
7
+ data.tar.gz: 555b5570c50258d3ee00a317795868cee3281e0d3675d894e25773f26977d21d40781b031a4e3835469fa580d39b3e1ba5b87f11dcad83986b0bd144f612bc5c
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Motor
4
+ module WrapIoParams
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ before_action :wrap_io_params, only: %i[update create]
9
+ end
10
+
11
+ private
12
+
13
+ def wrap_io_params(hash = params)
14
+ hash.each do |key, value|
15
+ if key == 'io'
16
+ hash[key] = StringIO.new(value.encode('ISO-8859-1'))
17
+ elsif value.is_a?(ActionController::Parameters)
18
+ wrap_io_params(value)
19
+ end
20
+ end
21
+
22
+ hash
23
+ end
24
+ end
25
+ end
@@ -2,16 +2,15 @@
2
2
 
3
3
  module Motor
4
4
  class ActiveStorageAttachmentsController < ApiBaseController
5
+ include Motor::WrapIoParams
6
+
5
7
  wrap_parameters :data, except: %i[include fields]
6
8
 
7
9
  load_and_authorize_resource :attachment, class: 'ActiveStorage::Attachment', parent: false
8
10
 
9
11
  def create
10
12
  if attachable?(@attachment.record)
11
- @attachment.record.public_send(@attachment.name).attach(
12
- io: StringIO.new(params.dig(:data, :file, :io).to_s.encode('ISO-8859-1')),
13
- filename: params.dig(:data, :file, :filename)
14
- )
13
+ @attachment.record.public_send(@attachment.name).attach(file_params)
15
14
 
16
15
  head :ok
17
16
  else
@@ -26,8 +25,16 @@ module Motor
26
25
  record.respond_to?("#{@attachment.name}_attachments=")
27
26
  end
28
27
 
28
+ def file_params
29
+ params.require(:data).require(:file).permit(:io, :filename).to_h
30
+ end
31
+
29
32
  def attachment_params
30
- params.require(:data).except(:file).permit!
33
+ if params[:data].present?
34
+ params.require(:data).except(:file).permit!
35
+ else
36
+ {}
37
+ end
31
38
  end
32
39
  end
33
40
  end
@@ -2,13 +2,14 @@
2
2
 
3
3
  module Motor
4
4
  class DataController < ApiBaseController
5
+ include Motor::WrapIoParams
6
+
5
7
  INSTANCE_VARIABLE_NAME = 'resource'
6
8
 
7
9
  wrap_parameters :data, except: %i[include fields]
8
10
 
9
11
  before_action :load_and_authorize_resource
10
12
  before_action :load_and_authorize_association
11
- before_action :wrap_io_params
12
13
 
13
14
  def index
14
15
  @resources = Motor::ApiQuery.call(@resources, params)
@@ -27,12 +28,20 @@ module Motor
27
28
  @resource.save!
28
29
 
29
30
  render json: { data: Motor::ApiQuery::BuildJson.call(@resource, params) }
31
+ rescue ActiveRecord::RecordInvalid
32
+ render json: { errors: @resource.errors }, status: :unprocessable_entity
33
+ rescue StandardError => e
34
+ render json: { errors: [e.message] }, status: :unprocessable_entity
30
35
  end
31
36
 
32
37
  def update
33
38
  @resource.update!(resource_params)
34
39
 
35
40
  render json: { data: Motor::ApiQuery::BuildJson.call(@resource, params) }
41
+ rescue ActiveRecord::RecordInvalid
42
+ render json: { errors: @resource.errors }, status: :unprocessable_entity
43
+ rescue StandardError => e
44
+ render json: { errors: [e.message] }, status: :unprocessable_entity
36
45
  end
37
46
 
38
47
  def destroy
@@ -77,6 +86,8 @@ module Motor
77
86
  self,
78
87
  options
79
88
  ).load_and_authorize_resource
89
+ rescue StandardError => e
90
+ render json: { errors: [e.message] }, status: :unprocessable_entity
80
91
  end
81
92
 
82
93
  def load_and_authorize_association
@@ -96,6 +107,8 @@ module Motor
96
107
  else
97
108
  render json: { message: 'Unknown association' }, status: :not_found
98
109
  end
110
+ rescue StandardError => e
111
+ render json: { errors: [e.message] }, status: :unprocessable_entity
99
112
  end
100
113
 
101
114
  def resource_params
@@ -105,17 +118,5 @@ module Motor
105
118
  {}
106
119
  end
107
120
  end
108
-
109
- def wrap_io_params(hash = params)
110
- hash.each do |key, value|
111
- if key == 'io'
112
- hash[key] = StringIO.new(value.encode('ISO-8859-1'))
113
- elsif value.is_a?(ActionController::Parameters)
114
- wrap_io_params(value)
115
- end
116
- end
117
-
118
- hash
119
- end
120
121
  end
121
122
  end
@@ -133,7 +133,7 @@ module Motor
133
133
  column_type: is_attachment ? 'file' : 'integer',
134
134
  access_type: access_type,
135
135
  default_value: default_attrs[column_name],
136
- validators: fetch_validators(model, column_name),
136
+ validators: fetch_validators(model, column_name, ref),
137
137
  format: {},
138
138
  reference: {
139
139
  name: name,
@@ -172,23 +172,34 @@ module Motor
172
172
  end.compact
173
173
  end
174
174
 
175
- def fetch_validators(model, column_name)
176
- model.validators_on(column_name).map do |validator|
177
- case validator
178
- when ActiveModel::Validations::InclusionValidator
179
- { includes: validator.send(:delimiter) }
180
- when ActiveRecord::Validations::PresenceValidator
181
- { required: true }
182
- when ActiveModel::Validations::FormatValidator
183
- { format: JsRegex.new(validator.options[:with]).to_h.slice(:source, :options) }
184
- when ActiveRecord::Validations::LengthValidator
185
- { length: validator.options }
186
- when ActiveModel::Validations::NumericalityValidator
187
- { numeric: validator.options }
175
+ def fetch_validators(model, column_name, reflection = nil)
176
+ validators =
177
+ if reflection&.belongs_to? && !reflection.options[:optional]
178
+ [{ required: true }]
188
179
  else
189
- next
180
+ []
190
181
  end
182
+
183
+ validators += model.validators_on(column_name).map do |validator|
184
+ build_validator_hash(validator)
191
185
  end.compact
186
+
187
+ validators.uniq
188
+ end
189
+
190
+ def build_validator_hash(validator)
191
+ case validator
192
+ when ActiveModel::Validations::InclusionValidator
193
+ { includes: validator.send(:delimiter) }
194
+ when ActiveRecord::Validations::PresenceValidator
195
+ { required: true }
196
+ when ActiveModel::Validations::FormatValidator
197
+ { format: JsRegex.new(validator.options[:with]).to_h.slice(:source, :options) }
198
+ when ActiveRecord::Validations::LengthValidator
199
+ { length: validator.options }
200
+ when ActiveModel::Validations::NumericalityValidator
201
+ { numeric: validator.options }
202
+ end
192
203
  end
193
204
 
194
205
  def eager_load_models!
@@ -90,9 +90,9 @@ module Motor
90
90
  return preferences if new_prefs[configs_name].blank?
91
91
 
92
92
  normalized_configs = public_send("normalize_#{configs_name}",
93
- default_prefs[:actions],
94
- existing_prefs.fetch(:actions, []),
95
- new_prefs.fetch(:actions, []))
93
+ default_prefs[configs_name],
94
+ existing_prefs.fetch(configs_name, []),
95
+ new_prefs.fetch(configs_name, []))
96
96
 
97
97
  preferences[configs_name] = normalized_configs
98
98
 
data/lib/motor/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Motor
4
- VERSION = '0.1.28'
4
+ VERSION = '0.1.29'
5
5
  end
@@ -5,9 +5,9 @@
5
5
  "fonts/ionicons.ttf?v=3.0.0-alpha.3": "fonts/ionicons.ttf",
6
6
  "fonts/ionicons.woff2?v=3.0.0-alpha.3": "fonts/ionicons.woff2",
7
7
  "fonts/ionicons.woff?v=3.0.0-alpha.3": "fonts/ionicons.woff",
8
- "main-4da1a5102d7bc66aefd0.css.gz": "main-4da1a5102d7bc66aefd0.css.gz",
9
- "main-4da1a5102d7bc66aefd0.js.LICENSE.txt": "main-4da1a5102d7bc66aefd0.js.LICENSE.txt",
10
- "main-4da1a5102d7bc66aefd0.js.gz": "main-4da1a5102d7bc66aefd0.js.gz",
11
- "main.css": "main-4da1a5102d7bc66aefd0.css",
12
- "main.js": "main-4da1a5102d7bc66aefd0.js"
8
+ "main-482137e0bc1ba9f875dc.css.gz": "main-482137e0bc1ba9f875dc.css.gz",
9
+ "main-482137e0bc1ba9f875dc.js.LICENSE.txt": "main-482137e0bc1ba9f875dc.js.LICENSE.txt",
10
+ "main-482137e0bc1ba9f875dc.js.gz": "main-482137e0bc1ba9f875dc.js.gz",
11
+ "main.css": "main-482137e0bc1ba9f875dc.css",
12
+ "main.js": "main-482137e0bc1ba9f875dc.js"
13
13
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: motor-admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.28
4
+ version: 0.1.29
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pete Matsyburka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-06 00:00:00.000000000 Z
11
+ date: 2021-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord-filter
@@ -132,6 +132,7 @@ files:
132
132
  - LICENSE
133
133
  - README.md
134
134
  - Rakefile
135
+ - app/controllers/concerns/motor/wrap_io_params.rb
135
136
  - app/controllers/motor/active_storage_attachments_controller.rb
136
137
  - app/controllers/motor/alerts_controller.rb
137
138
  - app/controllers/motor/api_base_controller.rb
@@ -214,8 +215,8 @@ files:
214
215
  - lib/motor/ui_configs.rb
215
216
  - lib/motor/version.rb
216
217
  - ui/dist/fonts/ionicons.woff2
217
- - ui/dist/main-4da1a5102d7bc66aefd0.css.gz
218
- - ui/dist/main-4da1a5102d7bc66aefd0.js.gz
218
+ - ui/dist/main-482137e0bc1ba9f875dc.css.gz
219
+ - ui/dist/main-482137e0bc1ba9f875dc.js.gz
219
220
  - ui/dist/manifest.json
220
221
  homepage:
221
222
  licenses: