class GitHubWebHooksReceiver::Base

Constants

KEYWORD_TO_HTTP_STATUS_CODE

Public Class Methods

new(options={}) click to toggle source
# File lib/github-web-hooks-receiver/base.rb, line 18
def initialize(options={})
  @options = symbolize_options(options)
end

Public Instance Methods

call(env) click to toggle source
# File lib/github-web-hooks-receiver/base.rb, line 22
def call(env)
  request = Rack::Request.new(env)
  response = Rack::Response.new
  process(request, response)
  response.to_a
end

Private Instance Methods

parse_payload(request, response) click to toggle source
# File lib/github-web-hooks-receiver/base.rb, line 73
def parse_payload(request, response)
  if request.content_type == "application/json"
    payload = request.body.read
  else
    payload = request["payload"]
  end
  if payload.nil?
    set_error_response(response, :bad_request, "payload is missing")
    return
  end

  begin
    JSON.parse(payload)
  rescue JSON::ParserError
    set_error_response(response, :bad_request,
                       "invalid JSON format: <#{$!.message}>")
    nil
  end
end
process(request, response) click to toggle source
# File lib/github-web-hooks-receiver/base.rb, line 62
def process(request, response)
  unless request.post?
    set_error_response(response, :method_not_allowed, "must POST")
    return
  end

  payload = parse_payload(request, response)
  return if payload.nil?
  process_payload(request, response, payload)
end
process_payload(request, response, payload) click to toggle source
# File lib/github-web-hooks-receiver/base.rb, line 93
def process_payload(request, response, payload)
  raise NotImplementedError, "Define this method in subclass"
end
production?() click to toggle source
# File lib/github-web-hooks-receiver/base.rb, line 31
def production?
  ENV["RACK_ENV"] == "production"
end
set_error_response(response, status_keyword, message) click to toggle source
# File lib/github-web-hooks-receiver/base.rb, line 56
def set_error_response(response, status_keyword, message)
  response.status = status(status_keyword)
  response["Content-Type"] = "text/plain"
  response.write(message)
end
status(keyword) click to toggle source
# File lib/github-web-hooks-receiver/base.rb, line 48
def status(keyword)
  code = KEYWORD_TO_HTTP_STATUS_CODE[keyword]
  if code.nil?
    raise ArgumentError, "invalid status keyword: #{keyword.inspect}"
  end
  code
end
symbolize_options(options) click to toggle source
# File lib/github-web-hooks-receiver/base.rb, line 35
def symbolize_options(options)
  symbolized_options = {}
  options.each do |key, value|
    symbolized_options[key.to_sym] = value
  end
  symbolized_options
end