defmodule Plausible.Plugs.AuthorizeTeamAccess do @moduledoc """ Enforce team role to be within the declared set. `:current_team_role` is assumed to be populated by `PlausibleWeb.AuthPlug`. For cases where no `:current_team` exists, the plug is permissive, so that existing notices can be displayed still. """ alias PlausibleWeb.Router.Helpers, as: Routes import Plug.Conn @all_roles Plausible.Teams.Membership.roles() -- [:guest] def init([]), do: @all_roles def init(roles) when is_list(roles) do true = Enum.all?(roles, &(&1 in @all_roles)) roles end def call(conn, roles \\ @all_roles) do current_team = conn.assigns[:current_team] if current_team do current_team_role = conn.assigns[:current_team_role] if current_team_role in roles do conn else conn |> Phoenix.Controller.redirect(to: Routes.site_path(conn, :index)) |> halt() end else conn end end end