asciinema.org/lib/asciinema/file_store/s3.ex

53 lines
1.3 KiB
Elixir
Raw Normal View History

2017-05-16 12:54:13 +00:00
defmodule Asciinema.FileStore.S3 do
@behaviour Asciinema.FileStore
import Phoenix.Controller, only: [redirect: 2]
2017-05-21 11:26:41 +00:00
alias ExAws.S3
2017-05-16 12:54:13 +00:00
def serve_file(conn, path, nil) do
do_serve_file(conn, path)
end
def serve_file(conn, path, filename) do
do_serve_file(conn, path, ["response-content-disposition": "attachment; filename=#{filename}"])
end
defp do_serve_file(conn, path, query_params \\ []) do
{:ok, url} =
ExAws.Config.new(:s3, region: region())
|> ExAws.S3.presigned_url(:get, bucket(), base_path() <> path, query_params: query_params)
conn
|> redirect(external: url)
end
2017-06-01 07:35:47 +00:00
def open(path, function \\ nil) do
2017-05-21 11:26:41 +00:00
response = S3.get_object(bucket(), base_path() <> path) |> ExAws.request(region: region())
case response do
{:ok, %{body: body}} ->
2017-06-01 07:35:47 +00:00
if function do
File.open(body, [:ram, :binary, :read], function)
else
File.open(body, [:ram, :binary, :read])
end
2017-05-21 11:26:41 +00:00
{:error, reason} ->
{:error, reason}
end
end
2017-05-16 12:54:13 +00:00
defp config do
Application.get_env(:asciinema, Asciinema.FileStore.S3)
end
defp region do
Keyword.get(config(), :region)
end
defp bucket do
Keyword.get(config(), :bucket)
end
defp base_path do
Keyword.get(config(), :path)
end
end