Class: Draisine::ConflictResolver

Inherits:
Object
  • Object
show all
Defined in:
lib/draisine/conflict_resolver.rb

Constant Summary collapse

ALLOWED_RESOLUTIONS =
%w[
  remote_push remote_pull local_delete merge
]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(model_class, client, local_id, salesforce_id) ⇒ ConflictResolver

Returns a new instance of ConflictResolver.



10
11
12
13
14
15
16
# File 'lib/draisine/conflict_resolver.rb', line 10

def initialize(model_class, client, local_id, salesforce_id)
  @model_class = model_class
  @client = client
  @salesforce_object_name = model_class.salesforce_object_name
  @local_id = local_id
  @salesforce_id = salesforce_id
end

Instance Attribute Details

#clientObject (readonly)

Returns the value of attribute client.



7
8
9
# File 'lib/draisine/conflict_resolver.rb', line 7

def client
  @client
end

#local_idObject (readonly)

Returns the value of attribute local_id.



7
8
9
# File 'lib/draisine/conflict_resolver.rb', line 7

def local_id
  @local_id
end

#model_classObject (readonly)

Returns the value of attribute model_class.



7
8
9
# File 'lib/draisine/conflict_resolver.rb', line 7

def model_class
  @model_class
end

#salesforce_idObject (readonly)

Returns the value of attribute salesforce_id.



7
8
9
# File 'lib/draisine/conflict_resolver.rb', line 7

def salesforce_id
  @salesforce_id
end

#salesforce_object_nameObject (readonly)

Returns the value of attribute salesforce_object_name.



7
8
9
# File 'lib/draisine/conflict_resolver.rb', line 7

def salesforce_object_name
  @salesforce_object_name
end

Instance Method Details

#allowed_resolution?(resolution_type) ⇒ Boolean

Returns:

  • (Boolean)


29
30
31
# File 'lib/draisine/conflict_resolver.rb', line 29

def allowed_resolution?(resolution_type)
  ALLOWED_RESOLUTIONS.include?(resolution_type)
end

#conflict?Boolean

Returns:

  • (Boolean)


18
19
20
# File 'lib/draisine/conflict_resolver.rb', line 18

def conflict?
  ConflictDetector.new(model, remote_model, model_class.salesforce_synced_attributes).conflict?
end

#local_delete(_options = {}) ⇒ Object



55
56
57
# File 'lib/draisine/conflict_resolver.rb', line 55

def local_delete(_options = {})
  model_class.salesforce_inbound_delete(salesforce_id)
end

#merge(options) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/draisine/conflict_resolver.rb', line 59

def merge(options)
  fail ArgumentError unless model && remote_model
  assert_required_options!(options, [:local_attributes, :remote_attributes])

  local_attrs_to_merge = options.fetch(:local_attributes)
  remote_attrs_to_merge = options.fetch(:remote_attributes)

  model.salesforce_outbound_update(
    model.salesforce_attributes.slice(*local_attrs_to_merge))
  model.salesforce_inbound_update(
    remote_model.attributes.slice(*remote_attrs_to_merge), false)
end

#modelObject



72
73
74
75
76
77
78
# File 'lib/draisine/conflict_resolver.rb', line 72

def model
  @model ||= if local_id
    model_class.find_by(id: local_id)
  else
    model_class.find_by(salesforce_id: salesforce_id)
  end
end

#remote_delete(_options = {}) ⇒ Object



49
50
51
52
53
# File 'lib/draisine/conflict_resolver.rb', line 49

def remote_delete(_options = {})
  fail ArgumentError, "local model is required for remote delete" unless model

  model.salesforce_outbound_delete
end

#remote_modelObject



80
81
82
83
84
85
86
87
# File 'lib/draisine/conflict_resolver.rb', line 80

def remote_model
  return @remote_model unless @remote_model.nil?
  @remote_model = begin
    client.find(salesforce_object_name, salesforce_id)
  rescue Databasedotcom::SalesForceError
    false
  end
end

#remote_pull(_options = {}) ⇒ Object



33
34
35
36
37
# File 'lib/draisine/conflict_resolver.rb', line 33

def remote_pull(_options = {})
  fail ArgumentError, "remote model is required for remote pull" unless remote_model

  model_class.salesforce_inbound_update(remote_model.attributes)
end

#remote_push(_options = {}) ⇒ Object



39
40
41
42
43
44
45
46
47
# File 'lib/draisine/conflict_resolver.rb', line 39

def remote_push(_options = {})
  fail ArgumentError, "local model is required for remote push" unless model

  if model.salesforce_id.present?
    model.salesforce_outbound_update(model.salesforce_attributes)
  else
    model.salesforce_outbound_create
  end
end

#resolve(resolution_type, options = {}) ⇒ Object



22
23
24
25
26
27
# File 'lib/draisine/conflict_resolver.rb', line 22

def resolve(resolution_type, options = {})
  resolution_type = resolution_type.to_s
  fail ArgumentError, "Unknown resolution type '#{resolution_type}'" unless allowed_resolution?(resolution_type)

  __send__(resolution_type, options)
end