Files
EventHubBack/src/infra/admin_utils.erl
T
aleksey 17b2e617d7
Test & Deploy to Snapdeploy / build-test-deploy (push) Failing after 24m46s
bagofix
2026-06-05 23:20:03 +03:00

104 lines
4.5 KiB
Erlang
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-module(admin_utils).
-include("records.hrl").
-export([is_admin/1, check_role/2, get_permissions/1, is_superadmin/1]).
-export([client_ip/1]). % ← IP
-export([log_admin_action/6]). % ← аудит действий администратора
-export([ip_to_binary/1]). % ← преобразование IP
%% -- существующие функции -------------------------------------------------
is_admin(UserId) ->
case core_admin:get_by_id(UserId) of
{ok, _Admin} -> true;
_ -> false
end.
is_superadmin(AdminId) ->
case core_admin:get_by_id(AdminId) of
{ok, #admin{role = superadmin}} -> true;
_ -> false
end.
check_role(UserId, RequiredRoles) when is_list(RequiredRoles) ->
case core_admin:get_by_id(UserId) of
{ok, Admin} -> lists:member(Admin#admin.role, RequiredRoles);
_ -> false
end;
check_role(UserId, RequiredRole) when is_atom(RequiredRole) ->
case core_admin:get_by_id(UserId) of
{ok, Admin} -> Admin#admin.role =:= RequiredRole;
_ -> false
end.
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">>];
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(_) -> [].
%% -- работа с 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.
%% @doc Логирует действие администратора.
%% Параметры:
%% AdminId – ID администратора, выполнившего действие
%% Action – бинарная строка действия (напр. <<"create">>)
%% EntityType – тип сущности (напр. <<"admin">>, <<"banned_word">>)
%% EntityId – идентификатор сущности
%% Reason - причина
%% Req cowboy_req для извлечения IP
-spec log_admin_action(binary(), binary(), binary(), term(), binary(), cowboy_req:req()) -> ok.
log_admin_action(AdminId, Action, EntityType, EntityId, Reason, 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, Reason),
ok;
_ -> ok
end.