forked from AkkomaGang/akkoma
Merge branch 'split-masto-api/leftovers' into 'develop'
[#1278] Move a few more actions from MastodonAPIController See merge request pleroma/pleroma!1761
This commit is contained in:
commit
7a318d74e6
7 changed files with 140 additions and 160 deletions
|
@ -301,4 +301,26 @@ def unblock(%{assigns: %{user: blocker, account: blocked}} = conn, _params) do
|
||||||
{:error, message} -> json_response(conn, :forbidden, %{error: message})
|
{:error, message} -> json_response(conn, :forbidden, %{error: message})
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
|
|
|
@ -5,86 +5,10 @@
|
||||||
defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
use Pleroma.Web, :controller
|
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
|
require Logger
|
||||||
|
|
||||||
action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
|
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
|
# Stubs for unimplemented mastodon api
|
||||||
#
|
#
|
||||||
def empty_array(conn, _) do
|
def empty_array(conn, _) do
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
defmodule Pleroma.Web.MastodonAPI.StatusController do
|
defmodule Pleroma.Web.MastodonAPI.StatusController do
|
||||||
use Pleroma.Web, :controller
|
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
|
require Ecto.Query
|
||||||
|
|
||||||
|
@ -283,4 +283,39 @@ def context(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
render(conn, "context.json", activity: activity, activities: activities, user: user)
|
render(conn, "context.json", activity: activity, activities: activities, user: user)
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
|
|
|
@ -347,14 +347,14 @@ defmodule Pleroma.Web.Router do
|
||||||
get("/accounts/:id/identity_proofs", MastodonAPIController, :empty_array)
|
get("/accounts/:id/identity_proofs", MastodonAPIController, :empty_array)
|
||||||
|
|
||||||
get("/follow_requests", FollowRequestController, :index)
|
get("/follow_requests", FollowRequestController, :index)
|
||||||
get("/blocks", MastodonAPIController, :blocks)
|
get("/blocks", AccountController, :blocks)
|
||||||
get("/mutes", MastodonAPIController, :mutes)
|
get("/mutes", AccountController, :mutes)
|
||||||
|
|
||||||
get("/timelines/home", TimelineController, :home)
|
get("/timelines/home", TimelineController, :home)
|
||||||
get("/timelines/direct", TimelineController, :direct)
|
get("/timelines/direct", TimelineController, :direct)
|
||||||
|
|
||||||
get("/favourites", MastodonAPIController, :favourites)
|
get("/favourites", StatusController, :favourites)
|
||||||
get("/bookmarks", MastodonAPIController, :bookmarks)
|
get("/bookmarks", StatusController, :bookmarks)
|
||||||
|
|
||||||
get("/notifications", NotificationController, :index)
|
get("/notifications", NotificationController, :index)
|
||||||
get("/notifications/:id", NotificationController, :show)
|
get("/notifications/:id", NotificationController, :show)
|
||||||
|
@ -426,7 +426,7 @@ defmodule Pleroma.Web.Router do
|
||||||
scope [] do
|
scope [] do
|
||||||
pipe_through(:oauth_follow)
|
pipe_through(:oauth_follow)
|
||||||
|
|
||||||
post("/follows", MastodonAPIController, :follows)
|
post("/follows", AccountController, :follows)
|
||||||
post("/accounts/:id/follow", AccountController, :follow)
|
post("/accounts/:id/follow", AccountController, :follow)
|
||||||
post("/accounts/:id/unfollow", AccountController, :unfollow)
|
post("/accounts/:id/unfollow", AccountController, :unfollow)
|
||||||
post("/accounts/:id/block", AccountController, :block)
|
post("/accounts/:id/block", AccountController, :block)
|
||||||
|
|
|
@ -849,4 +849,34 @@ test "returns an empty list on a bad request", %{conn: conn} do
|
||||||
assert [] = json_response(conn, 200)
|
assert [] = json_response(conn, 200)
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
|
|
|
@ -1242,4 +1242,51 @@ test "context" do
|
||||||
"descendants" => [%{"id" => ^id4}, %{"id" => ^id5}]
|
"descendants" => [%{"id" => ^id4}, %{"id" => ^id5}]
|
||||||
} = response
|
} = response
|
||||||
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
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,7 +7,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|
||||||
|
|
||||||
alias Pleroma.Notification
|
alias Pleroma.Notification
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
alias Pleroma.User
|
|
||||||
alias Pleroma.Web.CommonAPI
|
alias Pleroma.Web.CommonAPI
|
||||||
|
|
||||||
import Pleroma.Factory
|
import Pleroma.Factory
|
||||||
|
@ -20,36 +19,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|
||||||
|
|
||||||
clear_config([:rich_media, :enabled])
|
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
|
test "unimplemented follow_requests, blocks, domain blocks" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
|
@ -64,53 +33,6 @@ test "unimplemented follow_requests, blocks, domain blocks" do
|
||||||
end)
|
end)
|
||||||
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
|
describe "link headers" do
|
||||||
test "preserves parameters in link headers", %{conn: conn} do
|
test "preserves parameters in link headers", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
Loading…
Reference in a new issue