| defmodule PlausibleWeb.Api.InternalController do |
| use PlausibleWeb, :controller |
| use Plausible.Repo |
| import Ecto.Query |
| alias Plausible.{Sites, Auth} |
| alias Plausible.Auth.User |
| alias Plausible.Teams |
|
|
| def sites(conn, _params) do |
| current_user = conn.assigns[:current_user] |
| current_team = conn.assigns[:current_team] |
|
|
| if current_user do |
| sites = sites_for(current_user, current_team) |
|
|
| json(conn, %{data: sites}) |
| else |
| PlausibleWeb.Api.Helpers.unauthorized( |
| conn, |
| "You need to be logged in to request a list of sites" |
| ) |
| end |
| end |
|
|
| @features %{ |
| "funnels" => Plausible.Billing.Feature.Funnels, |
| "props" => Plausible.Billing.Feature.Props, |
| "conversions" => Plausible.Billing.Feature.Goals |
| } |
| def disable_feature(conn, %{"domain" => domain, "feature" => feature}) do |
| with %User{id: user_id} = user <- conn.assigns[:current_user], |
| site <- Sites.get_by_domain(domain), |
| true <- |
| Plausible.Teams.Memberships.has_editor_access?(site, user) || |
| Auth.super_admin?(user_id), |
| {:ok, mod} <- Map.fetch(@features, feature), |
| {:ok, _site} <- mod.toggle(site, user, override: false) do |
| json(conn, "ok") |
| else |
| {:error, :upgrade_required} -> |
| PlausibleWeb.Api.Helpers.payment_required( |
| conn, |
| "This feature is part of the Plausible Business plan. To get access to this feature, please upgrade your account" |
| ) |
|
|
| :error -> |
| PlausibleWeb.Api.Helpers.bad_request( |
| conn, |
| "The feature you tried to disable is not valid. Valid features are: #{@features |> Map.keys() |> Enum.join(", ")}" |
| ) |
|
|
| _ -> |
| PlausibleWeb.Api.Helpers.unauthorized( |
| conn, |
| "You need to be logged in as the owner or admin account of this site" |
| ) |
| end |
| end |
|
|
| defp sites_for(user, team) do |
| from(u in subquery(Teams.Sites.accessible_by(user, team)), |
| inner_join: s in ^Plausible.Site.regular(), |
| on: u.site_id == s.id, |
| left_join: up in Plausible.Site.UserPreference, |
| on: up.site_id == s.id and up.user_id == ^user.id, |
| select: %{domain: s.domain}, |
| order_by: [ |
| asc: |
| fragment( |
| "CASE WHEN ? IS NOT NULL THEN 'pinned_site' ELSE 'site' END", |
| up.pinned_at |
| ), |
| desc: up.pinned_at, |
| asc: s.domain |
| ], |
| limit: 9 |
| ) |
| |> Repo.all() |
| end |
| end |
|
|