Skip to main content

lib/access_grid/access_pass.ex

defmodule AccessGrid.AccessPass do
  @moduledoc """
  Represents an access pass — the credential issued to an end user. Returned
  by `AccessGrid.AccessPasses` operations (issue, get, update, list, suspend,
  resume, unlink, delete).
  """

  @type t :: %__MODULE__{
          id: String.t() | nil,
          state: String.t() | nil,
          install_url: String.t() | nil,
          direct_install_url: String.t() | nil,
          full_name: String.t() | nil,
          expiration_date: String.t() | nil,
          card_template_id: String.t() | nil,
          card_number: String.t() | nil,
          site_code: String.t() | nil,
          file_data: map() | nil,
          devices: list(),
          metadata: map()
        }

  defstruct [
    :id,
    :state,
    :install_url,
    :direct_install_url,
    :full_name,
    :expiration_date,
    :card_template_id,
    :card_number,
    :site_code,
    :file_data,
    devices: [],
    metadata: %{}
  ]

  @doc """
  Creates an AccessPass struct from an API response map.
  """
  @spec from_response(map()) :: t()
  def from_response(data) when is_map(data) do
    %__MODULE__{
      id: data["id"],
      state: data["state"],
      install_url: data["install_url"],
      direct_install_url: data["direct_install_url"],
      full_name: data["full_name"],
      expiration_date: data["expiration_date"],
      card_template_id: data["card_template_id"],
      card_number: data["card_number"],
      site_code: data["site_code"],
      file_data: data["file_data"],
      devices: data["devices"] || [],
      metadata: data["metadata"] || %{}
    }
  end
end