Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion lib/api/common.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
58 changes: 58 additions & 0 deletions lib/api/docs.ex
Original file line number Diff line number Diff line change
@@ -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
11 changes: 5 additions & 6 deletions lib/api/messages.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
})
Expand Down
76 changes: 76 additions & 0 deletions lib/api/photos.ex
Original file line number Diff line number Diff line change
@@ -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
5 changes: 4 additions & 1 deletion lib/vk.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down