class TokenChain::Receiver

Public Instance Methods

initialize_chain(anchor) click to toggle source
# File lib/token_chain/receiver.rb, line 8
def initialize_chain(anchor)
  @generator = Generator.new anchor
  @generator.generate(10).each_with_index do |token, i|
    ReceivableToken.create token, anchor: anchor, sequence: i
  end
end
validate!(token) click to toggle source
# File lib/token_chain/receiver.rb, line 15
def validate!(token)
  receivable = ReceivableToken.find(token)

  if receivable.nil?
    raise UnknownTokenError.new("Invalid token")
  elsif ! receivable.available?
    raise InvalidTokenError.new("Token was previously submitted")
  else # it's a valid, available token
    response = { result: 'success' }

    anchor = receivable.anchor
    incoming_token_seq = receivable.sequence

    if incoming_token_seq > 0
      response[:warning] = 'Token submitted out of sequence.'
    end

    # resequence and prune
    ReceivableToken.where(anchor: anchor).each do |rt|
      old_sequence = rt.sequence
      new_sequence = old_sequence - (incoming_token_seq + 1)
      rt.sequence = new_sequence
      if rt.sequence >= -10
        rt.save
      else
        rt.delete
      end
    end

    # replentish tokens
    first_new_token_seq = 9 - incoming_token_seq
    (first_new_token_seq..9).each do |sequence|
      ReceivableToken.create @generator.generate,
        anchor: anchor,
        sequence: sequence
    end

    return response
  end
end