daily-tracker

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

user_session_controller.ex (2066B)


      1 defmodule DailyTrackerWeb.UserSessionController do
      2   use DailyTrackerWeb, :controller
      3 
      4   alias DailyTracker.Accounts
      5   alias DailyTrackerWeb.UserAuth
      6 
      7   def create(conn, %{"_action" => "confirmed"} = params) do
      8     create(conn, params, "User confirmed successfully.")
      9   end
     10 
     11   def create(conn, params) do
     12     create(conn, params, "Welcome back!")
     13   end
     14 
     15   # magic link login
     16   defp create(conn, %{"user" => %{"token" => token} = user_params}, info) do
     17     case Accounts.login_user_by_magic_link(token) do
     18       {:ok, {user, tokens_to_disconnect}} ->
     19         UserAuth.disconnect_sessions(tokens_to_disconnect)
     20 
     21         conn
     22         |> put_flash(:info, info)
     23         |> UserAuth.log_in_user(user, user_params)
     24 
     25       _ ->
     26         conn
     27         |> put_flash(:error, "The link is invalid or it has expired.")
     28         |> redirect(to: ~p"/users/log-in")
     29     end
     30   end
     31 
     32   # email + password login
     33   defp create(conn, %{"user" => user_params}, info) do
     34     %{"email" => email, "password" => password} = user_params
     35 
     36     if user = Accounts.get_user_by_email_and_password(email, password) do
     37       conn
     38       |> put_flash(:info, info)
     39       |> UserAuth.log_in_user(user, user_params)
     40     else
     41       # In order to prevent user enumeration attacks, don't disclose whether the email is registered.
     42       conn
     43       |> put_flash(:error, "Invalid email or password")
     44       |> put_flash(:email, String.slice(email, 0, 160))
     45       |> redirect(to: ~p"/users/log-in")
     46     end
     47   end
     48 
     49   def update_password(conn, %{"user" => user_params} = params) do
     50     user = conn.assigns.current_scope.user
     51     true = Accounts.sudo_mode?(user)
     52     {:ok, {_user, expired_tokens}} = Accounts.update_user_password(user, user_params)
     53 
     54     # disconnect all existing LiveViews with old sessions
     55     UserAuth.disconnect_sessions(expired_tokens)
     56 
     57     conn
     58     |> put_session(:user_return_to, ~p"/users/settings")
     59     |> create(params, "Password updated successfully!")
     60   end
     61 
     62   def delete(conn, _params) do
     63     conn
     64     |> put_flash(:info, "Logged out successfully.")
     65     |> UserAuth.log_out_user()
     66   end
     67 end