class Zulu::SubscriptionRequest

Constants

LIST
MODES

Public Class Methods

new(params) click to toggle source
# File lib/zulu/subscription_request.rb, line 19
def initialize(params)
  @mode     = params['hub.mode']
  @topic    = params['hub.topic']
  @callback = params['hub.callback']
end
pop(timeout=nil) click to toggle source
# File lib/zulu/subscription_request.rb, line 14
def self.pop(timeout=nil)
  _, params = Zulu.redis.brpop(LIST, timeout: timeout)
  params and new(Oj.load(params))
end
push(request) click to toggle source
# File lib/zulu/subscription_request.rb, line 10
def self.push(request)
  Zulu.redis.lpush(LIST, request.to_json)
end

Public Instance Methods

==(other) click to toggle source
# File lib/zulu/subscription_request.rb, line 57
def ==(other)
  to_hash == other.to_hash
end
error_messages() click to toggle source
# File lib/zulu/subscription_request.rb, line 38
def error_messages
  errors.map {|e| "hub.#{e[0]} #{e[1]}" }
end
errors() click to toggle source
# File lib/zulu/subscription_request.rb, line 34
def errors
  @errors ||= []
end
perform() click to toggle source
# File lib/zulu/subscription_request.rb, line 69
def perform
  subscription = Subscription.new(topic: @topic, callback: @callback)
  case @mode
  when 'subscribe'
    subscription.save
  when 'unsubscribe'
    subscription.destroy
  end
end
process() click to toggle source
# File lib/zulu/subscription_request.rb, line 79
def process
  verify and perform
end
save() click to toggle source
# File lib/zulu/subscription_request.rb, line 42
def save
  valid? and self.class.push(self)
end
to_hash() click to toggle source
# File lib/zulu/subscription_request.rb, line 46
def to_hash
  [:mode, :topic, :callback].inject({}) do |hash, attr|
    hash["hub.#{attr}"] = instance_variable_get(:"@#{attr}")
    hash
  end
end
to_json() click to toggle source
# File lib/zulu/subscription_request.rb, line 53
def to_json
  Oj.dump(to_hash)
end
valid?() click to toggle source
# File lib/zulu/subscription_request.rb, line 25
def valid?
  @valid ||= begin
    validate_mode
    validate_topic
    validate_callback
    errors.empty?
  end
end
verify() click to toggle source
# File lib/zulu/subscription_request.rb, line 61
def verify
  challenge = Challenge.new
  params = to_hash
  params['hub.challenge'] = challenge
  response = Http.get(@callback, params: params)
  response.code == "200" && response.body == challenge
end

Private Instance Methods

validate_callback() click to toggle source
# File lib/zulu/subscription_request.rb, line 95
def validate_callback
  @callback or errors << [:callback, 'must be present']
  uri = Addressable::URI.parse(@callback)
  uri and %w(http https).include? uri.scheme or fail Addressable::URI::InvalidURIError
rescue Addressable::URI::InvalidURIError
  errors << [:callback, 'must be a valid http url']
end
validate_mode() click to toggle source
# File lib/zulu/subscription_request.rb, line 85
def validate_mode
  @mode or errors << [:mode, 'must be present']
  in_list = MODES.include?(@mode)
  in_list or errors << [:mode, "must be either #{MODES.join(' or ')}"]
end
validate_topic() click to toggle source
# File lib/zulu/subscription_request.rb, line 91
def validate_topic
  @topic or errors << [:topic, 'must be present']
end