diff --git a/lib/api/common.ex b/lib/api/common.ex index 1c5c042..b037854 100644 --- a/lib/api/common.ex +++ b/lib/api/common.ex @@ -2,11 +2,32 @@ defmodule Agala.Provider.Vk.Helpers.Common do defmacro __using__(_opts) do quote location: :keep do @headers [{"Content-Type", "application/json"}] + @multipart_headers [{"Content-Type", "multipart/form-data"}] - defp create_body(map, opts \\ []) do + defp send_file_to_url(url, params, opts \\ %{}) do + HTTPoison.post( + url, + create_body_multipart(params, opts), + @multipart_headers, + Map.get(opts, :http_opts, []) + ) + end + + defp create_body(map, opts \\ []) when is_map(map) do Map.merge(map, Enum.into(opts, %{}), fn _, v1, _ -> v1 end) end + defp create_body_multipart(map, opts \\ []) when is_map(map) do + multipart = + Map.merge(map, Enum.into(opts, %{}), fn _, v1, _ -> v1 end) + |> Enum.map(fn + {_, {:file, file}} -> {:file, file, []} + {key, value} -> {to_string(key), to_string(value)} + end) + + {:multipart, multipart} + end + defp random_id(user_id) do :erlang.term_to_binary({ user_id, diff --git a/lib/api/docs.ex b/lib/api/docs.ex new file mode 100644 index 0000000..3c5d1ae --- /dev/null +++ b/lib/api/docs.ex @@ -0,0 +1,58 @@ +defmodule Agala.Provider.Vk.Helpers.Docs do + @moduledoc "Contain methods for interactions with docs." + + use Agala.Provider.Vk.Helpers.Common + + alias Agala.Provider.Vk.Conn + + require Logger + + @doc """ + Params: [ + type + peer_id + ] + """ + def get_messages_upload_server(conn, params, opts \\ []) do + Map.put(conn, :response, %Conn.Response{ + method: :post, + payload: %{ + endpoint: "docs.getMessagesUploadServer", + body: create_body(params, opts), + headers: @headers + } + }) + end + + @doc """ + Params: [ + file + title + tags + ] + """ + def save(conn, params, opts \\ []) + def save(conn, %{file: _file} = params, opts) do + perform_save(conn, params, opts) + end + + def save(conn, %{"file" => _file} = params, opts) do + perform_save(conn, params, opts) + end + + def save(conn, params, _opts) do + Logger.error(fn -> "You must pass url in params. Given params: #{inspect(params)}." end) + conn + end + + defp perform_save(conn, params, opts) do + Map.put(conn, :response, %Conn.Response{ + method: :post, + payload: %{ + endpoint: "docs.save", + body: create_body(params, opts), + headers: @headers + } + }) + end +end diff --git a/lib/api/messages.ex b/lib/api/messages.ex index 5da0e33..1758cb7 100644 --- a/lib/api/messages.ex +++ b/lib/api/messages.ex @@ -16,16 +16,15 @@ defmodule Agala.Provider.Vk.Helpers.Messages do sticker_id, ] """ - def send(conn, user_id, message, opts \\ []) do + def send(conn, params, opts \\ []) do Map.put(conn, :response, %Agala.Provider.Vk.Conn.Response{ method: :post, payload: %{ endpoint: "messages.send", - body: create_body(%{ - user_id: user_id, - message: message, - random_id: random_id(user_id) - }, opts), + body: create_body( + Map.put_new(params, :random_id, random_id(params.user_id)), + opts + ), headers: @headers } }) diff --git a/lib/api/photos.ex b/lib/api/photos.ex new file mode 100644 index 0000000..48cab7f --- /dev/null +++ b/lib/api/photos.ex @@ -0,0 +1,76 @@ +defmodule Agala.Provider.Vk.Helpers.Photos do + @moduledoc "Contain methods for interactions with photos." + + use Agala.Provider.Vk.Helpers.Common + + alias Agala.Provider.Vk.Conn + + @doc """ + Params: [ + peer_id + ] + """ + def get_messages_upload_server(conn, params, opts \\ []) do + Map.put(conn, :response, %Conn.Response{ + method: :post, + payload: %{ + endpoint: "photos.getMessagesUploadServer", + body: create_body(params, opts), + headers: @headers + } + }) + end + + @doc """ + Params: [ + photo + server + hash + ] + """ + def save_messages_photo(conn, params, opts \\ []) + def save_messages_photo(conn, %{photo: photo, server: server, hash: hash}, opts) do + perform_save_messages_photo(conn, %{photo: photo, server: server, hash: hash}, opts) + end + + def save_messages_photo(conn, %{"photo" => photo, "server" => server, "hash" => hash}, opts) do + perform_save_messages_photo(conn, %{photo: photo, server: server, hash: hash}, opts) + end + + defp perform_save_messages_photo(conn, params, opts) do + Map.put(conn, :response, %Conn.Response{ + method: :post, + payload: %{ + endpoint: "photos.saveMessagesPhoto", + body: create_body(params, opts), + headers: @headers + } + }) + end + + @doc """ + Prams: [ + photos + extended + photo_sizes + ] + """ + def get_by_id(conn, params, opts \\ []) do + Map.put(conn, :response, %Agala.Provider.Vk.Conn.Response{ + method: :post, + payload: %{ + endpoint: "photos.getById", + body: create_body(%{ + photos: Map.get(params, :photos, ""), + extended: safe_boolean_params(Map.get(params, :extended, 0)), + photo_sizes: safe_boolean_params(Map.get(params, :photo_sizes, 0)) + }, opts), + headers: @headers + } + }) + end + + defp safe_boolean_params(true), do: 1 + defp safe_boolean_params(false), do: 0 + defp safe_boolean_params(param), do: param +end diff --git a/lib/vk.ex b/lib/vk.ex index 1406886..b0dffbd 100644 --- a/lib/vk.ex +++ b/lib/vk.ex @@ -81,9 +81,12 @@ defmodule Agala.Provider.Vk do defmacro __using__(:handler) do quote location: :keep do + use Agala.Provider.Vk.Helpers.Common alias Agala.Provider.Vk.Helpers.{ Messages, - Users + Users, + Photos, + Docs } end end