-
-
Save lena/3f32757b36233670faf36b3f3c522779 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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