mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
82 lines
2.1 KiB
Ruby
82 lines
2.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "faraday"
|
|
|
|
module Vine
|
|
class ApiService
|
|
attr_reader :api_key, :jwt_generator
|
|
|
|
def initialize(api_key:, jwt_generator:)
|
|
@vine_api_url = ENV.fetch("VINE_API_URL")
|
|
@api_key = api_key
|
|
@jwt_generator = jwt_generator
|
|
end
|
|
|
|
def my_team
|
|
my_team_url = "#{@vine_api_url}/my-team"
|
|
|
|
call_with_logging do
|
|
connection.get(my_team_url)
|
|
end
|
|
end
|
|
|
|
def voucher_validation(voucher_short_code)
|
|
voucher_validation_url = "#{@vine_api_url}/voucher-validation"
|
|
|
|
call_with_logging do
|
|
connection.post(
|
|
voucher_validation_url,
|
|
{ type: "voucher_code", value: voucher_short_code },
|
|
'Content-Type': "application/json"
|
|
)
|
|
end
|
|
end
|
|
|
|
def voucher_redemptions(voucher_id, voucher_set_id, amount)
|
|
voucher_redemptions_url = "#{@vine_api_url}/voucher-redemptions"
|
|
|
|
call_with_logging do
|
|
connection.post(
|
|
voucher_redemptions_url,
|
|
{ voucher_id:, voucher_set_id:, amount: amount.to_i },
|
|
'Content-Type': "application/json"
|
|
)
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def connection
|
|
jwt = jwt_generator.generate_token
|
|
Faraday.new(
|
|
request: { timeout: 30 },
|
|
headers: {
|
|
'X-Authorization': "JWT #{jwt}",
|
|
Accept: "application/json"
|
|
}
|
|
) do |f|
|
|
f.request :json
|
|
f.response :json
|
|
f.request :authorization, 'Bearer', api_key
|
|
f.use Faraday::Response::RaiseError
|
|
end
|
|
end
|
|
|
|
def call_with_logging
|
|
yield
|
|
rescue Faraday::ClientError, Faraday::ServerError => e
|
|
# caller_location(2,1) gets us the second entry in the stacktrace,
|
|
# ie the method where `call_with_logging` is called from
|
|
log_error("#{self.class}##{caller_locations(2, 1)[0].label}", e.response)
|
|
|
|
# Re raise the same exception
|
|
raise
|
|
end
|
|
|
|
def log_error(prefix, response)
|
|
Rails.logger.error "#{prefix} -- response_status: #{response[:status]}"
|
|
Rails.logger.error "#{prefix} -- response: #{response[:body]}"
|
|
end
|
|
end
|
|
end
|