lib/pipple/employee.ex

defmodule Pipple.Employee do
  @moduledoc """
  This struct represents an Employee in Rippling
  """

  use TypedStruct

  typedstruct do
    field(:created_at, DateTime.t())
    field(:custom_fields, list())
    field(:department, String.t())
    field(:first_name, String.t())
    field(:id, String.t())
    field(:last_name, String.t())
    field(:manager, String.t())
    field(:name, String.t())
    field(:preferred_first_name, String.t())
    field(:preferred_last_name, String.t())
    field(:start_date, Date.t())
    field(:title, String.t())
    field(:updated_at, DateTime.t())
  end

  def new(
        %{
          "createdAt" => created_at,
          "customFields" => custom_fields,
          "department" => department,
          "firstName" => first_name,
          "id" => id,
          "lastName" => last_name,
          "manager" => manager,
          "name" => name,
          "startDate" => start_date,
          "title" => title,
          "updatedAt" => updated_at
        } = response
      ) do
    struct(
      __MODULE__,
      %{
        created_at: Timex.parse!(created_at, "{ISO:Extended}"),
        custom_fields: custom_fields,
        department: department,
        first_name: first_name,
        id: id,
        last_name: last_name,
        manager: manager,
        name: name,
        preferred_first_name: Map.get(response, "preferredFirstName", nil),
        preferred_last_name: Map.get(response, "preferredLastName", nil),
        start_date: Timex.parse!(start_date, "%Y-%m-%d", :strftime),
        title: title,
        updated_at: Timex.parse!(updated_at, "{ISO:Extended}")
      }
    )
  end

  def new(map) do
    struct(__MODULE__, map)
  end
end