Class: Cartman::Cart
- Inherits:
-
Object
- Object
- Cartman::Cart
- Defined in:
- lib/cartman/cart.rb
Constant Summary collapse
- CART_LINE_ITEM_ID_KEY =
"cartman:line_item:id"
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 ⇒ 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/cartman/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/cartman/cart.rb', line 9 def add_item() raise "Must specify both :id and :type" unless .has_key?(:id) && .has_key?(:type) line_item_id = redis.incr CART_LINE_ITEM_ID_KEY redis.pipelined do redis.mapped_hmset("cartman:line_item:#{line_item_id}", ) redis.hincrby("cartman: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
112 113 114 |
# File 'lib/cartman/cart.rb', line 112 def cache_key "cart/#{@uid}-#{version}" end |
#contains?(object) ⇒ Boolean
35 36 37 |
# File 'lib/cartman/cart.rb', line 35 def contains?(object) redis.sismember index_key, "#{object.class}:#{object.id}" end |
#count ⇒ Object
45 46 47 |
# File 'lib/cartman/cart.rb', line 45 def count redis.scard key end |
#destroy! ⇒ Object
65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/cartman/cart.rb', line 65 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
39 40 41 42 43 |
# File 'lib/cartman/cart.rb', line 39 def find(object) if contains?(object) get_item(redis.get(index_key_for(object)).to_i) end end |
#items ⇒ Object
31 32 33 |
# File 'lib/cartman/cart.rb', line 31 def items ItemCollection.new(line_item_ids.collect{ |item_id| get_item(item_id)}) end |
#quantity ⇒ Object
49 50 51 52 53 |
# File 'lib/cartman/cart.rb', line 49 def quantity line_item_keys.collect { |item_key| redis.hget item_key, Cartman.config.quantity_field }.inject(0){|sum,quantity| sum += quantity.to_i} end |
#reassign(new_id) ⇒ Object
98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/cartman/cart.rb', line 98 def reassign(new_id) if redis.exists key new_index_keys = items.collect { |item| index_key_for(item, new_id) } 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/cartman/cart.rb', line 23 def remove_item(item) redis.del "cartman: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
55 56 57 58 59 |
# File 'lib/cartman/cart.rb', line 55 def total items.collect { |item| (item.cost * 100).to_i }.inject{|sum,cost| sum += cost} / 100.0 end |
#touch ⇒ Object
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/cartman/cart.rb', line 78 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, Cartman.config.cart_expires_in end end redis.hincrby self.class.versions_key, version_key, 1 end |
#ttl ⇒ Object
61 62 63 |
# File 'lib/cartman/cart.rb', line 61 def ttl redis.ttl key end |
#version ⇒ Object
94 95 96 |
# File 'lib/cartman/cart.rb', line 94 def version redis.hget(self.class.versions_key, version_key).to_i end |