Current section
Files
Jump to
Current section
Files
lib/models/message_outbound_hsm.ex
defmodule Whatsapp.Models.MessageOutboundHsm do
@moduledoc """
Estructura del mensaje de Whatsapp HSM
"""
require Logger
alias __MODULE__
@enforce_keys [:to, :language_policy, :params]
defstruct(
to: nil,
namespace: nil,
element_name: nil,
language_policy: nil,
language_code: nil,
params: nil
)
@valid_language_policies ["deterministic"]
@default_values %{
language_policy: "deterministic",
params: []
}
@type t :: %__MODULE__{}
@doc """
Crea un mensaje nuevo
"""
@spec new(Keyword.t()) :: __MODULE__.t()
def new(options) do
attrs = Enum.into(options, Map.new())
Kernel.struct(__MODULE__, Map.merge(@default_values, attrs))
end
# Valida que el tipo de selección de lenguaje sea válido
@spec _validate_policy(MessageOutboundHsm.t()) :: String.t()
defp _validate_policy(%MessageOutboundHsm{language_policy: language_policy} = msg)
when language_policy in @valid_language_policies do
{:ok, msg}
end
defp _validate_policy(_message), do: {:error, "Invalid language policy"}
def validate(message) do
with {:ok, message} <- _validate_policy(message) do
{:ok, message}
end
end
# Formatea la lista de parametros como parametros default para el HSM
@spec format_params([String.t()]) :: [map]
defp format_params(params) do
Enum.map(params, fn param ->
%{
text: param,
type: "text"
}
end)
end
def to_json(%__MODULE__{} = message) do
%{
recipient_type: "individual",
to: message.to,
type: "template",
template: %{
components: [
%{
parameters: format_params(message.params),
type: "body"
}
],
language: %{
code: message.language_code,
policy: message.language_policy
},
name: message.element_name,
namespace: message.namespace
}
}
end
end