diff --git a/lib/algora/accounts/accounts.ex b/lib/algora/accounts/accounts.ex index 67d12964e..48d5b6d8b 100644 --- a/lib/algora/accounts/accounts.ex +++ b/lib/algora/accounts/accounts.ex @@ -369,7 +369,7 @@ defmodule Algora.Accounts do {:ok, Repo.preload(user, :identities, force: true)} end - def last_context(%{last_context: nil} = user) do + def last_context(%User{last_context: nil} = user) do orgs = Organizations.get_user_orgs(user) last_debit_query = @@ -378,7 +378,8 @@ defmodule Algora.Accounts do where: t.type == :debit, where: u.id in ^Enum.map(orgs, & &1.id), order_by: [desc: t.succeeded_at], - limit: 1 + limit: 1, + select_merge: %{user: u} ) last_bounty_query = @@ -386,7 +387,8 @@ defmodule Algora.Accounts do join: c in assoc(b, :creator), where: c.id in ^Enum.map(orgs, & &1.id), order_by: [desc: b.created_at], - limit: 1 + limit: 1, + select_merge: %{creator: c} ) last_sponsored_on_behalf_of = @@ -396,13 +398,18 @@ defmodule Algora.Accounts do true -> nil end - case last_sponsored_on_behalf_of do - %{type: :organization} -> last_sponsored_on_behalf_of.handle - _ -> default_context() - end + last_context = + case last_sponsored_on_behalf_of do + %{type: :organization} -> last_sponsored_on_behalf_of.handle + _ -> default_context() + end + + update_settings(user, %{last_context: last_context}) + + last_context end - def last_context(%{last_context: last_context}), do: last_context + def last_context(%User{last_context: last_context}), do: last_context def default_context, do: "personal" diff --git a/lib/algora_web/controllers/context_controller.ex b/lib/algora_web/controllers/context_controller.ex index c8033f4e0..0d95d296b 100644 --- a/lib/algora_web/controllers/context_controller.ex +++ b/lib/algora_web/controllers/context_controller.ex @@ -5,11 +5,16 @@ defmodule AlgoraWeb.ContextController do alias AlgoraWeb.UserAuth def set(conn, %{"context" => context}) do - {:ok, _updated_user} = - Accounts.update_settings(conn.assigns.current_user, %{last_context: context}) + # TODO: validate context is accessible by user - conn = put_session(conn, :last_context, context) + conn = + case Accounts.update_settings(conn.assigns.current_user, %{last_context: context}) do + {:ok, user} -> assign(conn, :current_user, user) + {:error, _} -> conn + end - redirect(conn, to: UserAuth.signed_in_path(conn)) + conn + |> put_session(:last_context, context) + |> redirect(to: UserAuth.signed_in_path_from_context(context)) end end diff --git a/lib/algora_web/controllers/oauth_callback_controller.ex b/lib/algora_web/controllers/oauth_callback_controller.ex index bbc3c98c8..3452ff3d3 100644 --- a/lib/algora_web/controllers/oauth_callback_controller.ex +++ b/lib/algora_web/controllers/oauth_callback_controller.ex @@ -45,10 +45,12 @@ defmodule AlgoraWeb.OAuthCallbackController do |> render(:success) :redirect -> - conn - |> put_flash(:info, welcome_message(user)) - |> AlgoraWeb.UserAuth.put_current_user(user) - |> redirect(to: data[:return_to] || AlgoraWeb.UserAuth.signed_in_path(conn)) + conn = + conn + |> put_flash(:info, welcome_message(user)) + |> AlgoraWeb.UserAuth.put_current_user(user) + + redirect(conn, to: data[:return_to] || AlgoraWeb.UserAuth.signed_in_path(conn)) end else {:error, reason} -> diff --git a/lib/algora_web/controllers/user_auth.ex b/lib/algora_web/controllers/user_auth.ex index 3460e5d53..151683168 100644 --- a/lib/algora_web/controllers/user_auth.ex +++ b/lib/algora_web/controllers/user_auth.ex @@ -99,7 +99,7 @@ defmodule AlgoraWeb.UserAuth do conn |> renew_session() |> put_session(:user_id, user.id) - |> put_session(:last_context, user.last_context) + |> put_session(:last_context, Accounts.last_context(user)) |> put_session(:live_socket_id, "users_sessions:#{user.id}") end @@ -194,7 +194,16 @@ defmodule AlgoraWeb.UserAuth do end def signed_in_path(conn) do - signed_in_path_from_context(get_session(conn, :last_context) || Accounts.default_context()) + cond do + last_context = get_session(conn, :last_context) -> + signed_in_path_from_context(last_context) + + user = conn.assigns[:current_user] -> + signed_in_path(user) + + true -> + signed_in_path_from_context(Accounts.default_context()) + end end defp login_code_ttl, do: 3600