| defmodule PlausibleWeb.Plugins.API.Controllers.SharedLinks do |
| @moduledoc """ |
| Controller for the Shared Link resource under Plugins API |
| """ |
| use PlausibleWeb, :plugins_api_controller |
|
|
| operation(:index, |
| summary: "Retrieve Shared Links", |
| parameters: [ |
| limit: [in: :query, type: :integer, description: "Maximum entries per page", example: 10], |
| after: [ |
| in: :query, |
| type: :string, |
| description: "Cursor value to seek after - generated internally" |
| ], |
| before: [ |
| in: :query, |
| type: :string, |
| description: "Cursor value to seek before - generated internally" |
| ] |
| ], |
| responses: %{ |
| ok: {"Shared Links response", "application/json", Schemas.SharedLink.ListResponse}, |
| unauthorized: {"Unauthorized", "application/json", Schemas.Unauthorized} |
| } |
| ) |
|
|
| @spec index(Plug.Conn.t(), %{}) :: Plug.Conn.t() |
| def index(conn, _params) do |
| {:ok, pagination} = |
| API.SharedLinks.get_shared_links(conn.assigns.authorized_site, conn.query_params) |
|
|
| conn |
| |> put_view(Views.SharedLink) |
| |> render("index.json", %{pagination: pagination}) |
| end |
|
|
| operation(:create, |
| summary: "Get or create Shared Link", |
| request_body: {"Shared Link params", "application/json", Schemas.SharedLink.CreateRequest}, |
| responses: %{ |
| created: {"Shared Link", "application/json", Schemas.SharedLink}, |
| unauthorized: {"Unauthorized", "application/json", Schemas.Unauthorized}, |
| unprocessable_entity: |
| {"Unprocessable entity", "application/json", Schemas.UnprocessableEntity} |
| } |
| ) |
|
|
| @spec create(Plug.Conn.t(), map()) :: Plug.Conn.t() |
| def create( |
| %{ |
| private: %{ |
| open_api_spex: %{ |
| body_params: %Schemas.SharedLink.CreateRequest{ |
| shared_link: %{name: name} = shared_link |
| } |
| } |
| } |
| } = conn, |
| _params |
| ) do |
| site = conn.assigns.authorized_site |
|
|
| {:ok, shared_link} = API.SharedLinks.get_or_create(site, name, shared_link[:password]) |
|
|
| conn |
| |> put_view(Views.SharedLink) |
| |> put_status(:created) |
| |> put_resp_header("location", plugins_api_shared_links_url(conn, :get, shared_link.id)) |
| |> render("shared_link.json", shared_link: shared_link, authorized_site: site) |
| end |
|
|
| operation(:get, |
| summary: "Retrieve Shared Link by ID", |
| parameters: [ |
| id: [ |
| in: :path, |
| type: :integer, |
| description: "Shared Link ID", |
| example: 123, |
| required: true |
| ] |
| ], |
| responses: %{ |
| created: {"Shared Link", "application/json", Schemas.SharedLink}, |
| not_found: {"NotFound", "application/json", Schemas.NotFound}, |
| unauthorized: {"Unauthorized", "application/json", Schemas.Unauthorized}, |
| unprocessable_entity: |
| {"Unprocessable entity", "application/json", Schemas.UnprocessableEntity} |
| } |
| ) |
|
|
| @spec get(Plug.Conn.t(), map()) :: Plug.Conn.t() |
| def get(%{private: %{open_api_spex: %{params: %{id: id}}}} = conn, _params) do |
| site = conn.assigns.authorized_site |
|
|
| case API.SharedLinks.get(site, id) do |
| nil -> |
| conn |
| |> put_view(Views.Error) |
| |> put_status(:not_found) |
| |> render("404.json") |
|
|
| shared_link -> |
| conn |
| |> put_view(Views.SharedLink) |
| |> put_status(:ok) |
| |> render("shared_link.json", shared_link: shared_link, authorized_site: site) |
| end |
| end |
| end |
|
|