lib/passworks/request_proxy.rb
# encoding: UTF-8
module Passworks
class RequestProxy
include Passworks::Inflector
# @return [Passworks::Client] fsdfsd fsf sdfsd fsdf
attr_reader :client
# @return [String] Current collection name (ex: assets, campaigns, boarding_passes, coupons, event_tickets)
attr_reader :collection_name
# @return [String] Collection UUID
attr_reader :collection_uuid
def initialize(client, collection_name, collection_uuid = nil, options = {})
@collection_name = collection_name
@collection_uuid = collection_uuid
@client = client
@options = options
end
# Fetch all instances of a given collection (Assests, Boarding Passes, Coupons, Generics and Store Cards)
# @param options [Hash] options
# @option options [Integer] :per_page Changes the number of results per page
# @option options [Integer] :offset 0 The offset to start from
# @example Fetching the very first coupon (campaign) without having to pull all the elements first from the server
# client.coupons.all(per_page: 1).first
# @example Fetching the very first coupon pass from the first coupon (campaign) without having to pull all the elements first from the server
# client.coupons.all(per_page: 1).first.passes.all(per_page: 1).first
# @return [Passworks::CollectionProxy]
def all(options = {})
options = { query: options } unless options.empty?
CollectionProxy.new(client, collection_name, collection_uuid, options)
end
# Finds a given campaing or passe given the context
# @param uuid [String] The campaign or pass UUID
# @example Fetching a coupon campaign
# coupon_campaign = client.coupons.find('c3d5fc64-3a43-4d3a-a167-473dfeb1edd3')
# @example Fetching a pass for the first coupon campaign
# pass = client.coupons.all(per_page: 1).first.passes.find('c3d5fc64-3a43-4d3a-a167-473dfeb1edd3')
# @return [PassResource.new or CampaignResource]
def find(uuid)
# TODO @tparreira add a validation for UUID.
raise Passworks::Exceptions::InvalidUUID.new("The UUID supplied is invalid.") if uuid.empty?
if collection_uuid
fetch_url = "#{collection_name}/#{collection_uuid}/passes/#{uuid}"
else
fetch_url = "#{collection_name}/#{uuid}"
end
response = client.get(fetch_url)
resource_class.new(client, collection_name, response.data)
end
# Creates a campaing instance (Assests, Boarding Passes, Coupons, Generics and Store Cards) or a passe depending of the caller context
# @param data [Hash] data Campaign or pass data
# @param params [Hash] params Extra arguments to send with the request
# @option params [Boolean] merge: (true) Merge passed pass data with the campaign incase you are creating a passe instance.
# @example Create a coupon (campaign)
# client.coupons.create({
# name: 'My First Coupon',
# icon_id: 'c3d5fc64-3a43-4d3a-a167-473dfeb1edd3'
# })
# @example Create a "empty" passe for the first coupon campaign
# client.coupons.all(per_page: 1).first.passes.create()
# @return [Passworks::CampaignResource or Passworks::PassResource] depending of the calling a {Passworks::CampaignResource} or {Passworks::PassResource} is returned.
def create(data={}, params={})
if collection_name.to_s == 'assets' && collection_uuid.nil?
raise Passworks::Exceptions::FileNotFound.new("Can't find file #{data[:file]}") unless data.has_key?(:file) && File.exists?(data[:file])
data[:file] = ::Faraday::UploadIO.new(data[:file], content_type_for(data[:file]))
end
if collection_uuid
content = {
body: {
'pass' => data
}.merge(params)
}
fetch_url = "#{collection_url}/passes"
else
content = {
body: {
single_name.to_sym => data
}.merge(params)
}
fetch_url = collection_url
end
response = client.post(fetch_url, content)
resource_class.new(client, collection_name, response.data)
end
# Delets a campaing (Assests, Boarding Passes, Coupons, Generics and Store Cards campaign) or a pass instance
# @param uuid [String] the UUID of the campaign or pass to delete
# @return [Boolean]
def delete(uuid)
if collection_uuid
client.delete("#{collection_name}/#{collection_uuid}/passes/#{uuid}").ok?
else
client.delete("#{collection_name}/#{uuid}").ok?
end
end
# @!visibility private
def collection_url
if collection_uuid
"#{collection_name}/#{collection_uuid}"
else
collection_name
end
end
def content_type_for(filename)
file_extension = filename.split('.').last.downcase
content_types = {
"jpg" => "image/jpeg",
"jpeg" => "image/jpeg",
"png" => "image/png",
"gif" => "image/gif",
}
return content_types[file_extension]
end
end
end