Module: Recognition::Database

Defined in:
lib/recognition/database.rb

Overview

Handle all Transactions and logging to Redis

Class Method Summary collapse

Class Method Details

.get(key) ⇒ Object



20
21
22
# File 'lib/recognition/database.rb', line 20

def self.get key
  Recognition.backend.get "recognition:#{key}"
end

.get_counter(hash, key) ⇒ Object



24
25
26
# File 'lib/recognition/database.rb', line 24

def self.get_counter hash, key
  Recognition.backend.hget("recognition:#{hash}", key).to_i
end

.get_transactions(keypart, start, stop) ⇒ Object



52
53
54
55
56
57
58
59
# File 'lib/recognition/database.rb', line 52

def self.get_transactions keypart, start, stop
  transactions = []
  range = Recognition.backend.zrange "recognition:#{ keypart }:transactions", start, stop
  range.each do |transaction|
    transactions << JSON.parse(transaction, { symbolize_names: true })
  end
  transactions
end

.log(id, amount, bucket, code = nil) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/recognition/database.rb', line 6

def self.log id, amount, bucket, code = nil
  hash = Time.now.to_f.to_s
  Recognition.log :transaction, "hash:'#{hash}' user:'#{id}' amount:'#{amount}' bucket:'#{bucket}'"
  Recognition.backend.multi do
    Recognition.backend.hincrby "recognition:user:#{ id }:counters", 'points', amount
    Recognition.backend.hincrby "recognition:user:#{ id }:counters", bucket, amount
    Recognition.backend.zadd "recognition:user:#{ id }:transactions", hash, { hash: hash, amount: amount, bucket: bucket, datetime: DateTime.now.to_s }.to_json
    Recognition.backend.zadd 'recognition:transactions', hash, { hash: hash, id: id, amount: amount, bucket: bucket, datetime: DateTime.now.to_s }.to_json
    unless code.nil?
      Recognition.backend.zadd "recognition:#{ code[:type] }:#{ code[:code] }:transactions", hash, { hash: hash, id: id, bucket: bucket, datetime: DateTime.now.to_s }.to_json
    end
  end
end

.redeem(id, bucket, type, code, value) ⇒ Object



46
47
48
49
50
# File 'lib/recognition/database.rb', line 46

def self.redeem id, bucket, type, code, value
  certificate = { type: type, code: code }
  Recognition.log type, "redeeming #{type}:#{code} for user: #{id}"
  log id, value, bucket, certificate
end

.update_points(object, action, condition) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/recognition/database.rb', line 28

def self.update_points object, action, condition
  Recognition.log 'foo', condition.to_s
  condition[:bucket] ||= "#{ object.class.to_s.camelize }:#{ action }"
  user = Recognition::Parser.parse_recognizable(object, condition[:recognizable], condition[:proc_params])
  if condition[:amount].nil? && condition[:gain].nil? && condition[:loss].nil?
    Recognition.log 'validation', "Unable to determine points: no 'amount', 'gain' or 'loss' specified"
    false
  else
    total = Recognition::Parser.parse_amount(condition[:amount], object, condition[:proc_params]) + Recognition::Parser.parse_amount(condition[:gain], object, condition[:proc_params]) - Recognition::Parser.parse_amount(condition[:loss], object, condition[:proc_params])
    ground_total = user.recognition_counter(condition[:bucket]) + total
    if condition[:maximum].nil? || ground_total <= condition[:maximum]
      log(user.id, total.to_i, condition[:bucket])
    else
      Recognition.log 'validation', "Unable to add points: bucket maximum reached for bucket '#{condition[:bucket]}'"
    end
  end
end