deep_unrest 0.1.21 → 0.1.22

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: d956b080370fba60df6de844edcb1346763aa98f
4
- data.tar.gz: 0126de558b0326faf98280030b1e6b32f8c208c0
3
+ metadata.gz: bbbfefbc56611c2e591a4a0b4765ea55b8692208
4
+ data.tar.gz: eedb25cd0ab54ba479e8d54fba7170f1161708ae
5
5
  SHA512:
6
- metadata.gz: 096bde94abae1571026d1664dfec6fd87feac55aab27fbd3c2eeac4267f69926f0738b717289f769ff11b1b1b59daf768920117b47606545deab60391f8ad268
7
- data.tar.gz: d3574d96731e97b160dcf32c3dd1d6d75c5eace3abc8bbdad93e1ebc163e35803e998f5489d7743bbae7ba24bfaf924949ca9185290bfdc72c7dd1aa14fd66cf
6
+ metadata.gz: 458883abb589902b4958544173915d8783d4cfd9b99a1ad13a08bb75c54f1b6e1b6a8cf5985c3f9d07ca0d01ae1a8f92f672def3f9d80874fa0d03584e26f5ee
7
+ data.tar.gz: 503d64e14fc93803a813e45813a387f923b7af89a21e03dc65af0de3e488ef6d45eb4c2f451f0119541d934926d3ccf53d3f0755b2bc82eb971f170f8451bdf7
@@ -28,12 +28,11 @@ module DeepUnrest
28
28
  end
29
29
 
30
30
  def update
31
- @@temp_ids[request.uuid] = {}
32
31
  redirect = allowed_params[:redirect]
33
32
  data = repair_nested_params(allowed_params)[:data]
34
33
  results = DeepUnrest.perform_update(request.uuid, data, current_user)
35
34
  resp = { destroyed: results[:destroyed],
36
- tempIds: @@temp_ids[request.uuid] }
35
+ tempIds: results[:temp_ids] }
37
36
  resp[:redirect] = results[:redirect_regex].call(redirect) if redirect
38
37
  render json: resp, status: 200
39
38
  rescue DeepUnrest::Unauthorized => err
data/lib/deep_unrest.rb CHANGED
@@ -194,7 +194,11 @@ module DeepUnrest
194
194
  idx = {}
195
195
  params.map { |operation| collect_action_scopes(operation) }
196
196
  .flatten
197
- .uniq
197
+ .each_with_object({}) do |op, memo|
198
+ # ensure no duplicate scopes
199
+ memo["#{op[:scope_type]}-#{op[:type]}-#{op[:id]}"] ||= {}
200
+ memo["#{op[:scope_type]}-#{op[:type]}-#{op[:id]}"].merge!(op)
201
+ end.values
198
202
  .map do |op|
199
203
  unless op[:scope_type] == :show
200
204
  op[:index] = update_indices(idx, op[:type])[op[:type]] - 1
@@ -204,6 +208,7 @@ module DeepUnrest
204
208
  end
205
209
 
206
210
  def self.parse_id(id_str)
211
+ return false if id_str.nil?
207
212
  id_match = id_str.match(/^\.?(?<id>\d+)$/)
208
213
  id_match && id_match[:id]
209
214
  end
@@ -256,13 +261,9 @@ module DeepUnrest
256
261
  cursor
257
262
  end
258
263
 
259
- def self.get_mutation_cursor(ctx, memo, cursor, addr, type, id, temp_id, scope_type)
264
+ def self.get_mutation_cursor(memo, cursor, addr, type, id, temp_id, scope_type)
260
265
  if memo
261
266
  record = { id: id || temp_id }
262
- if temp_id
263
- record[:deep_unrest_temp_id] = temp_id
264
- record[:deep_unrest_context] = ctx
265
- end
266
267
  if plural?(type)
267
268
  cursor[addr] = [record]
268
269
  next_cursor = cursor[addr][0]
@@ -277,8 +278,6 @@ module DeepUnrest
277
278
  klass = to_class(type)
278
279
  body = {}
279
280
  body[klass.primary_key.to_sym] = id if id
280
- body[:deep_unrest_temp_id] = temp_id if temp_id
281
- body[:deep_unrest_context] = ctx if temp_id
282
281
  cursor[type_sym] = {
283
282
  klass: klass
284
283
  }
@@ -295,47 +294,28 @@ module DeepUnrest
295
294
  [memo, next_cursor]
296
295
  end
297
296
 
298
- def self.merge_siblings!(mutations)
299
- mutations.each do |k, v|
300
- case v
301
- when Array
302
- h = v.each_with_object({}) do |item, memo|
303
- if item.respond_to?(:key?) && item.key?(:id)
304
- # this is a nested resource. merge as such
305
- memo[item[:id]] ||= {}
306
- memo[item[:id]].deeper_merge(item)
307
- merge_siblings!(item)
308
- else
309
- # otherwise this is just a normal array
310
- idx = memo.keys.size
311
- memo[idx] = item
312
- end
313
- end
314
- mutations[k] = h.values
315
- when Hash
316
- merge_siblings!(v)
317
- end
318
- end
319
- mutations
320
- end
321
-
322
- def self.remove_temp_ids!(mutations)
297
+ def self.convert_temp_ids!(ctx, mutations)
323
298
  case mutations
324
299
  when Hash
325
- mutations.map do |key, val|
300
+ mutations.keys.map do |key|
301
+ val = mutations[key]
326
302
  if ['id', :id].include?(key)
327
- mutations.delete(key) unless parse_id(val)
303
+ unless parse_id(val)
304
+ mutations.delete(key)
305
+ mutations[:deep_unrest_temp_id] = val
306
+ mutations[:deep_unrest_context] = ctx
307
+ end
328
308
  else
329
- remove_temp_ids!(val)
309
+ convert_temp_ids!(ctx, val)
330
310
  end
331
311
  end
332
312
  when Array
333
- mutations.map { |val| remove_temp_ids!(val) }
313
+ mutations.map { |val| convert_temp_ids!(ctx, val) }
334
314
  end
335
315
  mutations
336
316
  end
337
317
 
338
- def self.build_mutation_fragment(ctx, op, scopes, user, err_path_memo, rest = nil, memo = nil, cursor = nil, type = nil)
318
+ def self.build_mutation_fragment(op, scopes, user, err_path_memo, rest = nil, memo = nil, cursor = nil, type = nil)
339
319
  rest ||= parse_path(op[:path])
340
320
 
341
321
  if rest.empty?
@@ -349,8 +329,7 @@ module DeepUnrest
349
329
  scope_type = get_scope_type(id_str, rest.blank?, op[:destroy])
350
330
  temp_id = scope_type == :create ? id_str : nil
351
331
 
352
- memo, next_cursor = get_mutation_cursor(ctx,
353
- memo,
332
+ memo, next_cursor = get_mutation_cursor(memo,
354
333
  cursor,
355
334
  addr,
356
335
  type,
@@ -359,13 +338,42 @@ module DeepUnrest
359
338
  scope_type)
360
339
 
361
340
  next_cursor[:id] = id if id
362
- build_mutation_fragment(ctx, op, scopes, user, err_path_memo, rest, memo, next_cursor, type)
341
+ build_mutation_fragment(op, scopes, user, err_path_memo, rest, memo, next_cursor, type)
342
+ end
343
+
344
+ def self.combine_arrays(a, b)
345
+ # get list of dupe items
346
+ groups = (a + b).flatten.group_by { |item| item[:id] }
347
+
348
+ dupes = groups.select { |_, v| v.size > 1 }.values
349
+
350
+ # combine non-dupe items
351
+ non_dupes = groups.select { |_, v| v.size == 1 }.values
352
+
353
+ # deep_merge dupes
354
+ merged = dupes.map do |(a2, b2)|
355
+ a2.deep_merge(b2) do |_, a3, b3|
356
+ if a3.is_a? Array
357
+ combine_arrays(a3, b3)
358
+ else
359
+ b3
360
+ end
361
+ end
362
+ end
363
+
364
+ (non_dupes + merged).flatten
363
365
  end
364
366
 
365
- def self.build_mutation_body(ctx, ops, scopes, user)
367
+ def self.build_mutation_body(ops, scopes, user)
366
368
  err_path_memo = {}
367
369
  ops.each_with_object(HashWithIndifferentAccess.new({})) do |op, memo|
368
- memo.deeper_merge(build_mutation_fragment(ctx, op, scopes, user, err_path_memo))
370
+ memo.deep_merge!(build_mutation_fragment(op, scopes, user, err_path_memo)) do |key, a, b|
371
+ if a.is_a? Array
372
+ combine_arrays(a, b)
373
+ else
374
+ b
375
+ end
376
+ end
369
377
  end
370
378
  end
371
379
 
@@ -392,6 +400,7 @@ module DeepUnrest
392
400
  when :destroy
393
401
  item[:klass].destroy(id)
394
402
  end
403
+
395
404
  result = { record: record }
396
405
  if action[:temp_id]
397
406
  result[:temp_ids] = {}
@@ -480,6 +489,12 @@ module DeepUnrest
480
489
  end
481
490
 
482
491
  def self.perform_update(ctx, params, user)
492
+ temp_id_map = DeepUnrest::ApplicationController.class_variable_get(
493
+ '@@temp_ids'
494
+ )
495
+
496
+ temp_id_map[ctx] = {}
497
+
483
498
  # reject new resources marked for destruction
484
499
  viable_params = params.reject do |param|
485
500
  temp_id?(param[:path]) && param[:destroy].present?
@@ -492,10 +507,10 @@ module DeepUnrest
492
507
  DeepUnrest.authorization_strategy.authorize(scopes, user).flatten
493
508
 
494
509
  # bulid update arguments
495
- mutations = build_mutation_body(ctx, viable_params, scopes, user)
510
+ mutations = build_mutation_body(viable_params, scopes, user)
496
511
 
497
- merge_siblings!(mutations)
498
- remove_temp_ids!(mutations)
512
+ # convert temp_ids from ids to non-activerecord attributes
513
+ convert_temp_ids!(ctx, mutations)
499
514
 
500
515
  # perform update
501
516
  results = mutate(mutations, user).flatten
@@ -507,12 +522,9 @@ module DeepUnrest
507
522
  .compact
508
523
 
509
524
  if errors.empty?
510
- temp_ids = results.map { |res| res[:temp_ids] }
511
- .compact
512
- .each_with_object({}) { |item, mem| mem.merge!(item) }
513
-
514
525
  return {
515
- redirect_regex: build_redirect_regex(temp_ids),
526
+ redirect_regex: build_redirect_regex(temp_id_map[ctx]),
527
+ temp_ids: temp_id_map[ctx],
516
528
  destroyed: scopes.select { |item| item[:destroyed] }
517
529
  .map do |item|
518
530
  { type: item[:type],
@@ -3,7 +3,6 @@ require 'deep_unrest/authorization/none_strategy'
3
3
  require 'deep_unrest/authorization/pundit_strategy'
4
4
  require 'deep_unrest/concerns/null_concern'
5
5
  require 'deep_unrest/concerns/map_temp_ids'
6
- require 'deep_merge/rails_compat'
7
6
 
8
7
  module DeepUnrest
9
8
  class Engine < ::Rails::Engine
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DeepUnrest
4
- VERSION = '0.1.21'
4
+ VERSION = '0.1.22'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deep_unrest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.21
4
+ version: 0.1.22
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lynn Hurley
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-18 00:00:00.000000000 Z
11
+ date: 2017-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.9.0
55
- - !ruby/object:Gem::Dependency
56
- name: deep_merge
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: 1.1.1
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: 1.1.1
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: sqlite3
71
57
  requirement: !ruby/object:Gem::Requirement