Skip to content

Commit

Permalink
KAZOO-1770: Update crossbar bindings. Now version are in different fo…
Browse files Browse the repository at this point in the history
…lders with their own bindings
  • Loading branch information
Peter Defebvre committed Jan 16, 2014
1 parent 64cd90f commit 4b2a88f
Show file tree
Hide file tree
Showing 8 changed files with 547 additions and 172 deletions.
10 changes: 6 additions & 4 deletions applications/crossbar/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -20,20 +20,22 @@ all: compile

MODULES = $(shell ls src/*.erl | sed 's/src\///;s/\.erl/,/' | sed '$$s/.$$//')
CB_MODULES = $(shell ls src/modules/*.erl | sed 's/src\/modules\///;s/\.erl/,/' | sed '$$s/.$$//')
CB_MODULES_V1 = $(shell ls src/modules_v1/*.erl | sed 's/src\/modules_v1\///;s/\.erl/,/' | sed '$$s/.$$//')
CB_MODULES_V2 = $(shell ls src/modules_v2/*.erl | sed 's/src\/modules_v2\///;s/\.erl/,/' | sed '$$s/.$$//')

compile: ebin/$(PROJECT).app
@cat src/$(PROJECT).app.src \
| sed 's/{modules, \[\]}/{modules, \[$(MODULES),$(CB_MODULES)\]}/' \
| sed 's/{modules, \[\]}/{modules, \[$(MODULES),$(CB_MODULES),$(CB_MODULES_V1),$(CB_MODULES_V2)\]}/' \
> ebin/$(PROJECT).app
-@$(MAKE) ebin/$(PROJECT).app

ebin/$(PROJECT).app: src/*.erl src/modules/*.erl
ebin/$(PROJECT).app: src/*.erl src/*/*.erl
@mkdir -p ebin/
ERL_LIBS=$(ERL_LIBS) erlc -v $(ERLC_OPTS) -o ebin/ -pa ebin/ $?

compile-test: test/$(PROJECT).app
@cat src/$(PROJECT).app.src \
| sed 's/{modules, \[\]}/{modules, \[$(MODULES),$(CB_MODULES)\]}/' \
| sed 's/{modules, \[\]}/{modules, \[$(MODULES),$(CB_MODULES,$(CB_MODULES_V1),$(CB_MODULES_V2))\]}/' \
> test/$(PROJECT).app
-@$(MAKE) test/$(PROJECT).app

Expand All @@ -49,7 +51,7 @@ clean:
test: clean compile-test eunit

eunit: compile-test
erl -noshell -pa test -eval "eunit:test([$(MODULES),$(CB_MODULES)], [verbose])" -s init stop
erl -noshell -pa test -eval "eunit:test([$(MODULES),$(CB_MODULES,$(CB_MODULES_V1),$(CB_MODULES_V2))], [verbose])" -s init stop

dialyze:
@$(DIALYZER) $(foreach DIR,$(DIRS),$(DIR)/ebin) \
Expand Down
2 changes: 1 addition & 1 deletion applications/crossbar/src/api_resource.erl
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ known_methods(Req, Context) ->
allowed_methods(Req0, Context) ->
Methods = cb_context:allowed_methods(Context),
{Tokens, Req1} = cowboy_req:path_info(Req0),
case api_util:parse_path_tokens(Tokens) of
case api_util:parse_path_tokens(Context, Tokens) of
[_|_] = Nouns ->
%% Because we allow tunneling of verbs through the request,
%% we have to check and see if we need to override the actual
Expand Down
39 changes: 25 additions & 14 deletions applications/crossbar/src/api_util.erl
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
,is_cors_request/1
,add_cors_headers/2
,allow_methods/4
,parse_path_tokens/1
,parse_path_tokens/2
,get_req_data/2
,get_http_verb/2
,is_authentic/2
Expand Down Expand Up @@ -468,34 +468,45 @@ get_http_verb(Method, Context) ->

-type cb_mod_with_tokens() :: {ne_binary(), path_tokens()}.
-type cb_mods_with_tokens() :: [cb_mod_with_tokens(),...] | [].
-spec parse_path_tokens(path_tokens()) -> cb_mods_with_tokens().
parse_path_tokens(Tokens) ->
parse_path_tokens(Tokens, []).
-spec parse_path_tokens(cb_context:context(), path_tokens()) -> cb_mods_with_tokens().
parse_path_tokens(Context, Tokens) ->
parse_path_tokens(Context, Tokens, []).

-spec parse_path_tokens(wh_json:json_strings(), cb_mods_with_tokens()) ->
-spec parse_path_tokens(cb_context:context(), wh_json:json_strings(), cb_mods_with_tokens()) ->
cb_mods_with_tokens().
parse_path_tokens([], Events) -> Events;
parse_path_tokens([<<"schemas">>=Mod|T], Events) ->
parse_path_tokens(_, [], Events) -> Events;
parse_path_tokens(_, [<<"schemas">>=Mod|T], Events) ->
[{Mod, T} | Events];
parse_path_tokens([<<"braintree">>=Mod|T], Events) ->
parse_path_tokens(_, [<<"braintree">>=Mod|T], Events) ->
[{Mod, T} | Events];
parse_path_tokens([Mod|T], Events) ->
case is_cb_module(Mod) of
parse_path_tokens(Context, [Mod|T], Events) ->
case is_cb_module(Context, Mod) of
'false' -> [];
'true' ->
{Params, List2} = lists:splitwith(fun(Elem) -> not is_cb_module(Elem) end, T),
parse_path_tokens(List2, [{Mod, Params} | Events])
{Params, List2} = lists:splitwith(fun(Elem) -> not is_cb_module(Context, Elem) end, T),
parse_path_tokens(Context, List2, [{Mod, Params} | Events])
end.

-spec is_cb_module(ne_binary()) -> boolean().
is_cb_module(Elem) ->
-spec is_cb_module(cb_context:context(), ne_binary()) -> boolean().
is_cb_module(Context, Elem) ->
try (wh_util:to_atom(<<"cb_", Elem/binary>>)):module_info('imports') of
_ -> 'true'
catch
'error':'badarg' -> 'false'; %% atom didn't exist already
_E:_R -> is_cb_module_version(Context, Elem)
end.

-spec is_cb_module_version(cb_context:context(), ne_binary()) -> boolean().
is_cb_module_version(#cb_context{api_version=ApiVersion}, Elem) ->
try (wh_util:to_atom(<<"cb_", Elem/binary, "_", ApiVersion/binary>>)):module_info('imports') of
_ -> 'true'
catch
'error':'badarg' -> 'false'; %% atom didn't exist already
_E:_R -> 'false'
end.



%%--------------------------------------------------------------------
%% @private
%% @doc
Expand Down
2 changes: 2 additions & 0 deletions applications/crossbar/src/crossbar.hrl
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
-define(APP_NAME, <<"crossbar">>).
-define(APP_VERSION, <<"0.8.0">>).

-define(VERSION_SUPPORTED, [<<"v1">>, <<"v2">>]).

-define(CACHE_TTL, whapps_config:get_integer(<<"crossbar">>, <<"cache_ttl">>, 300)).

-define(CROSSBAR_DEFAULT_CONTENT_TYPE, {<<"application">>, <<"json">>, []}).
Expand Down
17 changes: 16 additions & 1 deletion applications/crossbar/src/crossbar_bindings.erl
Original file line number Diff line number Diff line change
Expand Up @@ -206,9 +206,24 @@ maybe_init_mod(ModBin) ->
_ -> 'ok'
catch
_E:_R ->
lager:warning("failed to initialize ~s: ~p, ~p", [ModBin, _E, _R])
lager:warning("failed to initialize ~s: ~p, ~p. Trying other versions...", [ModBin, _E, _R]),
maybe_init_mod_versions(?VERSION_SUPPORTED, ModBin)
end.

maybe_init_mod_versions([], _) -> 'ok';
maybe_init_mod_versions([Version|Versions], ModBin) ->
Module = <<ModBin/binary, "_", Version/binary>>,
try (wh_util:to_atom(Module, 'true')):init() of
_ -> maybe_init_mod_versions(Versions, ModBin)
catch
_E:_R ->
lager:warning("failed to initialize ~s: ~p, ~p", [Module, _E, _R]),
maybe_init_mod_versions(Versions, ModBin)
end.




%%--------------------------------------------------------------------
%% @private
%% @doc
Expand Down
78 changes: 0 additions & 78 deletions applications/crossbar/src/modules/cb_phone_numbers_v1.erl

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
%%% Karl Anderson
%%% James Aimonetti
%%%-------------------------------------------------------------------
-module(cb_phone_numbers).
-module(cb_phone_numbers_v1).

-export([init/0
,allowed_methods/0, allowed_methods/1, allowed_methods/2, allowed_methods/3
,resource_exists/0, resource_exists/1, resource_exists/2, resource_exists/3
,content_types_accepted/4
,validate/2, validate/3, validate/4
,validate/1 ,validate/2, validate/3, validate/4
,validate_request/1
,authorize/1
,authenticate/1
Expand All @@ -24,8 +24,6 @@
,delete/2, delete/4
,summary/1
,populate_phone_numbers/1
,read/2
,set_response/3
]).

-include("../crossbar.hrl").
Expand All @@ -50,6 +48,7 @@
,{<<"application">>, <<"x-base64">>}
]).
-define(PHONE_NUMBERS_CONFIG_CAT, <<"crossbar.phone_numbers">>).
-define(FIND_NUMBER_SCHEMA, "{\"$schema\": \"http://json-schema.org/draft-03/schema#\", \"id\": \"http://json-schema.org/draft-03/schema#\", \"properties\": {\"prefix\": {\"required\": \"true\", \"type\": \"string\", \"minLength\": 3, \"maxLength\": 10}, \"quantity\": {\"default\": 1, \"type\": \"integer\", \"minimum\": 1}}}").

-define(MAX_TOKENS, whapps_config:get_integer(?PHONE_NUMBERS_CONFIG_CAT, <<"activations_per_day">>, 100)).

Expand All @@ -58,23 +57,17 @@
%%%===================================================================
init() ->
_ = crossbar_bindings:bind(<<"account.created">>, ?MODULE, 'populate_phone_numbers'),
_ = crossbar_bindings:bind(<<"*.content_types_accepted.phone_numbers">>, ?MODULE, 'content_types_accepted'),
_ = crossbar_bindings:bind(<<"v2_resource.authenticate">>, 'cb_phone_numbers_v2', 'authenticate'),
_ = crossbar_bindings:bind(<<"*.authenticate">>, ?MODULE, 'authenticate'),
_ = crossbar_bindings:bind(<<"v2_resource.authorize">>, 'cb_phone_numbers_v2', 'authorize'),
_ = crossbar_bindings:bind(<<"*.authorize">>, ?MODULE, 'authorize'),
_ = crossbar_bindings:bind(<<"v2_resource.allowed_methods.phone_numbers">>, 'cb_phone_numbers_v2', 'allowed_methods'),
_ = crossbar_bindings:bind(<<"*.allowed_methods.phone_numbers">>, ?MODULE, 'allowed_methods'),
_ = crossbar_bindings:bind(<<"v2_resource.resource_exists.phone_numbers">>, 'cb_phone_numbers_v2', 'resource_exists'),
_ = crossbar_bindings:bind(<<"*.resource_exists.phone_numbers">>, ?MODULE, 'resource_exists'),
_ = crossbar_bindings:bind(<<"v1_resource.validate.phone_numbers">>, 'cb_phone_numbers_v1', 'validate'),
_ = crossbar_bindings:bind(<<"v2_resource.validate.phone_numbers">>, 'cb_phone_numbers_v2', 'validate'),
% _ = crossbar_bindings:bind(<<"*.validate.phone_numbers">>, ?MODULE, 'validate'),
_ = crossbar_bindings:bind(<<"v2_resource.execute.put.phone_numbers">>, 'cb_phone_numbers_v2', 'put'),
_ = crossbar_bindings:bind(<<"*.execute.put.phone_numbers">>, ?MODULE, 'put'),
_ = crossbar_bindings:bind(<<"v2_resource.execute.post.phone_numbers">>, 'cb_phone_numbers_v2', 'post'),
_ = crossbar_bindings:bind(<<"*.execute.post.phone_numbers">>, ?MODULE, 'post'),
crossbar_bindings:bind(<<"*.execute.delete.phone_numbers">>, ?MODULE, 'delete').
_ = crossbar_bindings:bind(<<"v1_resource.content_types_accepted.phone_numbers">>, ?MODULE, 'content_types_accepted'),
_ = crossbar_bindings:bind(<<"v1_resource.authenticate">>, ?MODULE, 'authenticate'),
_ = crossbar_bindings:bind(<<"v1_resource.authorize">>, ?MODULE, 'authorize'),
_ = crossbar_bindings:bind(<<"v1_resource.allowed_methods.phone_numbers">>, ?MODULE, 'allowed_methods'),
_ = crossbar_bindings:bind(<<"v1_resource.resource_exists.phone_numbers">>, ?MODULE, 'resource_exists'),
_ = crossbar_bindings:bind(<<"v1_resource.validate.phone_numbers">>, ?MODULE, 'validate'),
_ = crossbar_bindings:bind(<<"v1_resource.execute.put.phone_numbers">>, ?MODULE, 'put'),
_ = crossbar_bindings:bind(<<"v1_resource.execute.post.phone_numbers">>, ?MODULE, 'post'),
crossbar_bindings:bind(<<"v1_resource.execute.delete.phone_numbers">>, ?MODULE, 'delete').


%%--------------------------------------------------------------------
%% @public
%% @doc
Expand Down Expand Up @@ -210,10 +203,18 @@ content_types_accepted(#cb_context{req_verb = ?HTTP_POST}=Context, _Number, ?POR
%% Failure here returns 400
%% @end
%%--------------------------------------------------------------------
-spec validate(cb_context:context()) -> cb_context:context().
-spec validate(cb_context:context(), path_token()) -> cb_context:context().
-spec validate(cb_context:context(), path_token(), path_token()) -> cb_context:context().
-spec validate(cb_context:context(), path_token(), path_token(), path_token()) -> cb_context:context().

validate(#cb_context{req_verb = ?HTTP_GET
,account_id='undefined'
}=Context) ->
find_numbers(Context);
validate(#cb_context{req_verb = ?HTTP_GET}=Context) ->
summary(Context).

validate(#cb_context{req_verb = ?HTTP_PUT}=Context, ?COLLECTION) ->
validate_request(Context);
validate(#cb_context{req_verb = ?HTTP_POST}=Context, ?COLLECTION) ->
Expand All @@ -224,6 +225,10 @@ validate(#cb_context{req_verb = ?HTTP_GET}=Context, ?CLASSIFIERS) ->
cb_context:set_resp_data(cb_context:set_resp_status(Context, 'success')
,wnm_util:available_classifiers()
);
validate(#cb_context{req_verb = ?HTTP_GET}=Context, Number) ->
read(Number, Context);
validate(#cb_context{req_verb = ?HTTP_POST}=Context, _Number) ->
validate_request(Context);
validate(#cb_context{req_verb = ?HTTP_PUT}=Context, _Number) ->
validate_request(Context);
validate(#cb_context{req_verb = ?HTTP_DELETE}=Context, _Number) ->
Expand Down Expand Up @@ -405,6 +410,48 @@ read(Number, Context) ->
Result = wh_number_manager:get_public_fields(Number, cb_context:auth_account_id(Context)),
set_response(Result, Number, Context).

%%--------------------------------------------------------------------
%% @private
%% @doc
%%
%% @end
%%--------------------------------------------------------------------
-spec find_numbers(cb_context:context()) -> cb_context:context().
find_numbers(Context) ->
AccountId = cb_context:auth_account_id(Context),
QueryString = wh_json:set_value(<<"Account-ID">>, AccountId, cb_context:query_string(Context)),
OnSuccess = fun(C) ->
cb_context:set_resp_data(
cb_context:set_resp_status(C, 'success')
,get_numbers(QueryString)
)
end,
Schema = wh_json:decode(?FIND_NUMBER_SCHEMA),
cb_context:validate_request_data(Schema
,cb_context:set_req_data(Context, QueryString)
,OnSuccess
).

%%--------------------------------------------------------------------
%% @private
%% @doc
%%
%% @end
%%--------------------------------------------------------------------
-spec get_numbers(wh_json:object()) -> ne_binaries().
get_numbers(QueryString) ->
Prefix = wh_json:get_ne_value(<<"prefix">>, QueryString),
Quantity = wh_json:get_ne_value(<<"quantity">>, QueryString, 1),
lists:reverse(
lists:foldl(
fun(JObj, Acc) ->
[wh_json:get_value(<<"number">>, JObj)|Acc]
end
,[]
,wh_number_manager:find(Prefix, Quantity, wh_json:to_proplist(QueryString))
)
).

%%--------------------------------------------------------------------
%% @private
%% @doc
Expand Down
Loading

0 comments on commit 4b2a88f

Please sign in to comment.