Рефакторинг админских обработчиков - пагинация, сортировка, фильтрация. Часть 1
This commit is contained in:
+44
-13
@@ -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.
|
||||
Reference in New Issue
Block a user