forked from AkkomaGang/akkoma
Change emoji api responses to JSON
This commit is contained in:
parent
f24731788e
commit
7c784128fd
2 changed files with 186 additions and 166 deletions
|
@ -6,7 +6,7 @@ defmodule Pleroma.Web.EmojiAPI.EmojiAPIController do
|
||||||
def reload(conn, _params) do
|
def reload(conn, _params) do
|
||||||
Pleroma.Emoji.reload()
|
Pleroma.Emoji.reload()
|
||||||
|
|
||||||
conn |> text("ok")
|
conn |> json("ok")
|
||||||
end
|
end
|
||||||
|
|
||||||
@emoji_dir_path Path.join(
|
@emoji_dir_path Path.join(
|
||||||
|
@ -133,13 +133,15 @@ def download_shared(conn, %{"name" => name}) do
|
||||||
{:can_download?, _} ->
|
{:can_download?, _} ->
|
||||||
conn
|
conn
|
||||||
|> put_status(:forbidden)
|
|> put_status(:forbidden)
|
||||||
|> text("Pack #{name} cannot be downloaded from this instance, either pack sharing\
|
|> json(%{
|
||||||
was disabled for this pack or some files are missing")
|
error: "Pack #{name} cannot be downloaded from this instance, either pack sharing\
|
||||||
|
was disabled for this pack or some files are missing"
|
||||||
|
})
|
||||||
|
|
||||||
{:exists?, _} ->
|
{:exists?, _} ->
|
||||||
conn
|
conn
|
||||||
|> put_status(:not_found)
|
|> put_status(:not_found)
|
||||||
|> text("Pack #{name} does not exist")
|
|> json(%{error: "Pack #{name} does not exist"})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -200,15 +202,15 @@ def download_from(conn, %{"instance_address" => address, "pack_name" => name} =
|
||||||
File.write!(pack_file_path, Jason.encode!(full_pack, pretty: true))
|
File.write!(pack_file_path, Jason.encode!(full_pack, pretty: true))
|
||||||
end
|
end
|
||||||
|
|
||||||
text(conn, "ok")
|
json(conn, "ok")
|
||||||
else
|
else
|
||||||
{:error, e} ->
|
{:error, e} ->
|
||||||
conn |> put_status(:internal_server_error) |> text(e)
|
conn |> put_status(:internal_server_error) |> json(%{error: e})
|
||||||
|
|
||||||
{:sha, _} ->
|
{:sha, _} ->
|
||||||
conn
|
conn
|
||||||
|> put_status(:internal_server_error)
|
|> put_status(:internal_server_error)
|
||||||
|> text("SHA256 for the pack doesn't match the one sent by the server")
|
|> json(%{error: "SHA256 for the pack doesn't match the one sent by the server"})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -228,11 +230,11 @@ def create(conn, %{"name" => name}) do
|
||||||
Jason.encode!(%{pack: %{}, files: %{}})
|
Jason.encode!(%{pack: %{}, files: %{}})
|
||||||
)
|
)
|
||||||
|
|
||||||
conn |> text("ok")
|
conn |> json("ok")
|
||||||
else
|
else
|
||||||
conn
|
conn
|
||||||
|> put_status(:conflict)
|
|> put_status(:conflict)
|
||||||
|> text("A pack named \"#{name}\" already exists")
|
|> json(%{error: "A pack named \"#{name}\" already exists"})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -244,10 +246,12 @@ def delete(conn, %{"name" => name}) do
|
||||||
|
|
||||||
case File.rm_rf(pack_dir) do
|
case File.rm_rf(pack_dir) do
|
||||||
{:ok, _} ->
|
{:ok, _} ->
|
||||||
conn |> text("ok")
|
conn |> json("ok")
|
||||||
|
|
||||||
{:error, _} ->
|
{:error, _} ->
|
||||||
conn |> put_status(:internal_server_error) |> text("Couldn't delete the pack #{name}")
|
conn
|
||||||
|
|> put_status(:internal_server_error)
|
||||||
|
|> json(%{error: "Couldn't delete the pack #{name}"})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -281,7 +285,7 @@ def update_metadata(conn, %{"pack_name" => name, "new_data" => new_data}) do
|
||||||
{:has_all_files?, _} ->
|
{:has_all_files?, _} ->
|
||||||
conn
|
conn
|
||||||
|> put_status(:bad_request)
|
|> put_status(:bad_request)
|
||||||
|> text("The fallback archive does not have all files specified in pack.json")
|
|> json(%{error: "The fallback archive does not have all files specified in pack.json"})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -302,6 +306,25 @@ defp update_metadata_and_send(conn, full_pack, new_data, pack_file_p) do
|
||||||
json(conn, new_data)
|
json(conn, new_data)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp get_filename(%{"filename" => filename}), do: filename
|
||||||
|
|
||||||
|
defp get_filename(%{"file" => file}) do
|
||||||
|
case file do
|
||||||
|
%Plug.Upload{filename: filename} -> filename
|
||||||
|
url when is_binary(url) -> Path.basename(url)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp empty?(str), do: String.trim(str) == ""
|
||||||
|
|
||||||
|
defp update_file_and_send(conn, updated_full_pack, pack_file_p) do
|
||||||
|
# Write the emoji pack file
|
||||||
|
File.write!(pack_file_p, Jason.encode!(updated_full_pack, pretty: true))
|
||||||
|
|
||||||
|
# Return the modified file list
|
||||||
|
json(conn, updated_full_pack["files"])
|
||||||
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Updates a file in a pack.
|
Updates a file in a pack.
|
||||||
|
|
||||||
|
@ -316,31 +339,21 @@ defp update_metadata_and_send(conn, full_pack, new_data, pack_file_p) do
|
||||||
(from the current filename to `new_filename`)
|
(from the current filename to `new_filename`)
|
||||||
- `remove` removes the emoji named `shortcode` and it's associated file
|
- `remove` removes the emoji named `shortcode` and it's associated file
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# Add
|
||||||
def update_file(
|
def update_file(
|
||||||
conn,
|
conn,
|
||||||
%{"pack_name" => pack_name, "action" => action, "shortcode" => shortcode} = params
|
%{"pack_name" => pack_name, "action" => "add", "shortcode" => shortcode} = params
|
||||||
) do
|
) do
|
||||||
pack_dir = Path.join(@emoji_dir_path, pack_name)
|
pack_dir = Path.join(@emoji_dir_path, pack_name)
|
||||||
pack_file_p = Path.join(pack_dir, "pack.json")
|
pack_file_p = Path.join(pack_dir, "pack.json")
|
||||||
|
|
||||||
full_pack = Jason.decode!(File.read!(pack_file_p))
|
full_pack = Jason.decode!(File.read!(pack_file_p))
|
||||||
|
|
||||||
res =
|
with {_, false} <- {:has_shortcode, Map.has_key?(full_pack["files"], shortcode)},
|
||||||
case action do
|
filename <- get_filename(params),
|
||||||
"add" ->
|
false <- empty?(shortcode),
|
||||||
unless Map.has_key?(full_pack["files"], shortcode) do
|
false <- empty?(filename) do
|
||||||
filename =
|
|
||||||
if Map.has_key?(params, "filename") do
|
|
||||||
params["filename"]
|
|
||||||
else
|
|
||||||
case params["file"] do
|
|
||||||
%Plug.Upload{filename: filename} -> filename
|
|
||||||
url when is_binary(url) -> Path.basename(url)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
unless String.trim(shortcode) |> String.length() == 0 or
|
|
||||||
String.trim(filename) |> String.length() == 0 do
|
|
||||||
file_path = Path.join(pack_dir, filename)
|
file_path = Path.join(pack_dir, filename)
|
||||||
|
|
||||||
# If the name contains directories, create them
|
# If the name contains directories, create them
|
||||||
|
@ -360,22 +373,31 @@ def update_file(
|
||||||
end
|
end
|
||||||
|
|
||||||
updated_full_pack = put_in(full_pack, ["files", shortcode], filename)
|
updated_full_pack = put_in(full_pack, ["files", shortcode], filename)
|
||||||
|
update_file_and_send(conn, updated_full_pack, pack_file_p)
|
||||||
{:ok, updated_full_pack}
|
|
||||||
else
|
else
|
||||||
{:error,
|
{:has_shortcode, _} ->
|
||||||
conn
|
|
||||||
|> put_status(:bad_request)
|
|
||||||
|> text("shortcode or filename cannot be empty")}
|
|
||||||
end
|
|
||||||
else
|
|
||||||
{:error,
|
|
||||||
conn
|
conn
|
||||||
|> put_status(:conflict)
|
|> put_status(:conflict)
|
||||||
|> text("An emoji with the \"#{shortcode}\" shortcode already exists")}
|
|> json(%{error: "An emoji with the \"#{shortcode}\" shortcode already exists"})
|
||||||
|
|
||||||
|
true ->
|
||||||
|
conn
|
||||||
|
|> put_status(:bad_request)
|
||||||
|
|> json(%{error: "shortcode or filename cannot be empty"})
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
"remove" ->
|
# Remove
|
||||||
|
def update_file(conn, %{
|
||||||
|
"pack_name" => pack_name,
|
||||||
|
"action" => "remove",
|
||||||
|
"shortcode" => shortcode
|
||||||
|
}) do
|
||||||
|
pack_dir = Path.join(@emoji_dir_path, pack_name)
|
||||||
|
pack_file_p = Path.join(pack_dir, "pack.json")
|
||||||
|
|
||||||
|
full_pack = Jason.decode!(File.read!(pack_file_p))
|
||||||
|
|
||||||
if Map.has_key?(full_pack["files"], shortcode) do
|
if Map.has_key?(full_pack["files"], shortcode) do
|
||||||
{emoji_file_path, updated_full_pack} = pop_in(full_pack, ["files", shortcode])
|
{emoji_file_path, updated_full_pack} = pop_in(full_pack, ["files", shortcode])
|
||||||
|
|
||||||
|
@ -393,17 +415,28 @@ def update_file(
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
{:ok, updated_full_pack}
|
update_file_and_send(conn, updated_full_pack, pack_file_p)
|
||||||
else
|
else
|
||||||
{:error,
|
conn
|
||||||
conn |> put_status(:bad_request) |> text("Emoji \"#{shortcode}\" does not exist")}
|
|> put_status(:bad_request)
|
||||||
|
|> json(%{error: "Emoji \"#{shortcode}\" does not exist"})
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
"update" ->
|
# Update
|
||||||
if Map.has_key?(full_pack["files"], shortcode) do
|
def update_file(
|
||||||
with %{"new_shortcode" => new_shortcode, "new_filename" => new_filename} <- params do
|
conn,
|
||||||
unless String.trim(new_shortcode) |> String.length() == 0 or
|
%{"pack_name" => pack_name, "action" => "update", "shortcode" => shortcode} = params
|
||||||
String.trim(new_filename) |> String.length() == 0 do
|
) do
|
||||||
|
pack_dir = Path.join(@emoji_dir_path, pack_name)
|
||||||
|
pack_file_p = Path.join(pack_dir, "pack.json")
|
||||||
|
|
||||||
|
full_pack = Jason.decode!(File.read!(pack_file_p))
|
||||||
|
|
||||||
|
with {_, true} <- {:has_shortcode, Map.has_key?(full_pack["files"], shortcode)},
|
||||||
|
%{"new_shortcode" => new_shortcode, "new_filename" => new_filename} <- params,
|
||||||
|
false <- empty?(new_shortcode),
|
||||||
|
false <- empty?(new_filename) do
|
||||||
# First, remove the old shortcode, saving the old path
|
# First, remove the old shortcode, saving the old path
|
||||||
{old_emoji_file_path, updated_full_pack} = pop_in(full_pack, ["files", shortcode])
|
{old_emoji_file_path, updated_full_pack} = pop_in(full_pack, ["files", shortcode])
|
||||||
old_emoji_file_path = Path.join(pack_dir, old_emoji_file_path)
|
old_emoji_file_path = Path.join(pack_dir, old_emoji_file_path)
|
||||||
|
@ -428,43 +461,30 @@ def update_file(
|
||||||
end
|
end
|
||||||
|
|
||||||
# Then, put in the new shortcode with the new path
|
# Then, put in the new shortcode with the new path
|
||||||
updated_full_pack =
|
updated_full_pack = put_in(updated_full_pack, ["files", new_shortcode], new_filename)
|
||||||
put_in(updated_full_pack, ["files", new_shortcode], new_filename)
|
update_file_and_send(conn, updated_full_pack, pack_file_p)
|
||||||
|
|
||||||
{:ok, updated_full_pack}
|
|
||||||
else
|
else
|
||||||
{:error,
|
{:has_shortcode, _} ->
|
||||||
conn
|
conn
|
||||||
|> put_status(:bad_request)
|
|> put_status(:bad_request)
|
||||||
|> text("new_shortcode or new_filename cannot be empty")}
|
|> json(%{error: "Emoji \"#{shortcode}\" does not exist"})
|
||||||
end
|
|
||||||
else
|
true ->
|
||||||
_ ->
|
|
||||||
{:error,
|
|
||||||
conn
|
conn
|
||||||
|> put_status(:bad_request)
|
|> put_status(:bad_request)
|
||||||
|> text("new_shortcode or new_file were not specified")}
|
|> json(%{error: "new_shortcode or new_filename cannot be empty"})
|
||||||
end
|
|
||||||
else
|
|
||||||
{:error,
|
|
||||||
conn |> put_status(:bad_request) |> text("Emoji \"#{shortcode}\" does not exist")}
|
|
||||||
end
|
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
{:error, conn |> put_status(:bad_request) |> text("Unknown action: #{action}")}
|
conn
|
||||||
|
|> put_status(:bad_request)
|
||||||
|
|> json(%{error: "new_shortcode or new_file were not specified"})
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
case res do
|
def update_file(conn, %{"action" => action}) do
|
||||||
{:ok, updated_full_pack} ->
|
conn
|
||||||
# Write the emoji pack file
|
|> put_status(:bad_request)
|
||||||
File.write!(pack_file_p, Jason.encode!(updated_full_pack, pretty: true))
|
|> json(%{error: "Unknown action: #{action}"})
|
||||||
|
|
||||||
# Return the modified file list
|
|
||||||
conn |> json(updated_full_pack["files"])
|
|
||||||
|
|
||||||
{:error, e} ->
|
|
||||||
e
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
|
@ -493,7 +513,7 @@ def import_from_fs(conn, _params) do
|
||||||
{:error, _} ->
|
{:error, _} ->
|
||||||
conn
|
conn
|
||||||
|> put_status(:internal_server_error)
|
|> put_status(:internal_server_error)
|
||||||
|> text("Error accessing emoji pack directory")
|
|> json(%{error: "Error accessing emoji pack directory"})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -101,14 +101,14 @@ test "downloading shared & unshared packs from another instance via download_fro
|
||||||
}
|
}
|
||||||
|> Jason.encode!()
|
|> Jason.encode!()
|
||||||
)
|
)
|
||||||
|> text_response(200) == "ok"
|
|> json_response(200) == "ok"
|
||||||
|
|
||||||
assert File.exists?("#{@emoji_dir_path}/test_pack2/pack.json")
|
assert File.exists?("#{@emoji_dir_path}/test_pack2/pack.json")
|
||||||
assert File.exists?("#{@emoji_dir_path}/test_pack2/blank.png")
|
assert File.exists?("#{@emoji_dir_path}/test_pack2/blank.png")
|
||||||
|
|
||||||
assert conn
|
assert conn
|
||||||
|> delete(emoji_api_path(conn, :delete, "test_pack2"))
|
|> delete(emoji_api_path(conn, :delete, "test_pack2"))
|
||||||
|> response(200) == "ok"
|
|> json_response(200) == "ok"
|
||||||
|
|
||||||
refute File.exists?("#{@emoji_dir_path}/test_pack2")
|
refute File.exists?("#{@emoji_dir_path}/test_pack2")
|
||||||
|
|
||||||
|
@ -130,14 +130,14 @@ test "downloading shared & unshared packs from another instance via download_fro
|
||||||
}
|
}
|
||||||
|> Jason.encode!()
|
|> Jason.encode!()
|
||||||
)
|
)
|
||||||
|> text_response(200) == "ok"
|
|> json_response(200) == "ok"
|
||||||
|
|
||||||
assert File.exists?("#{@emoji_dir_path}/test_pack_nonshared2/pack.json")
|
assert File.exists?("#{@emoji_dir_path}/test_pack_nonshared2/pack.json")
|
||||||
assert File.exists?("#{@emoji_dir_path}/test_pack_nonshared2/blank.png")
|
assert File.exists?("#{@emoji_dir_path}/test_pack_nonshared2/blank.png")
|
||||||
|
|
||||||
assert conn
|
assert conn
|
||||||
|> delete(emoji_api_path(conn, :delete, "test_pack_nonshared2"))
|
|> delete(emoji_api_path(conn, :delete, "test_pack_nonshared2"))
|
||||||
|> response(200) == "ok"
|
|> json_response(200) == "ok"
|
||||||
|
|
||||||
refute File.exists?("#{@emoji_dir_path}/test_pack_nonshared2")
|
refute File.exists?("#{@emoji_dir_path}/test_pack_nonshared2")
|
||||||
end
|
end
|
||||||
|
@ -225,7 +225,7 @@ test "when the fallback source doesn't have all the files", ctx do
|
||||||
|
|
||||||
conn = build_conn()
|
conn = build_conn()
|
||||||
|
|
||||||
assert conn
|
assert (conn
|
||||||
|> assign(:user, ctx[:admin])
|
|> assign(:user, ctx[:admin])
|
||||||
|> post(
|
|> post(
|
||||||
emoji_api_path(conn, :update_metadata, "test_pack"),
|
emoji_api_path(conn, :update_metadata, "test_pack"),
|
||||||
|
@ -233,7 +233,7 @@ test "when the fallback source doesn't have all the files", ctx do
|
||||||
"new_data" => new_data
|
"new_data" => new_data
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|> text_response(:bad_request) =~ "does not have all"
|
|> json_response(:bad_request))["error"] =~ "does not have all"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -267,9 +267,9 @@ test "updating pack files" do
|
||||||
|
|
||||||
conn = conn |> assign(:user, admin)
|
conn = conn |> assign(:user, admin)
|
||||||
|
|
||||||
assert conn
|
assert (conn
|
||||||
|> post(emoji_api_path(conn, :update_file, "test_pack"), same_name)
|
|> post(emoji_api_path(conn, :update_file, "test_pack"), same_name)
|
||||||
|> text_response(:conflict) =~ "already exists"
|
|> json_response(:conflict))["error"] =~ "already exists"
|
||||||
|
|
||||||
assert conn
|
assert conn
|
||||||
|> post(emoji_api_path(conn, :update_file, "test_pack"), different_name)
|
|> post(emoji_api_path(conn, :update_file, "test_pack"), different_name)
|
||||||
|
@ -350,7 +350,7 @@ test "creating and deleting a pack" do
|
||||||
"test_created"
|
"test_created"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|> text_response(200) == "ok"
|
|> json_response(200) == "ok"
|
||||||
|
|
||||||
assert File.exists?("#{@emoji_dir_path}/test_created/pack.json")
|
assert File.exists?("#{@emoji_dir_path}/test_created/pack.json")
|
||||||
|
|
||||||
|
@ -361,7 +361,7 @@ test "creating and deleting a pack" do
|
||||||
|
|
||||||
assert conn
|
assert conn
|
||||||
|> delete(emoji_api_path(conn, :delete, "test_created"))
|
|> delete(emoji_api_path(conn, :delete, "test_created"))
|
||||||
|> response(200) == "ok"
|
|> json_response(200) == "ok"
|
||||||
|
|
||||||
refute File.exists?("#{@emoji_dir_path}/test_created/pack.json")
|
refute File.exists?("#{@emoji_dir_path}/test_created/pack.json")
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue