Skip to content

Commit

Permalink
refactor: "Refactor Appwrite services: Accounts, Avatars, and Storage…
Browse files Browse the repository at this point in the history
…; remove Client dependency, update function signatures, and modify API calls."
  • Loading branch information
iamkanishka committed Nov 29, 2024
1 parent 65c1eca commit 6fe8983
Show file tree
Hide file tree
Showing 3 changed files with 116 additions and 117 deletions.
1 change: 1 addition & 0 deletions lib/appwrite/services/accounts.ex
Original file line number Diff line number Diff line change
Expand Up @@ -950,6 +950,7 @@ defmodule Appwrite.Services.Accounts do
end
)


query_string = URI.encode_query(Client.flatten(params))
{to_string(url) <> "?" <> query_string}

Expand Down
225 changes: 112 additions & 113 deletions lib/appwrite/services/avatars.ex
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,9 @@ defmodule Appwrite.Services.Avatars do
All endpoints in this service allow you to resize, crop, and
change the output image quality for maximum performance and visibility in your app.
Status: In Testing
"""

alias Appwrite.Types.Client
alias Appwrite.Utils.Client
alias Appwrite.Exceptions.AppwriteException
alias Appwrite.Utils.Service

Expand All @@ -22,7 +20,6 @@ defmodule Appwrite.Services.Avatars do
## Parameters
- `client` (`Client.t`): The Appwrite client instance.
- `code` (`String.t`): The browser code.
- `width` (`integer`): The width of the icon.
- `height` (`integer`): The height of the icon.
Expand All @@ -37,23 +34,28 @@ defmodule Appwrite.Services.Avatars do
- `AppwriteException` if any required parameter is missing.
"""
@spec get_browser(Client.t(), String.t(), integer() | nil, integer() | nil, integer() | nil) :: String.t()
def get_browser(client, code, width \\ nil, height \\ nil, quality \\ nil) do
validate_params(%{client: client, code: code})
@spec get_browser(String.t(), integer() | nil, integer() | nil, integer() | nil) ::
String.t()
def get_browser(code, width \\ nil, height \\ nil, quality \\ nil) do
if is_nil(code) do
{:error, %AppwriteException{message: "Missing required parameters: code"}}
else
api_path = "/v1/avatars/browsers/#{code}"

api_path = "/avatars/browsers/#{code}"
uri = URI.merge(client.config.endpoint, api_path)
payload =
%{
"quality" => quality,
"width" => width,
"height" => height,
"project" => Client.default_config()["project"]
}
|> Enum.reject(fn {_, v} -> v == nil end)

payload =
%{}
|> maybe_put("width", width)
|> maybe_put("height", height)
|> maybe_put("quality", quality)
|> Map.put("project", client.config.project)
|> Service.flatten()

uri = build_query_params(uri, payload)
Client.call(client, :get, uri)
url = URI.merge(Client.default_config()[~c"endpoint"], api_path)

query_string = URI.encode_query(Service.flatten(payload))
{to_string(url) <> "?" <> query_string}
end
end

@doc """
Expand All @@ -63,7 +65,6 @@ defmodule Appwrite.Services.Avatars do
## Parameters
- `client` (`Client.t`): The Appwrite client instance.
- `code` (`String.t`): The credit card code.
- `width` (`integer`): The width of the icon.
- `height` (`integer`): The height of the icon.
Expand All @@ -78,47 +79,30 @@ defmodule Appwrite.Services.Avatars do
- `AppwriteException` if any required parameter is missing.
"""
@spec get_credit_card(Client.t(), String.t(), integer() | nil, integer() | nil, integer() | nil) :: String.t()
def get_credit_card(client, code, width \\ nil, height \\ nil, quality \\ nil) do
validate_params(%{client: client, code: code})
@spec get_credit_card(String.t(), integer() | nil, integer() | nil, integer() | nil) ::
String.t()
def get_credit_card(code, width \\ nil, height \\ nil, quality \\ nil) do
if is_nil(code) do
{:error, %AppwriteException{message: "Missing required parameters: code"}}
else
api_path = "/v1/avatars/credit-cards/#{code}"

api_path = "/avatars/credit-cards/#{code}"
uri = URI.merge(client.config.endpoint, api_path)
payload =
%{
"quality" => quality,
"width" => width,
"height" => height,
"project" => Client.default_config()["project"]
}
|> Enum.reject(fn {_, v} -> v == nil end)

payload =
%{}
|> maybe_put("width", width)
|> maybe_put("height", height)
|> maybe_put("quality", quality)
|> Map.put("project", client.config.project)
|> Service.flatten()

uri = build_query_params(uri, payload)
Client.call(client, :get, uri)
end
url = URI.merge(Client.default_config()[~c"endpoint"], api_path)

# Helper function to validate parameters
@spec validate_params(map()) :: :ok | no_return()
defp validate_params(params) do
Enum.each(params, fn {key, value} ->
if is_nil(value) do
raise AppwriteException, "Missing required parameter: #{inspect(key)}"
end
end)
end

# Helper function to build query params
@spec build_query_params(URI.t(), map()) :: URI.t()
defp build_query_params(uri, payload) do
Enum.reduce(payload, uri, fn {key, value}, acc ->
query = URI.decode_query(acc.query || "") |> Map.put(key, to_string(value))
%{acc | query: URI.encode_query(query)}
end)
query_string = URI.encode_query(Service.flatten(payload))
{to_string(url) <> "?" <> query_string}
end
end




@doc """
Fetches the favicon of a given URL.
Expand All @@ -131,25 +115,28 @@ defmodule Appwrite.Services.Avatars do
## Raises
- `AppwriteException` if the `url` is nil.
"""
@spec get_favicon(Client.t(), String.t()) :: String.t()
def get_favicon(client, url) when is_binary(url) do
api_path = "/avatars/favicon"
payload = %{"url" => url, "project" => client.config.project}
@spec get_favicon(String.t()) :: String.t()
def get_favicon(url) when is_binary(url) do
api_path = "/v1/avatars/favicon"

with {:ok, uri} <- prepare_uri(client.config.endpoint, api_path, payload) do
Client.call(client, uri)
else
{:error, reason} -> raise AppwriteException, message: reason
end
payload = %{
"url" => url,
"project" => Client.default_config()["project"]
}

url = URI.merge(Client.default_config()[~c"endpoint"], api_path)

query_string = URI.encode_query(Service.flatten(payload))
{to_string(url) <> "?" <> query_string}
end

def get_favicon(_client, nil), do: raise AppwriteException, message: "Missing required parameter: 'url'"
def get_favicon(_client, nil),
do: raise(AppwriteException, message: "Missing required parameter: 'url'")

@doc """
Fetches a country flag icon by its ISO 3166-1 code.
## Parameters
- `client` (Client.t): The client instance.
- `code` (string): ISO 3166-1 2-letter country code.
- `width` (optional, integer): The width of the flag icon.
- `height` (optional, integer): The height of the flag icon.
Expand All @@ -161,27 +148,27 @@ defmodule Appwrite.Services.Avatars do
## Raises
- `AppwriteException` if the `code` is nil.
"""
@spec get_flag(Client.t(), String.t(), integer(), integer(), integer()) :: String.t()
def get_flag(client, code, width \\ nil, height \\ nil, quality \\ nil) when is_binary(code) do
api_path = "/avatars/flags/#{code}"
@spec get_flag(String.t(), integer(), integer(), integer()) :: String.t()
def get_flag(code, width \\ nil, height \\ nil, quality \\ nil) when is_binary(code) do
api_path = "/v1/avatars/flags/#{code}"

payload =
%{
"quality" => quality,
"width" => width,
"height" => height,
"quality" => quality,
"project" => client.config.project
"project" => Client.default_config()["project"]
}
|> Enum.reject(fn {_, v} -> v == nil end)

with {:ok, uri} <- prepare_uri(client.config.endpoint, api_path, payload) do
Client.call(client, uri)
else
{:error, reason} -> raise AppwriteException, message: reason
end
url = URI.merge(Client.default_config()[~c"endpoint"], api_path)

query_string = URI.encode_query(Service.flatten(payload))
{to_string(url) <> "?" <> query_string}
end

def get_flag(_client, nil, _width, _height, _quality),
do: raise AppwriteException, message: "Missing required parameter: 'code'"
do: raise(AppwriteException, message: "Missing required parameter: 'code'")

@doc """
Fetches and optionally crops a remote image by URL.
Expand All @@ -198,33 +185,32 @@ defmodule Appwrite.Services.Avatars do
## Raises
- `AppwriteException` if the `url` is nil.
"""
@spec get_image(Client.t(), String.t(), integer(), integer()) :: String.t()
def get_image(client, url, width \\ nil, height \\ nil) when is_binary(url) do
api_path = "/avatars/image"
@spec get_image(String.t(), integer(), integer()) :: String.t()
def get_image(url, width \\ nil, height \\ nil) when is_binary(url) do
api_path = "/v1/avatars/image"

payload =
%{
"url" => url,
"width" => width,
"height" => height,
"project" => client.config.project
"project" => Client.default_config()["project"]
}
|> Enum.reject(fn {_, v} -> v == nil end)

with {:ok, uri} <- prepare_uri(client.config.endpoint, api_path, payload) do
Client.call(client, uri)
else
{:error, reason} -> raise AppwriteException, message: reason
end
url = URI.merge(Client.default_config()[~c"endpoint"], api_path)

query_string = URI.encode_query(Service.flatten(payload))
{to_string(url) <> "?" <> query_string}
end

def get_image(_client, nil, _width, _height),
do: raise AppwriteException, message: "Missing required parameter: 'url'"
do: raise(AppwriteException, message: "Missing required parameter: 'url'")

@doc """
Generates a user initials avatar.
## Parameters
- `client` (Client.t): The client instance.
- `name` (optional, string): The name or initials of the user.
- `width` (optional, integer): The width of the avatar.
- `height` (optional, integer): The height of the avatar.
Expand All @@ -233,31 +219,30 @@ defmodule Appwrite.Services.Avatars do
## Returns
- `String.t`: The URI for fetching the initials avatar.
"""
@spec get_initials(Client.t(), String.t(), integer(), integer(), String.t()) :: String.t()
def get_initials(client, name \\ nil, width \\ nil, height \\ nil, background \\ nil) do
api_path = "/avatars/initials"
@spec get_initials(String.t(), integer(), integer(), String.t()) :: String.t()
def get_initials(name \\ nil, width \\ nil, height \\ nil, background \\ nil) do
api_path = "/v1/avatars/initials"

payload =
%{
"name" => name,
"background" => background,
"width" => width,
"height" => height,
"background" => background,
"project" => client.config.project
"project" => Client.default_config()["project"]
}
|> Enum.reject(fn {_, v} -> v == nil end)

with {:ok, uri} <- prepare_uri(client.config.endpoint, api_path, payload) do
Client.call(client, uri)
else
{:error, reason} -> raise AppwriteException, message: reason
end
url = URI.merge(Client.default_config()[~c"endpoint"], api_path)

query_string = URI.encode_query(Service.flatten(payload))
{to_string(url) <> "?" <> query_string}
end

@doc """
Generates a QR code from the given text.
## Parameters
- `client` (Client.t): The client instance.
- `text` (string): The text to encode in the QR code.
- `size` (optional, integer): The size of the QR code.
- `margin` (optional, integer): The margin around the QR code.
Expand All @@ -269,28 +254,28 @@ defmodule Appwrite.Services.Avatars do
## Raises
- `AppwriteException` if the `text` is nil.
"""
@spec get_qr(Client.t(), String.t(), integer(), integer(), boolean()) :: String.t()
def get_qr(client, text, size \\ nil, margin \\ nil, download \\ nil) when is_binary(text) do
api_path = "/avatars/qr"
@spec get_qr(String.t(), integer(), integer(), boolean()) :: String.t()
def get_qr(text, size \\ nil, margin \\ nil, download \\ nil) when is_binary(text) do
api_path = "/v1/avatars/qr"

payload =
%{
"text" => text,
"size" => size,
"margin" => margin,
"download" => download,
"project" => client.config.project
"project" => Client.default_config()["project"]
}
|> Enum.reject(fn {_, v} -> v == nil end)

with {:ok, uri} <- prepare_uri(client.config.endpoint, api_path, payload) do
Client.call(client, uri)
else
{:error, reason} -> raise AppwriteException, message: reason
end
url = URI.merge(Client.default_config()[~c"endpoint"], api_path)

query_string = URI.encode_query(Service.flatten(payload))
{to_string(url) <> "?" <> query_string}
end

def get_qr(_client, nil, _size, _margin, _download),
do: raise AppwriteException, message: "Missing required parameter: 'text'"
do: raise(AppwriteException, message: "Missing required parameter: 'text'")

defp prepare_uri(endpoint, api_path, payload) do
uri = URI.merge(endpoint, api_path)
Expand All @@ -300,13 +285,27 @@ defmodule Appwrite.Services.Avatars do
e -> {:error, Exception.message(e)}
end



# Helper function to optionally add a key to a map
@spec maybe_put(map(), String.t(), any()) :: map()
defp maybe_put(map, key, value) when is_nil(value), do: map
defp maybe_put(map, key, value), do: Map.put(map, key, value)

# Helper function to validate parameters
@spec validate_params(map()) :: :ok | no_return()
defp validate_params(params) do
Enum.each(params, fn {key, value} ->
if is_nil(value) do
raise AppwriteException, "Missing required parameter: #{inspect(key)}"
end
end)
end


# Helper function to build query params
@spec build_query_params(URI.t(), map()) :: URI.t()
defp build_query_params(uri, payload) do
Enum.reduce(payload, uri, fn {key, value}, acc ->
query = URI.decode_query(acc.query || "") |> Map.put(key, to_string(value))
%{acc | query: URI.encode_query(query)}
end)
end
end
Loading

0 comments on commit 6fe8983

Please sign in to comment.