summaryrefslogtreecommitdiff
path: root/lib/aggiedit/rooms.ex
diff options
context:
space:
mode:
authorLogan Hunt <loganhunt@simponic.xyz>2022-04-15 13:00:42 -0600
committerLogan Hunt <loganhunt@simponic.xyz>2022-04-15 13:00:42 -0600
commit3cf9f4a364ac91cca30799c8379a682139425e71 (patch)
treedb94f64634e0a840b0a5d1eeef43460ef4e8dd21 /lib/aggiedit/rooms.ex
parentdb7c2321cd0af59f9e810e84c7d4eb83ec416458 (diff)
downloadaggiedit-3cf9f4a364ac91cca30799c8379a682139425e71.tar.gz
aggiedit-3cf9f4a364ac91cca30799c8379a682139425e71.zip
Add comments and vote models; pub/sub voting on posts
Diffstat (limited to 'lib/aggiedit/rooms.ex')
-rw-r--r--lib/aggiedit/rooms.ex21
1 files changed, 20 insertions, 1 deletions
diff --git a/lib/aggiedit/rooms.ex b/lib/aggiedit/rooms.ex
index 898dfe1..41df588 100644
--- a/lib/aggiedit/rooms.ex
+++ b/lib/aggiedit/rooms.ex
@@ -6,9 +6,11 @@ defmodule Aggiedit.Rooms do
import Ecto.Query, warn: false
alias Aggiedit.Repo
- alias Aggiedit.Accounts
+ alias Aggiedit.Accounts.User
alias Aggiedit.Rooms.Room
+ alias Aggiedit.Post.{Vote, Comment}
+
alias Phoenix.PubSub
def list_rooms do
@@ -91,6 +93,23 @@ defmodule Aggiedit.Rooms do
Post.changeset(post, attrs)
end
+ def vote_count(post) do
+ votes = post
+ |> Repo.preload(:votes)
+ |> Map.get(:votes)
+ |> Enum.map(fn vote -> if vote.is_up, do: 1, else: -1 end)
+ |> Enum.sum()
+ end
+
+ def vote_post(%Post{} = post, %User{} = user, direction) do
+ is_up = direction == "upvote"
+ vote = %Vote{is_up: is_up, user: user, post: post}
+ |> Repo.insert(on_conflict: [set: [is_up: is_up]], conflict_target: [:user_id, :post_id])
+ post = change_post(post, %{score: vote_count(post)})
+ |> Repo.update()
+ broadcast_post_over_room(post, :post_voted)
+ end
+
defp broadcast_post_over_room({:error, _reason}=error, _event), do: error
defp broadcast_post_over_room({:ok, post}, event) do
PubSub.broadcast(Aggiedit.PubSub, "room:#{post.room_id}:posts", {event, post})