Class: AwesomeO::Cart
- Inherits:
-
Object
- Object
- AwesomeO::Cart
- Defined in:
- lib/awesome_o/cart.rb
Constant Summary collapse
- CART_LINE_ITEM_ID_KEY =
'awesome_o:line_item:id'.freeze
Instance Method Summary collapse
- #add_item(options) ⇒ Object
- #cache_key ⇒ Object
- #contains?(object) ⇒ Boolean
- #count ⇒ Object
- #destroy! ⇒ Object
- #find(object) ⇒ Object
-
#initialize(uid) ⇒ Cart
constructor
A new instance of Cart.
- #items(type = nil) ⇒ Object
- #quantity ⇒ Object
- #reassign(new_id) ⇒ Object
- #remove_item(item) ⇒ Object
- #total ⇒ Object
- #touch ⇒ Object
- #ttl ⇒ Object
- #version ⇒ Object
Constructor Details
#initialize(uid) ⇒ Cart
Returns a new instance of Cart.
5 6 7 |
# File 'lib/awesome_o/cart.rb', line 5 def initialize(uid) @uid = uid end |
Instance Method Details
#add_item(options) ⇒ Object
9 10 11 12 13 14 15 16 17 18 19 20 21 |
# File 'lib/awesome_o/cart.rb', line 9 def add_item() raise 'Must specify both :id and :type' unless .key?(:id) && .key?(:type) line_item_id = redis.incr CART_LINE_ITEM_ID_KEY redis.pipelined do redis.mapped_hmset("awesome_o:line_item:#{line_item_id}", ) redis.hincrby("awesome_o:line_item:#{line_item_id}", :_version, 1) redis.sadd key, line_item_id redis.sadd index_key, "#{[:type]}:#{[:id]}" redis.set index_key_for(), line_item_id end touch get_item(line_item_id) end |
#cache_key ⇒ Object
115 116 117 |
# File 'lib/awesome_o/cart.rb', line 115 def cache_key "cart/#{@uid}-#{version}" end |
#contains?(object) ⇒ Boolean
40 41 42 |
# File 'lib/awesome_o/cart.rb', line 40 def contains?(object) redis.sismember index_key, "#{object.class}:#{object.id}" end |
#count ⇒ Object
48 49 50 |
# File 'lib/awesome_o/cart.rb', line 48 def count redis.scard key end |
#destroy! ⇒ Object
68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/awesome_o/cart.rb', line 68 def destroy! keys = line_item_keys keys << key keys << index_key keys << index_keys keys.flatten! redis.pipelined do keys.each do |key| redis.del key end end end |
#find(object) ⇒ Object
44 45 46 |
# File 'lib/awesome_o/cart.rb', line 44 def find(object) get_item(redis.get(index_key_for(object)).to_i) if contains?(object) end |
#items(type = nil) ⇒ Object
31 32 33 34 35 36 37 38 |
# File 'lib/awesome_o/cart.rb', line 31 def items(type = nil) if type items = line_item_ids.collect { |item_id| get_item(item_id) }.select { |item| item.type == type } return ItemCollection.new(items) else return ItemCollection.new(line_item_ids.collect { |item_id| get_item(item_id) }) end end |
#quantity ⇒ Object
52 53 54 55 56 |
# File 'lib/awesome_o/cart.rb', line 52 def quantity line_item_keys.collect do |item_key| redis.hget item_key, AwesomeO.config.quantity_field end.inject(0) { |sum, quantity| sum += quantity.to_i } end |
#reassign(new_id) ⇒ Object
101 102 103 104 105 106 107 108 109 110 111 112 113 |
# File 'lib/awesome_o/cart.rb', line 101 def reassign(new_id) if redis.exists key new_index_keys = items.collect do |item| index_key_for(item, new_id) end redis.rename key, key(new_id) redis.rename index_key, index_key(new_id) index_keys.zip(new_index_keys).each do |key, value| redis.rename key, value end end @uid = new_id end |
#remove_item(item) ⇒ Object
23 24 25 26 27 28 29 |
# File 'lib/awesome_o/cart.rb', line 23 def remove_item(item) redis.del "awesome_o:line_item:#{item._id}" redis.srem key, item._id redis.srem index_key, "#{item.type}:#{item.id}" redis.del index_key_for(item) touch end |
#total ⇒ Object
58 59 60 61 62 |
# File 'lib/awesome_o/cart.rb', line 58 def total items.collect do |item| (item.cost * 100).to_i end.inject(0) { |sum, cost| sum += cost } / 100.0 end |
#touch ⇒ Object
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/awesome_o/cart.rb', line 81 def touch keys_to_expire = line_item_keys keys_to_expire << key if redis.exists index_key keys_to_expire << index_key keys_to_expire << index_keys keys_to_expire.flatten! end redis.pipelined do keys_to_expire.each do |item| redis.expire item, AwesomeO.config.cart_expires_in end end redis.hincrby self.class.versions_key, version_key, 1 end |
#ttl ⇒ Object
64 65 66 |
# File 'lib/awesome_o/cart.rb', line 64 def ttl redis.ttl key end |
#version ⇒ Object
97 98 99 |
# File 'lib/awesome_o/cart.rb', line 97 def version redis.hget(self.class.versions_key, version_key).to_i end |