Module: JSONAPI::ResourceActions::SidepostingPrimaryFirst

Extended by:
ActiveSupport::Concern
Included in:
Sideposting
Defined in:
lib/json_api/controllers/concerns/resource_actions/sideposting_primary_first.rb

Instance Method Summary collapse

Instance Method Details

#apply_lid_relationships_if_any(resource, lid_relationships, lid_resolver) ⇒ Object



48
49
50
51
52
53
# File 'lib/json_api/controllers/concerns/resource_actions/sideposting_primary_first.rb', line 48

def apply_lid_relationships_if_any(resource, lid_relationships, lid_resolver)
  return if lid_relationships.blank?

  resolved = lid_resolver.resolve(lid_relationships)
  apply_resolved_relationships!(resource, resolved)
end

#build_lid_resolver_with_primary(data, resource) ⇒ Object



28
29
30
31
32
33
34
35
36
# File 'lib/json_api/controllers/concerns/resource_actions/sideposting_primary_first.rb', line 28

def build_lid_resolver_with_primary(data, resource)
  lid_resolver = JSONAPI::Sideposting::LidResolver.new
  primary_lid = (data[:lid] || data["lid"]).to_s.presence
  if primary_lid
    type_name = RelationshipHelpers.resource_type_name(determine_sti_resource_class)
    lid_resolver.add(primary_lid, type: type_name, id: resource.id)
  end
  lid_resolver
end

#create_primary_and_lid_resolver(data) ⇒ Object



19
20
21
22
23
24
25
26
# File 'lib/json_api/controllers/concerns/resource_actions/sideposting_primary_first.rb', line 19

def create_primary_and_lid_resolver(data)
  resource = build_resource_from_resolved_data(data)
  authorize_resource_action!(resource, action: :create)
  attach_active_storage_files(resource, @create_attachments, resource_class: determine_sti_resource_class)
  raise JSONAPI::Sideposting::PrimaryValidationError, resource unless resource.save

  [resource, build_lid_resolver_with_primary(data, resource)]
end

#create_with_sidepost_primary_firstObject



8
9
10
11
12
13
14
15
16
17
# File 'lib/json_api/controllers/concerns/resource_actions/sideposting_primary_first.rb', line 8

def create_with_sidepost_primary_first
  ActiveRecord::Base.transaction do
    data = raw_jsonapi_data.dup
    lid_relationships = extract_lid_relationships!(data)
    resource, lid_resolver = create_primary_and_lid_resolver(data)
    processor = run_sidepost_processor(lid_resolver)
    apply_lid_relationships_if_any(resource, lid_relationships, lid_resolver)
    render_created_with_sidepost(resource, processor)
  end
end

#render_created_with_sidepost(resource, processor) ⇒ Object



55
56
57
58
59
60
# File 'lib/json_api/controllers/concerns/resource_actions/sideposting_primary_first.rb', line 55

def render_created_with_sidepost(resource, processor)
  emit_resource_event(:created, resource)
  render json: serialize_resource_with_sidepost(resource, processor.created_records),
         status: :created,
         location: resource_url(resource)
end

#run_sidepost_processor(lid_resolver) ⇒ Object



38
39
40
41
42
43
44
45
46
# File 'lib/json_api/controllers/concerns/resource_actions/sideposting_primary_first.rb', line 38

def run_sidepost_processor(lid_resolver)
  processor = JSONAPI::Sideposting::Processor.new(
    included: params[:included],
    controller: self,
    lid_resolver: lid_resolver,
  )
  processor.create_all!
  processor
end