Skip to content

Commit 817137c

Browse files
committed
Merge pull request #264 from cerebris/fix_operation_context
Rework context in operations
2 parents 5aaf22c + d9fd43d commit 817137c

4 files changed

Lines changed: 47 additions & 33 deletions

File tree

lib/jsonapi/active_record_operations_processor.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def rollback
1616
end
1717

1818
def process_operation(operation)
19-
operation.apply(@context)
19+
operation.apply
2020
rescue ActiveRecord::DeleteRestrictionError => e
2121
record_locked_error = JSONAPI::Exceptions::RecordLocked.new(e.message)
2222
return JSONAPI::ErrorsOperationResult.new(record_locked_error.errors[0].code, record_locked_error.errors)

lib/jsonapi/operation.rb

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@ class Operation
33
attr_reader :resource_klass, :options, :transactional
44

55
def initialize(resource_klass, options = {})
6+
@context = options[:context]
67
@resource_klass = resource_klass
78
@options = options
89
@transactional = true
910
end
1011

11-
def apply(context)
12+
def apply
1213
end
1314
end
1415

@@ -20,7 +21,8 @@ def initialize(resource_klass, options = {})
2021
@include_directives = options[:include_directives]
2122
@sort_criteria = options.fetch(:sort_criteria, [])
2223
@paginator = options[:paginator]
23-
super(resource_klass, false)
24+
@transactional = false
25+
super(resource_klass, options)
2426
end
2527

2628
def record_count
@@ -39,9 +41,9 @@ def pagination_params
3941
end
4042
end
4143

42-
def apply(context)
43-
resource_records = @resource_klass.find(@resource_klass.verify_filters(@filters, context),
44-
context: context,
44+
def apply
45+
resource_records = @resource_klass.find(@resource_klass.verify_filters(@filters, @context),
46+
context: @context,
4547
include_directives: @include_directives,
4648
sort_criteria: @sort_criteria,
4749
paginator: @paginator)
@@ -74,11 +76,11 @@ def initialize(resource_klass, options = {})
7476
super(resource_klass, options)
7577
end
7678

77-
def apply(context)
78-
key = @resource_klass.verify_key(@id, context)
79+
def apply
80+
key = @resource_klass.verify_key(@id, @context)
7981

8082
resource_record = resource_klass.find_by_key(key,
81-
context: context,
83+
context: @context,
8284
include_directives: @include_directives)
8385

8486
return JSONAPI::ResourceOperationResult.new(:ok, resource_record)
@@ -98,8 +100,8 @@ def initialize(resource_klass, options = {})
98100
super(resource_klass, options)
99101
end
100102

101-
def apply(context)
102-
parent_resource = resource_klass.find_by_key(@parent_key, context: context)
103+
def apply
104+
parent_resource = resource_klass.find_by_key(@parent_key, context: @context)
103105

104106
return JSONAPI::LinksObjectOperationResult.new(:ok,
105107
parent_resource,
@@ -121,8 +123,8 @@ def initialize(resource_klass, options = {})
121123
super(resource_klass, options)
122124
end
123125

124-
def apply(context)
125-
source_resource = @source_klass.find_by_key(@source_id, context: context)
126+
def apply
127+
source_resource = @source_klass.find_by_key(@source_id, context: @context)
126128

127129
related_resource = source_resource.send(@association_type)
128130

@@ -147,8 +149,8 @@ def initialize(resource_klass, options = {})
147149
super(resource_klass, options)
148150
end
149151

150-
def apply(context)
151-
source_resource = @source_klass.find_by_key(@source_id, context: context)
152+
def apply
153+
source_resource = @source_klass.find_by_key(@source_id, context: @context)
152154

153155
related_resource = source_resource.send(@association_type,
154156
{
@@ -172,8 +174,8 @@ def initialize(resource_klass, options = {})
172174
super(resource_klass, options)
173175
end
174176

175-
def apply(context)
176-
resource = @resource_klass.create(context)
177+
def apply
178+
resource = @resource_klass.create(@context)
177179
result = resource.replace_fields(@data)
178180

179181
return JSONAPI::ResourceOperationResult.new((result == :completed ? :created : :accepted), resource)
@@ -190,8 +192,8 @@ def initialize(resource_klass, options = {})
190192
super(resource_klass, options)
191193
end
192194

193-
def apply(context)
194-
resource = @resource_klass.find_by_key(@resource_id, context: context)
195+
def apply
196+
resource = @resource_klass.find_by_key(@resource_id, context: @context)
195197
result = resource.remove
196198

197199
return JSONAPI::OperationResult.new(result == :completed ? :no_content : :accepted)
@@ -210,8 +212,8 @@ def initialize(resource_klass, options = {})
210212
super(resource_klass, options)
211213
end
212214

213-
def apply(context)
214-
resource = @resource_klass.find_by_key(@resource_id, context: context)
215+
def apply
216+
resource = @resource_klass.find_by_key(@resource_id, context: @context)
215217
result = resource.replace_fields(data)
216218

217219
return JSONAPI::ResourceOperationResult.new(result == :completed ? :ok : :accepted, resource)
@@ -228,8 +230,8 @@ def initialize(resource_klass, options = {})
228230
super(resource_klass, options)
229231
end
230232

231-
def apply(context)
232-
resource = @resource_klass.find_by_key(@resource_id, context: context)
233+
def apply
234+
resource = @resource_klass.find_by_key(@resource_id, context: @context)
233235
result = resource.replace_has_one_link(@association_type, @key_value)
234236

235237
return JSONAPI::OperationResult.new(result == :completed ? :no_content : :accepted)
@@ -246,8 +248,8 @@ def initialize(resource_klass, options)
246248
super(resource_klass, options)
247249
end
248250

249-
def apply(context)
250-
resource = @resource_klass.find_by_key(@resource_id, context: context)
251+
def apply
252+
resource = @resource_klass.find_by_key(@resource_id, context: @context)
251253
result = resource.create_has_many_links(@association_type, @data)
252254

253255
return JSONAPI::OperationResult.new(result == :completed ? :no_content : :accepted)
@@ -264,8 +266,8 @@ def initialize(resource_klass, options)
264266
super(resource_klass, options)
265267
end
266268

267-
def apply(context)
268-
resource = @resource_klass.find_by_key(@resource_id, context: context)
269+
def apply
270+
resource = @resource_klass.find_by_key(@resource_id, context: @context)
269271
result = resource.replace_has_many_links(@association_type, @data)
270272

271273
return JSONAPI::OperationResult.new(result == :completed ? :no_content : :accepted)
@@ -282,8 +284,8 @@ def initialize(resource_klass, options)
282284
super(resource_klass, options)
283285
end
284286

285-
def apply(context)
286-
resource = @resource_klass.find_by_key(@resource_id, context: context)
287+
def apply
288+
resource = @resource_klass.find_by_key(@resource_id, context: @context)
287289
result = resource.remove_has_many_link(@association_type, @associated_key)
288290

289291
return JSONAPI::OperationResult.new(result == :completed ? :no_content : :accepted)
@@ -299,8 +301,8 @@ def initialize(resource_klass, options)
299301
super(resource_klass, options)
300302
end
301303

302-
def apply(context)
303-
resource = @resource_klass.find_by_key(@resource_id, context: context)
304+
def apply
305+
resource = @resource_klass.find_by_key(@resource_id, context: @context)
304306
result = resource.remove_has_one_link(@association_type)
305307

306308
return JSONAPI::OperationResult.new(result == :completed ? :no_content : :accepted)

lib/jsonapi/operations_processor.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ def operations_processor_for(operations_processor)
2727
def process(request)
2828
@results = JSONAPI::OperationResults.new
2929
@request = request
30-
@context = request.context
3130
@operations = request.operations
3231

3332
# Use transactions if more than one operation and if one of the operations can be transactional
@@ -82,7 +81,7 @@ def rollback
8281
end
8382

8483
def process_operation(operation)
85-
operation.apply(@context)
84+
operation.apply
8685
end
8786
end
8887
end

lib/jsonapi/request.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ def add_find_operation
264264
@operations.push JSONAPI::FindOperation.new(
265265
@resource_klass,
266266
{
267+
context: @context,
267268
filters: @filters,
268269
include_directives: @include_directives,
269270
sort_criteria: @sort_criteria,
@@ -276,6 +277,7 @@ def add_show_operation
276277
@operations.push JSONAPI::ShowOperation.new(
277278
@resource_klass,
278279
{
280+
context: @context,
279281
id: @id,
280282
include_directives: @include_directives
281283
}
@@ -286,6 +288,7 @@ def add_show_association_operation(association_type, parent_key)
286288
@operations.push JSONAPI::ShowAssociationOperation.new(
287289
@resource_klass,
288290
{
291+
context: @context,
289292
association_type: association_type,
290293
parent_key: @resource_klass.verify_key(parent_key)
291294
}
@@ -296,6 +299,7 @@ def add_show_related_resource_operation(association_type)
296299
@operations.push JSONAPI::ShowRelatedResourceOperation.new(
297300
@resource_klass,
298301
{
302+
context: @context,
299303
association_type: association_type,
300304
source_klass: @source_klass,
301305
source_id: @source_id
@@ -307,6 +311,7 @@ def add_show_related_resources_operation(association_type)
307311
@operations.push JSONAPI::ShowRelatedResourcesOperation.new(
308312
@resource_klass,
309313
{
314+
context: @context,
310315
association_type: association_type,
311316
source_klass: @source_klass,
312317
source_id: @source_id,
@@ -336,6 +341,7 @@ def parse_add_operation(data)
336341
@operations.push JSONAPI::CreateResourceOperation.new(
337342
@resource_klass,
338343
{
344+
context: @context,
339345
data: data
340346
}
341347
)
@@ -519,6 +525,7 @@ def parse_add_association_operation(data, association_type, parent_key)
519525
@operations.push JSONAPI::CreateHasManyAssociationOperation.new(
520526
resource_klass,
521527
{
528+
context: @context,
522529
resource_id: parent_key,
523530
association_type: association_type,
524531
data: verified_param_set[:has_many].values[0]
@@ -537,6 +544,7 @@ def parse_update_association_operation(data, association_type, parent_key)
537544
@operations.push JSONAPI::ReplaceHasOneAssociationOperation.new(
538545
resource_klass,
539546
{
547+
context: @context,
540548
resource_id: parent_key,
541549
association_type: association_type,
542550
key_value: verified_param_set[:has_one].values[0]
@@ -553,6 +561,7 @@ def parse_update_association_operation(data, association_type, parent_key)
553561
@operations.push JSONAPI::ReplaceHasManyAssociationOperation.new(
554562
resource_klass,
555563
{
564+
context: @context,
556565
resource_id: parent_key,
557566
association_type: association_type,
558567
data: verified_param_set[:has_many].values[0]
@@ -585,6 +594,7 @@ def parse_single_replace_operation(data, keys)
585594
@operations.push JSONAPI::ReplaceFieldsOperation.new(
586595
@resource_klass,
587596
{
597+
context: @context,
588598
resource_id: key,
589599
data: parse_params(data, updatable_fields)
590600
}
@@ -615,6 +625,7 @@ def parse_remove_operation(params)
615625
@operations.push JSONAPI::RemoveResourceOperation.new(
616626
@resource_klass,
617627
{
628+
context: @context,
618629
resource_id: key
619630
}
620631
)
@@ -637,6 +648,7 @@ def parse_remove_association_operation(params)
637648
@operations.push JSONAPI::RemoveHasManyAssociationOperation.new(
638649
resource_klass,
639650
{
651+
context: @context,
640652
resource_id: parent_key,
641653
association_type: association_type,
642654
associated_key: key
@@ -647,6 +659,7 @@ def parse_remove_association_operation(params)
647659
@operations.push JSONAPI::RemoveHasOneAssociationOperation.new(
648660
resource_klass,
649661
{
662+
context: @context,
650663
resource_id: parent_key,
651664
association_type: association_type
652665
}

0 commit comments

Comments
 (0)