Рефакторинг обработчиков. Часть 3 #21
This commit is contained in:
@@ -1,3 +1,9 @@
|
||||
%%%-------------------------------------------------------------------
|
||||
%%% @doc Административный обработчик профиля текущего администратора.
|
||||
%%% GET – получить свой профиль.
|
||||
%%% PUT – обновить свой профиль.
|
||||
%%% @end
|
||||
%%%-------------------------------------------------------------------
|
||||
-module(admin_handler_me).
|
||||
-behaviour(cowboy_handler).
|
||||
|
||||
@@ -6,6 +12,8 @@
|
||||
|
||||
-include("records.hrl").
|
||||
|
||||
%%% cowboy_handler callback
|
||||
-spec init(cowboy_req:req(), any()) -> {ok, cowboy_req:req(), any()}.
|
||||
init(Req, _Opts) ->
|
||||
case cowboy_req:method(Req) of
|
||||
<<"GET">> -> get_me(Req);
|
||||
@@ -13,6 +21,8 @@ init(Req, _Opts) ->
|
||||
_ -> handler_utils:send_error(Req, 405, <<"Method not allowed">>)
|
||||
end.
|
||||
|
||||
%%% Swagger metadata
|
||||
-spec trails() -> [map()].
|
||||
trails() ->
|
||||
[
|
||||
#{ % GET
|
||||
@@ -42,6 +52,7 @@ trails() ->
|
||||
}
|
||||
].
|
||||
|
||||
-spec admin_schema() -> map().
|
||||
admin_schema() ->
|
||||
#{
|
||||
type => object,
|
||||
@@ -62,6 +73,7 @@ admin_schema() ->
|
||||
}
|
||||
}.
|
||||
|
||||
-spec admin_update_schema() -> map().
|
||||
admin_update_schema() ->
|
||||
#{
|
||||
type => object,
|
||||
@@ -75,6 +87,9 @@ admin_update_schema() ->
|
||||
}
|
||||
}.
|
||||
|
||||
%%% Internal functions
|
||||
|
||||
-spec get_me(cowboy_req:req()) -> {ok, binary(), cowboy_req:req()}.
|
||||
get_me(Req) ->
|
||||
case handler_utils:auth_admin(Req) of
|
||||
{ok, AdminId, Req1} ->
|
||||
@@ -90,13 +105,15 @@ get_me(Req) ->
|
||||
handler_utils:send_error(Req1, Code, Msg)
|
||||
end.
|
||||
|
||||
-spec update_me(cowboy_req:req()) -> {ok, binary(), cowboy_req:req()}.
|
||||
update_me(Req) ->
|
||||
case handler_utils:auth_admin(Req) of
|
||||
{ok, AdminId, Req1} ->
|
||||
{ok, Body, Req2} = cowboy_req:read_body(Req1),
|
||||
try jsx:decode(Body, [return_maps]) of
|
||||
UpdatesMap when is_map(UpdatesMap) ->
|
||||
Updates = maps:to_list(UpdatesMap),
|
||||
Updates0 = maps:to_list(UpdatesMap),
|
||||
Updates = convert_admin_fields(Updates0),
|
||||
case logic_admin:update_admin(AdminId, Updates) of
|
||||
{ok, Admin} ->
|
||||
handler_utils:send_json(Req2, 200, admin_to_json(Admin));
|
||||
@@ -114,6 +131,21 @@ update_me(Req) ->
|
||||
handler_utils:send_error(Req1, Code, Msg)
|
||||
end.
|
||||
|
||||
%% @private Преобразует бинарные ключи в атомы для обновлений администратора.
|
||||
-spec convert_admin_fields([{binary(), term()}]) -> [{atom(), term()}].
|
||||
convert_admin_fields(Updates) ->
|
||||
lists:map(fun
|
||||
({<<"nickname">>, V}) -> {nickname, V};
|
||||
({<<"avatar_url">>, V}) -> {avatar_url, V};
|
||||
({<<"timezone">>, V}) -> {timezone, V};
|
||||
({<<"language">>, V}) -> {language, V};
|
||||
({<<"phone">>, V}) -> {phone, V};
|
||||
({<<"preferences">>, V}) -> {preferences, V};
|
||||
(Other) -> Other
|
||||
end, Updates).
|
||||
|
||||
%% @private Формирует JSON-представление администратора.
|
||||
-spec admin_to_json(#admin{}) -> map().
|
||||
admin_to_json(Admin) ->
|
||||
#{
|
||||
id => Admin#admin.id,
|
||||
@@ -126,12 +158,7 @@ admin_to_json(Admin) ->
|
||||
language => Admin#admin.language,
|
||||
phone => Admin#admin.phone,
|
||||
preferences => Admin#admin.preferences,
|
||||
last_login => datetime_to_iso8601(Admin#admin.last_login),
|
||||
created_at => datetime_to_iso8601(Admin#admin.created_at),
|
||||
updated_at => datetime_to_iso8601(Admin#admin.updated_at)
|
||||
}.
|
||||
|
||||
datetime_to_iso8601(undefined) -> undefined;
|
||||
datetime_to_iso8601({{Year, Month, Day}, {Hour, Minute, Second}}) ->
|
||||
iolist_to_binary(io_lib:format("~4..0B-~2..0B-~2..0BT~2..0B:~2..0B:~2..0BZ",
|
||||
[Year, Month, Day, Hour, Minute, Second])).
|
||||
last_login => handler_utils:datetime_to_iso8601(Admin#admin.last_login),
|
||||
created_at => handler_utils:datetime_to_iso8601(Admin#admin.created_at),
|
||||
updated_at => handler_utils:datetime_to_iso8601(Admin#admin.updated_at)
|
||||
}.
|
||||
Reference in New Issue
Block a user