Skip to main content

lib/bloccs/web/access.ex

defmodule Bloccs.Web.Access do
  @moduledoc """
  The default `Bloccs.Web.Resolver` — the free, open baseline.

  Every user is anonymous, has full read access, and sees every feature. This
  is also the central place panels ask "is this feature on?" via `enabled?/2`,
  so a future licensed resolver only has to narrow `resolve_features/1` while the
  LiveView code stays unchanged.
  """

  @behaviour Bloccs.Web.Resolver

  @typedoc "Features the dashboard knows how to gate. All on in the free build."
  @type feature :: :networks | :topology | :messages | :metrics | :coverage | :trace_export

  @all_features ~w(networks topology messages metrics coverage trace_export)a

  @impl true
  def resolve_user(_session), do: nil

  @impl true
  def resolve_access(_user), do: :all

  @impl true
  def resolve_features(_user), do: :all

  @doc "Every feature the dashboard defines (the upper bound a resolver may grant)."
  @spec all_features() :: [feature()]
  def all_features, do: @all_features

  @doc """
  Whether `feature` is enabled given a resolved feature set.

  `:all` (the free baseline) enables everything; a list enables only its
  members. Panels call this and render a "Pro" lock when it returns `false`.
  """
  @spec enabled?(feature(), :all | [feature()]) :: boolean()
  def enabled?(_feature, :all), do: true
  def enabled?(feature, features) when is_list(features), do: feature in features
end