Class: Draisine::ConflictResolver
- Inherits:
-
Object
- Object
- Draisine::ConflictResolver
- Defined in:
- lib/draisine/conflict_resolver.rb
Constant Summary collapse
- ALLOWED_RESOLUTIONS =
%w[ remote_push remote_pull local_delete merge ]
Instance Attribute Summary collapse
-
#client ⇒ Object
readonly
Returns the value of attribute client.
-
#local_id ⇒ Object
readonly
Returns the value of attribute local_id.
-
#model_class ⇒ Object
readonly
Returns the value of attribute model_class.
-
#salesforce_id ⇒ Object
readonly
Returns the value of attribute salesforce_id.
-
#salesforce_object_name ⇒ Object
readonly
Returns the value of attribute salesforce_object_name.
Instance Method Summary collapse
- #allowed_resolution?(resolution_type) ⇒ Boolean
- #conflict? ⇒ Boolean
-
#initialize(model_class, client, local_id, salesforce_id) ⇒ ConflictResolver
constructor
A new instance of ConflictResolver.
- #local_delete(_options = {}) ⇒ Object
- #merge(options) ⇒ Object
- #model ⇒ Object
- #remote_delete(_options = {}) ⇒ Object
- #remote_model ⇒ Object
- #remote_pull(_options = {}) ⇒ Object
- #remote_push(_options = {}) ⇒ Object
- #resolve(resolution_type, options = {}) ⇒ Object
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
#client ⇒ Object (readonly)
Returns the value of attribute client.
7 8 9 |
# File 'lib/draisine/conflict_resolver.rb', line 7 def client @client end |
#local_id ⇒ Object (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_class ⇒ Object (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_id ⇒ Object (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_name ⇒ Object (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
29 30 31 |
# File 'lib/draisine/conflict_resolver.rb', line 29 def allowed_resolution?(resolution_type) ALLOWED_RESOLUTIONS.include?(resolution_type) end |
#conflict? ⇒ 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( = {}) 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() fail ArgumentError unless model && remote_model (, [:local_attributes, :remote_attributes]) local_attrs_to_merge = .fetch(:local_attributes) remote_attrs_to_merge = .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 |
#model ⇒ Object
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( = {}) fail ArgumentError, "local model is required for remote delete" unless model model.salesforce_outbound_delete end |
#remote_model ⇒ Object
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( = {}) 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( = {}) 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, = {}) resolution_type = resolution_type.to_s fail ArgumentError, "Unknown resolution type '#{resolution_type}'" unless allowed_resolution?(resolution_type) __send__(resolution_type, ) end |