@@ -8,6 +8,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do | |||||
alias Ecto.Changeset | alias Ecto.Changeset | ||||
alias Pleroma.Activity | alias Pleroma.Activity | ||||
alias Pleroma.Config | alias Pleroma.Config | ||||
alias Pleroma.Conversation.Participation | |||||
alias Pleroma.Filter | alias Pleroma.Filter | ||||
alias Pleroma.Notification | alias Pleroma.Notification | ||||
alias Pleroma.Object | alias Pleroma.Object | ||||
@@ -1584,6 +1585,41 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do | |||||
end | end | ||||
end | end | ||||
def conversations(%{assigns: %{user: user}} = conn, params) do | |||||
participations = Participation.for_user_with_last_activity_id(user, params) | |||||
conversations = | |||||
Enum.map(participations, fn participation -> | |||||
%{ | |||||
id: participation.id, | |||||
# TODO: Add this. | |||||
accounts: [], | |||||
unread: !participation.read, | |||||
last_status: participation.last_activity_id | |||||
} | |||||
end) | |||||
conn | |||||
|> add_link_headers(:conversations, participations) | |||||
|> json(conversations) | |||||
end | |||||
def conversation_read(%{assigns: %{user: user}} = conn, %{"id" => participation_id}) do | |||||
with %Participation{} = participation <- | |||||
Repo.get_by(Participation, id: participation_id, user_id: user.id), | |||||
{:ok, participation} <- Participation.mark_as_read(participation) do | |||||
conn | |||||
|> json(%{ | |||||
id: participation.id, | |||||
# TODO: Add this. | |||||
accounts: [], | |||||
unread: !participation.read, | |||||
# TODO: Add this. | |||||
last_status: nil | |||||
}) | |||||
end | |||||
end | |||||
def try_render(conn, target, params) | def try_render(conn, target, params) | ||||
when is_binary(target) do | when is_binary(target) do | ||||
res = render(conn, target, params) | res = render(conn, target, params) | ||||
@@ -273,7 +273,7 @@ defmodule Pleroma.Web.Router do | |||||
get("/suggestions", MastodonAPIController, :suggestions) | get("/suggestions", MastodonAPIController, :suggestions) | ||||
get("/conversations", MastodonAPIController, :conversations) | get("/conversations", MastodonAPIController, :conversations) | ||||
get("/conversations/:id/read", MastodonAPIController, :get_conversation) | |||||
post("/conversations/:id/read", MastodonAPIController, :conversation_read) | |||||
get("/endorsements", MastodonAPIController, :empty_array) | get("/endorsements", MastodonAPIController, :empty_array) | ||||
@@ -325,14 +325,17 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do | |||||
assert response = json_response(res_conn, 200) | assert response = json_response(res_conn, 200) | ||||
assert %{ | |||||
"id" => res_id, | |||||
"accounts" => res_accounts, | |||||
"last_status" => res_last_status, | |||||
"unread" => unread | |||||
} = response | |||||
assert [ | |||||
%{ | |||||
"id" => res_id, | |||||
"accounts" => res_accounts, | |||||
"last_status" => res_last_status, | |||||
"unread" => unread | |||||
} | |||||
] = response | |||||
assert unread == false | |||||
assert unread == true | |||||
assert res_last_status == direct.id | |||||
# Apparently undocumented API endpoint | # Apparently undocumented API endpoint | ||||
res_conn = | res_conn = | ||||
@@ -340,15 +343,16 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do | |||||
|> assign(:user, user_one) | |> assign(:user, user_one) | ||||
|> post("/api/v1/conversations/#{res_id}/read") | |> post("/api/v1/conversations/#{res_id}/read") | ||||
assert response == json_response(res_conn, 200) | |||||
assert response = json_response(res_conn, 200) | |||||
assert response["unread"] == false | |||||
# (vanilla) Mastodon frontend behaviour | # (vanilla) Mastodon frontend behaviour | ||||
res_conn = | res_conn = | ||||
conn | conn | ||||
|> assign(:user, user_one) | |> assign(:user, user_one) | ||||
|> get("/api/v1/statuses/#{res_last_status.id}/context") | |||||
|> get("/api/v1/statuses/#{res_last_status}/context") | |||||
assert %{ancestors: [], descendants: []} == json_response(res_conn, 200) | |||||
assert %{"ancestors" => [], "descendants" => []} == json_response(res_conn, 200) | |||||
end | end | ||||
test "doesn't include DMs from blocked users", %{conn: conn} do | test "doesn't include DMs from blocked users", %{conn: conn} do | ||||