diff --git a/lib/algora_web/controllers/oauth_login_controller.ex b/lib/algora_web/controllers/oauth_login_controller.ex index 20cb59ba..0ac7932c 100644 --- a/lib/algora_web/controllers/oauth_login_controller.ex +++ b/lib/algora_web/controllers/oauth_login_controller.ex @@ -1,6 +1,7 @@ defmodule AlgoraWeb.OAuthLoginController do use AlgoraWeb, :controller require Logger + import AlgoraWeb.UserAuth, only: [maybe_store_return_to: 1] def new(conn, %{"provider" => "restream"} = params) do if conn.assigns.current_user do @@ -11,7 +12,9 @@ defmodule AlgoraWeb.OAuthLoginController do |> put_session(:restream_state, state) |> redirect(external: Algora.Restream.authorize_url(state)) else - conn |> redirect(to: ~p"/auth/login") + conn + |> maybe_store_return_to() + |> redirect(to: ~p"/auth/login") end end end diff --git a/lib/algora_web/controllers/redirect_controller.ex b/lib/algora_web/controllers/redirect_controller.ex index 264befd8..2573a709 100644 --- a/lib/algora_web/controllers/redirect_controller.ex +++ b/lib/algora_web/controllers/redirect_controller.ex @@ -1,7 +1,7 @@ defmodule AlgoraWeb.RedirectController do use AlgoraWeb, :controller - import AlgoraWeb.UserAuth, only: [fetch_current_user: 2] + import AlgoraWeb.UserAuth, only: [fetch_current_user: 2, maybe_store_return_to: 1] plug :fetch_current_user @@ -9,7 +9,9 @@ defmodule AlgoraWeb.RedirectController do if conn.assigns.current_user do AlgoraWeb.UserAuth.redirect_if_user_is_authenticated(conn, []) else - redirect(conn, to: ~p"/auth/login") + conn + |> maybe_store_return_to() + |> redirect(to: ~p"/auth/login") end end end diff --git a/lib/algora_web/controllers/user_auth.ex b/lib/algora_web/controllers/user_auth.ex index 92b58df4..534aaa86 100644 --- a/lib/algora_web/controllers/user_auth.ex +++ b/lib/algora_web/controllers/user_auth.ex @@ -54,10 +54,15 @@ defmodule AlgoraWeb.UserAuth do end defp redirect_require_login(socket) do - socket - |> LiveView.put_flash(:error, "Please sign in") - |> LiveView.redirect(to: ~p"/auth/login") - end + conn = LiveView.get_connect_info(socket, :conn) + %{request_path: request_path, query_string: query_string} = conn + + return_to = if query_string == "", do: request_path, else: request_path <> "?" <> query_string + + socket + |> LiveView.put_flash(:error, "Please sign in") + |> LiveView.redirect(to: ~p"/auth/login?return_to=#{URI.encode_www_form(return_to)}") +end @doc """ Logs the user in. @@ -157,13 +162,13 @@ defmodule AlgoraWeb.UserAuth do end end - defp maybe_store_return_to(%{method: "GET"} = conn) do + def maybe_store_return_to(%{method: "GET"} = conn) do %{request_path: request_path, query_string: query_string} = conn return_to = if query_string == "", do: request_path, else: request_path <> "?" <> query_string put_session(conn, :user_return_to, return_to) end - defp maybe_store_return_to(conn), do: conn + def maybe_store_return_to(conn), do: conn def signed_in_path(_conn), do: "/" end diff --git a/lib/algora_web/live/show_live/show.ex b/lib/algora_web/live/show_live/show.ex index 100e8d3a..f5382ce9 100644 --- a/lib/algora_web/live/show_live/show.ex +++ b/lib/algora_web/live/show_live/show.ex @@ -1,5 +1,6 @@ defmodule AlgoraWeb.ShowLive.Show do use AlgoraWeb, :live_view + import AlgoraWeb.UserAuth, only: [maybe_store_return_to: 1] alias Algora.{Shows, Library, Events} alias Algora.Accounts @@ -344,9 +345,12 @@ defmodule AlgoraWeb.ShowLive.Show do show = Shows.get_show_by_fields!(slug: slug) + conn = get_connect_info(socket, :conn) + cond do current_user == nil -> - socket + conn + |> maybe_store_return_to() |> redirect(to: ~p"/auth/login") current_user.id != show.user_id && !Accounts.admin?(current_user) ->