-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.