From 7697467c9fef76636f880723d207558b6f8828b7 Mon Sep 17 00:00:00 2001 From: zafer Date: Sat, 1 Mar 2025 02:40:54 +0300 Subject: [PATCH 1/3] feat: add last_context logic to determine user's default org context --- lib/algora/accounts/accounts.ex | 38 +++++++++++++++++++ lib/algora/accounts/schemas/user.ex | 4 -- .../installation_callback_controller.ex | 2 +- lib/algora_web/controllers/user_auth.ex | 4 +- lib/algora_web/live/payment/success_live.ex | 4 +- scripts/database_migration.exs | 2 +- 6 files changed, 44 insertions(+), 10 deletions(-) diff --git a/lib/algora/accounts/accounts.ex b/lib/algora/accounts/accounts.ex index da94354f6..8f9347d0b 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,42 @@ 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 + ) + + cond do + last_debit = Repo.one(last_debit_query) -> + last_debit.user.handle + + last_bounty = Repo.one(last_bounty_query) -> + last_bounty.owner.handle + + true -> + 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"], From 319a4fae3652071a2fed3a96d9e44d5b4f99c319 Mon Sep 17 00:00:00 2001 From: zafer Date: Sat, 1 Mar 2025 02:45:13 +0300 Subject: [PATCH 2/3] update logic --- lib/algora/accounts/accounts.ex | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/lib/algora/accounts/accounts.ex b/lib/algora/accounts/accounts.ex index 8f9347d0b..e8407bc6e 100644 --- a/lib/algora/accounts/accounts.ex +++ b/lib/algora/accounts/accounts.ex @@ -389,15 +389,17 @@ defmodule Algora.Accounts do limit: 1 ) - cond do - last_debit = Repo.one(last_debit_query) -> - last_debit.user.handle - - last_bounty = Repo.one(last_bounty_query) -> - last_bounty.owner.handle - - true -> - default_context() + 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 + nil -> default_context() + %{type: :individual} -> default_context() + user -> user.handle end end From 7db9a8c9a8d67a2057aff4c501d2d54ff6b5e92f Mon Sep 17 00:00:00 2001 From: zafer Date: Sat, 1 Mar 2025 02:45:51 +0300 Subject: [PATCH 3/3] simplify --- lib/algora/accounts/accounts.ex | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/algora/accounts/accounts.ex b/lib/algora/accounts/accounts.ex index e8407bc6e..67d12964e 100644 --- a/lib/algora/accounts/accounts.ex +++ b/lib/algora/accounts/accounts.ex @@ -397,9 +397,8 @@ defmodule Algora.Accounts do end case last_sponsored_on_behalf_of do - nil -> default_context() - %{type: :individual} -> default_context() - user -> user.handle + %{type: :organization} -> last_sponsored_on_behalf_of.handle + _ -> default_context() end end