Merge branch 'develop' of https://git.pleroma.social/pleroma/pleroma into develop
[akkoma] / lib / pleroma / web / mastodon_api / controllers / mastodon_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.MastodonAPI.MastodonAPIController do
6 use Pleroma.Web, :controller
7
8 import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2]
9
10 alias Pleroma.Bookmark
11 alias Pleroma.Pagination
12 alias Pleroma.User
13 alias Pleroma.Web.ActivityPub.ActivityPub
14 alias Pleroma.Web.CommonAPI
15 alias Pleroma.Web.MastodonAPI.AccountView
16 alias Pleroma.Web.MastodonAPI.StatusView
17
18 require Logger
19
20 action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
21
22 def follows(%{assigns: %{user: follower}} = conn, %{"uri" => uri}) do
23 with {_, %User{} = followed} <- {:followed, User.get_cached_by_nickname(uri)},
24 {_, true} <- {:followed, follower.id != followed.id},
25 {:ok, follower, followed, _} <- CommonAPI.follow(follower, followed) do
26 conn
27 |> put_view(AccountView)
28 |> render("show.json", %{user: followed, for: follower})
29 else
30 {:followed, _} ->
31 {:error, :not_found}
32
33 {:error, message} ->
34 conn
35 |> put_status(:forbidden)
36 |> json(%{error: message})
37 end
38 end
39
40 def mutes(%{assigns: %{user: user}} = conn, _) do
41 with muted_accounts <- User.muted_users(user) do
42 res = AccountView.render("index.json", users: muted_accounts, for: user, as: :user)
43 json(conn, res)
44 end
45 end
46
47 def blocks(%{assigns: %{user: user}} = conn, _) do
48 with blocked_accounts <- User.blocked_users(user) do
49 res = AccountView.render("index.json", users: blocked_accounts, for: user, as: :user)
50 json(conn, res)
51 end
52 end
53
54 def favourites(%{assigns: %{user: user}} = conn, params) do
55 params =
56 params
57 |> Map.put("type", "Create")
58 |> Map.put("favorited_by", user.ap_id)
59 |> Map.put("blocking_user", user)
60
61 activities =
62 ActivityPub.fetch_activities([], params)
63 |> Enum.reverse()
64
65 conn
66 |> add_link_headers(activities)
67 |> put_view(StatusView)
68 |> render("index.json", %{activities: activities, for: user, as: :activity})
69 end
70
71 def bookmarks(%{assigns: %{user: user}} = conn, params) do
72 user = User.get_cached_by_id(user.id)
73
74 bookmarks =
75 Bookmark.for_user_query(user.id)
76 |> Pagination.fetch_paginated(params)
77
78 activities =
79 bookmarks
80 |> Enum.map(fn b -> Map.put(b.activity, :bookmark, Map.delete(b, :activity)) end)
81
82 conn
83 |> add_link_headers(bookmarks)
84 |> put_view(StatusView)
85 |> render("index.json", %{activities: activities, for: user, as: :activity})
86 end
87
88 # Stubs for unimplemented mastodon api
89 #
90 def empty_array(conn, _) do
91 Logger.debug("Unimplemented, returning an empty array")
92 json(conn, [])
93 end
94
95 def empty_object(conn, _) do
96 Logger.debug("Unimplemented, returning an empty object")
97 json(conn, %{})
98 end
99 end