# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
-defmodule Pleroma.ChatMessageReference do
+defmodule Pleroma.Chat.MessageReference do
@moduledoc """
A reference that builds a relation between an AP chat message that a user can see and whether it has been seen
by them, or should be displayed to them. Used to build the chat view that is presented to the user.
"""
alias Pleroma.Activity
alias Pleroma.Chat
- alias Pleroma.ChatMessageReference
+ alias Pleroma.Chat.MessageReference
alias Pleroma.Notification
alias Pleroma.Object
alias Pleroma.Repo
Object.decrease_replies_count(in_reply_to)
end
- ChatMessageReference.delete_for_object(deleted_object)
+ MessageReference.delete_for_object(deleted_object)
ActivityPub.stream_out(object)
ActivityPub.stream_out_participations(deleted_object, user)
|> Enum.each(fn [user, other_user] ->
if user.local do
{:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id)
- {:ok, cm_ref} = ChatMessageReference.create(chat, object, user.ap_id != actor.ap_id)
+ {:ok, cm_ref} = MessageReference.create(chat, object, user.ap_id != actor.ap_id)
# We add a cache of the unread value here so that it
# doesn't change when being streamed out
chat =
chat
- |> Map.put(:unread, ChatMessageReference.unread_count_for_chat(chat))
+ |> Map.put(:unread, MessageReference.unread_count_for_chat(chat))
Streamer.stream(
["user", "user:pleroma_chat"],
use Pleroma.Web, :view
alias Pleroma.Activity
- alias Pleroma.ChatMessageReference
+ alias Pleroma.Chat.MessageReference
alias Pleroma.Notification
alias Pleroma.Object
alias Pleroma.User
alias Pleroma.Web.MastodonAPI.AccountView
alias Pleroma.Web.MastodonAPI.NotificationView
alias Pleroma.Web.MastodonAPI.StatusView
- alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView
+ alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView
@parent_types ~w{Like Announce EmojiReact}
object = Object.normalize(activity)
author = User.get_cached_by_ap_id(object.data["actor"])
chat = Pleroma.Chat.get(reading_user.id, author.ap_id)
- cm_ref = ChatMessageReference.for_chat_and_object(chat, object)
+ cm_ref = MessageReference.for_chat_and_object(chat, object)
render_opts = Map.merge(opts, %{for: reading_user, chat_message_reference: cm_ref})
- chat_message_render = ChatMessageReferenceView.render("show.json", render_opts)
+ chat_message_render = MessageReferenceView.render("show.json", render_opts)
Map.put(response, :chat_message, chat_message_render)
end
alias Pleroma.Activity
alias Pleroma.Chat
- alias Pleroma.ChatMessageReference
+ alias Pleroma.Chat.MessageReference
alias Pleroma.Object
alias Pleroma.Pagination
alias Pleroma.Plugs.OAuthScopesPlug
alias Pleroma.Repo
alias Pleroma.User
alias Pleroma.Web.CommonAPI
- alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView
+ alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView
alias Pleroma.Web.PleromaAPI.ChatView
import Ecto.Query
message_id: message_id,
id: chat_id
}) do
- with %ChatMessageReference{} = cm_ref <-
- ChatMessageReference.get_by_id(message_id),
+ with %MessageReference{} = cm_ref <-
+ MessageReference.get_by_id(message_id),
^chat_id <- cm_ref.chat_id |> to_string(),
%Chat{user_id: ^user_id} <- Chat.get_by_id(chat_id),
{:ok, _} <- remove_or_delete(cm_ref, user) do
conn
- |> put_view(ChatMessageReferenceView)
+ |> put_view(MessageReferenceView)
|> render("show.json", chat_message_reference: cm_ref)
else
_e ->
defp remove_or_delete(cm_ref, _) do
cm_ref
- |> ChatMessageReference.delete()
+ |> MessageReference.delete()
end
def post_chat_message(
media_id: params[:media_id]
),
message <- Object.normalize(activity, false),
- cm_ref <- ChatMessageReference.for_chat_and_object(chat, message) do
+ cm_ref <- MessageReference.for_chat_and_object(chat, message) do
conn
- |> put_view(ChatMessageReferenceView)
+ |> put_view(MessageReferenceView)
|> render("show.json", for: user, chat_message_reference: cm_ref)
end
end
id: chat_id,
message_id: message_id
}) do
- with %ChatMessageReference{} = cm_ref <-
- ChatMessageReference.get_by_id(message_id),
+ with %MessageReference{} = cm_ref <-
+ MessageReference.get_by_id(message_id),
^chat_id <- cm_ref.chat_id |> to_string(),
%Chat{user_id: ^user_id} <- Chat.get_by_id(chat_id),
- {:ok, cm_ref} <- ChatMessageReference.mark_as_read(cm_ref) do
+ {:ok, cm_ref} <- MessageReference.mark_as_read(cm_ref) do
conn
- |> put_view(ChatMessageReferenceView)
+ |> put_view(MessageReferenceView)
|> render("show.json", for: user, chat_message_reference: cm_ref)
end
end
def mark_as_read(%{assigns: %{user: %{id: user_id}}} = conn, %{id: id}) do
with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id),
- {_n, _} <- ChatMessageReference.set_all_seen_for_chat(chat) do
+ {_n, _} <- MessageReference.set_all_seen_for_chat(chat) do
conn
|> put_view(ChatView)
|> render("show.json", chat: chat)
with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id) do
cm_refs =
chat
- |> ChatMessageReference.for_chat_query()
+ |> MessageReference.for_chat_query()
|> Pagination.fetch_paginated(params |> stringify_keys())
conn
- |> put_view(ChatMessageReferenceView)
+ |> put_view(MessageReferenceView)
|> render("index.json", for: user, chat_message_references: cm_refs)
else
_ ->
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
-defmodule Pleroma.Web.PleromaAPI.ChatMessageReferenceView do
+defmodule Pleroma.Web.PleromaAPI.Chat.MessageReferenceView do
use Pleroma.Web, :view
alias Pleroma.User
use Pleroma.Web, :view
alias Pleroma.Chat
- alias Pleroma.ChatMessageReference
+ alias Pleroma.Chat.MessageReference
alias Pleroma.User
alias Pleroma.Web.CommonAPI.Utils
alias Pleroma.Web.MastodonAPI.AccountView
- alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView
+ alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView
def render("show.json", %{chat: %Chat{} = chat} = opts) do
recipient = User.get_cached_by_ap_id(chat.recipient)
- last_message = opts[:last_message] || ChatMessageReference.last_message_for_chat(chat)
+ last_message = opts[:last_message] || MessageReference.last_message_for_chat(chat)
%{
id: chat.id |> to_string(),
account: AccountView.render("show.json", Map.put(opts, :user, recipient)),
- unread: Map.get(chat, :unread) || ChatMessageReference.unread_count_for_chat(chat),
+ unread: Map.get(chat, :unread) || MessageReference.unread_count_for_chat(chat),
last_message:
last_message &&
- ChatMessageReferenceView.render("show.json", chat_message_reference: last_message),
+ MessageReferenceView.render("show.json", chat_message_reference: last_message),
updated_at: Utils.to_masto_date(chat.updated_at)
}
end
require Logger
alias Pleroma.Activity
- alias Pleroma.ChatMessageReference
+ alias Pleroma.Chat.MessageReference
alias Pleroma.Config
alias Pleroma.Conversation.Participation
alias Pleroma.Notification
end)
end
- defp do_stream(topic, {user, %ChatMessageReference{} = cm_ref})
+ defp do_stream(topic, {user, %MessageReference{} = cm_ref})
when topic in ["user", "user:pleroma_chat"] do
topic = "#{topic}:#{user.id}"
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
-defmodule Pleroma.ChatMessageReferenceTest do
+defmodule Pleroma.Chat.MessageReferenceTest do
use Pleroma.DataCase, async: true
alias Pleroma.Chat
- alias Pleroma.ChatMessageReference
+ alias Pleroma.Chat.MessageReference
alias Pleroma.Web.CommonAPI
import Pleroma.Factory
{:ok, chat} = Chat.get_or_create(user.id, recipient.ap_id)
- message = ChatMessageReference.last_message_for_chat(chat)
+ message = MessageReference.last_message_for_chat(chat)
assert message.object.data["content"] == "ho"
end
alias Pleroma.Activity
alias Pleroma.Chat
- alias Pleroma.ChatMessageReference
+ alias Pleroma.Chat.MessageReference
alias Pleroma.Notification
alias Pleroma.Object
alias Pleroma.Repo
end
end
- test "it creates a Chat and ChatMessageReferences for the local users and bumps the unread count, except for the author" do
+ test "it creates a Chat and MessageReferences for the local users and bumps the unread count, except for the author" do
author = insert(:user, local: true)
recipient = insert(:user, local: true)
chat = Chat.get(author.id, recipient.ap_id)
- [cm_ref] = ChatMessageReference.for_chat_query(chat) |> Repo.all()
+ [cm_ref] = MessageReference.for_chat_query(chat) |> Repo.all()
assert cm_ref.object.data["content"] == "hey"
assert cm_ref.unread == false
chat = Chat.get(recipient.id, author.ap_id)
- [cm_ref] = ChatMessageReference.for_chat_query(chat) |> Repo.all()
+ [cm_ref] = MessageReference.for_chat_query(chat) |> Repo.all()
assert cm_ref.object.data["content"] == "hey"
assert cm_ref.unread == true
alias Pleroma.Activity
alias Pleroma.Chat
- alias Pleroma.ChatMessageReference
+ alias Pleroma.Chat.MessageReference
alias Pleroma.Notification
alias Pleroma.Object
alias Pleroma.Repo
alias Pleroma.Web.MastodonAPI.AccountView
alias Pleroma.Web.MastodonAPI.NotificationView
alias Pleroma.Web.MastodonAPI.StatusView
- alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView
+ alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView
import Pleroma.Factory
defp test_notifications_rendering(notifications, user, expected_result) do
object = Object.normalize(activity)
chat = Chat.get(recipient.id, user.ap_id)
- cm_ref = ChatMessageReference.for_chat_and_object(chat, object)
+ cm_ref = MessageReference.for_chat_and_object(chat, object)
expected = %{
id: to_string(notification.id),
pleroma: %{is_seen: false},
type: "pleroma:chat_mention",
account: AccountView.render("show.json", %{user: user, for: recipient}),
- chat_message:
- ChatMessageReferenceView.render("show.json", %{chat_message_reference: cm_ref}),
+ chat_message: MessageReferenceView.render("show.json", %{chat_message_reference: cm_ref}),
created_at: Utils.to_masto_date(notification.inserted_at)
}
use Pleroma.Web.ConnCase, async: true
alias Pleroma.Chat
- alias Pleroma.ChatMessageReference
+ alias Pleroma.Chat.MessageReference
alias Pleroma.Object
alias Pleroma.User
alias Pleroma.Web.ActivityPub.ActivityPub
{:ok, _create} = CommonAPI.post_chat_message(other_user, user, "sup part 2")
{:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id)
object = Object.normalize(create, false)
- cm_ref = ChatMessageReference.for_chat_and_object(chat, object)
+ cm_ref = MessageReference.for_chat_and_object(chat, object)
assert cm_ref.unread == true
assert result["unread"] == false
- cm_ref = ChatMessageReference.for_chat_and_object(chat, object)
+ cm_ref = MessageReference.for_chat_and_object(chat, object)
assert cm_ref.unread == false
end
{:ok, _create} = CommonAPI.post_chat_message(other_user, user, "sup part 2")
{:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id)
object = Object.normalize(create, false)
- cm_ref = ChatMessageReference.for_chat_and_object(chat, object)
+ cm_ref = MessageReference.for_chat_and_object(chat, object)
assert cm_ref.unread == true
assert result["unread"] == 0
- cm_ref = ChatMessageReference.for_chat_and_object(chat, object)
+ cm_ref = MessageReference.for_chat_and_object(chat, object)
assert cm_ref.unread == false
end
chat = Chat.get(user.id, recipient.ap_id)
- cm_ref = ChatMessageReference.for_chat_and_object(chat, object)
+ cm_ref = MessageReference.for_chat_and_object(chat, object)
# Deleting your own message removes the message and the reference
result =
|> json_response_and_validate_schema(200)
assert result["id"] == cm_ref.id
- refute ChatMessageReference.get_by_id(cm_ref.id)
+ refute MessageReference.get_by_id(cm_ref.id)
assert %{data: %{"type" => "Tombstone"}} = Object.get_by_id(object.id)
# Deleting other people's messages just removes the reference
object = Object.normalize(other_message, false)
- cm_ref = ChatMessageReference.for_chat_and_object(chat, object)
+ cm_ref = MessageReference.for_chat_and_object(chat, object)
result =
conn
|> json_response_and_validate_schema(200)
assert result["id"] == cm_ref.id
- refute ChatMessageReference.get_by_id(cm_ref.id)
+ refute MessageReference.get_by_id(cm_ref.id)
assert Object.get_by_id(object.id)
end
end
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
-defmodule Pleroma.Web.PleromaAPI.ChatMessageReferenceViewTest do
+defmodule Pleroma.Web.PleromaAPI.Chat.MessageReferenceViewTest do
use Pleroma.DataCase
alias Pleroma.Chat
- alias Pleroma.ChatMessageReference
+ alias Pleroma.Chat.MessageReference
alias Pleroma.Object
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.CommonAPI
- alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView
+ alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView
import Pleroma.Factory
object = Object.normalize(activity)
- cm_ref = ChatMessageReference.for_chat_and_object(chat, object)
+ cm_ref = MessageReference.for_chat_and_object(chat, object)
- chat_message = ChatMessageReferenceView.render("show.json", chat_message_reference: cm_ref)
+ chat_message = MessageReferenceView.render("show.json", chat_message_reference: cm_ref)
assert chat_message[:id] == cm_ref.id
assert chat_message[:content] == "kippis :firefox:"
object = Object.normalize(activity)
- cm_ref = ChatMessageReference.for_chat_and_object(chat, object)
+ cm_ref = MessageReference.for_chat_and_object(chat, object)
- chat_message_two =
- ChatMessageReferenceView.render("show.json", chat_message_reference: cm_ref)
+ chat_message_two = MessageReferenceView.render("show.json", chat_message_reference: cm_ref)
assert chat_message_two[:id] == cm_ref.id
assert chat_message_two[:content] == "gkgkgk"
use Pleroma.DataCase
alias Pleroma.Chat
- alias Pleroma.ChatMessageReference
+ alias Pleroma.Chat.MessageReference
alias Pleroma.Object
alias Pleroma.Web.CommonAPI
alias Pleroma.Web.CommonAPI.Utils
alias Pleroma.Web.MastodonAPI.AccountView
- alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView
+ alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView
alias Pleroma.Web.PleromaAPI.ChatView
import Pleroma.Factory
represented_chat = ChatView.render("show.json", chat: chat)
- cm_ref = ChatMessageReference.for_chat_and_object(chat, chat_message)
+ cm_ref = MessageReference.for_chat_and_object(chat, chat_message)
assert represented_chat[:last_message] ==
- ChatMessageReferenceView.render("show.json", chat_message_reference: cm_ref)
+ MessageReferenceView.render("show.json", chat_message_reference: cm_ref)
end
end
import Pleroma.Factory
alias Pleroma.Chat
- alias Pleroma.ChatMessageReference
+ alias Pleroma.Chat.MessageReference
alias Pleroma.Conversation.Participation
alias Pleroma.List
alias Pleroma.Object
{:ok, create_activity} = CommonAPI.post_chat_message(other_user, user, "hey cirno")
object = Object.normalize(create_activity, false)
chat = Chat.get(user.id, other_user.ap_id)
- cm_ref = ChatMessageReference.for_chat_and_object(chat, object)
+ cm_ref = MessageReference.for_chat_and_object(chat, object)
cm_ref = %{cm_ref | chat: chat, object: object}
Streamer.get_topic_and_add_socket("user:pleroma_chat", user)
{:ok, create_activity} = CommonAPI.post_chat_message(other_user, user, "hey cirno")
object = Object.normalize(create_activity, false)
chat = Chat.get(user.id, other_user.ap_id)
- cm_ref = ChatMessageReference.for_chat_and_object(chat, object)
+ cm_ref = MessageReference.for_chat_and_object(chat, object)
cm_ref = %{cm_ref | chat: chat, object: object}
Streamer.get_topic_and_add_socket("user", user)