From d329880ec8231550c3ffbac3ce163c20a1108184 Mon Sep 17 00:00:00 2001 From: Jamil Date: Mon, 13 Oct 2025 13:24:46 -0700 Subject: [PATCH] fix(portal): don't use Web functions from Domain (#10546) Fixes an issue introduced in #10510 where Web functions (like VerifiedRoutes) cannot be called from Domain because they are not available in the release. This happens to work in dev mode because everything is available under the same dev context. --- elixir/apps/domain/lib/domain/mailer.ex | 16 ++++++++++++++++ .../apps/domain/lib/domain/mailer/auth_email.ex | 16 ---------------- .../domain/lib/domain/mailer/notifications.ex | 5 ++--- elixir/apps/web/lib/web/url_generator.ex | 17 ----------------- elixir/config/config.exs | 2 -- 5 files changed, 18 insertions(+), 38 deletions(-) delete mode 100644 elixir/apps/web/lib/web/url_generator.ex diff --git a/elixir/apps/domain/lib/domain/mailer.ex b/elixir/apps/domain/lib/domain/mailer.ex index 807c5a1ef..4fba77725 100644 --- a/elixir/apps/domain/lib/domain/mailer.ex +++ b/elixir/apps/domain/lib/domain/mailer.ex @@ -93,4 +93,20 @@ defmodule Domain.Mailer do Email.new() |> Email.from({"Firezone Notifications", from_email}) end + + def url(path, params \\ %{}) do + Domain.Config.fetch_env!(:domain, :web_external_url) + |> URI.parse() + |> URI.append_path(path) + |> maybe_append_query(params) + |> URI.to_string() + end + + defp maybe_append_query(uri, params) do + if Enum.empty?(params) do + uri + else + URI.append_query(uri, URI.encode_query(params)) + end + end end diff --git a/elixir/apps/domain/lib/domain/mailer/auth_email.ex b/elixir/apps/domain/lib/domain/mailer/auth_email.ex index e7c604597..6c36ee4c4 100644 --- a/elixir/apps/domain/lib/domain/mailer/auth_email.ex +++ b/elixir/apps/domain/lib/domain/mailer/auth_email.ex @@ -77,20 +77,4 @@ defmodule Domain.Mailer.AuthEmail do subject: subject ) end - - def url(path, params \\ %{}) do - Domain.Config.fetch_env!(:domain, :web_external_url) - |> URI.parse() - |> URI.append_path(path) - |> maybe_append_query(params) - |> URI.to_string() - end - - def maybe_append_query(uri, params) do - if Enum.empty?(params) do - uri - else - URI.append_query(uri, URI.encode_query(params)) - end - end end diff --git a/elixir/apps/domain/lib/domain/mailer/notifications.ex b/elixir/apps/domain/lib/domain/mailer/notifications.ex index 13df86662..223c46f64 100644 --- a/elixir/apps/domain/lib/domain/mailer/notifications.ex +++ b/elixir/apps/domain/lib/domain/mailer/notifications.ex @@ -7,9 +7,8 @@ defmodule Domain.Mailer.Notifications do embed_templates "notifications/*.text", suffix: "_text" def outdated_gateway_email(account, gateways, incompatible_client_count, email) do - url_generator = Application.fetch_env!(:domain, :url_generator) - - outdated_clients_url = url_generator.outdated_clients_url(account.id) + outdated_clients_url = + url("/#{account.id}/clients", %{clients_order_by: "clients:asc:last_seen_version"}) default_email() |> subject("Firezone Gateway Upgrade Available") diff --git a/elixir/apps/web/lib/web/url_generator.ex b/elixir/apps/web/lib/web/url_generator.ex deleted file mode 100644 index bca6a50a8..000000000 --- a/elixir/apps/web/lib/web/url_generator.ex +++ /dev/null @@ -1,17 +0,0 @@ -defmodule Web.UrlGenerator do - @moduledoc """ - Generates URLs for use in emails and other domain-layer notifications. - This breaks the circular dependency between Web and Domain apps. - """ - - use Phoenix.VerifiedRoutes, - endpoint: Web.Endpoint, - router: Web.Router - - @doc """ - Generates URL for the clients page with outdated clients filter. - """ - def outdated_clients_url(account_id) do - url(~p"/#{account_id}/clients?#{[clients_order_by: "clients:asc:last_seen_version"]}") - end -end diff --git a/elixir/config/config.exs b/elixir/config/config.exs index fe22b0898..916f20d4e 100644 --- a/elixir/config/config.exs +++ b/elixir/config/config.exs @@ -202,8 +202,6 @@ config :domain, outbound_email_adapter_configured?: false config :domain, web_external_url: "http://localhost:13000" -config :domain, :url_generator, Web.UrlGenerator - ############################### ##### Web ##################### ###############################