Changeset View
Changeset View
Standalone View
Standalone View
web/controllers/auth_controller.ex
defmodule KolabChat.AuthController do | defmodule KolabChat.AuthController do | ||||
use KolabChat.Web, :controller | use KolabChat.Web, :controller | ||||
# FIXME: is there a better place to put these | |||||
# Both are required for using Amnesia.transaction | |||||
require Amnesia | |||||
require Amnesia.Helper | |||||
@doc """ | @doc """ | ||||
Handler for the default logon form | Handler for the default logon form | ||||
""" | """ | ||||
def default_callback(conn, params) do | def default_callback(conn, params) do | ||||
%{"logon" => %{"password" => _pass, "username" => user}} = params | %{"logon" => %{"password" => _pass, "username" => user}} = params | ||||
cond do | cond do | ||||
is_nil(user) or user == "" -> | is_nil(user) or user == "" -> | ||||
conn | conn | ||||
|> put_flash(:error, gettext("Invalid username!")) | |> put_flash(:error, gettext("Invalid username!")) | ||||
|> redirect(to: "/") | |> redirect(to: "/") | ||||
true -> | true -> | ||||
changeset = User.changeset(%User{}, %{username: user}) | signin(conn, user) | ||||
signin(conn, changeset) | |||||
end | end | ||||
end | end | ||||
defp signin(conn, changeset) do | defp signin(conn, username) do | ||||
case insert_or_update_user(changeset) do | case insert_or_update_user(username) do | ||||
{:ok, user} -> | {:ok, user} -> | ||||
conn | conn | ||||
|> put_flash(:info, gettext("Signed in!")) | |> put_flash(:info, gettext("Signed in!")) | ||||
|> put_session(:user_id, user.id) | |> put_session(:user_id, user.id) | ||||
|> redirect(to: "/") | |> redirect(to: "/") | ||||
{:error, _reason} -> | {:error, _reason} -> | ||||
conn | conn | ||||
|> put_flash(:error, gettext("Error signing in")) | |> put_flash(:error, gettext("Error signing in")) | ||||
|> redirect(to: "/") | |> redirect(to: "/") | ||||
end | end | ||||
end | end | ||||
defp insert_or_update_user(changeset) do | defp insert_or_update_user(username) do | ||||
case Repo.get_by(User, username: changeset.changes.username) do | case Database.User.find(username) do | ||||
nil -> | nil -> | ||||
Repo.insert(changeset) | user = Amnesia.transaction do | ||||
Database.User.write!(%Database.User{username: username}) | |||||
end | |||||
{:ok, user} | |||||
user -> | user -> | ||||
{:ok, user} | {:ok, user} | ||||
end | end | ||||
end | end | ||||
@doc """ | @doc """ | ||||
Handler for logout action | Handler for logout action | ||||
""" | """ | ||||
def logout(conn, _params) do | def logout(conn, _params) do | ||||
conn | conn | ||||
|> configure_session(drop: true) | |> configure_session(drop: true) | ||||
|> redirect(to: "/") | |> redirect(to: "/") | ||||
end | end | ||||
end | end |