Selaa lähdekoodia

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

merge-requests/1875/head
eugenijm 4 vuotta sitten
vanhempi
commit
52ed2f8f2d
7 muutettua tiedostoa jossa 72 lisäystä ja 0 poistoa
  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 Näytä tiedosto

@@ -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 Näytä tiedosto

@@ -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 Näytä tiedosto

@@ -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 Näytä tiedosto

@@ -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 Näytä tiedosto

@@ -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 Näytä tiedosto

@@ -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 Näytä tiedosto

@@ -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…
Peruuta
Tallenna