lib/impl/http_client.ex

defmodule ExMicrosoftTeams.Impl.HTTPClient do
  @moduledoc "Implementation to send messages to Microsoft Teams"
  use Tesla

  plug(Tesla.Middleware.Headers, [{"Content-Type", "application/json"}])
  plug(Tesla.Middleware.JSON, engine: Jason, engine_opts: [keys: :atoms])

  def send_message(nil, _message) do
    {:error, "The Webhook URL is required."}
  end

  def send_message(_web_hook_url, nil) do
    {:error, "A message is required."}
  end

  def send_message(webhook_url, message) do
    case channel_notification(webhook_url, message) do
      {:ok, body} ->
        {:ok, body}

      {:error, message} ->
        {:error, message}
    end
  end

  defp channel_notification(webhook, message) do
    case post(webhook, payload(message)) do
      {:ok, %Tesla.Env{body: body}} ->
        {:ok, body}

      {:error, reason} ->
        {:error, inspect(reason)}
    end
  end

  defp payload(message) do
    %{text: message}
  end
end