39d371ff706f4313b11f2e5abccefb51fc52e820
[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("accounts.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 conversation(%{assigns: %{user: user}} = conn, %{"id" => participation_id}) do
52 with %Participation{} = participation <- Participation.get(participation_id),
53 true <- user.id == participation.user_id do
54 conn
55 |> put_view(ConversationView)
56 |> render("participation.json", %{participation: participation, for: user})
57 end
58 end
59
60 def conversation_statuses(
61 %{assigns: %{user: user}} = conn,
62 %{"id" => participation_id} = params
63 ) do
64 participation = Participation.get(participation_id, preload: [:conversation])
65
66 if user.id == participation.user_id do
67 params =
68 params
69 |> Map.put("blocking_user", user)
70 |> Map.put("muting_user", user)
71 |> Map.put("user", user)
72
73 activities =
74 participation.conversation.ap_id
75 |> ActivityPub.fetch_activities_for_context(params)
76 |> Enum.reverse()
77
78 conn
79 |> add_link_headers(activities)
80 |> put_view(StatusView)
81 |> render("index.json", %{activities: activities, for: user, as: :activity})
82 end
83 end
84
85 def update_conversation(
86 %{assigns: %{user: user}} = conn,
87 %{"id" => participation_id, "recipients" => recipients}
88 ) do
89 participation =
90 participation_id
91 |> Participation.get()
92
93 with true <- user.id == participation.user_id,
94 {:ok, participation} <- Participation.set_recipients(participation, recipients) do
95 conn
96 |> put_view(ConversationView)
97 |> render("participation.json", %{participation: participation, for: user})
98 end
99 end
100
101 def read_notification(%{assigns: %{user: user}} = conn, %{"id" => notification_id}) do
102 with {:ok, notification} <- Notification.read_one(user, notification_id) do
103 conn
104 |> put_view(NotificationView)
105 |> render("show.json", %{notification: notification, for: user})
106 else
107 {:error, message} ->
108 conn
109 |> put_status(:bad_request)
110 |> json(%{"error" => message})
111 end
112 end
113
114 def read_notification(%{assigns: %{user: user}} = conn, %{"max_id" => max_id}) do
115 with notifications <- Notification.set_read_up_to(user, max_id) do
116 notifications = Enum.take(notifications, 80)
117
118 conn
119 |> put_view(NotificationView)
120 |> render("index.json", %{notifications: notifications, for: user})
121 end
122 end
123 end