diff --git a/assets/js/app.ts b/assets/js/app.ts index ed3bde3..60d15eb 100644 --- a/assets/js/app.ts +++ b/assets/js/app.ts @@ -164,6 +164,9 @@ const Hooks = { this.handleEvent("play_video", playVideo); this.handleEvent("join_chat", Chat.join); + this.handleEvent("message_deleted", ({ id }) => { + document.querySelector(`#message-${id}`)?.remove(); + }); }, }, NavBar: { diff --git a/assets/js/user_socket.ts b/assets/js/user_socket.ts index 416f3b6..7b38799 100644 --- a/assets/js/user_socket.ts +++ b/assets/js/user_socket.ts @@ -42,7 +42,7 @@ const init = () => { channel.on("new_msg", (payload) => { const messageItem = document.createElement("div"); - messageItem.className = "px-4"; + messageItem.className = "group hover:bg-white/5 relative px-4"; const senderItem = document.createElement("span"); senderItem.innerText = `${payload.user.handle}: `; diff --git a/config/config.exs b/config/config.exs index 92d4d85..a81cea3 100644 --- a/config/config.exs +++ b/config/config.exs @@ -8,6 +8,7 @@ import Config config :algora, + admin_emails: ["zafer@algora.io", "ioannis@algora.io"], ecto_repos: [Algora.Repo.Local], rtmp_port: 9006 diff --git a/lib/algora/chat.ex b/lib/algora/chat.ex index 7d8ff80..c760d6b 100644 --- a/lib/algora/chat.ex +++ b/lib/algora/chat.ex @@ -6,7 +6,7 @@ defmodule Algora.Chat do import Ecto.Query, warn: false alias Algora.Library.Video alias Algora.Accounts.User - alias Algora.Repo + alias Algora.{Repo, Accounts} alias Algora.Chat.Message @@ -15,8 +15,12 @@ defmodule Algora.Chat do from(m in Message, join: u in User, on: m.user_id == u.id, - where: m.video_id == ^video.id, - select_merge: %{sender_handle: u.handle} + join: v in Video, + on: m.video_id == v.id, + join: c in User, + on: c.id == v.user_id, + select_merge: %{sender_handle: u.handle, channel_id: c.id}, + where: m.video_id == ^video.id ) |> order_by_inserted(:asc) |> Repo.all() @@ -26,7 +30,23 @@ defmodule Algora.Chat do from(s in query, order_by: [{^direction, s.inserted_at}]) end - def get_message!(id), do: Repo.get!(Message, id) + def can_delete?(%User{} = user, %Message{} = message) do + user.id == message.channel_id or user.id == message.user_id or Accounts.admin?(user) + end + + def get_message!(id) do + from(m in Message, + join: u in User, + on: m.user_id == u.id, + join: v in Video, + on: m.video_id == v.id, + join: c in User, + on: c.id == v.user_id, + select_merge: %{sender_handle: u.handle, channel_id: c.id}, + where: m.id == ^id + ) + |> Repo.one!() + end def create_message(attrs \\ %{}) do %Message{} diff --git a/lib/algora/chat/message.ex b/lib/algora/chat/message.ex index 023d19d..b65f3ad 100644 --- a/lib/algora/chat/message.ex +++ b/lib/algora/chat/message.ex @@ -7,6 +7,7 @@ defmodule Algora.Chat.Message do schema "messages" do field :body, :string field :sender_handle, :string, virtual: true + field :channel_id, :integer, virtual: true belongs_to :user, Accounts.User belongs_to :video, Library.Video diff --git a/lib/algora/library.ex b/lib/algora/library.ex index 0899a19..dcbb548 100644 --- a/lib/algora/library.ex +++ b/lib/algora/library.ex @@ -640,6 +640,10 @@ defmodule Algora.Library do Phoenix.PubSub.broadcast!(@pubsub, topic, {__MODULE__, msg}) end + def broadcast_message_deleted!(%Channel{} = channel, message) do + broadcast!(topic(channel.user_id), %Events.MessageDeleted{message: message}) + end + def broadcast_processing_progressed!(stage, video, pct) do broadcast!(topic_studio(), %Events.ProcessingProgressed{video: video, stage: stage, pct: pct}) end diff --git a/lib/algora/library/events.ex b/lib/algora/library/events.ex index bf3b82f..6d8f639 100644 --- a/lib/algora/library/events.ex +++ b/lib/algora/library/events.ex @@ -26,4 +26,8 @@ defmodule Algora.Library.Events do defmodule ProcessingFailed do defstruct video: nil, attempt: nil, max_attempts: nil end + + defmodule MessageDeleted do + defstruct message: nil + end end diff --git a/lib/algora_web/live/video_live.ex b/lib/algora_web/live/video_live.ex index 915be4d..d5ac29d 100644 --- a/lib/algora_web/live/video_live.ex +++ b/lib/algora_web/live/video_live.ex @@ -139,13 +139,27 @@ defmodule AlgoraWeb.VideoLive do phx-update="ignore" class="text-sm break-words flex-1 scrollbar-thin overflow-y-auto h-[calc(100vh-11rem)]" > -