aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorlain <lain@soykaf.club>2020-05-10 13:00:01 +0200
committerlain <lain@soykaf.club>2020-05-10 13:00:01 +0200
commitf335e1404a9cd19451b531e32e3591aa323761ff (patch)
treec55690b40016354a56150822b79d8b83d3f6de03 /lib
parente297d8c649a03510023cff61dc6e0c7131bc29dc (diff)
downloadpleroma-f335e1404a9cd19451b531e32e3591aa323761ff.tar.gz
ChatView: Add the last message to the view.
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/chat.ex34
-rw-r--r--lib/pleroma/web/pleroma_api/controllers/chat_controller.ex23
-rw-r--r--lib/pleroma/web/pleroma_api/views/chat_view.ex7
3 files changed, 43 insertions, 21 deletions
diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex
index 1a092b992..6a03ee3c1 100644
--- a/lib/pleroma/chat.ex
+++ b/lib/pleroma/chat.ex
@@ -4,8 +4,11 @@
defmodule Pleroma.Chat do
use Ecto.Schema
+
import Ecto.Changeset
+ import Ecto.Query
+ alias Pleroma.Object
alias Pleroma.Repo
alias Pleroma.User
@@ -23,6 +26,37 @@ defmodule Pleroma.Chat do
timestamps()
end
+ def last_message_for_chat(chat) do
+ messages_for_chat_query(chat)
+ |> order_by(desc: :id)
+ |> Repo.one()
+ end
+
+ def messages_for_chat_query(chat) do
+ chat =
+ chat
+ |> Repo.preload(:user)
+
+ from(o in Object,
+ where: fragment("?->>'type' = ?", o.data, "ChatMessage"),
+ where:
+ fragment(
+ """
+ (?->>'actor' = ? and ?->'to' = ?)
+ OR (?->>'actor' = ? and ?->'to' = ?)
+ """,
+ o.data,
+ ^chat.user.ap_id,
+ o.data,
+ ^[chat.recipient],
+ o.data,
+ ^chat.recipient,
+ o.data,
+ ^[chat.user.ap_id]
+ )
+ )
+ end
+
def creation_cng(struct, params) do
struct
|> cast(params, [:user_id, :recipient, :unread])
diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
index 450d85332..1ef3477c8 100644
--- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
+++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
@@ -14,9 +14,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do
alias Pleroma.Web.PleromaAPI.ChatMessageView
alias Pleroma.Web.PleromaAPI.ChatView
- import Pleroma.Web.ActivityPub.ObjectValidator, only: [stringify_keys: 1]
-
import Ecto.Query
+ import Pleroma.Web.ActivityPub.ObjectValidator, only: [stringify_keys: 1]
# TODO
# - Error handling
@@ -65,24 +64,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do
def messages(%{assigns: %{user: %{id: user_id} = user}} = conn, %{id: id} = params) do
with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id) do
messages =
- from(o in Object,
- where: fragment("?->>'type' = ?", o.data, "ChatMessage"),
- where:
- fragment(
- """
- (?->>'actor' = ? and ?->'to' = ?)
- OR (?->>'actor' = ? and ?->'to' = ?)
- """,
- o.data,
- ^user.ap_id,
- o.data,
- ^[chat.recipient],
- o.data,
- ^chat.recipient,
- o.data,
- ^[user.ap_id]
- )
- )
+ chat
+ |> Chat.messages_for_chat_query()
|> Pagination.fetch_paginated(params |> stringify_keys())
conn
diff --git a/lib/pleroma/web/pleroma_api/views/chat_view.ex b/lib/pleroma/web/pleroma_api/views/chat_view.ex
index bc3af5ef5..21f0612ff 100644
--- a/lib/pleroma/web/pleroma_api/views/chat_view.ex
+++ b/lib/pleroma/web/pleroma_api/views/chat_view.ex
@@ -8,14 +8,19 @@ defmodule Pleroma.Web.PleromaAPI.ChatView do
alias Pleroma.Chat
alias Pleroma.User
alias Pleroma.Web.MastodonAPI.AccountView
+ alias Pleroma.Web.PleromaAPI.ChatMessageView
def render("show.json", %{chat: %Chat{} = chat} = opts) do
recipient = User.get_cached_by_ap_id(chat.recipient)
+ last_message = Chat.last_message_for_chat(chat)
+
%{
id: chat.id |> to_string(),
account: AccountView.render("show.json", Map.put(opts, :user, recipient)),
- unread: chat.unread
+ unread: chat.unread,
+ last_message:
+ last_message && ChatMessageView.render("show.json", chat: chat, object: last_message)
}
end