Packages
ash_phoenix
1.2.21
2.3.24
2.3.23
2.3.22
2.3.21
2.3.20
2.3.19
2.3.18
2.3.17
2.3.16
2.3.15
2.3.14
2.3.13
2.3.12
2.3.11
2.3.10
2.3.9
2.3.8
2.3.7
2.3.6
2.3.5
2.3.4
2.3.3
2.3.2
2.3.1
2.3.0
2.2.0
2.1.26
2.1.25
2.1.24
2.1.23
2.1.22
2.1.21
2.1.20
2.1.19
2.1.18
2.1.17
2.1.16
2.1.15
2.1.14
2.1.13
2.1.12
2.1.11
2.1.10
2.1.9
2.1.8
2.1.7
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
2.0.0-rc.8
2.0.0-rc.7
2.0.0-rc.6
2.0.0-rc.5
2.0.0-rc.4
2.0.0-rc.3
2.0.0-rc.2
2.0.0-rc.1
2.0.0-rc.0
1.3.7
1.3.6
1.3.5
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.26
1.2.25
1.2.24
1.2.23
1.2.22
1.2.21
1.2.20
1.2.19
1.2.18
1.2.17
1.2.16
1.2.15
1.2.14
1.2.13
1.2.12
1.2.11
1.2.10
1.2.9
1.2.8
1.2.7
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.2
1.1.1
1.1.0
1.1.0-rc.3
1.1.0-rc.2
1.1.0-rc.1
1.1.0-rc.0
1.0.0-rc.1
1.0.0-rc.0
1.0.0-pre.2
1.0.0-pre.1
1.0.0-pre.0
0.7.7
0.7.6-rc.0
0.7.5
0.7.4
0.7.3
0.7.2-rc.2
0.7.2-rc.1
0.7.2-rc.0
0.7.1
0.7.0
0.6.0-rc.7
0.6.0-rc.6
0.6.0-rc.5
0.6.0-rc.4
0.6.0-rc.3
0.6.0-rc.2
0.6.0-rc.1
0.6.0-rc.0
0.5.19-rc.2
0.5.19-rc.1
0.5.19-rc.0
0.5.18
0.5.17
0.5.16
0.5.15
0.5.14
0.5.13
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.24
0.4.23
0.4.23-rc.1
0.4.23-rc.0
0.4.22-rc2
0.4.22-rc1
0.4.21
0.4.20
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.2
0.1.1
0.1.0
Utilities for integrating Ash and Phoenix
Current section
Files
Jump to
Current section
Files
lib/ash_phoenix/plug/subdomain_plug.ex
defmodule AshPhoenix.SubdomainPlug do
@plug_options [
endpoint: [
type: :atom,
doc: "The endpoint that the plug is in, used for deterining the host",
required: true
],
assign: [
type: :atom,
doc: "The key to use when assigning the current tenant",
default: :current_tenant
],
handle_subdomain: [
type: :mfa,
doc:
"An mfa to call with the conn and a subdomain value. Can be used to do something like fetch the current user given the tenant. Must return the new conn."
]
]
@moduledoc """
This is a basic plug that loads the current tenant assign from a given
value set on subdomain.
This was copied from `Triplex.SubdomainPlug`, here:
https://github.com/ateliware/triplex/blob/master/lib/triplex/plugs/subdomain_plug.ex
Options:
#{Spark.OptionsHelpers.docs(@plug_options)}
To plug it on your router, you can use:
plug AshPhoenix.SubdomainPlug,
endpoint: MyApp.Endpoint
An additional helper here can be used for determining the host in your liveview, and/or using
the host that was already assigned to the conn.
For example:
def handle_params(params, uri, socket) do
socket =
assign_new(socket, :current_tenant, fn ->
AshPhoenix.SubdomainPlug.live_tenant(socket, uri)
end)
socket =
assign_new(socket, :current_organization, fn ->
if socket.assigns[:current_tenant] do
MyApp.Accounts.Api.get!(MyApp.Accounts.Organization,
subdomain: socket.assigns[:current_tenant]
)
end
end)
{:noreply, socket}
end
"""
alias Plug.Conn
@doc false
def init(opts), do: Spark.OptionsHelpers.validate!(opts, @plug_options)
@doc false
def call(conn, opts) do
subdomain = get_subdomain(conn, opts)
conn
|> Plug.Conn.assign(opts[:assign], subdomain)
|> call_handle_subdomain(subdomain, opts)
end
if Code.ensure_loaded?(Phoenix.LiveView) do
def live_tenant(socket, url) do
url
|> URI.parse()
|> Map.get(:host)
|> do_get_subdomain(socket.endpoint.config(:url)[:host])
end
end
defp call_handle_subdomain(conn, subdomain, opts) do
case opts[:handle_subdomain] do
{m, f, a} ->
apply(m, f, [conn, subdomain | a])
_ ->
conn
end
end
defp get_subdomain(
%Conn{host: host},
opts
) do
root_host = opts[:endpoint].config(:url)[:host]
do_get_subdomain(host, root_host)
end
defp do_get_subdomain(host, root_host) do
if host in [root_host, "localhost", "127.0.0.1", "0.0.0.0"] do
nil
else
host
|> String.trim_leading("www.")
|> String.replace(~r/.?#{root_host}/, "")
|> case do
"" ->
nil
subdomain ->
subdomain
end
end
end
end