defmodule Auth do ## IMPERATIVE SHELL def login(email, input_password) do with {:ok, user} <- UserRepo.find_by_email(email), {:allowed, true} <- {:allowed, is_allowed(user, input_password)} do UserRepo.update_last_login_date(user, DateTime.utc_now()) {:ok, user} else _ -> :error end end ## FUNCTIONAL CORE defp is_allowed(user, input_password) do password_hash = BCrypt.hash(input_password) cond do user.hash != hash -> false user.active == false -> false user.deleted_at != nil -> false true -> true end end end