diff --git a/lib/algora/accounts/accounts.ex b/lib/algora/accounts/accounts.ex index da94354f6..67d12964e 100644 --- a/lib/algora/accounts/accounts.ex +++ b/lib/algora/accounts/accounts.ex @@ -5,6 +5,8 @@ defmodule Algora.Accounts do alias Algora.Accounts.Identity alias Algora.Accounts.User + alias Algora.Bounties.Bounty + alias Algora.Organizations alias Algora.Payments.Transaction alias Algora.Repo @@ -367,6 +369,43 @@ defmodule Algora.Accounts do {:ok, Repo.preload(user, :identities, force: true)} end + def last_context(%{last_context: nil} = user) do + orgs = Organizations.get_user_orgs(user) + + last_debit_query = + from(t in Transaction, + join: u in assoc(t, :user), + where: t.type == :debit, + where: u.id in ^Enum.map(orgs, & &1.id), + order_by: [desc: t.succeeded_at], + limit: 1 + ) + + last_bounty_query = + from(b in Bounty, + join: c in assoc(b, :creator), + where: c.id in ^Enum.map(orgs, & &1.id), + order_by: [desc: b.created_at], + limit: 1 + ) + + last_sponsored_on_behalf_of = + cond do + last_debit = Repo.one(last_debit_query) -> last_debit.user + last_bounty = Repo.one(last_bounty_query) -> last_bounty.owner + true -> nil + end + + case last_sponsored_on_behalf_of do + %{type: :organization} -> last_sponsored_on_behalf_of.handle + _ -> default_context() + end + end + + def last_context(%{last_context: last_context}), do: last_context + + def default_context, do: "personal" + defp get_flag(user), do: Algora.Misc.CountryEmojis.get(user.country, "🌎") # TODO: implement this diff --git a/lib/algora/accounts/schemas/user.ex b/lib/algora/accounts/schemas/user.ex index e5e3bc655..957e4b573 100644 --- a/lib/algora/accounts/schemas/user.ex +++ b/lib/algora/accounts/schemas/user.ex @@ -327,8 +327,4 @@ defmodule Algora.Accounts.User do def url(%{handle: handle, type: :organization}), do: "#{Endpoint.url()}/org/#{handle}" def url(%{handle: handle}) when is_binary(handle), do: "#{Endpoint.url()}/org/#{handle}" def url(%{provider_login: handle}), do: "https://github.com/#{handle}" - - def last_context(%{last_context: last_context}), do: last_context || default_context() - - def default_context, do: "personal" end diff --git a/lib/algora_web/controllers/installation_callback_controller.ex b/lib/algora_web/controllers/installation_callback_controller.ex index 1b68a9907..d1a93fe7d 100644 --- a/lib/algora_web/controllers/installation_callback_controller.ex +++ b/lib/algora_web/controllers/installation_callback_controller.ex @@ -78,5 +78,5 @@ defmodule AlgoraWeb.InstallationCallbackController do end end - defp redirect_url(conn), do: ~p"/org/#{User.last_context(conn.assigns.current_user)}" + defp redirect_url(conn), do: ~p"/org/#{Accounts.last_context(conn.assigns.current_user)}" end diff --git a/lib/algora_web/controllers/user_auth.ex b/lib/algora_web/controllers/user_auth.ex index 9a34dfe99..3460e5d53 100644 --- a/lib/algora_web/controllers/user_auth.ex +++ b/lib/algora_web/controllers/user_auth.ex @@ -190,11 +190,11 @@ defmodule AlgoraWeb.UserAuth do def signed_in_path_from_context(org_handle), do: ~p"/org/#{org_handle}" def signed_in_path(%User{} = user) do - signed_in_path_from_context(User.last_context(user)) + signed_in_path_from_context(Accounts.last_context(user)) end def signed_in_path(conn) do - signed_in_path_from_context(get_session(conn, :last_context) || User.default_context()) + signed_in_path_from_context(get_session(conn, :last_context) || Accounts.default_context()) end defp login_code_ttl, do: 3600 diff --git a/lib/algora_web/live/payment/success_live.ex b/lib/algora_web/live/payment/success_live.ex index f2168059f..9b6ec4480 100644 --- a/lib/algora_web/live/payment/success_live.ex +++ b/lib/algora_web/live/payment/success_live.ex @@ -2,7 +2,7 @@ defmodule AlgoraWeb.Payment.SuccessLive do @moduledoc false use AlgoraWeb, :live_view - alias Algora.Accounts.User + alias Algora.Accounts def mount(_params, _session, socket) do socket = @@ -12,7 +12,7 @@ defmodule AlgoraWeb.Payment.SuccessLive do current_user -> to = - case User.last_context(current_user) do + case Accounts.last_context(current_user) do "personal" -> ~p"/user/transactions" org_handle -> ~p"/org/#{org_handle}/transactions" end diff --git a/scripts/database_migration.exs b/scripts/database_migration.exs index d42b3bb5e..9960ddfb2 100644 --- a/scripts/database_migration.exs +++ b/scripts/database_migration.exs @@ -197,7 +197,7 @@ defmodule DatabaseMigration do "linkedin_url" => nil, "og_title" => nil, "og_image_url" => nil, - "last_context" => row["handle"], + "last_context" => nil, "need_avatar" => nil, "inserted_at" => row["created_at"], "updated_at" => row["updated_at"],