class PreferredPictures::Client

The client class of PreferredPictures

Public Class Methods

new(identity:, secret_key:, max_choices: 35, endpoint: "https://api.preferred-pictures.com/") click to toggle source

Initialize a new PreferredPictures client which will be used to create and sign API requests

Options

  • :identity - (String) The PreferredPictures identity that will be used.

  • :secret_key - (String) The secret key associated with the identity that is used to sign requests

  • :max_choices - (Number) The maximum number of choices to allow

  • :endpoint - (String) The PreferredPictures API endpoint to use for requests.

Examples

This will create an example PreferredPictures client.

client = PreferredPictures::Client.new(identity: "testidentity",
                                       secret_key: "secret123456")
# File lib/preferredpictures.rb, line 37
def initialize(identity:, secret_key:, max_choices: 35, endpoint: "https://api.preferred-pictures.com/")
  @identity = identity
  @secret_key = secret_key
  @max_choices = max_choices
  @endpoint = endpoint
end

Public Instance Methods

createChooseUrl(choices:, tournament:, ttl: 600, expiration_ttl: 3600, uid: "", choices_prefix: "", choices_suffix: "", destinations: [], destinations_prefix: "", destinations_suffix: "", go: false, json: false) click to toggle source

Create a URL that calls the PreferredPictures API to choose one option among the supplied chocies.

Options

  • :choices (Array<String>) A list of choices of which the API should choose

  • :tournament (String) The tournament where this request will participate

  • :ttl (Number) The time to live for an action to be taken from the choice, specified in seconds

  • :expiration_ttl (Number) The time to live for the URL's signature, after this time the request

  • will no longer be valid.

  • :uid (String) An optional unique identifier that will be used to correlate choices and

  • actions

  • :choices_prefix (String) An optional prefix to prepend to all of the choices.

  • :choices_suffix (String) An optional suffix to append to all of the choices.

  • :destinations (Array<String) An array of destination URLs that are paired with each of the choices

  • :destinations_prefix (String) An optional prefix to prepend to all of the destination URLs

  • :destinations_suffix (String) An optional suffix to append to all of the destination URLs

  • :go (Boolean) Indicate that the result should be a redirect to a destination URL from

  • a previously made choice

  • :json (Boolean) Return the choice using JSON rather than a HTTP 302 redirect.

Examples

This will create an PreferredPictures URL that will result in a choice:

client = PreferredPictures::Client.new(
    identity: "testidentity",
    secret_key: "secret123456")

url = client.createChooseUrl(
    choices: ['a', 'b', 'c'],
    tournament: 'test-ruby-tournment',
    choices_prefix: "https://example.com/image-",
    choices_suffix: ".jpg")
# File lib/preferredpictures.rb, line 81
def createChooseUrl(choices:,
                    tournament:,
                    ttl: 600,
                    expiration_ttl: 3600,
                    uid: "",
                    choices_prefix: "",
                    choices_suffix: "",
                    destinations: [],
                    destinations_prefix: "",
                    destinations_suffix: "",
                    go: false,
                    json: false)

  if choices.length() > @max_choices
    raise Error.new "Too many choices were supplied"
  end

  if choices.length() === 0
    raise Error.new "No choices were supplied"
  end

  params = {
    "choices[]" => choices,
    # Set the expiration of the request to be an hour
    # from when it is generated.
    "expiration" => Time.now.to_i + expiration_ttl,
    # The identifier of the tournament
    "tournament" => tournament,
    "ttl" => ttl,
  };

  if uid == ""
    params['uid'] = SecureRandom.uuid
  else
    params['uid'] = uid
  end

  if choices_prefix != ""
    params['choices_prefix'] = choices_prefix
  end

  if choices_suffix != ""
    params['choices_suffix'] = choices_suffix
  end

  if destinations_prefix != ""
    params['destinations_prefix'] = destinations_prefix
  end

  if destinations_suffix != ""
    params['destinations_suffix'] = destinations_suffix
  end

  if destinations.length > 0
    params['destinations[]'] = destinations
  end

  if go
    params['go'] = 'true'
  end

  if json
    params['json'] = 'true'
  end

  signing_field_order = [
    "choices_prefix",
    "choices_suffix",
    "choices[]",
    "destinations_prefix",
    "destinations_suffix",
    "destinations[]",
    "expiration",
    "go",
    "json",
    "tournament",
    "ttl",
    "uid",
  ];

  signing_string = signing_field_order
    .select { |field_name| params.has_key?(field_name) }
    .map{ |field_name| params[field_name].kind_of?(Array) ? params[field_name].join(",") : params[field_name] }
    .join("/")

  sha256 = OpenSSL::Digest.new('sha256')
  signature = OpenSSL::HMAC.hexdigest(sha256, @secret_key, signing_string)

  params['signature'] = signature
  params['identity'] = @identity

  return @endpoint + "choose?" + URI.encode_www_form(params)
end