Current section
Files
Jump to
Current section
Files
lib/beanstream/profile_card.ex
defmodule Beanstream.ProfileCard do
@moduledoc """
Manage cards on customer profiles.
"""
alias Beanstream.Gateway
@spec list(Gateway.t, String.t) :: tuple
def list(gw, customer_code) do
Beanstream.get("profiles/#{customer_code}/cards", auth_header(gw))
|> Beanstream.process_response
end
@spec make(Gateway.t, String.t, Card.t) :: tuple
def make(gw, customer_code, req) do
result = Beanstream.post("profiles/#{customer_code}/cards", %{"card" => req}, auth_header(gw))
|> Beanstream.process_response
case result do
{:ok, %{"customer_code" => customer_code}} ->
card_id = case list(gw, customer_code) do
{:ok, %{"card" => cards}} ->
find_card_id(cards, req.number)
_ -> nil # swallows any error listing cards
end
{:ok, %{customer_code: customer_code, card_id: card_id}}
_ -> result
end
end
defp find_card_id(cards, number) do
card_number = card_xxxx(number)
match = Enum.find(cards, fn(c) -> c["number"] == card_number end)
unless is_nil(match) do
match["card_id"]
end
end
defp card_xxxx(number) do
String.slice(number, 0..5) <>
String.duplicate("X", String.length(number) - 10) <>
String.slice(number, -4..-1)
end
@doc """
update customer profile card expiry (but not card number)
"""
@spec update(Gateway.t, String.t, String.t, Card.t) :: tuple
def update(gw, customer_code, card_id, req) do
Beanstream.put("profiles/#{customer_code}/cards/#{card_id}", %{"card" => req}, auth_header(gw))
|> Beanstream.process_response
end
@spec delete(Gateway.t, String.t, String.t) :: any
def delete(gw, customer_code, card_id) do
result = Beanstream.delete("profiles/#{customer_code}/cards/#{card_id}", auth_header(gw))
|> Beanstream.process_response
case result do
{:ok, _} -> :ok
_ -> result
end
end
defp auth_header(gw) do
Gateway.auth_header(gw, "profiles")
end
end