Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
4.1KB

  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.PleromaAPI.EmojiFileController do
  5. use Pleroma.Web, :controller
  6. alias Pleroma.Emoji.Pack
  7. alias Pleroma.Web.ApiSpec
  8. plug(Pleroma.Web.ApiSpec.CastAndValidate)
  9. plug(
  10. Pleroma.Web.Plugs.OAuthScopesPlug,
  11. %{scopes: ["write"], admin: true}
  12. when action in [
  13. :create,
  14. :update,
  15. :delete
  16. ]
  17. )
  18. defdelegate open_api_operation(action), to: ApiSpec.PleromaEmojiFileOperation
  19. def create(%{body_params: params} = conn, %{name: pack_name}) do
  20. filename = params[:filename] || get_filename(params[:file])
  21. shortcode = params[:shortcode] || Path.basename(filename, Path.extname(filename))
  22. with {:ok, pack} <- Pack.load_pack(pack_name),
  23. {:ok, file} <- get_file(params[:file]),
  24. {:ok, pack} <- Pack.add_file(pack, shortcode, filename, file) do
  25. json(conn, pack.files)
  26. else
  27. {:error, :already_exists} ->
  28. conn
  29. |> put_status(:conflict)
  30. |> json(%{error: "An emoji with the \"#{shortcode}\" shortcode already exists"})
  31. {:error, :empty_values} ->
  32. conn
  33. |> put_status(:unprocessable_entity)
  34. |> json(%{error: "pack name, shortcode or filename cannot be empty"})
  35. {:error, _} = error ->
  36. handle_error(conn, error, %{pack_name: pack_name})
  37. end
  38. end
  39. def update(%{body_params: %{shortcode: shortcode} = params} = conn, %{name: pack_name}) do
  40. new_shortcode = params[:new_shortcode]
  41. new_filename = params[:new_filename]
  42. force = params[:force]
  43. with {:ok, pack} <- Pack.load_pack(pack_name),
  44. {:ok, pack} <- Pack.update_file(pack, shortcode, new_shortcode, new_filename, force) do
  45. json(conn, pack.files)
  46. else
  47. {:error, :already_exists} ->
  48. conn
  49. |> put_status(:conflict)
  50. |> json(%{
  51. error:
  52. "New shortcode \"#{new_shortcode}\" is already used. If you want to override emoji use 'force' option"
  53. })
  54. {:error, :empty_values} ->
  55. conn
  56. |> put_status(:unprocessable_entity)
  57. |> json(%{error: "new_shortcode or new_filename cannot be empty"})
  58. {:error, _} = error ->
  59. handle_error(conn, error, %{pack_name: pack_name, code: shortcode})
  60. end
  61. end
  62. def delete(conn, %{name: pack_name, shortcode: shortcode}) do
  63. with {:ok, pack} <- Pack.load_pack(pack_name),
  64. {:ok, pack} <- Pack.delete_file(pack, shortcode) do
  65. json(conn, pack.files)
  66. else
  67. {:error, :empty_values} ->
  68. conn
  69. |> put_status(:unprocessable_entity)
  70. |> json(%{error: "pack name or shortcode cannot be empty"})
  71. {:error, _} = error ->
  72. handle_error(conn, error, %{pack_name: pack_name, code: shortcode})
  73. end
  74. end
  75. defp handle_error(conn, {:error, :doesnt_exist}, %{code: emoji_code}) do
  76. conn
  77. |> put_status(:bad_request)
  78. |> json(%{error: "Emoji \"#{emoji_code}\" does not exist"})
  79. end
  80. defp handle_error(conn, {:error, :not_found}, %{pack_name: pack_name}) do
  81. conn
  82. |> put_status(:not_found)
  83. |> json(%{error: "pack \"#{pack_name}\" is not found"})
  84. end
  85. defp handle_error(conn, {:error, _}, _) do
  86. render_error(
  87. conn,
  88. :internal_server_error,
  89. "Unexpected error occurred while adding file to pack."
  90. )
  91. end
  92. defp get_filename(%Plug.Upload{filename: filename}), do: filename
  93. defp get_filename(url) when is_binary(url), do: Path.basename(url)
  94. def get_file(%Plug.Upload{} = file), do: {:ok, file}
  95. def get_file(url) when is_binary(url) do
  96. with {:ok, %Tesla.Env{body: body, status: code, headers: headers}}
  97. when code in 200..299 <- Pleroma.HTTP.get(url) do
  98. path = Plug.Upload.random_file!("emoji")
  99. content_type =
  100. case List.keyfind(headers, "content-type", 0) do
  101. {"content-type", value} -> value
  102. nil -> nil
  103. end
  104. File.write(path, body)
  105. {:ok,
  106. %Plug.Upload{
  107. filename: Path.basename(url),
  108. path: path,
  109. content_type: content_type
  110. }}
  111. end
  112. end
  113. end