Packages

Bellboy is HTTP client library for send SMS by different services like Plivo, Twilio, Nexmo

Current section

Files

Jump to
bellboy src bellboy_nexmo.erl
Raw

src/bellboy_nexmo.erl

-module(bellboy_nexmo).
%%% ==================================================================
%%% API
%%% ==================================================================
-export([message/1]).
%%% ==================================================================
%%% Includes
%%% ==================================================================
-include("bellboy.hrl").
%%% ==================================================================
%%% API functions
%%% ==================================================================
%% -------------------------------------------------------------------
%% @private
%% @doc
%% Plivo handler
%% @end
%% -------------------------------------------------------------------
message(#{type := send_sms} = Data) ->
send_sms(maps:without([type], Data));
message(#{type := send_pin} = Data) ->
send_pin(maps:without([type], Data));
message(#{type := cancel_pin} = Data) ->
cancel_pin(maps:without([type], Data));
message(#{type := check_pin} = Data) ->
check_pin(maps:without([type], Data));
message(_) ->
?BAD_ARG.
%%% ==================================================================
%%% Internal/Private functions
%%% ==================================================================
%% -------------------------------------------------------------------
%% @private
%% @doc
%% Send simple SMS message
%% @end
%% -------------------------------------------------------------------
-spec send_sms(Params :: maps:map()) -> {ok, Result :: maps:map()} | {error, Reason :: tuple() | bad_arg}.
send_sms(#{from := F, text := TXT, to := T, api_key := AK, api_secret := AC} = B) ->
case bellboy_utils:is_valid([is_binary(F), is_binary(TXT), is_binary(T), is_binary(AK), is_binary(AC)]) of
true ->
RD = #{m => post, u => ?NEXMO_URL_MSG, ct => "application/json", b => jiffy:encode(B)},
case bellboy_utils:httpc_request(RD) of
{ok, Resp} ->
{ok, #{code => bellboy_utils:get_code(Resp), body => bellboy_utils:gen_body(bellboy_utils:get_body(Resp)), response => Resp}};
Error ->
Error
end;
false ->
?BAD_ARG
end;
send_sms(_) ->
?BAD_ARG.
%% -------------------------------------------------------------------
%% @private
%% @doc
%% Send PIN SMS
%% @end
%% -------------------------------------------------------------------
-spec send_pin(Params :: maps:map()) -> {ok, Result :: maps:map()} | {error, Reason :: tuple() | bad_arg}.
send_pin(#{api_key := AK, api_secret := AC, number := N, brand := B, code_length := CL}) ->
case bellboy_utils:is_valid([is_list(AK), is_list(AC), is_list(N), is_list(B), is_list(CL)]) of
true ->
URI = "?api_key=" ++ http_uri:encode(AK) ++ "&api_secret=" ++ http_uri:encode(AC) ++ "&number=" ++ http_uri:encode(N) ++ "&brand=" ++ http_uri:encode(B) ++ "&code_length=" ++ http_uri:encode(CL),
RD = #{m => get, u => ?NEXMO_URL_VERIFY ++ URI},
case bellboy_utils:httpc_request(RD) of
{ok, Resp} ->
{ok, #{code => bellboy_utils:get_code(Resp), body => bellboy_utils:gen_body(bellboy_utils:get_body(Resp)), response => Resp}};
Error ->
Error
end;
false ->
?BAD_ARG
end;
send_pin(_) ->
?BAD_ARG.
%% -------------------------------------------------------------------
%% @private
%% @doc
%% Cancel PIN SMS
%% @end
%% -------------------------------------------------------------------
-spec cancel_pin(Params :: maps:map()) -> {ok, Result :: maps:map()} | {error, Reason :: tuple() | bad_arg}.
cancel_pin(#{api_key := AK, api_secret := AC, request_id := RID}) when is_list(AK), is_list(AC), is_list(RID) ->
URI = "?api_key=" ++ http_uri:encode(AK) ++ "&api_secret=" ++ http_uri:encode(AC) ++ "&cmd=cancel" ++ "&request_id=" ++ http_uri:encode(RID),
RD = #{m => get, u => ?NEXMO_URL_CONTROL ++ URI},
case bellboy_utils:httpc_request(RD) of
{ok, Resp} ->
{ok, #{code => bellboy_utils:get_code(Resp), body => bellboy_utils:gen_body(bellboy_utils:get_body(Resp)), response => Resp}};
Error ->
Error
end;
cancel_pin(_) ->
?BAD_ARG.
%% -------------------------------------------------------------------
%% @private
%% @doc
%% Check PIN SMS
%% @end
%% -------------------------------------------------------------------
-spec check_pin(Params :: maps:map()) -> {ok, Result :: maps:map()} | {error, Reason :: tuple() | bad_arg}.
check_pin(#{api_key := AK, api_secret := AC, request_id := RID, code := C}) when is_list(AK), is_list(AC), is_list(RID), is_list(C) ->
URI = "?api_key=" ++ http_uri:encode(AK) ++ "&api_secret=" ++ http_uri:encode(AC) ++ "&request_id=" ++ http_uri:encode(RID) ++ "&code=" ++ http_uri:encode(C),
RD = #{m => get, u => ?NEXMO_URL_CHECK ++ URI},
case bellboy_utils:httpc_request(RD) of
{ok, Resp} ->
{ok, #{code => bellboy_utils:get_code(Resp), body => bellboy_utils:gen_body(bellboy_utils:get_body(Resp)), response => Resp}};
Error ->
Error
end;
check_pin(_) ->
?BAD_ARG.