Packages

This is a CMS written in Elixir. Aims to be the great open-source ecommerce and/or startup solution for those who are searching for a performance and stability on top of modern technologies like React and Elixir.

Current section

Files

Jump to
lyn web controllers session_controller.ex
Raw

web/controllers/session_controller.ex

defmodule Lyn.SessionController do
use Lyn.Web, :controller
alias Lyn.User
import Comeonin.Bcrypt, only: [checkpw: 2]
plug :scrub_params, "user" when action in [:create]
def new(conn, _params) do
render conn, "new.html", changeset: User.changeset(%User{})
end
def create(conn, %{"user" => %{"username" => username, "password" => password}}) when not is_nil(password) and not is_nil(password) do
Repo.get_by(User, username: username)
|> sign_in(password, conn)
end
def create(conn, _) do
failed_login(conn)
end
defp failed_login(conn) do
conn
|> put_session(:current_user, nil)
|> put_flash(:error, "Invalid username/password combination!")
|> redirect(to: page_path(conn, :index))
|> halt()
end
def delete(conn, _params) do
conn
|> delete_session(:current_user)
|> put_flash(:info, "Signed out successfully!")
|> redirect(to: page_path(conn, :index))
end
defp sign_in(user, _password, conn) when is_nil(user) do
failed_login(conn)
end
defp sign_in(user, password, conn) do
if checkpw(password, user.password_digest) do
conn
|> put_session(:current_user, %{id: user.id, username: user.username, role_id: user.role_id})
|> put_flash(:info, "Sign in successful!")
|> redirect(to: page_path(conn, :index))
else
failed_login(conn)
end
end
end