Browse Source

Merge branch 'split-masto-api/leftovers' into 'develop'

[#1278] Move a few more actions from MastodonAPIController

See merge request pleroma/pleroma!1761
develop^2
kaniini 1 year ago
parent
commit
7a318d74e6
7 changed files with 140 additions and 160 deletions
  1. +22
    -0
      lib/pleroma/web/mastodon_api/controllers/account_controller.ex
  2. +0
    -76
      lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex
  3. +36
    -1
      lib/pleroma/web/mastodon_api/controllers/status_controller.ex
  4. +5
    -5
      lib/pleroma/web/router.ex
  5. +30
    -0
      test/web/mastodon_api/controllers/account_controller_test.exs
  6. +47
    -0
      test/web/mastodon_api/controllers/status_controller_test.exs
  7. +0
    -78
      test/web/mastodon_api/mastodon_api_controller_test.exs

+ 22
- 0
lib/pleroma/web/mastodon_api/controllers/account_controller.ex View File

@@ -301,4 +301,26 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do
{:error, message} -> json_response(conn, :forbidden, %{error: message})
end
end

@doc "POST /api/v1/follows"
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
render(conn, "show.json", user: followed, for: follower)
else
{:followed, _} -> {:error, :not_found}
{:error, message} -> json_response(conn, :forbidden, %{error: message})
end
end

@doc "GET /api/v1/mutes"
def mutes(%{assigns: %{user: user}} = conn, _) do
render(conn, "index.json", users: User.muted_users(user), for: user, as: :user)
end

@doc "GET /api/v1/blocks"
def blocks(%{assigns: %{user: user}} = conn, _) do
render(conn, "index.json", users: User.blocked_users(user), for: user, as: :user)
end
end

+ 0
- 76
lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex View File

@@ -5,86 +5,10 @@
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


+ 36
- 1
lib/pleroma/web/mastodon_api/controllers/status_controller.ex View File

@@ -5,7 +5,7 @@
defmodule Pleroma.Web.MastodonAPI.StatusController do
use Pleroma.Web, :controller

import Pleroma.Web.ControllerHelper, only: [try_render: 3]
import Pleroma.Web.ControllerHelper, only: [try_render: 3, add_link_headers: 2]

require Ecto.Query

@@ -283,4 +283,39 @@ defmodule Pleroma.Web.MastodonAPI.StatusController do
render(conn, "context.json", activity: activity, activities: activities, user: user)
end
end

@doc "GET /api/v1/favourites"
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)
|> render("index.json", activities: activities, for: user, as: :activity)
end

@doc "GET /api/v1/bookmarks"
def bookmarks(%{assigns: %{user: user}} = conn, params) do
user = User.get_cached_by_id(user.id)

bookmarks =
user.id
|> Bookmark.for_user_query()
|> Pleroma.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)
|> render("index.json", %{activities: activities, for: user, as: :activity})
end
end

+ 5
- 5
lib/pleroma/web/router.ex View File

@@ -347,14 +347,14 @@ defmodule Pleroma.Web.Router do
get("/accounts/:id/identity_proofs", MastodonAPIController, :empty_array)

get("/follow_requests", FollowRequestController, :index)
get("/blocks", MastodonAPIController, :blocks)
get("/mutes", MastodonAPIController, :mutes)
get("/blocks", AccountController, :blocks)
get("/mutes", AccountController, :mutes)

get("/timelines/home", TimelineController, :home)
get("/timelines/direct", TimelineController, :direct)

get("/favourites", MastodonAPIController, :favourites)
get("/bookmarks", MastodonAPIController, :bookmarks)
get("/favourites", StatusController, :favourites)
get("/bookmarks", StatusController, :bookmarks)

get("/notifications", NotificationController, :index)
get("/notifications/:id", NotificationController, :show)
@@ -426,7 +426,7 @@ defmodule Pleroma.Web.Router do
scope [] do
pipe_through(:oauth_follow)

post("/follows", MastodonAPIController, :follows)
post("/follows", AccountController, :follows)
post("/accounts/:id/follow", AccountController, :follow)
post("/accounts/:id/unfollow", AccountController, :unfollow)
post("/accounts/:id/block", AccountController, :block)


+ 30
- 0
test/web/mastodon_api/controllers/account_controller_test.exs View File

@@ -849,4 +849,34 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do
assert [] = json_response(conn, 200)
end
end

test "getting a list of mutes", %{conn: conn} do
user = insert(:user)
other_user = insert(:user)

{:ok, user} = User.mute(user, other_user)

conn =
conn
|> assign(:user, user)
|> get("/api/v1/mutes")

other_user_id = to_string(other_user.id)
assert [%{"id" => ^other_user_id}] = json_response(conn, 200)
end

test "getting a list of blocks", %{conn: conn} do
user = insert(:user)
other_user = insert(:user)

{:ok, user} = User.block(user, other_user)

conn =
conn
|> assign(:user, user)
|> get("/api/v1/blocks")

other_user_id = to_string(other_user.id)
assert [%{"id" => ^other_user_id}] = json_response(conn, 200)
end
end

+ 47
- 0
test/web/mastodon_api/controllers/status_controller_test.exs View File

@@ -1242,4 +1242,51 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do
"descendants" => [%{"id" => ^id4}, %{"id" => ^id5}]
} = response
end

test "returns the favorites of a user", %{conn: conn} do
user = insert(:user)
other_user = insert(:user)

{:ok, _} = CommonAPI.post(other_user, %{"status" => "bla"})
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "traps are happy"})

{:ok, _, _} = CommonAPI.favorite(activity.id, user)

first_conn =
conn
|> assign(:user, user)
|> get("/api/v1/favourites")

assert [status] = json_response(first_conn, 200)
assert status["id"] == to_string(activity.id)

assert [{"link", _link_header}] =
Enum.filter(first_conn.resp_headers, fn element -> match?({"link", _}, element) end)

# Honours query params
{:ok, second_activity} =
CommonAPI.post(other_user, %{
"status" =>
"Trees Are Never Sad Look At Them Every Once In Awhile They're Quite Beautiful."
})

{:ok, _, _} = CommonAPI.favorite(second_activity.id, user)

last_like = status["id"]

second_conn =
conn
|> assign(:user, user)
|> get("/api/v1/favourites?since_id=#{last_like}")

assert [second_status] = json_response(second_conn, 200)
assert second_status["id"] == to_string(second_activity.id)

third_conn =
conn
|> assign(:user, user)
|> get("/api/v1/favourites?limit=0")

assert [] = json_response(third_conn, 200)
end
end

+ 0
- 78
test/web/mastodon_api/mastodon_api_controller_test.exs View File

@@ -7,7 +7,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do

alias Pleroma.Notification
alias Pleroma.Repo
alias Pleroma.User
alias Pleroma.Web.CommonAPI

import Pleroma.Factory
@@ -20,36 +19,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do

clear_config([:rich_media, :enabled])

test "getting a list of mutes", %{conn: conn} do
user = insert(:user)
other_user = insert(:user)

{:ok, user} = User.mute(user, other_user)

conn =
conn
|> assign(:user, user)
|> get("/api/v1/mutes")

other_user_id = to_string(other_user.id)
assert [%{"id" => ^other_user_id}] = json_response(conn, 200)
end

test "getting a list of blocks", %{conn: conn} do
user = insert(:user)
other_user = insert(:user)

{:ok, user} = User.block(user, other_user)

conn =
conn
|> assign(:user, user)
|> get("/api/v1/blocks")

other_user_id = to_string(other_user.id)
assert [%{"id" => ^other_user_id}] = json_response(conn, 200)
end

test "unimplemented follow_requests, blocks, domain blocks" do
user = insert(:user)

@@ -64,53 +33,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
end)
end

test "returns the favorites of a user", %{conn: conn} do
user = insert(:user)
other_user = insert(:user)

{:ok, _} = CommonAPI.post(other_user, %{"status" => "bla"})
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "traps are happy"})

{:ok, _, _} = CommonAPI.favorite(activity.id, user)

first_conn =
conn
|> assign(:user, user)
|> get("/api/v1/favourites")

assert [status] = json_response(first_conn, 200)
assert status["id"] == to_string(activity.id)

assert [{"link", _link_header}] =
Enum.filter(first_conn.resp_headers, fn element -> match?({"link", _}, element) end)

# Honours query params
{:ok, second_activity} =
CommonAPI.post(other_user, %{
"status" =>
"Trees Are Never Sad Look At Them Every Once In Awhile They're Quite Beautiful."
})

{:ok, _, _} = CommonAPI.favorite(second_activity.id, user)

last_like = status["id"]

second_conn =
conn
|> assign(:user, user)
|> get("/api/v1/favourites?since_id=#{last_like}")

assert [second_status] = json_response(second_conn, 200)
assert second_status["id"] == to_string(second_activity.id)

third_conn =
conn
|> assign(:user, user)
|> get("/api/v1/favourites?limit=0")

assert [] = json_response(third_conn, 200)
end

describe "link headers" do
test "preserves parameters in link headers", %{conn: conn} do
user = insert(:user)


Loading…
Cancel
Save