@@ -28,6 +28,8 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do | |||
{:ok, _object} = handle_object_creation(object) | |||
Notification.create_notifications(activity) | |||
{:ok, activity, meta} | |||
end | |||
@@ -8,11 +8,13 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do | |||
alias Pleroma.Activity | |||
alias Pleroma.Notification | |||
alias Pleroma.User | |||
alias Pleroma.Object | |||
alias Pleroma.UserRelationship | |||
alias Pleroma.Web.CommonAPI | |||
alias Pleroma.Web.MastodonAPI.AccountView | |||
alias Pleroma.Web.MastodonAPI.NotificationView | |||
alias Pleroma.Web.MastodonAPI.StatusView | |||
alias Pleroma.Web.PleromaAPI.ChatMessageView | |||
def render("index.json", %{notifications: notifications, for: reading_user} = opts) do | |||
activities = Enum.map(notifications, & &1.activity) | |||
@@ -81,7 +83,20 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do | |||
end | |||
end | |||
mastodon_type = Activity.mastodon_notification_type(activity) | |||
# This returns the notification type by activity, but both chats and statuses are in "Create" activities. | |||
mastodon_type = | |||
case Activity.mastodon_notification_type(activity) do | |||
"mention" -> | |||
object = Object.normalize(activity) | |||
case object do | |||
%{data: %{"type" => "ChatMessage"}} -> "pleroma:chat_mention" | |||
_ -> "mention" | |||
end | |||
type -> | |||
type | |||
end | |||
render_opts = %{ | |||
relationships: opts[:relationships], | |||
@@ -125,6 +140,9 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do | |||
|> put_status(parent_activity_fn.(), reading_user, render_opts) | |||
|> put_emoji(activity) | |||
"pleroma:chat_mention" -> | |||
put_chat_message(response, activity, reading_user, render_opts) | |||
_ -> | |||
nil | |||
end | |||
@@ -137,6 +155,16 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do | |||
Map.put(response, :emoji, activity.data["content"]) | |||
end | |||
defp put_chat_message(response, activity, reading_user, opts) do | |||
object = Object.normalize(activity) | |||
author = User.get_cached_by_ap_id(object.data["actor"]) | |||
chat = Pleroma.Chat.get(reading_user.id, author.ap_id) | |||
render_opts = Map.merge(opts, %{object: object, for: reading_user, chat: chat}) | |||
chat_message_render = ChatMessageView.render("show.json", render_opts) | |||
Map.put(response, :chat_message, chat_message_render) | |||
end | |||
defp put_status(response, activity, reading_user, opts) do | |||
status_render_opts = Map.merge(opts, %{activity: activity, for: reading_user}) | |||
status_render = StatusView.render("show.json", status_render_opts) | |||
@@ -6,7 +6,9 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do | |||
use Pleroma.DataCase | |||
alias Pleroma.Chat | |||
alias Pleroma.Notification | |||
alias Pleroma.Object | |||
alias Pleroma.Repo | |||
alias Pleroma.Web.ActivityPub.ActivityPub | |||
alias Pleroma.Web.ActivityPub.Builder | |||
alias Pleroma.Web.ActivityPub.SideEffects | |||
@@ -34,6 +36,23 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do | |||
end | |||
describe "creation of ChatMessages" do | |||
test "notifies the recipient" do | |||
author = insert(:user, local: false) | |||
recipient = insert(:user, local: true) | |||
{:ok, chat_message_data, _meta} = Builder.chat_message(author, recipient.ap_id, "hey") | |||
{:ok, chat_message_object} = Object.create(chat_message_data) | |||
{:ok, create_activity_data, _meta} = | |||
Builder.create(author, chat_message_object.data["id"], [recipient.ap_id]) | |||
{:ok, create_activity, _meta} = ActivityPub.persist(create_activity_data, local: false) | |||
{:ok, _create_activity, _meta} = SideEffects.handle(create_activity) | |||
assert Repo.get_by(Notification, user_id: recipient.id, activity_id: create_activity.id) | |||
end | |||
test "it creates a Chat for the local users and bumps the unread count" do | |||
author = insert(:user, local: false) | |||
recipient = insert(:user, local: true) | |||
@@ -6,7 +6,9 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do | |||
use Pleroma.DataCase | |||
alias Pleroma.Activity | |||
alias Pleroma.Chat | |||
alias Pleroma.Notification | |||
alias Pleroma.Object | |||
alias Pleroma.Repo | |||
alias Pleroma.User | |||
alias Pleroma.Web.CommonAPI | |||
@@ -14,6 +16,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do | |||
alias Pleroma.Web.MastodonAPI.AccountView | |||
alias Pleroma.Web.MastodonAPI.NotificationView | |||
alias Pleroma.Web.MastodonAPI.StatusView | |||
alias Pleroma.Web.PleromaAPI.ChatMessageView | |||
import Pleroma.Factory | |||
defp test_notifications_rendering(notifications, user, expected_result) do | |||
@@ -31,6 +34,29 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do | |||
assert expected_result == result | |||
end | |||
test "ChatMessage notification" do | |||
user = insert(:user) | |||
recipient = insert(:user) | |||
{:ok, activity} = CommonAPI.post_chat_message(user, recipient, "what's up my dude") | |||
{:ok, [notification]} = Notification.create_notifications(activity) | |||
object = Object.normalize(activity) | |||
chat = Chat.get(recipient.id, user.ap_id) | |||
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: | |||
ChatMessageView.render("show.json", %{object: object, for: recipient, chat: chat}), | |||
created_at: Utils.to_masto_date(notification.inserted_at) | |||
} | |||
test_notifications_rendering([notification], recipient, [expected]) | |||
end | |||
test "Mention notification" do | |||
user = insert(:user) | |||
mentioned_user = insert(:user) | |||