Current section
Files
Jump to
Current section
Files
lib/plug_image_processing.ex
defmodule PlugImageProcessing do
alias PlugImageProcessing.Middleware
alias PlugImageProcessing.Middlewares.SignatureKey
alias PlugImageProcessing.Operation
alias PlugImageProcessing.Source
def generate_url(url, config, operation, query) do
config = struct!(PlugImageProcessing.Config, config)
uri = URI.parse(url)
uri = %{uri | path: config.path <> "/#{operation}"}
uri = %{uri | query: URI.encode_query(query)}
uri =
if Middleware.enabled?(%SignatureKey{config: config}, nil) do
sign = SignatureKey.generate_signature(URI.to_string(uri), config)
URI.append_query(uri, "sign=#{sign}")
else
uri
end
URI.to_string(uri)
end
def run_middlewares(conn, config) do
Enum.reduce_while(config.middlewares, conn, fn module, conn ->
middleware = struct!(module, config: config)
with true <- Middleware.enabled?(middleware, conn),
conn when not conn.halted <- Middleware.run(middleware, conn) do
{:cont, conn}
else
conn when conn.halted -> {:halt, conn}
_ -> {:cont, conn}
end
end)
end
def params_operations(image, params, config) do
image =
Enum.reduce_while(params, image, fn {key, value}, image ->
case operations(image, key, %{key => value}, config) do
{:ok, image} -> {:cont, image}
{:error, :invalid_operation} -> {:cont, image}
error -> {:halt, error}
end
end)
case image do
%Vix.Vips.Image{} = image -> {:ok, image}
error -> error
end
end
def operations(image, operation_name, params, config) do
operation =
Enum.find_value(config.operations, fn {name, module_name} ->
operation_name === name && module_name.new(image, params)
end) || {:error, :invalid_operation}
with {:ok, operation} <- operation,
true <- Operation.valid?(operation) do
Operation.process(operation, config)
end
end
def cast_operation_name(name, config) do
if name in Enum.map(config.operations, &elem(&1, 0)) do
{:ok, name}
else
{:error, :invalid_operation}
end
end
def get_image(params, config) do
source = Enum.find_value(config.sources, &Source.cast(struct(&1), params))
if source do
Source.get_image(source)
else
{:error, :unknown_source}
end
end
def write_to_stream(image, file_extension) do
Vix.Vips.Image.write_to_stream(image, ".#{file_extension}")
end
end