Stage 6
This commit is contained in:
@@ -0,0 +1,180 @@
|
||||
-module(logic_moderation).
|
||||
-include("records.hrl").
|
||||
|
||||
-export([create_report/4, get_reports/1, get_reports_by_target/3, resolve_report/3]).
|
||||
-export([add_banned_word/2, remove_banned_word/2, list_banned_words/1]).
|
||||
-export([check_content/1, auto_moderate/1]).
|
||||
-export([freeze_calendar/2, unfreeze_calendar/2, freeze_event/2, unfreeze_event/2]).
|
||||
|
||||
-define(REPORT_THRESHOLD, 3). % Количество жалоб для авто-заморозки
|
||||
|
||||
%% ============ Жалобы ============
|
||||
|
||||
%% Создание жалобы
|
||||
create_report(ReporterId, TargetType, TargetId, Reason) ->
|
||||
case target_exists(TargetType, TargetId) of
|
||||
true ->
|
||||
case core_report:create(ReporterId, TargetType, TargetId, Reason) of
|
||||
{ok, Report} ->
|
||||
% Проверяем порог для авто-модерации
|
||||
check_auto_freeze(TargetType, TargetId),
|
||||
{ok, Report};
|
||||
Error -> Error
|
||||
end;
|
||||
false -> {error, target_not_found}
|
||||
end.
|
||||
|
||||
%% Получить все жалобы (для админа)
|
||||
get_reports(AdminId) ->
|
||||
case is_admin(AdminId) of
|
||||
true -> core_report:list_all();
|
||||
false -> {error, access_denied}
|
||||
end.
|
||||
|
||||
%% Получить жалобы на конкретную цель
|
||||
get_reports_by_target(AdminId, TargetType, TargetId) ->
|
||||
case is_admin(AdminId) of
|
||||
true -> core_report:list_by_target(TargetType, TargetId);
|
||||
false -> {error, access_denied}
|
||||
end.
|
||||
|
||||
%% Рассмотреть жалобу (подтвердить или отклонить)
|
||||
resolve_report(AdminId, ReportId, Action) when Action =:= reviewed; Action =:= dismissed ->
|
||||
case is_admin(AdminId) of
|
||||
true ->
|
||||
case core_report:get_by_id(ReportId) of
|
||||
{ok, Report} ->
|
||||
case Report#report.status of
|
||||
pending ->
|
||||
core_report:update_status(ReportId, Action, AdminId);
|
||||
_ -> {error, already_resolved}
|
||||
end;
|
||||
Error -> Error
|
||||
end;
|
||||
false -> {error, access_denied}
|
||||
end.
|
||||
|
||||
%% Проверка порога для авто-заморозки
|
||||
check_auto_freeze(TargetType, TargetId) ->
|
||||
Count = core_report:get_count_by_target(TargetType, TargetId),
|
||||
if Count >= ?REPORT_THRESHOLD ->
|
||||
auto_freeze(TargetType, TargetId);
|
||||
true -> ok
|
||||
end.
|
||||
|
||||
auto_freeze(event, EventId) ->
|
||||
case core_event:get_by_id(EventId) of
|
||||
{ok, Event} when Event#event.status =:= active ->
|
||||
core_event:update(EventId, [{status, frozen}]);
|
||||
_ -> ok
|
||||
end;
|
||||
auto_freeze(calendar, CalendarId) ->
|
||||
case core_calendar:get_by_id(CalendarId) of
|
||||
{ok, Calendar} when Calendar#calendar.status =:= active ->
|
||||
core_calendar:update(CalendarId, [{status, frozen}]);
|
||||
_ -> ok
|
||||
end;
|
||||
auto_freeze(_, _) -> ok.
|
||||
|
||||
%% ============ Бан-лист ============
|
||||
|
||||
%% Добавить запрещённое слово
|
||||
add_banned_word(AdminId, Word) ->
|
||||
case is_admin(AdminId) of
|
||||
true -> core_banned_word:add(Word);
|
||||
false -> {error, access_denied}
|
||||
end.
|
||||
|
||||
%% Удалить запрещённое слово
|
||||
remove_banned_word(AdminId, Word) ->
|
||||
case is_admin(AdminId) of
|
||||
true -> core_banned_word:remove(Word);
|
||||
false -> {error, access_denied}
|
||||
end.
|
||||
|
||||
%% Список запрещённых слов
|
||||
list_banned_words(AdminId) ->
|
||||
case is_admin(AdminId) of
|
||||
true -> core_banned_word:list_all();
|
||||
false -> {error, access_denied}
|
||||
end.
|
||||
|
||||
%% ============ Контент-фильтр ============
|
||||
|
||||
%% Проверить контент на запрещённые слова
|
||||
check_content(Text) ->
|
||||
core_banned_word:check_text(Text).
|
||||
|
||||
%% Автоматическая модерация контента (замена запрещённых слов)
|
||||
auto_moderate(Text) ->
|
||||
core_banned_word:filter_text(Text).
|
||||
|
||||
%% ============ Заморозка/разморозка ============
|
||||
|
||||
%% Заморозить календарь
|
||||
freeze_calendar(AdminId, CalendarId) ->
|
||||
case is_admin(AdminId) of
|
||||
true ->
|
||||
case core_calendar:get_by_id(CalendarId) of
|
||||
{ok, Calendar} ->
|
||||
core_calendar:update(CalendarId, [{status, frozen}]);
|
||||
Error -> Error
|
||||
end;
|
||||
false -> {error, access_denied}
|
||||
end.
|
||||
|
||||
%% Разморозить календарь
|
||||
unfreeze_calendar(AdminId, CalendarId) ->
|
||||
case is_admin(AdminId) of
|
||||
true ->
|
||||
case core_calendar:get_by_id(CalendarId) of
|
||||
{ok, Calendar} ->
|
||||
core_calendar:update(CalendarId, [{status, active}]);
|
||||
Error -> Error
|
||||
end;
|
||||
false -> {error, access_denied}
|
||||
end.
|
||||
|
||||
%% Заморозить событие
|
||||
freeze_event(AdminId, EventId) ->
|
||||
case is_admin(AdminId) of
|
||||
true ->
|
||||
case core_event:get_by_id(EventId) of
|
||||
{ok, Event} ->
|
||||
core_event:update(EventId, [{status, frozen}]);
|
||||
Error -> Error
|
||||
end;
|
||||
false -> {error, access_denied}
|
||||
end.
|
||||
|
||||
%% Разморозить событие
|
||||
unfreeze_event(AdminId, EventId) ->
|
||||
case is_admin(AdminId) of
|
||||
true ->
|
||||
case core_event:get_by_id(EventId) of
|
||||
{ok, Event} ->
|
||||
core_event:update(EventId, [{status, active}]);
|
||||
Error -> Error
|
||||
end;
|
||||
false -> {error, access_denied}
|
||||
end.
|
||||
|
||||
%% ============ Вспомогательные функции ============
|
||||
|
||||
target_exists(event, EventId) ->
|
||||
case core_event:get_by_id(EventId) of
|
||||
{ok, _} -> true;
|
||||
_ -> false
|
||||
end;
|
||||
target_exists(calendar, CalendarId) ->
|
||||
case core_calendar:get_by_id(CalendarId) of
|
||||
{ok, _} -> true;
|
||||
_ -> false
|
||||
end; % ← точка с запятой здесь!
|
||||
target_exists(_, _) -> false.
|
||||
|
||||
is_admin(UserId) ->
|
||||
case core_user:get_by_id(UserId) of
|
||||
{ok, User} -> User#user.role =:= admin;
|
||||
_ -> false
|
||||
end.
|
||||
Reference in New Issue
Block a user