При массовом изменении статуса отзывов причина теперь обязательное поле #22
This commit is contained in:
+33
-12
@@ -4,7 +4,7 @@
|
||||
-export([create_review/5, get_review/2, list_reviews/3, list_user_reviews/1,
|
||||
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/1, bulk_update_status/2]).
|
||||
-export([list_admin_reviews/2, get_review_admin/1, update_review_admin/2]).
|
||||
|
||||
%% Создание отзыва
|
||||
@@ -233,27 +233,48 @@ apply_filters(Reviews, [_ | Rest]) ->
|
||||
|
||||
%%%-------------------------------------------------------------------
|
||||
%%% @doc Массово обновить статусы отзывов.
|
||||
%%% Operations: [#{id => ReviewId, status => visible | hidden}, ...]
|
||||
%%% Все изменения выполняются в одной Mnesia-транзакции.
|
||||
%%%
|
||||
%%% Принимает список операций и одну причину, которая будет
|
||||
%%% записана во все изменённые отзывы. Все изменения выполняются
|
||||
%%% в одной Mnesia‑транзакции.
|
||||
%%%
|
||||
%%% Параметры:
|
||||
%%% Operations :: [#{ id := binary(), status := binary() }]
|
||||
%%% Каждый элемент обязан содержать ключи `id` и `status`.
|
||||
%%% Допустимые значения `status`: `<<"visible">>`, `<<"hidden">>`,
|
||||
%%% `<<"deleted">>`.
|
||||
%%% Reason :: binary()
|
||||
%%% Причина, которая будет записана в поле `reason` каждого
|
||||
%%% обновлённого отзыва.
|
||||
%%%
|
||||
%%% Возвращает:
|
||||
%%% {ok, UpdatedCount :: non_neg_integer()} в случае успеха,
|
||||
%%% {error, Reason :: binary()} при ошибке.
|
||||
%%% @end
|
||||
%%%-------------------------------------------------------------------
|
||||
bulk_update_status(Operations) when is_list(Operations) ->
|
||||
-spec bulk_update_status(Operations :: [#{binary() => binary()}], Reason :: binary()) ->
|
||||
{ok, non_neg_integer()} | {error, binary()}.
|
||||
bulk_update_status(Operations, Reason) when is_list(Operations) ->
|
||||
Fun = fun() ->
|
||||
lists:foreach(fun do_update_status/1, Operations)
|
||||
lists:foreach(fun(Op) -> do_update_status(Op, Reason) end, Operations)
|
||||
end,
|
||||
case mnesia:transaction(Fun) of
|
||||
{atomic, ok} ->
|
||||
{ok, length(Operations)};
|
||||
{aborted, Reason} ->
|
||||
{error, Reason}
|
||||
{aborted, ReasonErr} ->
|
||||
{error, ReasonErr}
|
||||
end.
|
||||
|
||||
do_update_status(#{<<"id">> := Id, <<"status">> := NewStatus}) ->
|
||||
%% @private Выполняет обновление одного отзыва внутри транзакции.
|
||||
-spec do_update_status(map(), binary()) -> ok | no_return().
|
||||
do_update_status(#{<<"id">> := Id, <<"status">> := NewStatus}, Reason) ->
|
||||
case core_review:get_by_id(Id) of
|
||||
{ok, Review} ->
|
||||
IdReview = Review#review{id = Id},
|
||||
UpdatedReview = Review#review{status = NewStatus},
|
||||
core_review:update(IdReview, UpdatedReview);
|
||||
{ok, _Review} ->
|
||||
Updates = [{status, NewStatus}, {reason, Reason}],
|
||||
case core_review:update(Id, Updates) of
|
||||
{ok, _} -> ok;
|
||||
{error, _} -> mnesia:abort(<<"review_update_failed">>)
|
||||
end;
|
||||
not_found ->
|
||||
mnesia:abort(<<"review_not_found">>)
|
||||
end.
|
||||
|
||||
Reference in New Issue
Block a user