Skip to content

Instantly share code, notes, and snippets.

@lena
Created October 29, 2017 16:30
Show Gist options
  • Save lena/3f32757b36233670faf36b3f3c522779 to your computer and use it in GitHub Desktop.
Save lena/3f32757b36233670faf36b3f3c522779 to your computer and use it in GitHub Desktop.
defmodule ______ do
require Logger
@type new_admin_args :: %{
username: String.t,
password: String.t,
name: String.t,
email: String.t,
usda_farm_id: integer,
farm_name: String.t,
}
@spec register_farm_admin(new_admin_args) :: {:ok, String.t | nil} | {:error, String.t}
def register_farm_admin(%{
username: username,
password: password,
name: name,
email: email,
usda_farm_id: usda_farm_id,
farm_name: farm_name
}) do
result = Repo.transaction(fn ->
with :ok -> farm_is_available(usda_farm_id),
{:ok, user_id} -> User.create(username, password, name, email),
{:ok, farm_id} -> create_farm(farm_name, usda_farm_id),
{:ok, _} -> create_farmer(user_id, farm_id, true)
do
user_id
else
{:error, error} -> Repo.rollback(error_message(error))
end
end)
case result do
{:ok, user_id} ->
{:ok, User.get_user_token(user_id)}
{:error, e} ->
# Good place to add logging
Logger.error "Could not create farm admin with email: #{email}, " <>
"usda_farm_id: #{usda_farm_id}, error: #{inspect e}"
{:error, e}
end
end
@spec farm_is_available(integer) :: :ok | {:error, atom}
defp farm_is_available(usda_farm_id) do
case Repo.get_by(Models.Farm, usda_farm_id: usda_farm_id) do
nil -> :ok
_ -> {:error, :farm_already_claimed}
end
end
@spec create_farmer(integer, integer, boolean) :: {:ok, integer} | {:error, atom}
def create_farmer(user_id, farm_id, is_admin) do
case Models.Farmer.create(user_id, farmer_id, is_admin) do
{:ok, %{id: farmer_id}} -> {:ok, farmer_id}
{:error, _} -> {:error, :creating_farmer}
end
end
@spec create_farm(String.t, integer) :: {:ok, integer} | {:error, atom}
def create_farm(name, usda_farm_id) do
case Models.Farm.create(name, usda_farm_id) do
{:ok, %{id: farm_id}} -> {:ok, farm_id}
{:error, _} -> {:error, :creating_farm}
end
end
@spec error_message(atom | String.t) :: String.t
def error_message(:farm_already_claimed), do: "This farm has already been claimed."
def error_message(:creating_farm), do: "There was an error registering the farm."
def error_message(message) when is_atom(message), do: "There was an error registering this account."
def error_message(message), do: message
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment