Рефакторинг админских обработчиков - пагинация, сортировка, фильтрация. Часть 1

This commit is contained in:
2026-05-26 13:04:31 +03:00
parent 01dbc6d6cb
commit ed5b275efb
24 changed files with 1009 additions and 1126 deletions
+44 -13
View File
@@ -1,8 +1,11 @@
-module(admin_utils).
-include("records.hrl").
-export([is_admin/1, check_role/2, get_permissions/1, is_superadmin/1]).
-export([client_ip/1]).
-export([client_ip/1]). % ← IP
-export([log_admin_action/5]). % ← аудит действий администратора
-export([ip_to_binary/1]). % ← преобразование IP
%% -- существующие функции -------------------------------------------------
is_admin(UserId) ->
case core_admin:get_by_id(UserId) of
@@ -16,8 +19,6 @@ is_superadmin(AdminId) ->
_ -> false
end.
%% Проверка конкретной роли (или одной из списка ролей)
-spec check_role(UserId :: binary(), RequiredRole :: atom() | [atom()]) -> boolean().
check_role(UserId, RequiredRoles) when is_list(RequiredRoles) ->
case core_admin:get_by_id(UserId) of
{ok, Admin} -> lists:member(Admin#admin.role, RequiredRoles);
@@ -29,25 +30,55 @@ check_role(UserId, RequiredRole) when is_atom(RequiredRole) ->
_ -> false
end.
%% Возвращает список прав для роли администратора
-spec get_permissions(Role :: atom()) -> [binary()].
get_permissions(superadmin) ->
[<<"manage_admins">>, <<"manage_users">>, <<"manage_events">>,
<<"manage_calendars">>, <<"manage_reviews">>, <<"manage_reports">>,
<<"manage_tickets">>, <<"manage_banned_words">>, <<"view_stats">>,
<<"view_audit">>];
get_permissions(admin) ->
[<<"manage_users">>, <<"manage_events">>,
<<"manage_calendars">>, <<"manage_reviews">>, <<"manage_reports">>,
<<"manage_tickets">>, <<"manage_banned_words">>, <<"view_stats">>,
<<"view_audit">>];
[<<"manage_users">>, <<"manage_events">>, <<"manage_calendars">>,
<<"manage_reviews">>, <<"manage_reports">>, <<"manage_tickets">>,
<<"manage_banned_words">>, <<"view_stats">>, <<"view_audit">>];
get_permissions(moderator) ->
[<<"manage_events">>, <<"manage_calendars">>, <<"manage_reviews">>,
<<"manage_reports">>, <<"manage_tickets">>, <<"manage_banned_words">>,
<<"view_stats">>];
get_permissions(support) ->
[<<"manage_tickets">>, <<"view_stats">>];
get_permissions(_) ->
[].
get_permissions(_) -> [].
client_ip(_Req) -> <<"127.0.0.1">>.
%% -- работа с IP -----------------------------------------------------------
%% @doc Возвращает IP-адрес клиента в виде бинарной строки (напр. <<"127.0.0.1">>).
%% Сохранена для обратной совместимости; внутренне вызывает ip_to_binary/1.
-spec client_ip(cowboy_req:req()) -> binary().
client_ip(Req) ->
ip_to_binary(cowboy_req:peer(Req)).
%% @doc Преобразует IP-адрес из кортежа {A,B,C,D} в бинарную строку.
-spec ip_to_binary({byte(), byte(), byte(), byte()}) -> binary().
ip_to_binary({A, B, C, D}) ->
list_to_binary(io_lib:format("~B.~B.~B.~B", [A, B, C, D]));
ip_to_binary(_) ->
<<"unknown">>.
%% -- аудит ----------------------------------------------------------------
%% @doc Логирует действие администратора.
%% Параметры:
%% AdminId – ID администратора, выполнившего действие
%% Action – бинарная строка действия (напр. <<"create">>)
%% EntityType – тип сущности (напр. <<"admin">>, <<"banned_word">>)
%% EntityId – идентификатор сущности
%% Req cowboy_req для извлечения IP
-spec log_admin_action(binary(), binary(), binary(), term(), cowboy_req:req()) -> ok.
log_admin_action(AdminId, Action, EntityType, EntityId, Req) ->
case core_admin:get_by_id(AdminId) of
{ok, Admin} ->
Email = Admin#admin.email,
Role = atom_to_binary(Admin#admin.role, utf8),
Ip = ip_to_binary(cowboy_req:peer(Req)),
core_admin_audit:log(AdminId, Email, Role, Action, EntityType, EntityId, Ip),
ok;
_ -> ok
end.