| 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 |
|
|