瀏覽代碼

Pleroma API: `POST /api/v1/pleroma/conversations/read` to mark all user's conversations as read

merge-requests/1875/head
eugenijm 4 年之前
父節點
當前提交
52ed2f8f2d
共有 7 個文件被更改,包括 72 次插入0 次删除
  1. +1
    -0
      CHANGELOG.md
  2. +7
    -0
      docs/API/pleroma_api.md
  3. +13
    -0
      lib/pleroma/conversation/participation.ex
  4. +9
    -0
      lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex
  5. +1
    -0
      lib/pleroma/web/router.ex
  6. +14
    -0
      test/conversation/participation_test.exs
  7. +27
    -0
      test/web/pleroma_api/controllers/pleroma_api_controller_test.exs

+ 1
- 0
CHANGELOG.md 查看文件

@@ -50,6 +50,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Admin API: `/users/:nickname/toggle_activation` endpoint is now deprecated in favor of: `/users/activate`, `/users/deactivate`, both accept `nicknames` array
- Admin API: `POST/DELETE /api/pleroma/admin/users/:nickname/permission_group/:permission_group` are deprecated in favor of: `POST/DELETE /api/pleroma/admin/users/permission_group/:permission_group` (both accept `nicknames` array), `DELETE /api/pleroma/admin/users` (`nickname` query param or `nickname` sent in JSON body) is deprecated in favor of: `DELETE /api/pleroma/admin/users` (`nicknames` query array param or `nicknames` sent in JSON body).
- Admin API: Add `GET /api/pleroma/admin/relay` endpoint - lists all followed relays
- Pleroma API: `POST /api/v1/pleroma/conversations/read` to mark all conversations as read

### Changed
- **Breaking:** Elixir >=1.8 is now required (was >= 1.7)


+ 7
- 0
docs/API/pleroma_api.md 查看文件

@@ -367,6 +367,13 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa
* `recipients`: A list of ids of users that should receive posts to this conversation. This will replace the current list of recipients, so submit the full list. The owner of owner of the conversation will always be part of the set of recipients, though.
* Response: JSON, statuses (200 - healthy, 503 unhealthy)

## `GET /api/v1/pleroma/conversations/read`
### Marks all user's conversations as read.
* Method `POST`
* Authentication: required
* Params: None
* Response: JSON, returns a list of Mastodon Conversation entities that were marked as read (200 - healthy, 503 unhealthy).

## `GET /api/pleroma/emoji/packs`
### Lists the custom emoji packs on the server
* Method `GET`


+ 13
- 0
lib/pleroma/conversation/participation.ex 查看文件

@@ -69,6 +69,19 @@ defmodule Pleroma.Conversation.Participation do
end
end

def mark_all_as_read(user) do
{_, participations} =
__MODULE__
|> where([p], p.user_id == ^user.id)
|> where([p], not p.read)
|> update([p], set: [read: true])
|> select([p], p)
|> Repo.update_all([])

User.set_unread_conversation_count(user)
{:ok, participations}
end

def mark_as_unread(participation) do
participation
|> read_cng(%{read: false})


+ 9
- 0
lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex 查看文件

@@ -79,6 +79,15 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIController do
end
end

def read_conversations(%{assigns: %{user: user}} = conn, _params) do
with {:ok, participations} <- Participation.mark_all_as_read(user) do
conn
|> add_link_headers(participations)
|> put_view(ConversationView)
|> render("participations.json", participations: participations, for: user)
end
end

def read_notification(%{assigns: %{user: user}} = conn, %{"id" => notification_id}) do
with {:ok, notification} <- Notification.read_one(user, notification_id) do
conn


+ 1
- 0
lib/pleroma/web/router.ex 查看文件

@@ -266,6 +266,7 @@ defmodule Pleroma.Web.Router do

get("/conversations/:id/statuses", PleromaAPIController, :conversation_statuses)
get("/conversations/:id", PleromaAPIController, :conversation)
post("/conversations/read", PleromaAPIController, :read_conversations)
end

scope [] do


+ 14
- 0
test/conversation/participation_test.exs 查看文件

@@ -133,6 +133,20 @@ defmodule Pleroma.Conversation.ParticipationTest do
refute participation.read
end

test "it marks all the user's participations as read" do
user = insert(:user)
other_user = insert(:user)
participation1 = insert(:participation, %{read: false, user: user})
participation2 = insert(:participation, %{read: false, user: user})
participation3 = insert(:participation, %{read: false, user: other_user})

{:ok, [%{read: true}, %{read: true}]} = Participation.mark_all_as_read(user)

assert Participation.get(participation1.id).read == true
assert Participation.get(participation2.id).read == true
assert Participation.get(participation3.id).read == false
end

test "gets all the participations for a user, ordered by updated at descending" do
user = insert(:user)
{:ok, activity_one} = CommonAPI.post(user, %{"status" => "x", "visibility" => "direct"})


+ 27
- 0
test/web/pleroma_api/controllers/pleroma_api_controller_test.exs 查看文件

@@ -95,6 +95,33 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do
assert other_user in participation.recipients
end

test "POST /api/v1/pleroma/conversations/read", %{conn: conn} do
user = insert(:user)
other_user = insert(:user)

{:ok, _activity} =
CommonAPI.post(user, %{"status" => "Hi @#{other_user.nickname}", "visibility" => "direct"})

{:ok, _activity} =
CommonAPI.post(user, %{"status" => "Hi @#{other_user.nickname}", "visibility" => "direct"})

[participation2, participation1] = Participation.for_user(other_user)
assert Participation.get(participation2.id).read == false
assert Participation.get(participation1.id).read == false
assert User.get_cached_by_id(other_user.id).info.unread_conversation_count == 2

[%{"unread" => false}, %{"unread" => false}] =
conn
|> assign(:user, other_user)
|> post("/api/v1/pleroma/conversations/read", %{})
|> json_response(200)

[participation2, participation1] = Participation.for_user(other_user)
assert Participation.get(participation2.id).read == true
assert Participation.get(participation1.id).read == true
assert User.get_cached_by_id(other_user.id).info.unread_conversation_count == 0
end

describe "POST /api/v1/pleroma/notifications/read" do
test "it marks a single notification as read", %{conn: conn} do
user1 = insert(:user)


Loading…
取消
儲存