Browse Source

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

merge-requests/1875/head
eugenijm 4 years ago
parent
commit
52ed2f8f2d
7 changed files with 72 additions and 0 deletions
  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 View File

@@ -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 View File

@@ -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 View File

@@ -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 View File

@@ -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 View File

@@ -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 View File

@@ -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 View File

@@ -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…
Cancel
Save