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