Class: Cart::ConflictResolver

Inherits:
Object
  • Object
show all
Defined in:
app/services/cart/conflict_resolver.rb

Overview

Service to handle cart conflicts when a user logs in with items in their guest cart
and also has items in their existing account cart

Constant Summary collapse

STRATEGIES =
%i[use_account replace_with_guest merge].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(account_cart:, guest_cart:) ⇒ ConflictResolver

Returns a new instance of ConflictResolver.



11
12
13
14
15
# File 'app/services/cart/conflict_resolver.rb', line 11

def initialize(account_cart:, guest_cart:)
  @account_cart = 
  @guest_cart = guest_cart
  @conflict_detected = detect_conflict
end

Instance Attribute Details

#account_cartObject (readonly)

Returns the value of attribute account_cart.



9
10
11
# File 'app/services/cart/conflict_resolver.rb', line 9

def 
  @account_cart
end

#conflict_detectedObject (readonly)

Returns the value of attribute conflict_detected.



9
10
11
# File 'app/services/cart/conflict_resolver.rb', line 9

def conflict_detected
  @conflict_detected
end

#guest_cartObject (readonly)

Returns the value of attribute guest_cart.



9
10
11
# File 'app/services/cart/conflict_resolver.rb', line 9

def guest_cart
  @guest_cart
end

Instance Method Details

#conflict?Boolean

Check if there's a conflict (both carts have items)

Returns:

  • (Boolean)


18
19
20
# File 'app/services/cart/conflict_resolver.rb', line 18

def conflict?
  @conflict_detected
end

#conflict_summaryObject

Get summary of both carts for display



23
24
25
26
27
28
29
30
# File 'app/services/cart/conflict_resolver.rb', line 23

def conflict_summary
  return nil unless conflict?

  {
    account_cart: cart_summary(),
    guest_cart: cart_summary(guest_cart)
  }
end

#resolve(strategy:) ⇒ Object

Resolve the conflict based on user's chosen strategy

Raises:

  • (ArgumentError)


33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'app/services/cart/conflict_resolver.rb', line 33

def resolve(strategy:)
  strategy = strategy.to_sym
  raise ArgumentError, "Invalid strategy: #{strategy}" unless STRATEGIES.include?(strategy)

  case strategy
  when :use_account
    
  when :replace_with_guest
    replace_with_guest_cart
  when :merge
    merge_carts
  end
end