Merge branch 'develop' into a1batross-develop-patch-62810
This commit is contained in:
commit
d0b4a49f16
@ -51,6 +51,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||||||
- WebPush: Introduce `pleroma:chat_mention` and `pleroma:emoji_reaction` notification types.
|
- WebPush: Introduce `pleroma:chat_mention` and `pleroma:emoji_reaction` notification types.
|
||||||
- Mastodon API: Add monthly active users to `/api/v1/instance` (`pleroma.stats.mau`).
|
- Mastodon API: Add monthly active users to `/api/v1/instance` (`pleroma.stats.mau`).
|
||||||
- Mastodon API: Home, public, hashtag & list timelines accept `only_media`, `remote` & `local` parameters for filtration.
|
- Mastodon API: Home, public, hashtag & list timelines accept `only_media`, `remote` & `local` parameters for filtration.
|
||||||
|
- Mastodon API: `/api/v1/accounts/:id` & `/api/v1/mutes` endpoints accept `with_relationships` parameter and return filled `pleroma.relationship` field.
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
@ -61,6 +62,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||||||
- Reblog API Endpoint: Do not set visibility parameter to public by default and let CommonAPI to infer it from status, so a user can reblog their private status without explicitly setting reblog visibility to private.
|
- Reblog API Endpoint: Do not set visibility parameter to public by default and let CommonAPI to infer it from status, so a user can reblog their private status without explicitly setting reblog visibility to private.
|
||||||
- Tag URLs in statuses are now absolute
|
- Tag URLs in statuses are now absolute
|
||||||
- Removed duplicate jobs to purge expired activities
|
- Removed duplicate jobs to purge expired activities
|
||||||
|
- File extensions of some attachments were incorrectly changed. This feature has been disabled for now.
|
||||||
- Mix task pleroma.instance creates missing parent directories if the configuration or SQL output paths are changed.
|
- Mix task pleroma.instance creates missing parent directories if the configuration or SQL output paths are changed.
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
@ -70,6 +70,13 @@ The `id` parameter can also be the `nickname` of the user. This only works in th
|
|||||||
- `exclude_replies`: exclude replies
|
- `exclude_replies`: exclude replies
|
||||||
- `exclude_visibilities`: exclude visibilities
|
- `exclude_visibilities`: exclude visibilities
|
||||||
|
|
||||||
|
Endpoints which accept `with_relationships` parameter:
|
||||||
|
|
||||||
|
- `/api/v1/accounts/:id`
|
||||||
|
- `/api/v1/accounts/:id/followers`
|
||||||
|
- `/api/v1/accounts/:id/following`
|
||||||
|
- `/api/v1/mutes`
|
||||||
|
|
||||||
Has these additional fields under the `pleroma` object:
|
Has these additional fields under the `pleroma` object:
|
||||||
|
|
||||||
- `ap_id`: nullable URL string, ActivityPub id of the user
|
- `ap_id`: nullable URL string, ActivityPub id of the user
|
||||||
|
@ -99,7 +99,10 @@ def show_operation do
|
|||||||
summary: "Account",
|
summary: "Account",
|
||||||
operationId: "AccountController.show",
|
operationId: "AccountController.show",
|
||||||
description: "View information about a profile.",
|
description: "View information about a profile.",
|
||||||
parameters: [%Reference{"$ref": "#/components/parameters/accountIdOrNickname"}],
|
parameters: [
|
||||||
|
%Reference{"$ref": "#/components/parameters/accountIdOrNickname"},
|
||||||
|
with_relationships_param()
|
||||||
|
],
|
||||||
responses: %{
|
responses: %{
|
||||||
200 => Operation.response("Account", "application/json", Account),
|
200 => Operation.response("Account", "application/json", Account),
|
||||||
401 => Operation.response("Error", "application/json", ApiError),
|
401 => Operation.response("Error", "application/json", ApiError),
|
||||||
@ -347,7 +350,7 @@ def mutes_operation do
|
|||||||
operationId: "AccountController.mutes",
|
operationId: "AccountController.mutes",
|
||||||
description: "Accounts the user has muted.",
|
description: "Accounts the user has muted.",
|
||||||
security: [%{"oAuth" => ["follow", "read:mutes"]}],
|
security: [%{"oAuth" => ["follow", "read:mutes"]}],
|
||||||
parameters: pagination_params(),
|
parameters: [with_relationships_param() | pagination_params()],
|
||||||
responses: %{
|
responses: %{
|
||||||
200 => Operation.response("Accounts", "application/json", array_of_accounts())
|
200 => Operation.response("Accounts", "application/json", array_of_accounts())
|
||||||
}
|
}
|
||||||
|
@ -269,10 +269,14 @@ def relationships(%{assigns: %{user: user}} = conn, %{id: id}) do
|
|||||||
def relationships(%{assigns: %{user: _user}} = conn, _), do: json(conn, [])
|
def relationships(%{assigns: %{user: _user}} = conn, _), do: json(conn, [])
|
||||||
|
|
||||||
@doc "GET /api/v1/accounts/:id"
|
@doc "GET /api/v1/accounts/:id"
|
||||||
def show(%{assigns: %{user: for_user}} = conn, %{id: nickname_or_id}) do
|
def show(%{assigns: %{user: for_user}} = conn, %{id: nickname_or_id} = params) do
|
||||||
with %User{} = user <- User.get_cached_by_nickname_or_id(nickname_or_id, for: for_user),
|
with %User{} = user <- User.get_cached_by_nickname_or_id(nickname_or_id, for: for_user),
|
||||||
:visible <- User.visible_for(user, for_user) do
|
:visible <- User.visible_for(user, for_user) do
|
||||||
render(conn, "show.json", user: user, for: for_user)
|
render(conn, "show.json",
|
||||||
|
user: user,
|
||||||
|
for: for_user,
|
||||||
|
embed_relationships: embed_relationships?(params)
|
||||||
|
)
|
||||||
else
|
else
|
||||||
error -> user_visibility_error(conn, error)
|
error -> user_visibility_error(conn, error)
|
||||||
end
|
end
|
||||||
@ -454,7 +458,12 @@ def mutes(%{assigns: %{user: user}} = conn, params) do
|
|||||||
|
|
||||||
conn
|
conn
|
||||||
|> add_link_headers(users)
|
|> add_link_headers(users)
|
||||||
|> render("index.json", users: users, for: user, as: :user)
|
|> render("index.json",
|
||||||
|
users: users,
|
||||||
|
for: user,
|
||||||
|
as: :user,
|
||||||
|
embed_relationships: embed_relationships?(params)
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
@doc "GET /api/v1/blocks"
|
@doc "GET /api/v1/blocks"
|
||||||
|
2
mix.exs
2
mix.exs
@ -194,7 +194,7 @@ defp deps do
|
|||||||
{:restarter, path: "./restarter"},
|
{:restarter, path: "./restarter"},
|
||||||
{:majic,
|
{:majic,
|
||||||
git: "https://git.pleroma.social/pleroma/elixir-libraries/majic.git",
|
git: "https://git.pleroma.social/pleroma/elixir-libraries/majic.git",
|
||||||
ref: "4c692e544b28d1f5e543fb8a44be090f8cd96f80"},
|
ref: "289cda1b6d0d70ccb2ba508a2b0bd24638db2880"},
|
||||||
{:open_api_spex,
|
{:open_api_spex,
|
||||||
git: "https://git.pleroma.social/pleroma/elixir-libraries/open_api_spex.git",
|
git: "https://git.pleroma.social/pleroma/elixir-libraries/open_api_spex.git",
|
||||||
ref: "f296ac0924ba3cf79c7a588c4c252889df4c2edd"},
|
ref: "f296ac0924ba3cf79c7a588c4c252889df4c2edd"},
|
||||||
|
2
mix.lock
2
mix.lock
@ -66,7 +66,7 @@
|
|||||||
"jumper": {:hex, :jumper, "1.0.1", "3c00542ef1a83532b72269fab9f0f0c82bf23a35e27d278bfd9ed0865cecabff", [:mix], [], "hexpm", "318c59078ac220e966d27af3646026db9b5a5e6703cb2aa3e26bcfaba65b7433"},
|
"jumper": {:hex, :jumper, "1.0.1", "3c00542ef1a83532b72269fab9f0f0c82bf23a35e27d278bfd9ed0865cecabff", [:mix], [], "hexpm", "318c59078ac220e966d27af3646026db9b5a5e6703cb2aa3e26bcfaba65b7433"},
|
||||||
"libring": {:hex, :libring, "1.4.0", "41246ba2f3fbc76b3971f6bce83119dfec1eee17e977a48d8a9cfaaf58c2a8d6", [:mix], [], "hexpm"},
|
"libring": {:hex, :libring, "1.4.0", "41246ba2f3fbc76b3971f6bce83119dfec1eee17e977a48d8a9cfaaf58c2a8d6", [:mix], [], "hexpm"},
|
||||||
"linkify": {:hex, :linkify, "0.4.1", "f881eb3429ae88010cf736e6fb3eed406c187bcdd544902ec937496636b7c7b3", [:mix], [], "hexpm", "ce98693f54ae9ace59f2f7a8aed3de2ef311381a8ce7794804bd75484c371dda"},
|
"linkify": {:hex, :linkify, "0.4.1", "f881eb3429ae88010cf736e6fb3eed406c187bcdd544902ec937496636b7c7b3", [:mix], [], "hexpm", "ce98693f54ae9ace59f2f7a8aed3de2ef311381a8ce7794804bd75484c371dda"},
|
||||||
"majic": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/majic.git", "4c692e544b28d1f5e543fb8a44be090f8cd96f80", [ref: "4c692e544b28d1f5e543fb8a44be090f8cd96f80"]},
|
"majic": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/majic.git", "289cda1b6d0d70ccb2ba508a2b0bd24638db2880", [ref: "289cda1b6d0d70ccb2ba508a2b0bd24638db2880"]},
|
||||||
"makeup": {:hex, :makeup, "1.0.3", "e339e2f766d12e7260e6672dd4047405963c5ec99661abdc432e6ec67d29ef95", [:mix], [{:nimble_parsec, "~> 0.5", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "2e9b4996d11832947731f7608fed7ad2f9443011b3b479ae288011265cdd3dad"},
|
"makeup": {:hex, :makeup, "1.0.3", "e339e2f766d12e7260e6672dd4047405963c5ec99661abdc432e6ec67d29ef95", [:mix], [{:nimble_parsec, "~> 0.5", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "2e9b4996d11832947731f7608fed7ad2f9443011b3b479ae288011265cdd3dad"},
|
||||||
"makeup_elixir": {:hex, :makeup_elixir, "0.14.1", "4f0e96847c63c17841d42c08107405a005a2680eb9c7ccadfd757bd31dabccfb", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f2438b1a80eaec9ede832b5c41cd4f373b38fd7aa33e3b22d9db79e640cbde11"},
|
"makeup_elixir": {:hex, :makeup_elixir, "0.14.1", "4f0e96847c63c17841d42c08107405a005a2680eb9c7ccadfd757bd31dabccfb", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f2438b1a80eaec9ede832b5c41cd4f373b38fd7aa33e3b22d9db79e640cbde11"},
|
||||||
"meck": {:hex, :meck, "0.8.13", "ffedb39f99b0b99703b8601c6f17c7f76313ee12de6b646e671e3188401f7866", [:rebar3], [], "hexpm", "d34f013c156db51ad57cc556891b9720e6a1c1df5fe2e15af999c84d6cebeb1a"},
|
"meck": {:hex, :meck, "0.8.13", "ffedb39f99b0b99703b8601c6f17c7f76313ee12de6b646e671e3188401f7866", [:rebar3], [], "hexpm", "d34f013c156db51ad57cc556891b9720e6a1c1df5fe2e15af999c84d6cebeb1a"},
|
||||||
|
@ -1607,9 +1607,9 @@ test "POST /api/ap/upload_media", %{conn: conn} do
|
|||||||
desc = "Description of the image"
|
desc = "Description of the image"
|
||||||
|
|
||||||
image = %Plug.Upload{
|
image = %Plug.Upload{
|
||||||
content_type: "bad/content-type",
|
content_type: "image/jpeg",
|
||||||
path: Path.absname("test/fixtures/image.jpg"),
|
path: Path.absname("test/fixtures/image.jpg"),
|
||||||
filename: "an_image.png"
|
filename: "an_image.jpg"
|
||||||
}
|
}
|
||||||
|
|
||||||
object =
|
object =
|
||||||
|
@ -29,6 +29,45 @@ test "works by id" do
|
|||||||
|> json_response_and_validate_schema(404)
|
|> json_response_and_validate_schema(404)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "relationship field" do
|
||||||
|
%{conn: conn, user: user} = oauth_access(["read"])
|
||||||
|
|
||||||
|
other_user = insert(:user)
|
||||||
|
|
||||||
|
response =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/accounts/#{other_user.id}")
|
||||||
|
|> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
|
assert response["id"] == other_user.id
|
||||||
|
assert response["pleroma"]["relationship"] == %{}
|
||||||
|
|
||||||
|
assert %{"pleroma" => %{"relationship" => %{"following" => false, "followed_by" => false}}} =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/accounts/#{other_user.id}?with_relationships=true")
|
||||||
|
|> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
|
{:ok, _, %{id: other_id}} = User.follow(user, other_user)
|
||||||
|
|
||||||
|
assert %{
|
||||||
|
"id" => ^other_id,
|
||||||
|
"pleroma" => %{"relationship" => %{"following" => true, "followed_by" => false}}
|
||||||
|
} =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/accounts/#{other_id}?with_relationships=true")
|
||||||
|
|> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
|
{:ok, _, _} = User.follow(other_user, user)
|
||||||
|
|
||||||
|
assert %{
|
||||||
|
"id" => ^other_id,
|
||||||
|
"pleroma" => %{"relationship" => %{"following" => true, "followed_by" => true}}
|
||||||
|
} =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/accounts/#{other_id}?with_relationships=true")
|
||||||
|
|> json_response_and_validate_schema(200)
|
||||||
|
end
|
||||||
|
|
||||||
test "works by nickname" do
|
test "works by nickname" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
@ -590,6 +629,45 @@ test "getting followers", %{user: user, conn: conn} do
|
|||||||
assert [%{"id" => ^user_id}] = json_response_and_validate_schema(conn, 200)
|
assert [%{"id" => ^user_id}] = json_response_and_validate_schema(conn, 200)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "following with relationship", %{conn: conn, user: user} do
|
||||||
|
other_user = insert(:user)
|
||||||
|
{:ok, %{id: id}, _} = User.follow(other_user, user)
|
||||||
|
|
||||||
|
assert [
|
||||||
|
%{
|
||||||
|
"id" => ^id,
|
||||||
|
"pleroma" => %{
|
||||||
|
"relationship" => %{
|
||||||
|
"id" => ^id,
|
||||||
|
"following" => false,
|
||||||
|
"followed_by" => true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
] =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/accounts/#{user.id}/followers?with_relationships=true")
|
||||||
|
|> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
|
{:ok, _, _} = User.follow(user, other_user)
|
||||||
|
|
||||||
|
assert [
|
||||||
|
%{
|
||||||
|
"id" => ^id,
|
||||||
|
"pleroma" => %{
|
||||||
|
"relationship" => %{
|
||||||
|
"id" => ^id,
|
||||||
|
"following" => true,
|
||||||
|
"followed_by" => true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
] =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/accounts/#{user.id}/followers?with_relationships=true")
|
||||||
|
|> json_response_and_validate_schema(200)
|
||||||
|
end
|
||||||
|
|
||||||
test "getting followers, hide_followers", %{user: user, conn: conn} do
|
test "getting followers, hide_followers", %{user: user, conn: conn} do
|
||||||
other_user = insert(:user, hide_followers: true)
|
other_user = insert(:user, hide_followers: true)
|
||||||
{:ok, _user, _other_user} = User.follow(user, other_user)
|
{:ok, _user, _other_user} = User.follow(user, other_user)
|
||||||
@ -660,6 +738,24 @@ test "getting following", %{user: user, conn: conn} do
|
|||||||
assert id == to_string(other_user.id)
|
assert id == to_string(other_user.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "following with relationship", %{conn: conn, user: user} do
|
||||||
|
other_user = insert(:user)
|
||||||
|
{:ok, user, other_user} = User.follow(user, other_user)
|
||||||
|
|
||||||
|
conn = get(conn, "/api/v1/accounts/#{user.id}/following?with_relationships=true")
|
||||||
|
|
||||||
|
id = other_user.id
|
||||||
|
|
||||||
|
assert [
|
||||||
|
%{
|
||||||
|
"id" => ^id,
|
||||||
|
"pleroma" => %{
|
||||||
|
"relationship" => %{"id" => ^id, "following" => true, "followed_by" => false}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
] = json_response_and_validate_schema(conn, 200)
|
||||||
|
end
|
||||||
|
|
||||||
test "getting following, hide_follows, other user requesting" do
|
test "getting following, hide_follows, other user requesting" do
|
||||||
user = insert(:user, hide_follows: true)
|
user = insert(:user, hide_follows: true)
|
||||||
other_user = insert(:user)
|
other_user = insert(:user)
|
||||||
@ -1565,7 +1661,6 @@ test "getting a list of mutes" do
|
|||||||
|
|
||||||
result =
|
result =
|
||||||
conn
|
conn
|
||||||
|> assign(:user, user)
|
|
||||||
|> get("/api/v1/mutes")
|
|> get("/api/v1/mutes")
|
||||||
|> json_response_and_validate_schema(200)
|
|> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
@ -1573,7 +1668,6 @@ test "getting a list of mutes" do
|
|||||||
|
|
||||||
result =
|
result =
|
||||||
conn
|
conn
|
||||||
|> assign(:user, user)
|
|
||||||
|> get("/api/v1/mutes?limit=1")
|
|> get("/api/v1/mutes?limit=1")
|
||||||
|> json_response_and_validate_schema(200)
|
|> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
@ -1581,7 +1675,6 @@ test "getting a list of mutes" do
|
|||||||
|
|
||||||
result =
|
result =
|
||||||
conn
|
conn
|
||||||
|> assign(:user, user)
|
|
||||||
|> get("/api/v1/mutes?since_id=#{id1}")
|
|> get("/api/v1/mutes?since_id=#{id1}")
|
||||||
|> json_response_and_validate_schema(200)
|
|> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
@ -1589,7 +1682,6 @@ test "getting a list of mutes" do
|
|||||||
|
|
||||||
result =
|
result =
|
||||||
conn
|
conn
|
||||||
|> assign(:user, user)
|
|
||||||
|> get("/api/v1/mutes?since_id=#{id1}&max_id=#{id3}")
|
|> get("/api/v1/mutes?since_id=#{id1}&max_id=#{id3}")
|
||||||
|> json_response_and_validate_schema(200)
|
|> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
@ -1597,13 +1689,45 @@ test "getting a list of mutes" do
|
|||||||
|
|
||||||
result =
|
result =
|
||||||
conn
|
conn
|
||||||
|> assign(:user, user)
|
|
||||||
|> get("/api/v1/mutes?since_id=#{id1}&limit=1")
|
|> get("/api/v1/mutes?since_id=#{id1}&limit=1")
|
||||||
|> json_response_and_validate_schema(200)
|
|> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
assert [%{"id" => ^id2}] = result
|
assert [%{"id" => ^id2}] = result
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "list of mutes with with_relationships parameter" do
|
||||||
|
%{user: user, conn: conn} = oauth_access(["read:mutes"])
|
||||||
|
%{id: id1} = other_user1 = insert(:user)
|
||||||
|
%{id: id2} = other_user2 = insert(:user)
|
||||||
|
%{id: id3} = other_user3 = insert(:user)
|
||||||
|
|
||||||
|
{:ok, _, _} = User.follow(other_user1, user)
|
||||||
|
{:ok, _, _} = User.follow(other_user2, user)
|
||||||
|
{:ok, _, _} = User.follow(other_user3, user)
|
||||||
|
|
||||||
|
{:ok, _} = User.mute(user, other_user1)
|
||||||
|
{:ok, _} = User.mute(user, other_user2)
|
||||||
|
{:ok, _} = User.mute(user, other_user3)
|
||||||
|
|
||||||
|
assert [
|
||||||
|
%{
|
||||||
|
"id" => ^id1,
|
||||||
|
"pleroma" => %{"relationship" => %{"muting" => true, "followed_by" => true}}
|
||||||
|
},
|
||||||
|
%{
|
||||||
|
"id" => ^id2,
|
||||||
|
"pleroma" => %{"relationship" => %{"muting" => true, "followed_by" => true}}
|
||||||
|
},
|
||||||
|
%{
|
||||||
|
"id" => ^id3,
|
||||||
|
"pleroma" => %{"relationship" => %{"muting" => true, "followed_by" => true}}
|
||||||
|
}
|
||||||
|
] =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/mutes?with_relationships=true")
|
||||||
|
|> json_response_and_validate_schema(200)
|
||||||
|
end
|
||||||
|
|
||||||
test "getting a list of blocks" do
|
test "getting a list of blocks" do
|
||||||
%{user: user, conn: conn} = oauth_access(["read:blocks"])
|
%{user: user, conn: conn} = oauth_access(["read:blocks"])
|
||||||
%{id: id1} = other_user1 = insert(:user)
|
%{id: id1} = other_user1 = insert(:user)
|
||||||
|
Loading…
Reference in New Issue
Block a user