104 lines
4.5 KiB
Erlang
104 lines
4.5 KiB
Erlang
-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. |