module Upvote

Constants

VERSION

Public Instance Methods

count(entity) click to toggle source
# File lib/upvote.rb, line 34
def count(entity)
  redis.zcard set_key(entity)
end
create(subject, target, execute: true) click to toggle source
# File lib/upvote.rb, line 12
def create(subject, target, execute: true)
  creation = ->() {
    redis.zadd set_key(subject), Time.now.to_f, key(target)
    redis.zadd set_key(target),  Time.now.to_f, key(subject)
  }

  execute ? redis.multi { creation.call } : creation
end
exist?(subject, target) click to toggle source
# File lib/upvote.rb, line 30
def exist?(subject, target)
  redis.zscore(set_key(target), key(subject)).present?
end
multi_count(entities) click to toggle source
# File lib/upvote.rb, line 62
def multi_count(entities)
  redis.multi { entities.each &method(:count) }
end
multi_create(upvotes) click to toggle source
# File lib/upvote.rb, line 42
def multi_create(upvotes)
  redis.multi do
    upvotes.each do |subject, *targets|
      targets.each do |target|
        create(subject, target, execute: false).call
      end
    end
  end
end
multi_remove(removals) click to toggle source
# File lib/upvote.rb, line 52
def multi_remove(removals)
  redis.multi do
    removals.each do |subject, *targets|
      targets.each do |target|
        remove(subject, target, execute: false).call
      end
    end
  end
end
multi_voters(entities, start: 0, offset: -1) click to toggle source
# File lib/upvote.rb, line 66
def multi_voters(entities, start: 0, offset: -1)
  redis.multi {
    entities.each { |e| voters entities, start: start, offset: offset }
  }
end
remove(subject, target, execute: true) click to toggle source
# File lib/upvote.rb, line 21
def remove(subject, target, execute: true)
  removal = ->() {
    redis.zrem set_key(subject), key(target)
    redis.zrem set_key(target),  key(subject)
  }

  execute ? redis.multi { removal.call } : removal
end
voters(entity, start: 0, offset: -1) click to toggle source
# File lib/upvote.rb, line 38
def voters(entity, start: 0, offset: -1)
  redis.zrevrange set_key(entity), start, offset
end

Private Instance Methods

key(entity) click to toggle source
# File lib/upvote.rb, line 78
def key(entity)
  klass  = entity.class
  method = id_method(klass)
  '${type}#${id}' % { type: klass.to_s.underscore, id: entity.send(method) }
end
set_key(entity) click to toggle source
# File lib/upvote.rb, line 74
def set_key(entity)
  "#{key(entity)}:likes"
end