defmodule GlificWeb.Providers.Airtel.Controllers.MessageController do
@moduledoc """
Dedicated controller to handle different types of inbound message from Airtel
"""
use GlificWeb, :controller
alias Glific.{
Communications,
Providers.Airtel
}
@doc false
@spec handler(Plug.Conn.t(), map(), String.t()) :: Plug.Conn.t()
def handler(conn, _params, _msg) do
conn
|> Plug.Conn.send_resp(200, "")
|> Plug.Conn.halt()
end
@doc """
Parse text message payload and convert that into Glific message struct
"""
@spec text(Plug.Conn.t(), map()) :: Plug.Conn.t()
def text(conn, params) do
params
|> Airtel.Message.receive_text()
|> Map.put(:organization_id, conn.assigns[:organization_id])
|> Communications.Message.receive_message()
handler(conn, params, "text handler")
end
# @doc """
# Callback for airtel image type
# """
# @spec image(Plug.Conn.t(), map()) :: Plug.Conn.t()
# def image(conn, params), do: media(conn, params, :image)
# @doc """
# Callback for airtel file type
# """
# @spec file(Plug.Conn.t(), map()) :: Plug.Conn.t()
# def file(conn, params), do: media(conn, params, :document)
# @doc """
# Callback for airtel audio type
# """
# @spec audio(Plug.Conn.t(), map()) :: Plug.Conn.t()
# def audio(conn, params), do: media(conn, params, :audio)
# @doc """
# Callback for airtel video type
# """
# @spec video(Plug.Conn.t(), map()) :: Plug.Conn.t()
# def video(conn, params), do: media(conn, params, :video)
# @doc """
# Callback for airtel sticker image
# """
# @spec sticker(Plug.Conn.t(), map()) :: Plug.Conn.t()
# def sticker(conn, params), do: media(conn, params, :sticker)
# @doc false
# # Handle Airtel media message and convert them into Glific Message struct
# @spec media(Plug.Conn.t(), map(), atom()) :: Plug.Conn.t()
# defp media(conn, params, type) do
# params
# |> Airtel.Message.receive_media()
# |> Map.put(:organization_id, conn.assigns[:organization_id])
# |> Communications.Message.receive_message(type)
# handler(conn, params, "media handler")
# end
@doc """
Callback for interactive quick reply type
"""
@spec quick_reply(Plug.Conn.t(), map()) :: Plug.Conn.t()
def quick_reply(conn, params), do: interactive(conn, params, :quick_reply)
@doc """
Callback for interactive list
"""
@spec list(Plug.Conn.t(), map()) :: Plug.Conn.t()
def list(conn, params), do: interactive(conn, params, :list)
@doc false
# Handle Airtel interactive message and convert them into Glific Message struct
@spec interactive(Plug.Conn.t(), map(), atom()) :: Plug.Conn.t()
defp interactive(conn, params, type) do
params
|> Airtel.Message.receive_interactive()
|> Map.put(:organization_id, conn.assigns[:organization_id])
|> Communications.Message.receive_message(type)
handler(conn, params, "interactive handler")
end
# @doc false
# # Handle Airtel location message and convert them into Glific Message struct
# @spec location(Plug.Conn.t(), map()) :: Plug.Conn.t()
# def location(conn, params) do
# params
# |> Airtel.Message.receive_location()
# |> Map.put(:organization_id, conn.assigns[:organization_id])
# |> Communications.Message.receive_message(:location)
# handler(conn, params, "location handler")
# end
end