diff --git a/lib/plausible/billing/enterprise_plan.ex b/lib/plausible/billing/enterprise_plan.ex index afc166cc8805..36ccd0a1d6a9 100644 --- a/lib/plausible/billing/enterprise_plan.ex +++ b/lib/plausible/billing/enterprise_plan.ex @@ -36,6 +36,5 @@ defmodule Plausible.Billing.EnterprisePlan do model |> cast(attrs, @required_fields) |> validate_required(@required_fields) - |> unique_constraint(:user_id) end end diff --git a/lib/plausible/crm_extensions.ex b/lib/plausible/crm_extensions.ex index 1ca27addf6de..054b6106f003 100644 --- a/lib/plausible/crm_extensions.ex +++ b/lib/plausible/crm_extensions.ex @@ -48,38 +48,71 @@ defmodule Plausible.CrmExtensions do ] end - def javascripts(%{assigns: %{context: context}}) - when context in ["sites", "billing"] do + def javascripts(%{assigns: %{context: "billing", resource: "enterprise_plan", changeset: %{}}}) do [ Phoenix.HTML.raw(""" - """) - ] - end - - def javascripts(%{assigns: %{context: "billing", resource: "enterprise_plan", changeset: %{}}}) do - [ + """), Phoenix.HTML.raw(""" + """) + ] + end end def javascripts(_) do diff --git a/lib/plausible_web/controllers/admin_controller.ex b/lib/plausible_web/controllers/admin_controller.ex index e5a5c501b31c..69c6ef5f1cbd 100644 --- a/lib/plausible_web/controllers/admin_controller.ex +++ b/lib/plausible_web/controllers/admin_controller.ex @@ -2,6 +2,9 @@ defmodule PlausibleWeb.AdminController do use PlausibleWeb, :controller use Plausible + import Ecto.Query + + alias Plausible.Repo alias Plausible.Teams def usage(conn, params) do @@ -71,6 +74,60 @@ defmodule PlausibleWeb.AdminController do |> send_resp(200, json_response) end + def user_by_id(conn, params) do + id = params["user_id"] + + entry = + Repo.one( + from u in Plausible.Auth.User, + where: u.id == ^id, + select: fragment("concat(?, ?, ?, ?)", u.name, " (", u.email, ")") + ) || "" + + conn + |> send_resp(200, entry) + end + + def user_search(conn, params) do + search = + (params["search"] || "") + |> String.trim() + + choices = + if search != "" do + term = + search + |> String.replace("%", "\%") + |> String.replace("_", "\_") + + term = "%#{term}%" + + user_id = + case Integer.parse(search) do + {id, ""} -> id + _ -> 0 + end + + if user_id != 0 do + [] + else + Repo.all( + from u in Plausible.Auth.User, + where: u.id == ^user_id or ilike(u.name, ^term) or ilike(u.email, ^term), + order_by: [u.name, u.id], + select: [fragment("concat(?, ?, ?, ?)", u.name, " (", u.email, ")"), u.id], + limit: 20 + ) + end + else + [] + end + + conn + |> put_resp_content_type("application/json") + |> send_resp(200, Jason.encode!(choices)) + end + defp usage_and_limits_html(team, usage, limits, embed?) do content = """