99 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
| # Pleroma: A lightweight social networking server
 | |
| # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
 | |
| # SPDX-License-Identifier: AGPL-3.0-only
 | |
| 
 | |
| defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
 | |
|   use Pleroma.Web, :controller
 | |
| 
 | |
|   import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2]
 | |
| 
 | |
|   alias Pleroma.Bookmark
 | |
|   alias Pleroma.Pagination
 | |
|   alias Pleroma.User
 | |
|   alias Pleroma.Web.ActivityPub.ActivityPub
 | |
|   alias Pleroma.Web.CommonAPI
 | |
|   alias Pleroma.Web.MastodonAPI.AccountView
 | |
|   alias Pleroma.Web.MastodonAPI.StatusView
 | |
| 
 | |
|   require Logger
 | |
| 
 | |
|   action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
 | |
| 
 | |
|   def follows(%{assigns: %{user: follower}} = conn, %{"uri" => uri}) do
 | |
|     with {_, %User{} = followed} <- {:followed, User.get_cached_by_nickname(uri)},
 | |
|          {_, true} <- {:followed, follower.id != followed.id},
 | |
|          {:ok, follower, followed, _} <- CommonAPI.follow(follower, followed) do
 | |
|       conn
 | |
|       |> put_view(AccountView)
 | |
|       |> render("show.json", %{user: followed, for: follower})
 | |
|     else
 | |
|       {:followed, _} ->
 | |
|         {:error, :not_found}
 | |
| 
 | |
|       {:error, message} ->
 | |
|         conn
 | |
|         |> put_status(:forbidden)
 | |
|         |> json(%{error: message})
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def mutes(%{assigns: %{user: user}} = conn, _) do
 | |
|     with muted_accounts <- User.muted_users(user) do
 | |
|       res = AccountView.render("index.json", users: muted_accounts, for: user, as: :user)
 | |
|       json(conn, res)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def blocks(%{assigns: %{user: user}} = conn, _) do
 | |
|     with blocked_accounts <- User.blocked_users(user) do
 | |
|       res = AccountView.render("index.json", users: blocked_accounts, for: user, as: :user)
 | |
|       json(conn, res)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def favourites(%{assigns: %{user: user}} = conn, params) do
 | |
|     params =
 | |
|       params
 | |
|       |> Map.put("type", "Create")
 | |
|       |> Map.put("favorited_by", user.ap_id)
 | |
|       |> Map.put("blocking_user", user)
 | |
| 
 | |
|     activities =
 | |
|       ActivityPub.fetch_activities([], params)
 | |
|       |> Enum.reverse()
 | |
| 
 | |
|     conn
 | |
|     |> add_link_headers(activities)
 | |
|     |> put_view(StatusView)
 | |
|     |> render("index.json", %{activities: activities, for: user, as: :activity})
 | |
|   end
 | |
| 
 | |
|   def bookmarks(%{assigns: %{user: user}} = conn, params) do
 | |
|     user = User.get_cached_by_id(user.id)
 | |
| 
 | |
|     bookmarks =
 | |
|       Bookmark.for_user_query(user.id)
 | |
|       |> Pagination.fetch_paginated(params)
 | |
| 
 | |
|     activities =
 | |
|       bookmarks
 | |
|       |> Enum.map(fn b -> Map.put(b.activity, :bookmark, Map.delete(b, :activity)) end)
 | |
| 
 | |
|     conn
 | |
|     |> add_link_headers(bookmarks)
 | |
|     |> put_view(StatusView)
 | |
|     |> render("index.json", %{activities: activities, for: user, as: :activity})
 | |
|   end
 | |
| 
 | |
|   # Stubs for unimplemented mastodon api
 | |
|   #
 | |
|   def empty_array(conn, _) do
 | |
|     Logger.debug("Unimplemented, returning an empty array")
 | |
|     json(conn, [])
 | |
|   end
 | |
| 
 | |
|   def empty_object(conn, _) do
 | |
|     Logger.debug("Unimplemented, returning an empty object")
 | |
|     json(conn, %{})
 | |
|   end
 | |
| end
 | 
