summaryrefslogtreecommitdiff
path: root/lib/pleroma/web/mastodon_api/views/conversation_view.ex
blob: 2b6f84c72bbea703236178cb8c78f2f93eb13c05 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# Pleroma: A lightweight social networking server
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.MastodonAPI.ConversationView do
  use Pleroma.Web, :view

  alias Pleroma.Activity
  alias Pleroma.Repo
  alias Pleroma.Web.ActivityPub.ActivityPub
  alias Pleroma.Web.MastodonAPI.AccountView
  alias Pleroma.Web.MastodonAPI.StatusView

  def render("participations.json", %{participations: participations, for: user}) do
    safe_render_many(participations, __MODULE__, "participation.json", %{
      as: :participation,
      for: user
    })
  end

  def render("participation.json", %{participation: participation, for: user}) do
    participation = Repo.preload(participation, conversation: [], recipients: [])

    last_activity_id =
      with nil <- participation.last_activity_id do
        ActivityPub.fetch_latest_activity_id_for_context(participation.conversation.ap_id, %{
          "user" => user,
          "blocking_user" => user
        })
      end

    activity = Activity.get_by_id_with_object(last_activity_id)
    # Conversations return all users except the current user.
    users = Enum.reject(participation.recipients, &(&1.id == user.id))

    %{
      id: participation.id |> to_string(),
      accounts: render(AccountView, "index.json", users: users, as: :user),
      unread: !participation.read,
      last_status:
        render(StatusView, "show.json",
          activity: activity,
          direct_conversation_id: participation.id
        )
    }
  end
end