module GlobalRegistry::Bindings::Entity::PushRelationshipMethods

Public Instance Methods

create_relationship_in_global_registry() click to toggle source
# File lib/global_registry_bindings/entity/push_relationship_methods.rb, line 38
def create_relationship_in_global_registry
  entity = put_relationship_to_global_registry
  relationship.id_value = global_registry_relationship_entity_id_from_entity entity
  model.update_column( # rubocop:disable Rails/SkipsModelValidations
    relationship.id_column,
    relationship.id_value
  )
end
delete_relationship_from_global_registry(and_retry = true) click to toggle source
# File lib/global_registry_bindings/entity/push_relationship_methods.rb, line 116
def delete_relationship_from_global_registry(and_retry = true)
  GlobalRegistry::Bindings::Workers::DeleteEntityWorker.new.perform(relationship.id_value)
  model.update_column( # rubocop:disable Rails/SkipsModelValidations
    relationship.id_column, nil
  )
  return unless and_retry
  raise GlobalRegistry::Bindings::RelatedEntityExistsWithCID,
        "#{model.class.name}(#{model.id}) #{relationship.related_name}" \
        ':relationship already exists with client_integration_id(' \
        "#{relationship.client_integration_id}). Will delete and retry."
end
global_registry_relationship_entity_id_from_entity(entity) click to toggle source
# File lib/global_registry_bindings/entity/push_relationship_methods.rb, line 47
def global_registry_relationship_entity_id_from_entity(entity)
  relationships = Array.wrap entity.dig(
    'entity',
    relationship.primary_type.to_s,
    "#{relationship.related_name}:relationship"
  )
  relationships.detect do |rel|
    cid = rel['client_integration_id']
    cid = cid['value'] if cid.is_a?(Hash)
    cid == relationship.client_integration_id.to_s
  end&.dig('relationship_entity_id')
end
push_primary_to_global_registry() click to toggle source
# File lib/global_registry_bindings/entity/push_relationship_methods.rb, line 75
def push_primary_to_global_registry
  model = relationship.primary
  if relationship.primary_binding == :entity
    model.push_entity_to_global_registry_async
  else
    model.push_relationships_to_global_registry_async(relationship.primary_binding)
  end
  "#{model.class.name}(#{model.id})"
end
push_relationship_to_global_registry() click to toggle source
# File lib/global_registry_bindings/entity/push_relationship_methods.rb, line 16
def push_relationship_to_global_registry
  return unless valid_update?
  ensure_related_entities_have_global_registry_ids!
  push_global_registry_relationship_type
  create_relationship_in_global_registry
end
put_relationship_to_global_registry() click to toggle source
# File lib/global_registry_bindings/entity/push_relationship_methods.rb, line 100
def put_relationship_to_global_registry
  GlobalRegistry::Entity.put(
    relationship.primary_id_value,
    relationship_entity,
    params: {
      full_response: true,
      fields: "#{relationship.related_name}:relationship"
    }
  )
rescue RestClient::BadRequest => e
  response = JSON.parse(e.response.body)
  raise unless response['error'] =~ /^Validation failed:.*already exists$/i
  # Delete relationship entity and retry on 400 Bad Request (client_integration_id already exists)
  delete_relationship_from_global_registry
end
relationship() click to toggle source
# File lib/global_registry_bindings/entity/push_relationship_methods.rb, line 12
def relationship
  global_registry_relationship(type)
end
relationship_entity() click to toggle source
# File lib/global_registry_bindings/entity/push_relationship_methods.rb, line 91
def relationship_entity
  { entity: { relationship.primary_type => {
    "#{relationship.related_name}:relationship" =>
      model.relationship_attributes_to_push(type)
           .merge(relationship.related_type =>
                 relationship.related_id_value)
  }, client_integration_id: relationship.primary.id } }
end
valid_update?() click to toggle source
# File lib/global_registry_bindings/entity/push_relationship_methods.rb, line 23
def valid_update?
  # We can't update relationship if related model is missing, but we may need to delete
  if relationship.related.nil?
    if relationship.related_id_value.nil? && relationship.id_value
      # Delete relationship if it exists and the related id_value is missing
      delete_relationship_from_global_registry(false)
      return false
    end
    # Do nothing if related model is missing and related_binding is :entity, :remote binding allows
    # empty related model
    return false if relationship.related_binding == :entity
  end
  true
end