Current section
Files
Jump to
Current section
Files
lib/addict/controller.ex
defmodule Addict.Controller do
@moduledoc """
The Addict Controller is used to receive User related requests directly from
the Phoenix router. Adds `register/2`, `logout/2` and `login/2` functions.
"""
use Phoenix.Controller
alias Addict.ManagerInteractor, as: AddictManager
plug :action
@doc """
Entry point for registering new users.
`params` needs to include email, password and username.
Returns a JSON response in the format `{message: text}` with status `201` for
successful creation, or `400` for when an error occurs.
On success, it also logs the new user in.
"""
def register(conn, user_params) do
AddictManager.create(user_params)
|> do_register(conn)
end
@doc """
Entry point for logging out users.
Since it only deletes session data, it should always return a JSON response
in the format `{message: "logged out"}` with a `200` status code.
"""
def logout(conn, _) do
fetch_session(conn)
|> delete_session(:current_user)
|> put_status(200)
|> json %{message: "logged out"}
end
@doc """
Entry point for logging users in.
Params needs to be populated with `email` and `password`. It returns `200`
status code along with the JSON response `{message: "logged in"}` or `400`
with `{message: "invalid email or password"}`
"""
def login(conn, params) do
email = params["email"]
password = params["password"]
AddictManager.verify_password(email, password)
|> do_login(conn)
end
@doc """
Entry point for asking for a new password.
Params need to be populated with `email`
"""
def recover_password(conn, params) do
email = params["email"]
AddictManager.recover_password(email)
|> do_password_recover(conn)
end
@doc """
Entry point for setting a user's password given the reset token.
Params needed to be populated with `token`, `password` and `password_confirm`
"""
def reset_password(conn, params) do
token = params["token"]
password = params["password"]
password_confirm = params["password_confirm"]
AddictManager.reset_password(token, password, password_confirm)
|> do_password_reset(conn)
end
#
# Private functions
#
defp do_register({:ok, user}, conn) do
fetch_session(conn)
|> put_status(201)
|> add_session(user)
|> json %{message: "user created"}
end
defp do_register({:error, message}, conn) do
fetch_session(conn)
|> put_status(400)
|> json %{message: message}
end
defp do_login({:ok, user}, conn) do
fetch_session(conn)
|> put_status(200)
|> add_session(user)
|> json %{message: "logged in"}
end
defp do_login({:error, _}, conn) do
conn
|> put_status(400)
|> json %{message: "invalid email or password"}
end
defp do_password_recover({:ok, _}, conn) do
conn
|>put_status(200)
|> json %{message: "email sent"}
end
defp do_password_recover({:error, message}, conn) do
conn
|> put_status(400)
|> json %{message: message}
end
defp do_password_reset({:ok, _}, conn) do
conn
|>put_status(200)
|> json %{message: "password reset"}
end
defp do_password_reset({:error, message}, conn) do
conn
|> put_status(400)
|> json %{message: message}
end
defp add_session(conn, user) do
conn
|> put_session(:current_user, user)
end
end