A hobbldey-working swift client.

apparently, all elixir openstack libraries are trash
luckily, the APIs are stupid easy.
This commit is contained in:
Thurloat 2018-08-28 22:32:24 -03:00
parent 9fc20ed572
commit 2ff25ac0ce
5 changed files with 94 additions and 2 deletions

View File

@ -12,7 +12,7 @@ def store(%Plug.Upload{} = file, should_dedupe) do
strip_exif_data(content_type, file.path) strip_exif_data(content_type, file.path)
url_path = @storage_backend.put_file(name, uuid, file, content_type, should_dedupe) url_path = @storage_backend.put_file(name, uuid, file.path, content_type, should_dedupe)
%{ %{
"type" => "Document", "type" => "Document",

View File

@ -1 +0,0 @@

View File

@ -0,0 +1,48 @@
defmodule Pleroma.Uploaders.Swift.Keystone do
use HTTPoison.Base
@settings Application.get_env(:pleroma, Pleroma.Uploaders.Swift)
def process_url(url) do
Enum.join(
[Keyword.fetch!(@settings, :auth_url), url],
"/"
)
end
def process_response_body(body) do
body
|> Poison.decode!()
end
def get_token() do
username = Keyword.fetch!(@settings, :username)
password = Keyword.fetch!(@settings, :password)
tenant_id = Keyword.fetch!(@settings, :tenant_id)
case post(
"/tokens",
make_auth_body(username, password, tenant_id),
["Content-Type": "application/json"],
hackney: [:insecure]
) do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
body["access"]["token"]["id"]
{:ok, %HTTPoison.Response{status_code: _}} ->
""
end
end
def make_auth_body(username, password, tenant) do
Poison.encode!(%{
:auth => %{
:passwordCredentials => %{
:username => username,
:password => password
},
:tenantId => tenant
}
})
end
end

View File

@ -0,0 +1,30 @@
defmodule Pleroma.Uploaders.Swift.Client do
use HTTPoison.Base
@settings Application.get_env(:pleroma, Pleroma.Uploaders.Swift)
def process_url(url) do
Enum.join(
[Keyword.fetch!(@settings, :storage_url), url],
"/"
)
end
def upload_file(filename, body, content_type) do
token = Pleroma.Uploaders.Swift.Keystone.get_token()
case put("#{filename}", body, "X-Auth-Token": token, "Content-Type": content_type) do
{:ok, %HTTPoison.Response{status_code: 201}} ->
# lgtm
""
{:ok, %HTTPoison.Response{status_code: 401}} ->
# bad token
""
{:error, _} ->
# bad news
""
end
end
end

View File

@ -0,0 +1,15 @@
defmodule Pleroma.Uploaders.Swift do
@behaviour Pleroma.Uploaders.Uploader
@settings Application.get_env(:pleroma, Pleroma.Uploaders.Swift)
def put_file(name, uuid, tmp_path, content_type, _should_dedupe) do
{:ok, file_data} = File.read(tmp_path)
remote_name = "#{uuid}/#{name}"
Pleroma.Uploaders.Swift.Client.upload_file(remote_name, file_data, content_type)
object_url = Keyword.fetch!(@settings, :object_url)
"#{object_url}/#{remote_name}"
end
end