@@ -72,9 +72,9 @@ authorize(Context, _Id, _Node) -> cb_context:is_superduper_admin(Context).
-spec allowed_methods(path_token(), path_token()) -> http_methods().
allowed_methods() ->
[?HTTP_GET, ?HTTP_PUT].
allowed_methods(_Id) ->
allowed_methods(_SystemConfigId) ->
[?HTTP_GET, ?HTTP_POST, ?HTTP_DELETE].
allowed_methods(_Id, _Node) ->
allowed_methods(_SystemConfigId, _Node) ->
[?HTTP_GET, ?HTTP_POST, ?HTTP_DELETE].

%%--------------------------------------------------------------------
@@ -171,27 +171,23 @@ post(Context, _Id, Node) ->
delete(Context, _Id) ->
Context1 = crossbar_doc:delete(Context),
case cb_context:resp_status(Context1) of
'success' ->
cb_context:set_resp_data(Context1, kz_json:new());
'success' -> cb_context:set_resp_data(Context1, kz_json:new());
_Status -> Context1
end.

delete(Context, Id, <<"default">>) ->
delete(Context, Id);
delete(Context, _Id, Node) ->
save(
cb_context:set_doc(Context, kz_json:delete_key(Node, cb_context:doc(Context)))
,<<"default">>
).
Context1 = cb_context:set_doc(Context, kz_json:delete_key(Node, cb_context:doc(Context))),
save(Context1, <<"default">>).

-spec save(cb_context:context(), ne_binary()) -> cb_context:context().
save(Context, Node) ->
Context1 = crossbar_doc:save(Context),
case cb_context:resp_status(Context1) of
'success' ->
cb_context:set_resp_data(Context1, kz_json:get_value(Node, cb_context:doc(Context1)));
_Status ->
Context1
_Status -> Context1
end.

%%--------------------------------------------------------------------
@@ -206,14 +202,12 @@ create(Context) ->
case kz_doc:id(Doc) of
'undefined' ->
lager:debug("no id on doc ~p", [Doc]),
cb_context:add_validation_error(
<<"id">>
cb_context:add_validation_error(<<"id">>
,<<"required">>
,kz_json:from_list([
{<<"message">>, <<"id is required to create a system_config resource">>}
,kz_json:from_list([{<<"message">>, <<"id is required to create a system_config resource">>}
])
,Context
);
);
Id ->
SysDoc = kz_json:from_list([{<<"_id">>, Id}
,{<<"default">>, kz_json:delete_key(<<"id">>, Doc)}
@@ -240,7 +234,6 @@ filter_read(Context, Node) ->
read(Id, Context, Node) ->
Context1 = crossbar_doc:load(Id, Context, ?TYPE_CHECK_OPTION(<<"config">>)),
Data = filter_read(Context1, Node),

cb_context:set_resp_data(Context1, Data).

-spec read_for_delete(ne_binary(), cb_context:context()) ->
@@ -239,6 +239,7 @@ is_design_doc_id(_) -> 'true'.
import_template_docs([], _, _, _) -> 'ok';
import_template_docs([Id|Ids], TemplateDb, AccountId, AccountDb) ->
case kz_datamgr:open_doc(TemplateDb, Id) of
{'error', _} -> import_template_docs(Ids, TemplateDb, AccountId, AccountDb);
{'ok', JObj} ->
Routines = [fun(J) -> kz_doc:set_account_id(J, AccountId) end
,fun(J) -> kz_doc:set_account_db(J, AccountDb) end
@@ -248,8 +249,7 @@ import_template_docs([Id|Ids], TemplateDb, AccountId, AccountDb) ->
_ = kz_datamgr:ensure_saved(AccountDb, lists:foldr(fun(F, J) -> F(J) end, JObj, Routines)),
Attachments = kz_doc:attachment_names(JObj),
_ = import_template_attachments(Attachments, JObj, TemplateDb, AccountDb, Id),
import_template_docs(Ids, TemplateDb, AccountId, AccountDb);
{'error', _} -> import_template_docs(Ids, TemplateDb, AccountId, AccountDb)
import_template_docs(Ids, TemplateDb, AccountId, AccountDb)
end.

-spec import_template_attachments(ne_binaries(), kz_json:object(), ne_binary(), ne_binary(), ne_binary()) -> 'ok'.
@@ -73,15 +73,15 @@ allowed_methods() ->
[?HTTP_GET, ?HTTP_PUT].
allowed_methods(?MESSAGES_RESOURCE) ->
[?HTTP_GET];
allowed_methods(_VMBoxID) ->
allowed_methods(_VMBoxId) ->
[?HTTP_GET, ?HTTP_POST, ?HTTP_DELETE, ?HTTP_PATCH].
allowed_methods(_VMBoxID, ?MESSAGES_RESOURCE) ->
allowed_methods(_VMBoxId, ?MESSAGES_RESOURCE) ->
[?HTTP_GET, ?HTTP_POST, ?HTTP_DELETE].
allowed_methods(_VMBoxID, ?MESSAGES_RESOURCE, ?BIN_DATA) ->
allowed_methods(_VMBoxId, ?MESSAGES_RESOURCE, ?BIN_DATA) ->
[?HTTP_POST];
allowed_methods(_VMBoxID, ?MESSAGES_RESOURCE, _MsgID) ->
allowed_methods(_VMBoxId, ?MESSAGES_RESOURCE, _VMMsgId) ->
[?HTTP_GET, ?HTTP_POST, ?HTTP_DELETE].
allowed_methods(_VMBoxID, ?MESSAGES_RESOURCE, _MsgID, ?BIN_DATA) ->
allowed_methods(_VMBoxId, ?MESSAGES_RESOURCE, _VMMsgId, ?BIN_DATA) ->
[?HTTP_GET].

%%--------------------------------------------------------------------
@@ -485,15 +485,21 @@ format_path_tokens(Tokens) ->
[format_path_token(Token) || Token <- Tokens, Token =/= <<"/">>].

format_path_token(<<"_", Rest/binary>>) -> format_path_token(Rest);
format_path_token(Token = <<Prefix:1/binary, _/binary>>) ->
format_path_token(Token = <<Prefix:1/binary, _/binary>>)
when byte_size(Token) >= 3 ->
case is_all_upper(Token) of
true -> brace_token(Token);
false ->
case is_all_upper(Prefix) of
true -> brace_token(camel_to_snake(Token));
false -> Token
end
end.
end;
format_path_token(BadToken) ->
io:format(standard_error
,"Please pick a good allowed_methods/N variable name: '~s' is too short.\n"
,[BadToken]),
halt(1).

camel_to_snake(Bin) ->
Options = ['global', {'return', 'binary'}],
@@ -10,13 +10,11 @@

-include("kzl.hrl").

-export([
new/0
-export([new/0
,save/1, save/2
]).

-export([
type/1, set_type/2
-export([type/1, set_type/2
,amount/1, set_amount/2
,description/1, set_description/2
,source/1
@@ -20,8 +20,7 @@
%%--------------------------------------------------------------------
-spec get(ne_binary()) -> {'error', any()} | {'ok', kz_json:object()}.
get(Account) ->
Options = [
'reduce'
Options = ['reduce'
,'group'
,{'group_level', 1}
],