class Repro::Api::Client

Constants

API_ENDPOINT
API_VERSION
VERSION

Attributes

options[R]

Public Class Methods

new(token, opts = {}) click to toggle source
# File lib/repro/api/client.rb, line 17
def initialize(token, opts = {})
  @options = opts.merge(token: token, method: 'post')
end

Public Instance Methods

endpoint() click to toggle source
# File lib/repro/api/client.rb, line 47
def endpoint
  @options[:endpoint] || API_ENDPOINT
end
push_deliver(push_id, user_ids, opts = {}) click to toggle source

/push/:push_id/deliver @param [String] push_id Push ID in Repro @param [Array] user_ids UserIDs to send push notification @option opts [String] :body Message body for push notification. (required) @option opts [String] :title Title for push notification @option opts [Integer] :badge Badge number @option opts [String] :sound Sound file name for notification @option opts [String] :url Custom url or Deep Link @option opts [Hash] :attachment Attachment for rich push. Hash must have keys :type and :url.

# File lib/repro/api/client.rb, line 30
def push_deliver(push_id, user_ids, opts = {})
  raise ArgumentError, ':body is required.' unless opts[:body]
  opts[:path] = "/push/#{push_id}/deliver"
  body = { audience: { user_ids: user_ids } }
  body[:notification] = {custom_payload: build_payload(opts)}
  opts[:body] = body
  send_request(opts)
end
token() click to toggle source
# File lib/repro/api/client.rb, line 39
def token
  @options[:token]
end
user_agent() click to toggle source
# File lib/repro/api/client.rb, line 43
def user_agent
  @options[:user_agent] || "Repro Ruby Client/#{VERSION}"
end

Private Instance Methods

build_payload(opts) click to toggle source
# File lib/repro/api/client.rb, line 53
def build_payload(opts)
  payload = { aps: { alert: {} }, data: {} }
  payload[:data][:app_body] = opts[:body]
  payload[:data][:app_title] = opts[:title]
  payload[:aps][:alert][:body] = opts[:body]
  payload[:aps][:alert][:title] = opts[:title]
  payload[:aps][:badge] = opts[:badge] if opts[:badge]
  payload[:aps][:sound] = opts.key?(:sound) ? opts[:sound] : 'default'
  if opts[:url]
    payload[:data][:app_url] = opts[:url]
    payload[:rpr_url] = opts[:url]
  end
  if opts[:attachment]
    payload[:data][:app_picture] = opts[:attachment]
    payload[:aps]['mutable-content'] = 1
    payload[:rpr_attachment] = opts[:attachment]
  end
  JSON.generate(payload)
end
call_api(opts) click to toggle source
# File lib/repro/api/client.rb, line 85
def call_api(opts)
  if opts.delete(:method) == 'post'
    request_url = prepare_url(path: opts.delete(:path))
    request = prepare_request(request_url, body: opts.delete(:body))
    Net::HTTP.start(request_url.host, request_url.port, use_ssl: true) do |http|
      http.request(request)
    end
  else
    request_url = prepare_url(opts)
    Net::HTTP.get_response(request_url)
  end
end
prepare_request(uri, opts) click to toggle source
# File lib/repro/api/client.rb, line 98
def prepare_request(uri, opts)
  request = Net::HTTP::Post.new(uri.path)
  request['Accept'] = 'application/json'
  request['Content-Type'] = 'application/json'
  request['X-Repro-Token'] = token
  request['User-Agent'] = user_agent
  request.body = JSON.generate(opts[:body])
  request
end
prepare_url(opts) click to toggle source
# File lib/repro/api/client.rb, line 108
def prepare_url(opts)
  path = opts.delete(:path)
  query_string = opts.empty? ? '' : '?' + URI.encode_www_form(opts)
  URI.parse(endpoint + path + query_string)
end
send_request(opts) click to toggle source
# File lib/repro/api/client.rb, line 73
def send_request(opts)
  opts = options.merge(opts) if options
  http_response = call_api(opts)
  res = Response.new(http_response)
  unless http_response.is_a? Net::HTTPSuccess
    err_msg = "HTTP Response: #{res.code} #{res.message}"
    err_msg += " - #{res.error}" if res.error
    raise Repro::Api::RequestError, err_msg
  end
  res
end