Merge remote-tracking branch 'origin/develop' into reactions
[akkoma] / lib / pleroma / web / pleroma_api / controllers / pleroma_api_controller.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.PleromaAPI.PleromaAPIController do
6 use Pleroma.Web, :controller
7
8 import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2]
9
10 alias Pleroma.Activity
11 alias Pleroma.Conversation.Participation
12 alias Pleroma.Notification
13 alias Pleroma.Object
14 alias Pleroma.User
15 alias Pleroma.Web.ActivityPub.ActivityPub
16 alias Pleroma.Web.CommonAPI
17 alias Pleroma.Web.MastodonAPI.AccountView
18 alias Pleroma.Web.MastodonAPI.ConversationView
19 alias Pleroma.Web.MastodonAPI.NotificationView
20 alias Pleroma.Web.MastodonAPI.StatusView
21
22 def emoji_reactions_by(%{assigns: %{user: user}} = conn, %{"id" => activity_id}) do
23 with %Activity{} = activity <- Activity.get_by_id_with_object(activity_id),
24 %Object{data: %{"reactions" => emoji_reactions}} <- Object.normalize(activity) do
25 reactions =
26 emoji_reactions
27 |> Enum.map(fn {emoji, users} ->
28 users = Enum.map(users, &User.get_cached_by_ap_id/1)
29 {emoji, AccountView.render("index.json", %{users: users, for: user, as: :user})}
30 end)
31 |> Enum.into(%{})
32
33 conn
34 |> json(reactions)
35 else
36 _e ->
37 conn
38 |> json(%{})
39 end
40 end
41
42 def react_with_emoji(%{assigns: %{user: user}} = conn, %{"id" => activity_id, "emoji" => emoji}) do
43 with {:ok, _activity, _object} <- CommonAPI.react_with_emoji(activity_id, user, emoji),
44 activity <- Activity.get_by_id(activity_id) do
45 conn
46 |> put_view(StatusView)
47 |> render("show.json", %{activity: activity, for: user, as: :activity})
48 end
49 end
50
51 def unreact_with_emoji(%{assigns: %{user: user}} = conn, %{
52 "id" => activity_id,
53 "emoji" => emoji
54 }) do
55 with {:ok, _activity, _object} <- CommonAPI.unreact_with_emoji(activity_id, user, emoji),
56 activity <- Activity.get_by_id(activity_id) do
57 conn
58 |> put_view(StatusView)
59 |> render("show.json", %{activity: activity, for: user, as: :activity})
60 end
61 end
62
63 def conversation(%{assigns: %{user: user}} = conn, %{"id" => participation_id}) do
64 with %Participation{} = participation <- Participation.get(participation_id),
65 true <- user.id == participation.user_id do
66 conn
67 |> put_view(ConversationView)
68 |> render("participation.json", %{participation: participation, for: user})
69 end
70 end
71
72 def conversation_statuses(
73 %{assigns: %{user: user}} = conn,
74 %{"id" => participation_id} = params
75 ) do
76 participation = Participation.get(participation_id, preload: [:conversation])
77
78 if user.id == participation.user_id do
79 params =
80 params
81 |> Map.put("blocking_user", user)
82 |> Map.put("muting_user", user)
83 |> Map.put("user", user)
84
85 activities =
86 participation.conversation.ap_id
87 |> ActivityPub.fetch_activities_for_context(params)
88 |> Enum.reverse()
89
90 conn
91 |> add_link_headers(activities)
92 |> put_view(StatusView)
93 |> render("index.json", %{activities: activities, for: user, as: :activity})
94 end
95 end
96
97 def update_conversation(
98 %{assigns: %{user: user}} = conn,
99 %{"id" => participation_id, "recipients" => recipients}
100 ) do
101 participation =
102 participation_id
103 |> Participation.get()
104
105 with true <- user.id == participation.user_id,
106 {:ok, participation} <- Participation.set_recipients(participation, recipients) do
107 conn
108 |> put_view(ConversationView)
109 |> render("participation.json", %{participation: participation, for: user})
110 end
111 end
112
113 def read_notification(%{assigns: %{user: user}} = conn, %{"id" => notification_id}) do
114 with {:ok, notification} <- Notification.read_one(user, notification_id) do
115 conn
116 |> put_view(NotificationView)
117 |> render("show.json", %{notification: notification, for: user})
118 else
119 {:error, message} ->
120 conn
121 |> put_status(:bad_request)
122 |> json(%{"error" => message})
123 end
124 end
125
126 def read_notification(%{assigns: %{user: user}} = conn, %{"max_id" => max_id}) do
127 with notifications <- Notification.set_read_up_to(user, max_id) do
128 notifications = Enum.take(notifications, 80)
129
130 conn
131 |> put_view(NotificationView)
132 |> render("index.json", %{notifications: notifications, for: user})
133 end
134 end
135 end