analytics/lib/plausible/plugins/api/shared_links.ex

62 lines
1.6 KiB
Elixir

defmodule Plausible.Plugins.API.SharedLinks do
@moduledoc """
Plugins API context module for Shared Links.
All high level Shared Links operations should be implemented here.
"""
import Ecto.Query
import Plausible.Pagination
alias Plausible.Repo
@spec get_shared_links(Plausible.Site.t(), map()) :: {:ok, Paginator.Page.t()}
def get_shared_links(site, params) do
query =
from l in Plausible.Site.SharedLink,
where: l.site_id == ^site.id,
order_by: [desc: l.id]
{:ok, paginate(query, params, cursor_fields: [{:id, :desc}])}
end
@spec get(Plausible.Site.t(), pos_integer() | String.t()) :: nil | Plausible.Site.SharedLink.t()
def get(site, id) when is_integer(id) do
get_by_id(site, id)
end
def get(site, name) when is_binary(name) do
get_by_name(site, name)
end
@spec get_or_create(Plausible.Site.t(), String.t(), String.t() | nil) ::
{:ok, Plausible.Site.SharedLink.t()}
def get_or_create(site, name, password \\ nil) do
case get_by_name(site, name) do
nil ->
Plausible.Sites.create_shared_link(site, name,
password: password,
skip_feature_check?: true,
skip_special_name_check?: true
)
shared_link ->
{:ok, shared_link}
end
end
defp get_by_id(site, id) do
Repo.one(
from l in Plausible.Site.SharedLink,
where: l.site_id == ^site.id,
where: l.id == ^id
)
end
defp get_by_name(site, name) do
Repo.one(
from l in Plausible.Site.SharedLink,
where: l.site_id == ^site.id,
where: l.name == ^name
)
end
end