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