aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/chat.ex13
-rw-r--r--lib/pleroma/chat_message_reference.ex16
-rw-r--r--lib/pleroma/web/activity_pub/side_effects.ex9
-rw-r--r--lib/pleroma/web/pleroma_api/controllers/chat_controller.ex2
-rw-r--r--lib/pleroma/web/pleroma_api/views/chat_view.ex2
5 files changed, 23 insertions, 19 deletions
diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex
index 65938c7a4..5aefddc5e 100644
--- a/lib/pleroma/chat.ex
+++ b/lib/pleroma/chat.ex
@@ -19,14 +19,13 @@ defmodule Pleroma.Chat do
schema "chats" do
belongs_to(:user, User, type: FlakeId.Ecto.CompatType)
field(:recipient, :string)
- field(:unread, :integer, default: 0, read_after_writes: true)
timestamps()
end
def creation_cng(struct, params) do
struct
- |> cast(params, [:user_id, :recipient, :unread])
+ |> cast(params, [:user_id, :recipient])
|> validate_change(:recipient, fn
:recipient, recipient ->
case User.get_cached_by_ap_id(recipient) do
@@ -61,16 +60,10 @@ defmodule Pleroma.Chat do
def bump_or_create(user_id, recipient) do
%__MODULE__{}
- |> creation_cng(%{user_id: user_id, recipient: recipient, unread: 1})
+ |> creation_cng(%{user_id: user_id, recipient: recipient})
|> Repo.insert(
- on_conflict: [set: [updated_at: NaiveDateTime.utc_now()], inc: [unread: 1]],
+ on_conflict: [set: [updated_at: NaiveDateTime.utc_now()]],
conflict_target: [:user_id, :recipient]
)
end
-
- def mark_as_read(chat) do
- chat
- |> change(%{unread: 0})
- |> Repo.update()
- end
end
diff --git a/lib/pleroma/chat_message_reference.ex b/lib/pleroma/chat_message_reference.ex
index 6808d1365..ad174b294 100644
--- a/lib/pleroma/chat_message_reference.ex
+++ b/lib/pleroma/chat_message_reference.ex
@@ -84,4 +84,20 @@ defmodule Pleroma.ChatMessageReference do
|> changeset(params)
|> Repo.insert()
end
+
+ def unread_count_for_chat(chat) do
+ chat
+ |> for_chat_query()
+ |> where([cmr], cmr.seen == false)
+ |> Repo.aggregate(:count)
+ end
+
+ def set_all_seen_for_chat(chat) do
+ chat
+ |> for_chat_query()
+ |> exclude(:order_by)
+ |> exclude(:preload)
+ |> where([cmr], cmr.seen == false)
+ |> Repo.update_all(set: [seen: true])
+ end
end
diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex
index cda52b00e..884d399d0 100644
--- a/lib/pleroma/web/activity_pub/side_effects.ex
+++ b/lib/pleroma/web/activity_pub/side_effects.ex
@@ -139,13 +139,8 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do
[[actor, recipient], [recipient, actor]]
|> Enum.each(fn [user, other_user] ->
if user.local do
- if user.ap_id == actor.ap_id do
- {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id)
- ChatMessageReference.create(chat, object, true)
- else
- {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id)
- ChatMessageReference.create(chat, object, false)
- end
+ {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id)
+ ChatMessageReference.create(chat, object, user.ap_id == actor.ap_id)
end
end)
diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
index f22f33de9..29922da99 100644
--- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
+++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
@@ -90,7 +90,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do
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),
- {:ok, chat} <- Chat.mark_as_read(chat) do
+ {_n, _} <- ChatMessageReference.set_all_seen_for_chat(chat) do
conn
|> put_view(ChatView)
|> render("show.json", chat: chat)
diff --git a/lib/pleroma/web/pleroma_api/views/chat_view.ex b/lib/pleroma/web/pleroma_api/views/chat_view.ex
index 331c1d282..c903a71fd 100644
--- a/lib/pleroma/web/pleroma_api/views/chat_view.ex
+++ b/lib/pleroma/web/pleroma_api/views/chat_view.ex
@@ -20,7 +20,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatView do
%{
id: chat.id |> to_string(),
account: AccountView.render("show.json", Map.put(opts, :user, recipient)),
- unread: chat.unread,
+ unread: ChatMessageReference.unread_count_for_chat(chat),
last_message:
last_message &&
ChatMessageReferenceView.render("show.json", chat_message_reference: last_message),