Current section
Files
Jump to
Current section
Files
lib/cloudinex.ex
defmodule Cloudinex do
@moduledoc false
use Tesla
require Logger
alias Cloudinex.Helpers
import Cloudinex.Validation
plug Tesla.Middleware.BaseUrl, base_url()
plug Tesla.Middleware.BasicAuth, username: Application.get_env(:cloudinex, :api_key),
password: Application.get_env(:cloudinex, :secret)
# plug Tesla.Middleware.FormUrlencoded
plug Tesla.Middleware.JSON
adapter Tesla.Adapter.Hackney
def ping do
client()
|> get("/ping")
|> Helpers.handle_response
end
def usage do
client()
|> get("/usage")
|> Helpers.handle_response
end
def resource_types do
client()
|> get("/resources")
|> Helpers.handle_response
end
def resources(options \\ []) do
{resource_type, options} = Keyword.pop(options, :resource_type, "image")
{type, options} = Keyword.pop(options, :type)
url = case type do
nil ->
"/resources/#{resource_type}"
type ->
"/resources/#{resource_type}/#{type}"
end
keys = [:prefix, :public_ids, :max_results, :next_cursor, :start_at,
:direction, :tags, :context, :moderations]
options = options
|> Keyword.take(keys)
client()
|> get(url, query: options)
|> Helpers.handle_response
end
def resources_by_tag(tag, options \\ []) do
{resource_type, options} = Keyword.pop(options, :resource_type, "image")
url = "/resources/#{resource_type}/tags/#{tag}"
keys = [:max_results, :next_cursor, :direction, :tags, :context, :moderations]
options = options
|> Keyword.take(keys)
client()
|> get(url, query: options)
|> Helpers.handle_response
end
def resources_by_context(key, value \\ nil, options \\ []) do
{resource_type, options} = Keyword.pop(options, :resource_type, "image")
url = case value do
nil ->
"/resources/#{resource_type}/context/?key=#{key}"
value ->
"/resources/#{resource_type}/context/?key=#{key}&value=#{value}"
end
keys = [:max_results, :next_cursor, :direction, :tags, :context]
options = options
|> Keyword.take(keys)
client()
|> get(url, query: options)
|> Helpers.handle_response
end
def resources_by_moderation(type, status, options \\ []) do
{resource_type, options} = Keyword.pop(options, :resource_type, "image")
valid_types = ["manual", "webpurify", "aws_rek", "metascan"]
valid_status = ["pending", "approved", "rejected"]
type = case Enum.member?(valid_types, type) do
true -> type
false -> "manual"
end
status = case Enum.member?(valid_status, status) do
true -> status
false -> "pending"
end
url = "/resources/#{resource_type}/moderations/#{type}/#{status}"
client()
|> get(url, query: options)
|> Helpers.handle_response
end
def resource(public_id, options \\ []) do
{resource_type, options} = Keyword.pop(options, :resource_type, "image")
{type, options} = Keyword.pop(options, :type, "upload")
url = "/resources/#{resource_type}/#{type}/#{public_id}"
keys = [:colors, :exif, :faces, :image_metadata, :pages, :phash,
:coordinates, :max_results]
options = options
|> Keyword.take(keys)
client()
|> get(url, query: options)
|> Helpers.handle_response
end
def update_resource(public_id, options \\ []) do
{resource_type, options} = Keyword.pop(options, :resource_type, "image")
{type, options} = Keyword.pop(options, :type, "upload")
url = "/resources/#{resource_type}/#{type}/#{public_id}"
keys = [:tags, :context, :face_coordinates, :custom_coordinates,
:moderation_status, :auto_tagging, :detection, :ocr, :raw_convert,
:categorization, :background_removal, :notification_url]
options = options
|> remove_invalid_keys(keys)
|> parse_keyword(:face_coordinates, &Helpers.map_coordinates/1)
|> parse_keyword(:custom_coordinates, &Helpers.map_coordinates/1)
|> parse_keyword(:tags, &Helpers.join_list/1)
|> parse_keyword(:context, &Helpers.map_context/1)
|> valid_member?(["approved", "rejected"], :moderation_status)
|> valid_member?(["remove_the_background", "pixelz"], :background_removal)
|> valid_option?(:detection, "adv_face")
|> valid_option?(:ocr, "adv_ocr")
|> valid_option?(:raw_convert, "aspose")
|> valid_option?(:categorization, "imagga_tagging")
|> valid_float_range?(:auto_tagging, 0.0, 1.0)
client()
|> post(url, Helpers.unify(options))
|> Helpers.handle_response
end
def restore(public_ids, options \\ []) do
{resource_type, options} = Keyword.pop(options, :resource_type, "image")
{type, _options} = Keyword.pop(options, :type, "upload")
url = "/resources/#{resource_type}/#{type}/restore"
client()
|> post(url, %{public_ids: public_ids})
|> Helpers.handle_response
end
def delete_resource(public_id, options \\ []) when is_binary(public_id),
do: delete_resources(%{public_ids: [public_id]}, options)
def delete_derived_resources(derived_resource_ids, options \\ []) do
query = [derived_resource_ids: derived_resource_ids]
|> Keyword.merge(options)
url = "/derived_resources"
client()
|> request(method: :delete, url: url, query: query)
|> Helpers.handle_response
end
def delete_resources_by_prefix(prefix, options \\ []) when is_binary(prefix),
do: delete_resources(%{prefix: prefix}, options)
def delete_all_resources(options \\ []),
do: delete_resources(%{all: true}, options)
def delete_resources_by_tag(tag, options \\ []),
do: delete_resources(%{tag: tag}, options)
def delete_resources(hash, options \\ [])
def delete_resources(%{public_ids: public_ids}, options) when is_list(public_ids),
do: delete_resources(%{public_ids: Helpers.join_list(public_ids)}, options)
def delete_resources(%{public_ids: public_ids}, options) when is_binary(public_ids),
do: call_delete(options, [public_ids: public_ids])
def delete_resources(%{prefix: prefix}, options) when is_binary(prefix),
do: call_delete(options, [prefix: prefix])
def delete_resources(%{all: true}, options),
do: call_delete(options, [all: true])
def delete_resources(%{tag: tag}, options),
do: call_delete(options, [tag: tag])
defp call_delete(options, query) do
{resource_type, options} = Keyword.pop(options, :resource_type, "image")
{type, options} = Keyword.pop(options, :type, "upload")
{tag, query} = Keyword.pop(query, :tag)
keys = [:keep_original, :next_cursor, :invalidate, :transformations]
query = options
|> remove_invalid_keys(keys)
|> Keyword.merge(query)
url = case tag do
nil -> "/resources/#{resource_type}/#{type}"
tag -> "/resources/#{resource_type}/tags/#{tag}"
end
client()
|> request(method: :delete, url: url, query: query)
|> Helpers.handle_response
end
def tags(options \\ []) do
{resource_type, options} = Keyword.pop(options, :resource_type, "image")
url = "/tags/#{resource_type}"
keys = [:prefix, :max_results, :next_cursor]
options = options
|> Keyword.take(keys)
client()
|> get(url, query: options)
|> Helpers.handle_response
end
def transformations(options \\ []) do
url = "/transformations"
keys = [:max_results, :next_cursor]
options = options
|> Keyword.take(keys)
client()
|> get(url, query: options)
|> Helpers.handle_response
end
def transformation(id, options \\ []) do
url = "/transformations/#{id}"
keys = [:max_results, :next_cursor]
options = options
|> Keyword.take(keys)
client()
|> get(url, query: options)
|> Helpers.handle_response
end
def delete_transformation(id, options \\ []) do
url = "/transformations/#{id}"
client()
|> delete(url, query: options)
|> Helpers.handle_response
end
def update_transformation(id, options \\ []) do
url = "/transformations/#{id}"
client()
|> request(method: :put, url: url, query: options)
|> Helpers.handle_response
end
def create_transformation(name, transformation) do
url = "/transformations/#{name}"
client()
|> post(url, %{transformation: transformation})
|> Helpers.handle_response
end
def upload_mappings(options \\ []) do
url = "/upload_mappings"
keys = [:max_results, :next_cursor]
options = options
|> Keyword.take(keys)
client()
|> get(url, query: options)
|> Helpers.handle_response
end
def upload_mapping(folder) do
url = "/upload_mappings/#{folder}"
client()
|> get(url)
|> Helpers.handle_response
end
def create_upload_mapping(folder, template) do
url = "/upload_mappings"
client()
|> post(url, %{folder: folder, template: template})
|> Helpers.handle_response
end
def delete_upload_mapping(folder) do
url = "/upload_mappings/#{folder}"
client()
|> delete(url)
|> Helpers.handle_response
end
def update_upload_mapping(folder, template) do
url = "/upload_mappings"
query = %{folder: folder, template: template}
client()
|> request(method: :put, url: url, query: query)
|> Helpers.handle_response
end
defp client do
case Application.get_env(:cloudinex, :debug) do
true -> Tesla.build_client [{Tesla.Middleware.DebugLogger, %{}}]
_ -> Tesla.build_client []
end
end
defp base_url do
"#{Application.get_env(:cloudinex, :base_url)}#{Application.get_env(:cloudinex, :cloud_name)}"
end
end