defmodule SyntropyWeb.SessionController do use SyntropyWeb, :controller alias SyntropyWeb.OperatorAuth plug :put_layout, false @spec new(Plug.Conn.t(), map()) :: Plug.Conn.t() def new(conn, _params) do cond do not OperatorAuth.required?() -> redirect(conn, to: "/") OperatorAuth.authenticated?(conn) -> redirect(conn, to: "/") true -> render_login(conn, nil) end end @spec create(Plug.Conn.t(), map()) :: Plug.Conn.t() def create(conn, params) do username = params["username"] password = params["password"] case OperatorAuth.validate_credentials(username, password) do :ok -> conn |> OperatorAuth.sign_in() |> redirect(to: "/") {:error, :invalid} -> conn |> put_status(:unauthorized) |> render_login("Invalid operator credentials.") end end @spec delete(Plug.Conn.t(), map()) :: Plug.Conn.t() def delete(conn, _params) do conn |> OperatorAuth.sign_out() |> redirect(to: "/login") end defp render_login(conn, error) do conn |> put_view(html: SyntropyWeb.SessionHTML) |> render(:new, error: error, username: OperatorAuth.username()) end end