Рефакторинг обработчиков. Часть 1 #21

This commit is contained in:
2026-05-10 22:14:38 +03:00
parent a35d6f7acc
commit 6403f061df
46 changed files with 3082 additions and 2091 deletions
+54 -3
View File
@@ -5,6 +5,7 @@
update_review/3, delete_review/2, hide_review/2, hide_review/3, unhide_review/2, unhide_review/3]).
-export([can_review/3, update_target_rating/2, can_moderate_review/2]).
-export([list_admin_reviews/1, bulk_update_status/1]).
-export([list_admin_reviews/2, get_review_admin/1, update_review_admin/2]).
%% Создание отзыва
create_review(UserId, TargetType, TargetId, Rating, Comment) ->
@@ -200,8 +201,9 @@ can_moderate_review(UserId, ReviewId) ->
%%% @end
%%%-------------------------------------------------------------------
list_admin_reviews(Filters) ->
AllReviews = core_review:list_all(),
apply_filters(AllReviews, Filters).
Reviews = core_review:list_all(), % возвращает список
Filtered = apply_filters(Reviews, Filters),
{ok, Filtered}.
%% Вспомогательная функция: фильтрация списка по proplist
apply_filters(Reviews, []) ->
@@ -271,4 +273,53 @@ update_target_rating(event, EventId) ->
update_target_rating(calendar, CalendarId) ->
{Avg, Count} = core_review:get_average_rating(calendar, CalendarId),
core_calendar:update(CalendarId, [{rating_avg, Avg}, {rating_count, Count}]);
update_target_rating(_, _) -> ok.
update_target_rating(_, _) -> ok.
%% Административный список с пагинацией
-spec list_admin_reviews(map(), #{limit => integer(), offset => integer(), sort => binary(), order => binary()}) ->
{ok, non_neg_integer(), [#review{}]}.
list_admin_reviews(Filters, Pagination) ->
#{limit := Limit, offset := Offset, sort := Sort, order := Order} = Pagination,
% Получаем все отзывы (можно временно через list_admin_reviews/1)
{ok, All} = list_admin_reviews(maps:to_list(Filters)),
Sorted = sort_reviews(All, Sort, Order),
Total = length(Sorted),
Page = lists:sublist(Sorted, Offset + 1, Limit),
{ok, Total, Page}.
%% Получить отзыв без проверки прав
-spec get_review_admin(binary()) -> {ok, #review{}} | {error, not_found}.
get_review_admin(ReviewId) ->
core_review:get_by_id(ReviewId).
%% Обновить отзыв без проверки прав
-spec update_review_admin(binary(), proplists:proplist()) ->
{ok, #review{}} | {error, not_found}.
update_review_admin(ReviewId, Updates) ->
case core_review:get_by_id(ReviewId) of
{ok, _} -> core_review:update(ReviewId, Updates);
Error -> Error
end.
%%%-------------------------------------------------------------------
%%% Вспомогательные функции административной пагинации
%%%-------------------------------------------------------------------
%% @private Сортирует список отзывов по указанному полю.
sort_reviews(Reviews, SortField, Order) ->
Field = binary_to_existing_atom(SortField, utf8),
Sorted = lists:sort(
fun(A, B) ->
ValA = review_field(A, Field),
ValB = review_field(B, Field),
if Order == <<"asc">> -> ValA =< ValB;
true -> ValA >= ValB
end
end, Reviews),
Sorted.
%% @private Извлекает значение поля из записи отзыва для сортировки.
review_field(#review{created_at = V}, created_at) -> V;
review_field(#review{rating = V}, rating) -> V;
review_field(#review{status = V}, status) -> V;
review_field(_, _) -> undefined.