defmodule Plaid.Employer do
@moduledoc """
[Plaid Employer API](https://plaid.com/docs/api/employers/) calls and schema.
🏗 I haven't tested this yet against the actual plaid API because I can't get the
`deposit_switch` product in plaid yet. If you test it, let me know and I can take
off the in-progress status!
"""
@behaviour Plaid.Castable
alias Plaid.Address
alias Plaid.Castable
alias __MODULE__
@type t :: %__MODULE__{
address: Address.t() | nil,
confidence_score: number() | nil,
employer_id: String.t(),
name: String.t()
}
defstruct [:address, :confidence_score, :employer_id, :name]
@impl true
def cast(generic_map) do
%__MODULE__{
address: Castable.cast(Address, generic_map["address"]),
confidence_score: generic_map["confidence_score"],
employer_id: generic_map["employer_id"],
name: generic_map["name"]
}
end
defmodule SearchResponse do
@moduledoc """
[Plaid API /employers/search response schema.](https://plaid.com/docs/api/employers/#employerssearch)
"""
@behaviour Castable
@type t :: %__MODULE__{
employers: [Employer.t()],
request_id: String.t()
}
defstruct [:employers, :request_id]
@impl true
def cast(generic_map) do
%__MODULE__{
employers: Castable.cast_list(Employer, generic_map["employers"]),
request_id: generic_map["request_id"]
}
end
end
@doc """
Search employers information.
Does a `POST /employers/search` call to search Plaid’s database of known employers,
for use with Deposit Switch
Params:
* `query` - The employer name to be searched for.
* `products` - The Plaid products the returned employers should support.
> Currently in the Plaid API, `products` must be set to `["deposit_switch"]`.
## Examples
Employer.search("Plaid", ["deposit_switch"], client_id: "123", secret: "abc")
{:ok, %Employer.SearchResponse{}}
"""
@spec search(String.t(), [String.t()], Plaid.config()) ::
{:ok, SearchResponse.t()} | {:error, Plaid.Error.t()}
def search(query, products, config) do
Plaid.Client.call(
"/employers/search",
%{query: query, products: products},
SearchResponse,
config
)
end
end