deep_unrest 0.1.11 → 0.1.12

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
  SHA1:
3
- metadata.gz: 20a20e746fdf62d5c9ce9e43b1474a43da804a09
4
- data.tar.gz: b5e7171c5a5e25d054a8b5025f4d30ba8872f867
3
+ metadata.gz: fab8d7d197527284f4b4dda948e4cde5b294b3d3
4
+ data.tar.gz: 4fab933a2b1e362d73b861c0be91b8144d85a1f7
5
5
  SHA512:
6
- metadata.gz: 6bd371aa11c9ca6527022866c0ca58594169a6035c7b479547e3fb1e15d7a52c02c2cc32f35cff0a769a806b0917bd2840cc1abe3c3d937cea1f0a866bf64613
7
- data.tar.gz: 32fc53dfbadb534dcdaf211c9c38dd1dd6697db362e7cedd52226c64b6371dfb94196463da275397c12801d802a8e5d5bc2107103ab93fc69be0f48f1b515312
6
+ metadata.gz: e743c5b618da969f16f9ba25c612f62a5a23c5f1310754ef6f0613f22ac753e9b0d6d9657da0a8fe1b941ba02cec63511edea457a77f71f7241088d1affbfaf1
7
+ data.tar.gz: b136c57f3520d945653fb41930635e0081a233f5c607a7fe1a15e6f12fa09d573b2299f4317199a90fc98629b0911f8b365a585f403d0878bfb252d9915c89db
@@ -29,7 +29,6 @@ module DeepUnrest
29
29
  current_user)
30
30
  resp = {}
31
31
  resp[:redirect] = redirect_replace.call(redirect) if redirect
32
- response.headers.merge! update_auth_header
33
32
  render json: resp, status: 200
34
33
  rescue DeepUnrest::Unauthorized => err
35
34
  render json: err.message, status: 403
@@ -37,6 +36,8 @@ module DeepUnrest
37
36
  render json: err.message, status: 405
38
37
  rescue DeepUnrest::Conflict => err
39
38
  render json: err.message, status: 409
39
+ ensure
40
+ response.headers.merge! update_auth_header
40
41
  end
41
42
 
42
43
  def current_user
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DeepUnrest
4
- VERSION = '0.1.11'
4
+ VERSION = '0.1.12'
5
5
  end
data/lib/deep_unrest.rb CHANGED
@@ -188,9 +188,26 @@ module DeepUnrest
188
188
  id_match && id_match[:id]
189
189
  end
190
190
 
191
- def self.set_action(cursor, operation, type, user)
191
+ def self.increment_error_indices(path_info, memo)
192
+ path_info.each_with_index.map do |(type, id), i|
193
+ next if i.zero?
194
+ parent_type, parent_id = path_info[i - 1]
195
+ key = "#{parent_type}#{parent_id}"
196
+ memo[key] = [] unless memo[key]
197
+ idx = memo[key].find_index(id)
198
+ unless idx
199
+ idx = memo[key].size
200
+ memo[key] << id
201
+ end
202
+
203
+ "#{type}[#{idx}]"
204
+ end.compact.join('.')
205
+ end
206
+
207
+ def self.set_action(cursor, operation, type, user, scopes, err_path_memo)
192
208
  # TODO: this is horrible. find a better way to go about this
193
- id_str = parse_path(operation[:path]).last[1]
209
+ path_info = parse_path(operation[:path])
210
+ id_str = path_info.last[1]
194
211
  id = parse_id(id_str)
195
212
  action = get_scope_type(id_str,
196
213
  true,
@@ -198,6 +215,13 @@ module DeepUnrest
198
215
 
199
216
  cursor[:id] = id || id_str
200
217
 
218
+ scope = scopes.find do |s|
219
+ s[:type] == type && s[:id] == id_str
220
+ end
221
+
222
+ scope[:ar_error_key] = increment_error_indices(path_info, err_path_memo)
223
+ scope[:dr_error_key] = path_info.map {|pair| pair.join('') }.join('.')
224
+
201
225
  case action
202
226
  when :destroy
203
227
  cursor[:_destroy] = true
@@ -207,6 +231,7 @@ module DeepUnrest
207
231
  operation[:attributes],
208
232
  user)
209
233
  end
234
+
210
235
  cursor
211
236
  end
212
237
 
@@ -276,11 +301,11 @@ module DeepUnrest
276
301
  mutations
277
302
  end
278
303
 
279
- def self.build_mutation_fragment(op, user, rest = nil, memo = nil, cursor = nil, type = nil)
304
+ def self.build_mutation_fragment(op, scopes, user, err_path_memo, rest = nil, memo = nil, cursor = nil, type = nil)
280
305
  rest ||= parse_path(op[:path])
281
306
 
282
307
  if rest.empty?
283
- set_action(cursor, op, type, user)
308
+ set_action(cursor, op, type, user, scopes, err_path_memo)
284
309
  return memo
285
310
  end
286
311
 
@@ -299,12 +324,13 @@ module DeepUnrest
299
324
  scope_type)
300
325
 
301
326
  next_cursor[:id] = id if id
302
- build_mutation_fragment(op, user, rest, memo, next_cursor, type)
327
+ build_mutation_fragment(op, scopes, user, err_path_memo, rest, memo, next_cursor, type)
303
328
  end
304
329
 
305
- def self.build_mutation_body(ops, user)
330
+ def self.build_mutation_body(ops, scopes, user)
331
+ err_path_memo = {}
306
332
  ops.each_with_object(HashWithIndifferentAccess.new({})) do |op, memo|
307
- memo.deeper_merge(build_mutation_fragment(op, user))
333
+ memo.deeper_merge(build_mutation_fragment(op, scopes, user, err_path_memo))
308
334
  end
309
335
  end
310
336
 
@@ -342,17 +368,30 @@ module DeepUnrest
342
368
  end
343
369
 
344
370
  def self.parse_error_path(key)
345
- rx = /(((^|\.)(?<type>[^\.\[]+)(?:\[(?<idx>\d+)\])\.)?(?<field>[\w\-\.]+)$)/
371
+ rx = /^(?<path>.*\])?\.?(?<field>[\w\-\.]+)$/
346
372
  rx.match(key)
347
373
  end
348
374
 
349
375
  def self.format_errors(operation, path_info, values)
350
376
  if operation
351
377
  return values.map do |msg|
352
- base_path = operation[:error_path] || operation[:path]
378
+ base_path = (
379
+ operation[:error_path] ||
380
+ operation[:dr_error_key] ||
381
+ operation[:ar_error_key]
382
+ )
383
+ # TODO: case field name according to jsonapi_resources settings
384
+ field_name = path_info[:field].camelize(:lower)
385
+ pointer = [base_path, field_name].compact.join('.')
386
+ active_record_path = [operation[:ar_error_key],
387
+ field_name].reject(&:empty?).compact.join('.')
388
+ deep_unrest_path = [operation[:dr_error_key],
389
+ field_name].compact.join('.')
353
390
  { title: "#{path_info[:field].humanize} #{msg}",
354
391
  detail: msg,
355
- source: { pointer: "#{base_path}.#{path_info[:field].camelize(:lower)}" } }
392
+ source: { pointer: pointer,
393
+ deepUnrestPath: deep_unrest_path,
394
+ activeRecordPath: active_record_path } }
356
395
  end
357
396
  end
358
397
  values.map do |msg|
@@ -365,10 +404,12 @@ module DeepUnrest
365
404
  errors.map do |key, values|
366
405
  path_info = parse_error_path(key.to_s)
367
406
  operation = scopes.find do |s|
368
- (s[:type] == path_info[:type].camelize(:lower) &&
369
- s[:index] == path_info[:idx].to_i)
407
+ (
408
+ s[:ar_error_key] &&
409
+ s[:ar_error_key] == (path_info[:path] || '') &&
410
+ s[:scope_type] != :show
411
+ )
370
412
  end
371
-
372
413
  format_errors(operation, path_info, values)
373
414
  end
374
415
  end.flatten
@@ -387,16 +428,9 @@ module DeepUnrest
387
428
  end
388
429
  end
389
430
 
390
- def self.format_error_keys(res, i)
431
+ def self.format_error_keys(res)
391
432
  record = res[:record]
392
- errors = record&.errors&.messages
393
- if errors
394
- base_key = "#{record.class.to_s.camelize(:lower).pluralize}[#{i}]"
395
- errors.keys.map do |attr|
396
- errors["#{base_key}.#{attr}".to_sym] = errors.delete(attr)
397
- end
398
- end
399
- errors
433
+ record&.errors&.messages
400
434
  end
401
435
 
402
436
  def self.perform_update(params, user)
@@ -407,7 +441,7 @@ module DeepUnrest
407
441
  DeepUnrest.authorization_strategy.authorize(scopes, user).flatten
408
442
 
409
443
  # bulid update arguments
410
- mutations = build_mutation_body(params, user)
444
+ mutations = build_mutation_body(params, scopes, user)
411
445
 
412
446
  merge_siblings!(mutations)
413
447
  remove_temp_ids!(mutations)
@@ -416,8 +450,7 @@ module DeepUnrest
416
450
  results = mutate(mutations, user).flatten
417
451
 
418
452
  # check results for errors
419
- errors = results.each_with_index
420
- .map { |res, i| format_error_keys(res, i) }
453
+ errors = results.map { |res| format_error_keys(res) }
421
454
  .compact
422
455
  .reject(&:empty?)
423
456
  .compact
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deep_unrest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.1.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lynn Hurley