Skip to content

Commit b989994

Browse files
authored
enhancement: Insert revert action when reversing vote (#367)
1 parent 23ffc65 commit b989994

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

apps/cf/lib/comments/comments.ex

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,15 +180,25 @@ defmodule CF.Comments do
180180

181181
# Delete prev directly vote if any (without logging a delete action)
182182
Multi.new()
183-
|> Multi.delete_all(:prev_vote, Vote.user_comment_vote(user, comment), returning: [:value])
183+
|> Multi.delete_all(:prev_votes, Vote.user_comment_vote(user, comment), returning: [:value])
184+
|> Multi.run(:revert_vote, fn _repo, %{prev_votes: {_count, prev_votes}} ->
185+
unless Enum.empty?(prev_votes) do
186+
prev_vote = List.first(prev_votes)
187+
prev_vote_type = Vote.vote_type(user, comment, prev_vote.value)
188+
revert_vote_type = reverse_vote_type(prev_vote_type)
189+
DB.Repo.insert(action_revert_vote(user.id, video_id, revert_vote_type, comment))
190+
else
191+
{:ok, nil}
192+
end
193+
end)
184194
|> Multi.insert(:vote, Vote.changeset_new(user, comment, value))
185195
|> Multi.insert(:vote_action, action_vote(user.id, video_id, vote_type, comment))
186196
|> Repo.transaction()
187197
|> case do
188-
{:ok, %{vote: vote, prev_vote: {0, []}}} ->
198+
{:ok, %{vote: vote, prev_votes: {0, []}}} ->
189199
{:ok, comment, %{vote | comment_id: comment.id, comment: comment}, 0}
190200

191-
{:ok, %{vote: vote, prev_vote: {_, [%{value: prev_value}]}}} ->
201+
{:ok, %{vote: vote, prev_votes: {_, [%{value: prev_value}]}}} ->
192202
{:ok, comment, %{vote | comment_id: comment.id, comment: comment}, prev_value}
193203

194204
{:error, _, reason, _} ->

apps/db/lib/query/query.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ defmodule DB.Query do
66
import Ecto.Query
77

88
@doc """
9-
Revert sort by last_inserted
9+
Revert sort by last_inserted. Fallsback on `id` in case there's an equality.
1010
"""
1111
@spec order_by_last_inserted_desc(Ecto.Queryable.t()) :: Ecto.Queryable.t()
1212
def order_by_last_inserted_desc(query) do
13-
order_by(query, desc: :inserted_at)
13+
order_by(query, desc: :inserted_at, desc: :id)
1414
end
1515
end

0 commit comments

Comments
 (0)