module JSONAPI::ResourceActions::SidepostingPrimaryFirst

def apply_lid_relationships_if_any(resource, lid_relationships, lid_resolver)

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

def build_lid_resolver_with_primary(data, resource)

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

def create_primary_and_lid_resolver(data)

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

def create_with_sidepost_primary_first

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

def render_created_with_sidepost(resource, processor)

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

def run_sidepost_processor(lid_resolver)

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