Рефакторинг обработчиков. Часть 3 #21

This commit is contained in:
2026-05-13 23:02:59 +03:00
parent 61bb44ab4a
commit 40806df62a
91 changed files with 6138 additions and 7150 deletions
+37 -10
View File
@@ -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)
}.