forked from AkkomaGang/akkoma
Uploader callback controller
This commit is contained in:
parent
afb8d9ec13
commit
f9a3269099
3 changed files with 63 additions and 4 deletions
|
@ -27,18 +27,47 @@ defmodule Pleroma.Uploaders.Uploader do
|
||||||
This allows to correctly proxy or redirect requests to the backend, while allowing to migrate backends without breaking any URL.
|
This allows to correctly proxy or redirect requests to the backend, while allowing to migrate backends without breaking any URL.
|
||||||
* `{url, url :: String.t}` to bypass `get_file/2` and use the `url` directly in the activity.
|
* `{url, url :: String.t}` to bypass `get_file/2` and use the `url` directly in the activity.
|
||||||
* `{:error, String.t}` error information if the file failed to be saved to the backend.
|
* `{:error, String.t}` error information if the file failed to be saved to the backend.
|
||||||
|
* `:wait_callback` will wait for an http post request at `/api/pleroma/upload_callback/:upload_path` and call the uploader's `http_callback/3` method.
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
@type file_spec :: {:file | :url, String.t()}
|
||||||
@callback put_file(Pleroma.Upload.t()) ::
|
@callback put_file(Pleroma.Upload.t()) ::
|
||||||
:ok | {:ok, {:file | :url, String.t()}} | {:error, String.t()}
|
:ok | {:ok, file_spec()} | {:error, String.t()} | :wait_callback
|
||||||
|
|
||||||
|
@callback http_callback(Plug.Conn.t(), Map.t()) ::
|
||||||
|
{:ok, Plug.Conn.t()}
|
||||||
|
| {:ok, Plug.Conn.t(), file_spec()}
|
||||||
|
| {:error, Plug.Conn.t(), String.t()}
|
||||||
|
@optional_callbacks http_callback: 2
|
||||||
|
|
||||||
|
@spec put_file(module(), Pleroma.Upload.t()) :: {:ok, file_spec()} | {:error, String.t()}
|
||||||
|
|
||||||
@spec put_file(module(), Pleroma.Upload.t()) ::
|
|
||||||
{:ok, {:file | :url, String.t()}} | {:error, String.t()}
|
|
||||||
def put_file(uploader, upload) do
|
def put_file(uploader, upload) do
|
||||||
case uploader.put_file(upload) do
|
case uploader.put_file(upload) do
|
||||||
:ok -> {:ok, {:file, upload.path}}
|
:ok -> {:ok, {:file, upload.path}}
|
||||||
other -> other
|
:wait_callback -> handle_callback(uploader, upload)
|
||||||
|
{:ok, _} = ok -> ok
|
||||||
|
{:error, _} = error -> error
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp handle_callback(uploader, upload) do
|
||||||
|
:global.register_name({__MODULE__, upload.path}, self())
|
||||||
|
|
||||||
|
receive do
|
||||||
|
{__MODULE__, pid, conn, params} ->
|
||||||
|
case uploader.http_callback(conn, params) do
|
||||||
|
{:ok, conn, ok} ->
|
||||||
|
send(pid, {__MODULE__, conn})
|
||||||
|
{:ok, ok}
|
||||||
|
|
||||||
|
{:error, conn, error} ->
|
||||||
|
send(pid, {__MODULE__, conn})
|
||||||
|
{:error, error}
|
||||||
|
end
|
||||||
|
after
|
||||||
|
30_000 -> {:error, "Uploader callback timeout"}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -107,6 +107,11 @@ defmodule Pleroma.Web.Router do
|
||||||
get("/captcha", UtilController, :captcha)
|
get("/captcha", UtilController, :captcha)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
scope "/api/pleroma", Pleroma.Web do
|
||||||
|
pipe_through(:pleroma_api)
|
||||||
|
post("/uploader_callback/:upload_path", UploaderController, :callback)
|
||||||
|
end
|
||||||
|
|
||||||
scope "/api/pleroma/admin", Pleroma.Web.AdminAPI do
|
scope "/api/pleroma/admin", Pleroma.Web.AdminAPI do
|
||||||
pipe_through(:admin_api)
|
pipe_through(:admin_api)
|
||||||
delete("/user", AdminAPIController, :user_delete)
|
delete("/user", AdminAPIController, :user_delete)
|
||||||
|
|
25
lib/pleroma/web/uploader_controller.ex
Normal file
25
lib/pleroma/web/uploader_controller.ex
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
defmodule Pleroma.Web.UploaderController do
|
||||||
|
use Pleroma.Web, :controller
|
||||||
|
|
||||||
|
alias Pleroma.Uploaders.Uploader
|
||||||
|
|
||||||
|
def callback(conn, params = %{"upload_path" => upload_path}) do
|
||||||
|
process_callback(conn, :global.whereis_name({Uploader, upload_path}), params)
|
||||||
|
end
|
||||||
|
|
||||||
|
def callbacks(conn, _) do
|
||||||
|
send_resp(conn, 400, "bad request")
|
||||||
|
end
|
||||||
|
|
||||||
|
defp process_callback(conn, pid, params) when is_pid(pid) do
|
||||||
|
send(pid, {Uploader, self(), conn, params})
|
||||||
|
|
||||||
|
receive do
|
||||||
|
{Uploader, conn} -> conn
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp process_callback(conn, _, _) do
|
||||||
|
send_resp(conn, 400, "bad request")
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue