Current section

Files

Jump to
blossom lib blossom controllers users.ex
Raw

lib/blossom/controllers/users.ex

defmodule Blossom.Controllers.Users do
alias Blossom.Controllers.Users
alias Blossom.Passwords
alias KilnCore.Utils
def word_from_stream(stream) do
stream
|> Enum.random()
|> String.trim()
|> String.downcase()
end
def make_username(params) do
if File.exists?("/usr/share/dict/words") do
stream = File.stream!("/usr/share/dict/words")
word_one = Users.word_from_stream(stream)
word_two = Users.word_from_stream(stream)
"#{word_one}-#{word_two}-#{Enum.random(1..100)}"
else
params["email"]
|> String.split("@")
|> List.first()
end
end
def new_user_params(params) do
params
|> Map.replace("email", String.downcase(params["email"]))
|> Map.replace("password", Passwords.hash(params["password"]))
|> Map.put_new("username", Users.make_username(params))
end
def make_user(outcome, params, model) do
case outcome do
{:ok, _} ->
params
|> Users.new_user_params()
|> model.new(:public)
error ->
error
end
end
def new(params, auth, model, settings) do
if settings.is_enabled?("allow_new_users") do
case params do
%{"email" => _, "password" => password} ->
password
|> auth.validate_new_password()
|> Users.make_user(params, model)
_ ->
{:error, :missing_fields}
end
else
{:error, :forbidden}
end
end
def login(params, auth, model) do
case params do
%{"email" => email, "password" => password} ->
%{"email" => String.downcase(email)}
|> model.get(:system)
|> List.first()
|> auth.login(password)
_ ->
{:error, :missing_fields}
end
end
defmacro __using__(opts \\ []) do
quote do
use KilnCore.Controller, unquote(opts)
@auth Utils.option_or_mod_replace(
@caller,
unquote(opts),
:auth,
Auth,
1,
0..1
)
@settings Utils.option_or_mod_replace(
@caller,
unquote(opts),
:settings,
Settings,
2
)
def new(params, _user, _opts) do
Users.new(params, @auth, @model, @settings)
end
def login(params, _user, _opts), do: Users.login(params, @auth, @model)
defoverridable new: 3, login: 3
end
end
end