summaryrefslogtreecommitdiff
path: root/lib/pleroma/web/mastodon_api/views/conversation_view.ex
blob: 46b63b54ba3aae97fc7201d71c210928937b8d9c (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
48
49
50
51
52
53
54
55
56
57
58
# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 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_direct_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,
    # except when the current user is the only participant
    users =
      if length(participation.recipients) > 1 do
        Enum.reject(participation.recipients, &(&1.id == user.id))
      else
        participation.recipients
      end

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