diff options
| -rw-r--r-- | docs/API/pleroma_api.md | 12 | ||||
| -rw-r--r-- | lib/pleroma/emoji/pack.ex | 37 | ||||
| -rw-r--r-- | lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex | 16 | ||||
| -rw-r--r-- | lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex | 4 | ||||
| -rw-r--r-- | test/instance_static/emoji/test_pack/blank2.png | bin | 0 -> 95 bytes | |||
| -rw-r--r-- | test/instance_static/emoji/test_pack/pack.json | 3 | ||||
| -rw-r--r-- | test/instance_static/emoji/test_pack_nonshared/nonshared.zip | bin | 256 -> 548 bytes | |||
| -rw-r--r-- | test/instance_static/emoji/test_pack_nonshared/pack.json | 2 | ||||
| -rw-r--r-- | test/web/pleroma_api/controllers/emoji_pack_controller_test.exs | 72 | 
9 files changed, 104 insertions, 42 deletions
diff --git a/docs/API/pleroma_api.md b/docs/API/pleroma_api.md index 70d4755b7..d8d3ba85f 100644 --- a/docs/API/pleroma_api.md +++ b/docs/API/pleroma_api.md @@ -450,17 +450,25 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa  * Response: JSON, list with updated files for updated pack (hashmap -> shortcode => filename) with status 200, either error status with error message.  ## `GET /api/pleroma/emoji/packs` +  ### Lists local custom emoji packs +  * Method `GET`  * Authentication: not required -* Params: None +* Params: +  * `page`: page number for packs (default 1) +  * `page_size`: page size for packs (default 50)  * Response: JSON, "ok" and 200 status and the JSON hashmap of pack name to pack contents  ## `GET /api/pleroma/emoji/packs/:name` +  ### Get pack.json for the pack +  * Method `GET`  * Authentication: not required -* Params: None +* Params: +  * `page`: page number for files (default 1) +  * `page_size`: page size for files (default 50)  * Response: JSON, pack json with `files` and `pack` keys with 200 status or 404 if the pack does not exist  ## `GET /api/pleroma/emoji/packs/:name/archive` diff --git a/lib/pleroma/emoji/pack.ex b/lib/pleroma/emoji/pack.ex index 5660c4c9d..c033572c1 100644 --- a/lib/pleroma/emoji/pack.ex +++ b/lib/pleroma/emoji/pack.ex @@ -26,10 +26,27 @@ defmodule Pleroma.Emoji.Pack do      end    end -  @spec show(String.t()) :: {:ok, t()} | {:error, atom()} -  def show(name) do +  defp paginate(entities, 1, page_size), do: Enum.take(entities, page_size) + +  defp paginate(entities, page, page_size) do +    entities +    |> Enum.take(page * page_size) +    |> Enum.take(-page_size) +  end + +  @spec show(keyword()) :: {:ok, t()} | {:error, atom()} +  def show(opts) do +    name = opts[:name] +      with :ok <- validate_not_empty([name]),           {:ok, pack} <- load_pack(name) do +      shortcodes = +        pack.files +        |> Map.keys() +        |> paginate(opts[:page], opts[:page_size]) + +      pack = Map.put(pack, :files, Map.take(pack.files, shortcodes)) +        {:ok, validate_pack(pack)}      end    end @@ -132,17 +149,7 @@ 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 +        |> paginate(opts[:page], opts[:page_size])          |> Map.new(fn pack -> {pack.name, validate_pack(pack)} end)        {:ok, packs} @@ -307,7 +314,9 @@ defmodule Pleroma.Emoji.Pack do      # Otherwise, they'd have to download it from external-src      pack.pack["share-files"] &&        Enum.all?(pack.files, fn {_, file} -> -        File.exists?(Path.join(pack.path, file)) +        pack.path +        |> Path.join(file) +        |> File.exists?()        end)    end diff --git a/lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex index 0d842382b..e8abe654d 100644 --- a/lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex +++ b/lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex @@ -58,7 +58,21 @@ defmodule Pleroma.Web.ApiSpec.PleromaEmojiPackOperation do        tags: ["Emoji Packs"],        summary: "Show emoji pack",        operationId: "PleromaAPI.EmojiPackController.show", -      parameters: [name_param()], +      parameters: [ +        name_param(), +        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 => Operation.response("Emoji Pack", "application/json", emoji_pack()),          400 => Operation.response("Bad Request", "application/json", ApiError), diff --git a/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex b/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex index 5654b3fbe..078fb88dd 100644 --- a/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex @@ -60,10 +60,10 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackController do      end    end -  def show(conn, %{name: name}) do +  def show(conn, %{name: name, page: page, page_size: page_size}) do      name = String.trim(name) -    with {:ok, pack} <- Pack.show(name) do +    with {:ok, pack} <- Pack.show(name: name, page: page, page_size: page_size) do        json(conn, pack)      else        {:error, :not_found} -> diff --git a/test/instance_static/emoji/test_pack/blank2.png b/test/instance_static/emoji/test_pack/blank2.png Binary files differnew file mode 100644 index 000000000..8f50fa023 --- /dev/null +++ b/test/instance_static/emoji/test_pack/blank2.png diff --git a/test/instance_static/emoji/test_pack/pack.json b/test/instance_static/emoji/test_pack/pack.json index 481891b08..5b33fbb32 100644 --- a/test/instance_static/emoji/test_pack/pack.json +++ b/test/instance_static/emoji/test_pack/pack.json @@ -1,6 +1,7 @@  {      "files": { -        "blank": "blank.png" +        "blank": "blank.png", +        "blank2": "blank2.png"      },      "pack": {          "description": "Test description", diff --git a/test/instance_static/emoji/test_pack_nonshared/nonshared.zip b/test/instance_static/emoji/test_pack_nonshared/nonshared.zip Binary files differindex 148446c64..59bff37f0 100644 --- a/test/instance_static/emoji/test_pack_nonshared/nonshared.zip +++ b/test/instance_static/emoji/test_pack_nonshared/nonshared.zip diff --git a/test/instance_static/emoji/test_pack_nonshared/pack.json b/test/instance_static/emoji/test_pack_nonshared/pack.json index 93d643a5f..09f6274d1 100644 --- a/test/instance_static/emoji/test_pack_nonshared/pack.json +++ b/test/instance_static/emoji/test_pack_nonshared/pack.json @@ -4,7 +4,7 @@          "homepage": "https://pleroma.social",          "description": "Test description",          "fallback-src": "https://nonshared-pack", -        "fallback-src-sha256": "74409E2674DAA06C072729C6C8426C4CB3B7E0B85ED77792DB7A436E11D76DAF", +        "fallback-src-sha256": "1967BB4E42BCC34BCC12D57BE7811D3B7BE52F965BCE45C87BD377B9499CE11D",          "share-files": false      },      "files": { diff --git a/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs b/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs index aafca6359..f6239cae5 100644 --- a/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs +++ b/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs @@ -31,7 +31,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do      resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200)      shared = resp["test_pack"] -    assert shared["files"] == %{"blank" => "blank.png"} +    assert shared["files"] == %{"blank" => "blank.png", "blank2" => "blank2.png"}      assert Map.has_key?(shared["pack"], "download-sha256")      assert shared["pack"]["can-download"]      assert shared["pack"]["share-files"] @@ -354,7 +354,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do          Map.put(            new_data,            "fallback-src-sha256", -          "74409E2674DAA06C072729C6C8426C4CB3B7E0B85ED77792DB7A436E11D76DAF" +          "1967BB4E42BCC34BCC12D57BE7811D3B7BE52F965BCE45C87BD377B9499CE11D"          )        assert ctx[:admin_conn] @@ -420,7 +420,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do        assert admin_conn               |> put_req_header("content-type", "multipart/form-data")               |> post("/api/pleroma/emoji/packs/test_pack/files", %{ -               shortcode: "blank2", +               shortcode: "blank3",                 filename: "dir/blank.png",                 file: %Plug.Upload{                   filename: "blank.png", @@ -429,7 +429,8 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do               })               |> json_response_and_validate_schema(200) == %{                 "blank" => "blank.png", -               "blank2" => "dir/blank.png" +               "blank2" => "blank2.png", +               "blank3" => "dir/blank.png"               }        assert File.exists?("#{@emoji_path}/test_pack/dir/blank.png") @@ -453,7 +454,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do        assert admin_conn               |> put_req_header("content-type", "multipart/form-data")               |> post("/api/pleroma/emoji/packs/test_pack/files", %{ -               shortcode: "blank2", +               shortcode: "blank3",                 filename: "dir/blank.png",                 file: %Plug.Upload{                   filename: "blank.png", @@ -462,7 +463,8 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do               })               |> json_response_and_validate_schema(200) == %{                 "blank" => "blank.png", -               "blank2" => "dir/blank.png" +               "blank2" => "blank2.png", +               "blank3" => "dir/blank.png"               }        assert File.exists?("#{@emoji_path}/test_pack/dir/blank.png") @@ -470,14 +472,15 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do        assert admin_conn               |> put_req_header("content-type", "multipart/form-data")               |> patch("/api/pleroma/emoji/packs/test_pack/files", %{ -               shortcode: "blank2", -               new_shortcode: "blank3", +               shortcode: "blank3", +               new_shortcode: "blank4",                 new_filename: "dir_2/blank_3.png",                 force: true               })               |> json_response_and_validate_schema(200) == %{                 "blank" => "blank.png", -               "blank3" => "dir_2/blank_3.png" +               "blank2" => "blank2.png", +               "blank4" => "dir_2/blank_3.png"               }        assert File.exists?("#{@emoji_path}/test_pack/dir_2/blank_3.png") @@ -503,7 +506,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do        assert admin_conn               |> put_req_header("content-type", "multipart/form-data")               |> post("/api/pleroma/emoji/packs/not_loaded/files", %{ -               shortcode: "blank2", +               shortcode: "blank3",                 filename: "dir/blank.png",                 file: %Plug.Upload{                   filename: "blank.png", @@ -557,7 +560,8 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do               })               |> json_response_and_validate_schema(200) == %{                 "blank" => "blank.png", -               "blank4" => "dir/blank.png" +               "blank4" => "dir/blank.png", +               "blank2" => "blank2.png"               }        assert File.exists?("#{@emoji_path}/test_pack/dir/blank.png") @@ -571,7 +575,8 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do               })               |> json_response_and_validate_schema(200) == %{                 "blank3" => "dir_2/blank_3.png", -               "blank" => "blank.png" +               "blank" => "blank.png", +               "blank2" => "blank2.png"               }        refute File.exists?("#{@emoji_path}/test_pack/dir/") @@ -579,7 +584,10 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do        assert admin_conn               |> delete("/api/pleroma/emoji/packs/test_pack/files?shortcode=blank3") -             |> json_response_and_validate_schema(200) == %{"blank" => "blank.png"} +             |> json_response_and_validate_schema(200) == %{ +               "blank" => "blank.png", +               "blank2" => "blank2.png" +             }        refute File.exists?("#{@emoji_path}/test_pack/dir_2/") @@ -603,7 +611,8 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do               })               |> json_response_and_validate_schema(200) == %{                 "blank_url" => "blank_url.png", -               "blank" => "blank.png" +               "blank" => "blank.png", +               "blank2" => "blank2.png"               }        assert File.exists?("#{@emoji_path}/test_pack/blank_url.png") @@ -624,15 +633,16 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do               })               |> json_response_and_validate_schema(200) == %{                 "shortcode" => "shortcode.png", -               "blank" => "blank.png" +               "blank" => "blank.png", +               "blank2" => "blank2.png"               }      end      test "remove non existing shortcode in pack.json", %{admin_conn: admin_conn} do        assert admin_conn -             |> delete("/api/pleroma/emoji/packs/test_pack/files?shortcode=blank2") +             |> delete("/api/pleroma/emoji/packs/test_pack/files?shortcode=blank3")               |> json_response_and_validate_schema(:bad_request) == %{ -               "error" => "Emoji \"blank2\" does not exist" +               "error" => "Emoji \"blank3\" does not exist"               }      end @@ -640,12 +650,12 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do        assert admin_conn               |> put_req_header("content-type", "multipart/form-data")               |> patch("/api/pleroma/emoji/packs/test_pack/files", %{ -               shortcode: "blank2", -               new_shortcode: "blank3", +               shortcode: "blank3", +               new_shortcode: "blank4",                 new_filename: "dir_2/blank_3.png"               })               |> json_response_and_validate_schema(:bad_request) == %{ -               "error" => "Emoji \"blank2\" does not exist" +               "error" => "Emoji \"blank3\" does not exist"               }      end @@ -768,7 +778,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do    describe "GET /api/pleroma/emoji/packs/:name" do      test "shows pack.json", %{conn: conn} do        assert %{ -               "files" => %{"blank" => "blank.png"}, +               "files" => files,                 "pack" => %{                   "can-download" => true,                   "description" => "Test description", @@ -781,6 +791,26 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do                 conn                 |> get("/api/pleroma/emoji/packs/test_pack")                 |> json_response_and_validate_schema(200) + +      assert files == %{"blank" => "blank.png", "blank2" => "blank2.png"} + +      assert %{ +               "files" => files +             } = +               conn +               |> get("/api/pleroma/emoji/packs/test_pack?page_size=1") +               |> json_response_and_validate_schema(200) + +      assert files |> Map.keys() |> length() == 1 + +      assert %{ +               "files" => files +             } = +               conn +               |> get("/api/pleroma/emoji/packs/test_pack?page_size=1&page=2") +               |> json_response_and_validate_schema(200) + +      assert files |> Map.keys() |> length() == 1      end      test "non existing pack", %{conn: conn} do  | 
