Skip to content

Commit

Permalink
WHISTLE-1016: updated the crossbar modules and carriers to follow the…
Browse files Browse the repository at this point in the history
… new authorizing scheme
  • Loading branch information
k-anderson committed May 4, 2012
1 parent 4d3fb0c commit 2681c90
Show file tree
Hide file tree
Showing 7 changed files with 223 additions and 82 deletions.
Expand Up @@ -4,7 +4,7 @@
-define(WNM_CONFIG_CAT, <<"number_manager">>).

-define(WNM_NUMBER_STATUS, [<<"discovery">>, <<"available">>, <<"reserved">>, <<"released">>
,<<"in_service">>, <<"disconnected">>, <<"cancelled">>]).
,<<"porting">> ,<<"in_service">>, <<"disconnected">>, <<"cancelled">>]).
-define(WNM_AVALIABLE_STATES, [<<"discovery">>, <<"available">>]).

-define(WNM_DEAFULT_CARRIER_MODULES, [<<"wnm_local">>]).
Expand Down
10 changes: 4 additions & 6 deletions lib/whistle_number_manager-1.0.0/src/carriers/wnm_bandwidth.erl
Expand Up @@ -83,19 +83,17 @@ find_numbers(Search, Quanity) ->
%%--------------------------------------------------------------------
-spec acquire_number/3 :: (ne_binary(), ne_binary(), wh_json:json_object()) -> {ok, ne_binary(), wh_json:json_object()} |
{error, ne_binary()}.
acquire_number(_, <<"available">>, JObj) ->
{ok, <<"in_service">>, JObj};
acquire_number(_, <<"discovery">>, JObj) ->
case whapps_config:get_is_true(?WNM_BW_CONFIG_CAT, <<"enable_provisioning">>, <<"true">>) of
true ->
order_number(JObj);
false ->
{ok, <<"in_service">>, JObj}
end;
acquire_number(_, <<"claim">>, JObj) ->
{ok, <<"in_service">>, JObj};
acquire_number(_, _, _) ->
{error, unavailable}.
acquire_number(_, <<"in_service">>, _) ->
{error, unavailable};
acquire_number(_, _, JObj) ->
{ok, <<"in_service">>, JObj}.

%%--------------------------------------------------------------------
%% @private
Expand Down
10 changes: 4 additions & 6 deletions lib/whistle_number_manager-1.0.0/src/carriers/wnm_local.erl
Expand Up @@ -52,12 +52,10 @@ find_numbers(Number, Quanity) ->
%%--------------------------------------------------------------------
-spec acquire_number/3 :: (ne_binary(), ne_binary(), wh_json:json_object()) -> {ok, ne_binary(), wh_json:json_object()}
| {error, ne_binary()}.
acquire_number(_, <<"available">>, JObj) ->
{ok, <<"in_service">>, JObj};
acquire_number(_, <<"claim">>, JObj) ->
{ok, <<"in_service">>, JObj};
acquire_number(_, _, _) ->
{error, unavailable}.
acquire_number(_, <<"in_service">>, _) ->
{error, unavailable};
acquire_number(_, _, JObj) ->
{ok, <<"in_service">>, JObj}.

%%--------------------------------------------------------------------
%% @private
Expand Down
98 changes: 75 additions & 23 deletions lib/whistle_number_manager-1.0.0/src/wh_number_manager.erl
Expand Up @@ -13,6 +13,7 @@
-export([find/1, find/2]).
-export([reconcile_number/2]).
-export([assign_number_to_account/2, assign_number_to_account/3]).
-export([lookup_authorized_account_by_number/1]).
-export([get_public_fields/1, set_public_fields/2]).
-export([list_attachments/1]).
-export([fetch_attachment/2]).
Expand Down Expand Up @@ -58,9 +59,12 @@ find(Number, Quanity) ->
{error, term()}.
lookup_account_by_number(undefined) ->
{error, number_undefined};
lookup_account_by_number(Number) when size(Number) < 5 ->
{error, number_too_short};
lookup_account_by_number(Number) ->
lookup_account_by_number(Number, wnm_util:is_reconcilable(Number)).

lookup_account_by_number(_, false) ->
{error, not_reconcilable};
lookup_account_by_number(Number, true) ->
Num = wnm_util:normalize_number(Number),
Db = wnm_util:number_to_db_name(Num),
lager:debug("attempting to lookup '~s' in '~s'", [Num, Db]),
Expand Down Expand Up @@ -88,6 +92,36 @@ lookup_account_by_number(Number) ->
E
end.

%%--------------------------------------------------------------------
%% @public
%% @doc
%%
%% @end
%%--------------------------------------------------------------------
-spec lookup_authorized_account_by_number/1 :: (ne_binary()) -> {ok, ne_binary()} |
{error, term()}.

lookup_authorized_account_by_number(undefined) ->
{error, number_undefined};
lookup_authorized_account_by_number(Number) ->
lookup_authorized_account_by_number(Number, wnm_util:is_reconcilable(Number)).

lookup_authorized_account_by_number(_, false) ->
{error, not_reconcilable};
lookup_authorized_account_by_number(Number, true) ->
Num = wnm_util:normalize_number(Number),
Db = wnm_util:number_to_db_name(Num),
lager:debug("attempting to lookup '~s' in '~s'", [Num, Db]),
case couch_mgr:open_doc(Db, Num) of
{ok, JObj} ->
case find_account_id(JObj) of
undefined -> {error, not_found};
AccountId -> {ok, AccountId}
end;
{error, _}=E ->
E
end.

%%--------------------------------------------------------------------
%% @public
%% @doc
Expand All @@ -110,11 +144,11 @@ reconcile_number(Number, AccountId, true) ->
Db = wnm_util:number_to_db_name(Num),
lager:debug("attempting to reconcile number '~s' with account '~s'", [Num, AccountId]),
case couch_mgr:lookup_doc_rev(Db, Num) of
{ok, _} -> assign_number_to_account(Num, AccountId);
{ok, _} -> assign_number_to_account(Num, AccountId, wh_json:new(), true);
{error, _} ->
lager:debug("failed to fine number doc for reconcile, creating as reserved", []),
case reserve_number(Number, AccountId) of
{ok, _} -> assign_number_to_account(Num, AccountId);
lager:debug("failed to find number doc for reconcile, creating as reserved", []),
case reserve_number(Number, AccountId, wh_json:new(), true) of
{ok, _} -> assign_number_to_account(Num, AccountId, wh_json:new(), true);
{error, _} ->
lager:debug("unable to reserve number during reconcile", []),
{error, not_found}
Expand Down Expand Up @@ -164,7 +198,7 @@ reserve_number(Number, AccountId, PublicFields, true) ->
,fun(J) -> wh_json:set_value(<<"pvt_assigned_to">>, AccountId, J) end
,fun(J) -> wh_json:merge_jobjs(wh_json:private_fields(J), PublicFields) end
],
save_number(Db, Num, lists:foldr(fun(F, J) -> F(J) end, JObj, Updaters), JObj)
save_number(Db, Num, lists:foldl(fun(F, J) -> F(J) end, JObj, Updaters), JObj)
end
end.

Expand Down Expand Up @@ -193,13 +227,17 @@ assign_number_to_account(Number, AccountId, PublicFields, true) ->
Db = wnm_util:number_to_db_name(Num),
case couch_mgr:open_doc(Db, Num) of
{error, _R} ->
lager:debug("failed to open number doc for assignment to an account: ~p", [_R]),
lager:debug("unable to assign to account: ~p", [_R]),
{error, not_found};
{ok, JObj} ->
Routines = [fun(J) ->
AssignedTo = wh_json:get_value(<<"pvt_assigned_to">>, J),
case wh_json:get_value(<<"pvt_number_state">>, J, <<"unknown">>) of
<<"in_service">> when AssignedTo =:= AccountId->
lager:debug("number already assigned to account"),
{ok, wh_json:public_fields(J)};
<<"in_service">> ->
lager:debug("number is already in service"),
lager:debug("unable to assign to account, number is in service for ~s", [AssignedTo]),
{error, unavailable};
_Else ->
lager:debug("allowing assignment of a number currently in state ~s", [_Else]),
Expand Down Expand Up @@ -234,10 +272,18 @@ assign_number_to_account(Number, AccountId, PublicFields, true) ->
({ok, J}) -> {ok, wh_json:merge_jobjs(wh_json:private_fields(J), PublicFields)}
end
,fun({error, _}=E) -> E;
({ok, J}) -> save_number(Db, Num, J, JObj)
({ok, J}) ->
case save_number(Db, Num, J, JObj) of
{error, _R}=E ->
lager:debug("failed to assign number to account: ~p", [_R]),
E;
{ok, _}=Ok ->
lager:debug("assigned number to account", []),
Ok
end
end
],
lists:foldr(fun(F, J) -> F(J) end, JObj, Routines)
lists:foldl(fun(F, J) -> F(J) end, JObj, Routines)
end.

%%--------------------------------------------------------------------
Expand All @@ -258,7 +304,7 @@ release_number(Number, true) ->
Db = wnm_util:number_to_db_name(Num),
case couch_mgr:open_doc(Db, Num) of
{error, _R} ->
lager:debug("failed to open number doc for assignment to an account: ~p", [_R]),
lager:debug("unable to release number: ~p", [_R]),
{error, not_found};
{ok, JObj} ->
Routines = [fun(J) ->
Expand Down Expand Up @@ -296,7 +342,7 @@ release_number(Number, true) ->
,fun({error, _}=E) -> E;
({ok, J}) ->
AccountId = wh_json:get_value(<<"pvt_assigned_to">>, J),
wh_json:set_value(<<"pvt_previously_assigned_to">>, AccountId, J)
{ok, wh_json:set_value(<<"pvt_previously_assigned_to">>, AccountId, J)}
end
,fun({error, _}=E) -> E;
({ok, J}) -> {ok, wh_json:delete_key(<<"pvt_assigned_to">>, J)}
Expand All @@ -308,10 +354,18 @@ release_number(Number, true) ->
({ok, J}) -> {ok, wh_json:private_fields(J)}
end
,fun({error, _}=E) -> E;
({ok, J}) -> save_number(Db, Num, J, JObj)
({ok, J}) ->
case save_number(Db, Num, J, JObj) of
{error, _R}=E ->
lager:debug("failed to release number: ~p", [_R]),
E;
{ok, _}=Ok ->
lager:debug("released number, good luck little guy....", []),
Ok
end
end
],
lists:foldr(fun(F, J) -> F(J) end, JObj, Routines)
lists:foldl(fun(F, J) -> F(J) end, JObj, Routines)
end.

%%--------------------------------------------------------------------
Expand All @@ -325,7 +379,7 @@ free_numbers(AccountId) ->
Db = wh_util:format_account_id(AccountId, encoded),
case couch_mgr:open_doc(Db, AccountId) of
{ok, JObj} ->
[ok = release_number(Number)
[ok = release_number(Number, true)
|| Number <- wh_json:get_value(<<"pvt_wnm_in_service">>, JObj, [])
++ wh_json:get_value(<<"pvt_wnm_in_reserved">>, JObj, [])
],
Expand Down Expand Up @@ -469,7 +523,7 @@ set_public_fields(Number, PublicFields) ->
Routines = [fun(J) -> wh_json:set_value(<<"pvt_modified">>, wh_util:current_tstamp(), J) end
,fun(J) -> wh_json:merge_jobjs(wh_json:private_fields(J), PublicFields) end
],
save_number(Db, Num, lists:foldr(fun(F, J) -> F(J) end, JObj, Routines), JObj)
save_number(Db, Num, lists:foldl(fun(F, J) -> F(J) end, JObj, Routines), JObj)
end.

%%--------------------------------------------------------------------
Expand Down Expand Up @@ -556,7 +610,7 @@ store_discovery(Number, ModuleName, ModuleData, State, PublicFields) ->
,fun(J) -> wh_json:set_value(<<"pvt_db_name">>, Db, J) end
,fun(J) -> wh_json:set_value(<<"pvt_created">>, wh_util:current_tstamp(), J) end
],
JObj = lists:foldr(fun(F, J) -> F(J) end, PublicFields, Routines),
JObj = lists:foldl(fun(F, J) -> F(J) end, PublicFields, Routines),
case save_number(Db, Number, JObj, wh_json:new()) of
{ok, _}=Ok ->
lager:debug("stored newly discovered number '~s'", [Number]),
Expand Down Expand Up @@ -608,24 +662,22 @@ update_numbers_on_account(Number, State, AccountId) ->
lager:debug("failed to load account definition when adding '~s': ~p", [Number, _R]),
E;
{ok, JObj} ->
lager:debug("setting number ~s to state ~s on the account ~s", [Number, State, AccountId]),
lager:debug("updating number ~s pvt state to '~s' on account definition ~s", [Number, State, AccountId]),
Migrate = wh_json:get_value(<<"pvt_wnm_numbers">>, JObj, []),
Updated = lists:foldr(fun(<<"numbers">>, J) when Migrate =/= [] ->
Updated = lists:foldl(fun(<<"numbers">>, J) when Migrate =/= [] ->
N = wh_json:get_value(<<"pvt_wnm_in_service">>, J, []),
wh_json:set_value(<<"pvt_wnm_in_service">>, N ++ Migrate,
wh_json:delete_key(<<"pvt_wnm_numbers">>, J));
(<<"numbers">>, J) when Migrate =:= [] ->
wh_json:delete_key(<<"pvt_wnm_numbers">>, J);
(S, J) when S =:= State ->
lager:debug("adding number ~s to state ~s", [Number, S]),
N = wh_json:get_value(<<"pvt_wnm_", S/binary>>, JObj, []),
wh_json:set_value(<<"pvt_wnm_", S/binary>>, [Number|lists:delete(Number,N)], J);
(S, J) ->
lager:debug("removing number ~s from state ~s", [Number, S]),
N = wh_json:get_value(<<"pvt_wnm_", S/binary>>, JObj, []),
wh_json:set_value(<<"pvt_wnm_", S/binary>>, lists:delete(Number,N), J)
end, JObj, [<<"numbers">>|?WNM_NUMBER_STATUS]),
Cleaned = lists:foldr(fun(S, J) ->
Cleaned = lists:foldl(fun(S, J) ->
Nums = wh_json:get_value(<<"pvt_wnm_", S/binary>>, J, []),
Clean = ordsets:to_list(ordsets:from_list(Nums)),
wh_json:set_value(<<"pvt_wnm_", S/binary>>, Clean, J)
Expand Down
5 changes: 1 addition & 4 deletions whistle_apps/apps/crossbar/src/modules/cb_accounts.erl
Expand Up @@ -11,7 +11,6 @@
%%%-------------------------------------------------------------------
-module(cb_accounts).

%% Bindings API
-export([init/0
,allowed_methods/0, allowed_methods/1, allowed_methods/2
,resource_exists/0, resource_exists/1, resource_exists/2
Expand All @@ -20,14 +19,12 @@
,post/2, post/3
,delete/2
]).

%% API
-export([create_account/1
,get_realm_from_db/1
,ensure_parent_set/0
]).

-include("../../include/crossbar.hrl").
-include_lib("crossbar/include/crossbar.hrl").

-define(SERVER, ?MODULE).

Expand Down
6 changes: 3 additions & 3 deletions whistle_apps/apps/crossbar/src/modules/cb_callflows.erl
Expand Up @@ -105,7 +105,7 @@ post(Context, _DocId) ->
RemovedNumbers = sets:subtract(Set1, Set2),
_ = [wh_number_manager:reconcile_number(Number, AccountId)
|| Number <- sets:to_list(NewNumbers)],
_ = [wh_number_manager:release_number(Number, AccountId)
_ = [wh_number_manager:release_number(Number)
|| Number <- sets:to_list(RemovedNumbers)],
C
end;
Expand All @@ -125,10 +125,10 @@ put(Context) ->
end.

-spec delete/2 :: (#cb_context{}, path_token()) -> #cb_context{}.
delete(#cb_context{doc=JObj, account_id=AccountId}=Context, _DocId) ->
delete(#cb_context{doc=JObj}=Context, _DocId) ->
case crossbar_doc:delete(Context) of
#cb_context{resp_status=success}=C ->
_ = [wh_number_manager:release_number(Number, AccountId)
_ = [wh_number_manager:release_number(Number)
|| Number <- wh_json:get_value(<<"numbers">>, JObj, [])],
C;
Else ->
Expand Down

0 comments on commit 2681c90

Please sign in to comment.