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