emoji packs pagination
authorAlexander Strizhakov <alex.strizhakov@gmail.com>
Thu, 18 Jun 2020 11:32:21 +0000 (14:32 +0300)
committerAlexander Strizhakov <alex.strizhakov@gmail.com>
Thu, 18 Jun 2020 11:32:21 +0000 (14:32 +0300)
lib/pleroma/emoji/pack.ex
lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex
lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex
test/web/pleroma_api/controllers/emoji_pack_controller_test.exs

index 14a5185be801834aa55fe23c24965e34d13e63e5..5660c4c9d8e39a20a910d7765afd62ad7cca8f28 100644 (file)
@@ -16,7 +16,7 @@ defmodule Pleroma.Emoji.Pack do
 
   alias Pleroma.Emoji
 
-  @spec create(String.t()) :: :ok | {:error, File.posix()} | {:error, :empty_values}
+  @spec create(String.t()) :: {:ok, t()} | {:error, File.posix()} | {:error, :empty_values}
   def create(name) do
     with :ok <- validate_not_empty([name]),
          dir <- Path.join(emoji_path(), name),
@@ -120,8 +120,8 @@ defmodule Pleroma.Emoji.Pack do
     end
   end
 
-  @spec list_local() :: {:ok, map()}
-  def list_local do
+  @spec list_local(keyword()) :: {:ok, map()}
+  def list_local(opts) do
     with {:ok, results} <- list_packs_dir() do
       packs =
         results
@@ -132,6 +132,17 @@ defmodule Pleroma.Emoji.Pack do
           end
         end)
         |> Enum.reject(&is_nil/1)
+
+      packs =
+        case opts[:page] do
+          1 ->
+            Enum.take(packs, opts[:page_size])
+
+          _ ->
+            packs
+            |> Enum.take(opts[:page] * opts[:page_size])
+            |> Enum.take(-opts[:page_size])
+        end
         |> Map.new(fn pack -> {pack.name, validate_pack(pack)} end)
 
       {:ok, packs}
@@ -146,7 +157,7 @@ defmodule Pleroma.Emoji.Pack do
     end
   end
 
-  @spec download(String.t(), String.t(), String.t()) :: :ok | {:error, atom()}
+  @spec download(String.t(), String.t(), String.t()) :: {:ok, t()} | {:error, atom()}
   def download(name, url, as) do
     uri = url |> String.trim() |> URI.parse()
 
index 567688ff50d68210eaf0924824da074eb81143cf..0d842382b149fad14281f5e30395484db49fda3e 100644 (file)
@@ -33,6 +33,20 @@ defmodule Pleroma.Web.ApiSpec.PleromaEmojiPackOperation do
       tags: ["Emoji Packs"],
       summary: "Lists local custom emoji packs",
       operationId: "PleromaAPI.EmojiPackController.index",
+      parameters: [
+        Operation.parameter(
+          :page,
+          :query,
+          %Schema{type: :integer, default: 1},
+          "Page"
+        ),
+        Operation.parameter(
+          :page_size,
+          :query,
+          %Schema{type: :integer, default: 50},
+          "Number of statuses to return"
+        )
+      ],
       responses: %{
         200 => emoji_packs_response()
       }
index d1efdeb5d8db98d8cb2c979668d83b7d6441b24d..5654b3fbe59f85e24d4849e431c1a5b6cb637215 100644 (file)
@@ -37,13 +37,13 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackController do
     end
   end
 
-  def index(conn, _params) do
+  def index(conn, params) do
     emoji_path =
       [:instance, :static_dir]
       |> Pleroma.Config.get!()
       |> Path.join("emoji")
 
-    with {:ok, packs} <- Pack.list_local() do
+    with {:ok, packs} <- Pack.list_local(page: params.page, page_size: params.page_size) do
       json(conn, packs)
     else
       {:error, :create_dir, e} ->
index ee3d281a00166781c26a1ad53c708494a053a23c..aafca6359dab0a4e058ad961ac38c307632b99c3 100644 (file)
@@ -39,6 +39,28 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do
     non_shared = resp["test_pack_nonshared"]
     assert non_shared["pack"]["share-files"] == false
     assert non_shared["pack"]["can-download"] == false
+
+    resp =
+      conn
+      |> get("/api/pleroma/emoji/packs?page_size=1")
+      |> json_response_and_validate_schema(200)
+
+    [pack1] = Map.keys(resp)
+
+    resp =
+      conn
+      |> get("/api/pleroma/emoji/packs?page_size=1&page=2")
+      |> json_response_and_validate_schema(200)
+
+    [pack2] = Map.keys(resp)
+
+    resp =
+      conn
+      |> get("/api/pleroma/emoji/packs?page_size=1&page=3")
+      |> json_response_and_validate_schema(200)
+
+    [pack3] = Map.keys(resp)
+    assert [pack1, pack2, pack3] |> Enum.uniq() |> length() == 3
   end
 
   describe "GET /api/pleroma/emoji/packs/remote" do