defmodule Supabase.Client.Auth do @moduledoc """ Auth configuration schema. This schema is used to configure the auth options. This schema is embedded in the `Supabase.Client` schema. ## Fields - `:auto_refresh_token` - Automatically refresh the token when it expires. Defaults to `true`. - `:debug` - Enable debug mode. Defaults to `false`. - `:detect_session_in_url` - Detect session in URL. Defaults to `true`. - `:flow_type` - Authentication flow type. Defaults to `"implicit"`. - `:persist_session` - Persist session. Defaults to `true`. - `:storage` - Storage type. - `:storage_key` - Storage key. Default to `"sb-$host-auth-token"` where $host is the hostname of your Supabase URL. For more information about the auth options, see the documentation for the [client](https://supabase.com/docs/reference/javascript/initializing) and [auth guides](https://supabase.com/docs/guides/auth) """ use Ecto.Schema import Ecto.Changeset @type t :: %__MODULE__{ auto_refresh_token: boolean(), debug: boolean(), detect_session_in_url: boolean(), flow_type: String.t(), persist_session: boolean(), storage: String.t(), storage_key: String.t() } @type params :: %{ auto_refresh_token: boolean(), debug: boolean(), detect_session_in_url: boolean(), flow_type: String.t(), persist_session: boolean(), storage: String.t(), storage_key: String.t() } @storage_key_template "sb-$host-auth-token" @primary_key false embedded_schema do field(:auto_refresh_token, :boolean, default: true) field(:debug, :boolean, default: false) field(:detect_session_in_url, :boolean, default: true) field(:flow_type, Ecto.Enum, values: ~w[implicit pkce magicLink]a, default: :implicit) field(:persist_session, :boolean, default: true) field(:storage, :string) field(:storage_key, :string) end def changeset(schema, params, supabase_url) do schema |> cast( params, ~w[auto_refresh_token debug detect_session_in_url persist_session flow_type storage]a ) |> validate_required( ~w[auto_refresh_token debug detect_session_in_url persist_session flow_type]a ) |> put_storage_key(supabase_url) end defp put_storage_key(%{valid?: false} = changeset, _), do: changeset defp put_storage_key(changeset, url) do host = url |> URI.new() |> Map.get(:host) |> String.split(".") |> List.first() storage_key = String.replace(@storage_key_template, "$host", host) put_change(changeset, :storage_key, storage_key) end end