feat: user API голосования за отзывы (like/dislike). Refs EventHub/EventHubBack#47
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
-export([can_review/3, update_target_rating/2, can_moderate_review/2]).
|
||||
-export([list_admin_reviews/1, bulk_update_status/2]).
|
||||
-export([list_admin_reviews/2, get_review_admin/1, update_review_admin/2]).
|
||||
-export([put_vote/3, delete_vote/2, my_vote/2, my_votes_map/1]).
|
||||
|
||||
%% Создание отзыва
|
||||
create_review(UserId, TargetType, TargetId, Rating, Comment) ->
|
||||
@@ -68,6 +69,45 @@ list_reviews(UserId, TargetType, TargetId) ->
|
||||
list_user_reviews(UserId) ->
|
||||
core_review:list_by_user(UserId).
|
||||
|
||||
%%%-------------------------------------------------------------------
|
||||
%%% @doc Поставить / сменить голос (like | dislike).
|
||||
%%% @end
|
||||
%%%-------------------------------------------------------------------
|
||||
-spec put_vote(UserId :: binary(), ReviewId :: binary(), Value :: like | dislike) ->
|
||||
{ok, #review{}, like | dislike} | {error, term()}.
|
||||
put_vote(UserId, ReviewId, Value) when Value =:= like; Value =:= dislike ->
|
||||
core_review_vote:upsert(ReviewId, UserId, Value).
|
||||
|
||||
%%%-------------------------------------------------------------------
|
||||
%%% @doc Снять голос с отзыва.
|
||||
%%% @end
|
||||
%%%-------------------------------------------------------------------
|
||||
-spec delete_vote(UserId :: binary(), ReviewId :: binary()) ->
|
||||
{ok, #review{}, null} | {error, term()}.
|
||||
delete_vote(UserId, ReviewId) ->
|
||||
core_review_vote:delete(ReviewId, UserId).
|
||||
|
||||
%%%-------------------------------------------------------------------
|
||||
%%% @doc Голос текущего пользователя за отзыв (`null` если нет).
|
||||
%%% @end
|
||||
%%%-------------------------------------------------------------------
|
||||
-spec my_vote(UserId :: binary(), ReviewId :: binary()) -> like | dislike | null.
|
||||
my_vote(UserId, ReviewId) ->
|
||||
case core_review_vote:get_by_user_and_review(UserId, ReviewId) of
|
||||
{ok, #review_vote{value = Value}} -> Value;
|
||||
{error, not_found} -> null
|
||||
end.
|
||||
|
||||
%%%-------------------------------------------------------------------
|
||||
%%% @doc Карта review_id => like | dislike для всех голосов пользователя.
|
||||
%%% @end
|
||||
%%%-------------------------------------------------------------------
|
||||
-spec my_votes_map(UserId :: binary()) -> #{binary() => like | dislike}.
|
||||
my_votes_map(UserId) ->
|
||||
lists:foldl(fun(#review_vote{review_id = Rid, value = V}, Acc) ->
|
||||
Acc#{Rid => V}
|
||||
end, #{}, core_review_vote:list_by_user(UserId)).
|
||||
|
||||
%% Обновление отзыва (только автор)
|
||||
update_review(UserId, ReviewId, Updates) ->
|
||||
io:format("Updating review ~p with ~p~n", [ReviewId, Updates]),
|
||||
|
||||
Reference in New Issue
Block a user