1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
6 use Pleroma.Web, :controller
8 import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2]
10 alias Pleroma.Bookmark
12 alias Pleroma.Pagination
14 alias Pleroma.Web.ActivityPub.ActivityPub
15 alias Pleroma.Web.CommonAPI
16 alias Pleroma.Web.MastodonAPI.AccountView
17 alias Pleroma.Web.MastodonAPI.MastodonView
18 alias Pleroma.Web.MastodonAPI.StatusView
22 action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
24 def follows(%{assigns: %{user: follower}} = conn, %{"uri" => uri}) do
25 with {_, %User{} = followed} <- {:followed, User.get_cached_by_nickname(uri)},
26 {_, true} <- {:followed, follower.id != followed.id},
27 {:ok, follower, followed, _} <- CommonAPI.follow(follower, followed) do
29 |> put_view(AccountView)
30 |> render("show.json", %{user: followed, for: follower})
37 |> put_status(:forbidden)
38 |> json(%{error: message})
42 def mutes(%{assigns: %{user: user}} = conn, _) do
43 with muted_accounts <- User.muted_users(user) do
44 res = AccountView.render("index.json", users: muted_accounts, for: user, as: :user)
49 def blocks(%{assigns: %{user: user}} = conn, _) do
50 with blocked_accounts <- User.blocked_users(user) do
51 res = AccountView.render("index.json", users: blocked_accounts, for: user, as: :user)
56 def favourites(%{assigns: %{user: user}} = conn, params) do
59 |> Map.put("type", "Create")
60 |> Map.put("favorited_by", user.ap_id)
61 |> Map.put("blocking_user", user)
64 ActivityPub.fetch_activities([], params)
68 |> add_link_headers(activities)
69 |> put_view(StatusView)
70 |> render("index.json", %{activities: activities, for: user, as: :activity})
73 def bookmarks(%{assigns: %{user: user}} = conn, params) do
74 user = User.get_cached_by_id(user.id)
77 Bookmark.for_user_query(user.id)
78 |> Pagination.fetch_paginated(params)
82 |> Enum.map(fn b -> Map.put(b.activity, :bookmark, Map.delete(b, :activity)) end)
85 |> add_link_headers(bookmarks)
86 |> put_view(StatusView)
87 |> render("index.json", %{activities: activities, for: user, as: :activity})
90 def index(%{assigns: %{user: user}} = conn, _params) do
91 token = get_session(conn, :oauth_token)
95 Pleroma.Web.MastodonAPI.CustomEmojiView.render("index.json", %{
96 custom_emojis: Pleroma.Emoji.get_all()
99 limit = Config.get([:instance, :limit])
101 accounts = Map.put(%{}, user.id, AccountView.render("show.json", %{user: user, for: user}))
106 streaming_api_base_url: Pleroma.Web.Endpoint.websocket_url(),
109 domain: Pleroma.Web.Endpoint.host(),
112 unfollow_modal: false,
115 auto_play_gif: false,
116 display_sensitive_media: false,
117 reduce_motion: false,
118 max_toot_chars: limit,
119 mascot: User.get_mascot(user)["url"]
121 poll_limits: Config.get([:instance, :poll_limits]),
123 delete_others_notice: present?(user.info.is_moderator),
124 admin: present?(user.info.is_admin)
128 default_privacy: user.info.default_scope,
129 default_sensitive: false,
130 allow_content_types: Config.get([:instance, :allowed_post_formats])
132 media_attachments: %{
133 accept_content_types: [
149 user.info.settings ||
179 push_subscription: nil,
181 custom_emojis: mastodon_emoji,
188 |> put_view(MastodonView)
189 |> render("index.html", %{initial_state: initial_state})
192 |> put_session(:return_to, conn.request_path)
193 |> redirect(to: "/web/login")
197 def put_settings(%{assigns: %{user: user}} = conn, %{"data" => settings} = _params) do
198 with {:ok, _} <- User.update_info(user, &User.Info.mastodon_settings_update(&1, settings)) do
203 |> put_status(:internal_server_error)
204 |> json(%{error: inspect(e)})
208 # Stubs for unimplemented mastodon api
210 def empty_array(conn, _) do
211 Logger.debug("Unimplemented, returning an empty array")
215 def empty_object(conn, _) do
216 Logger.debug("Unimplemented, returning an empty object")
220 defp present?(nil), do: false
221 defp present?(false), do: false
222 defp present?(_), do: true