forked from YokaiRick/akkoma
Pleroma API: POST /api/v1/pleroma/conversations/read
to mark all user's conversations as read
This commit is contained in:
parent
fd6d05dc45
commit
52ed2f8f2d
7 changed files with 72 additions and 0 deletions
|
@ -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: `/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: `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
|
- 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
|
### Changed
|
||||||
- **Breaking:** Elixir >=1.8 is now required (was >= 1.7)
|
- **Breaking:** Elixir >=1.8 is now required (was >= 1.7)
|
||||||
|
|
|
@ -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.
|
* `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)
|
* 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`
|
## `GET /api/pleroma/emoji/packs`
|
||||||
### Lists the custom emoji packs on the server
|
### Lists the custom emoji packs on the server
|
||||||
* Method `GET`
|
* Method `GET`
|
||||||
|
|
|
@ -69,6 +69,19 @@ def mark_as_read(participation) do
|
||||||
end
|
end
|
||||||
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
|
def mark_as_unread(participation) do
|
||||||
participation
|
participation
|
||||||
|> read_cng(%{read: false})
|
|> read_cng(%{read: false})
|
||||||
|
|
|
@ -79,6 +79,15 @@ def update_conversation(
|
||||||
end
|
end
|
||||||
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
|
def read_notification(%{assigns: %{user: user}} = conn, %{"id" => notification_id}) do
|
||||||
with {:ok, notification} <- Notification.read_one(user, notification_id) do
|
with {:ok, notification} <- Notification.read_one(user, notification_id) do
|
||||||
conn
|
conn
|
||||||
|
|
|
@ -266,6 +266,7 @@ defmodule Pleroma.Web.Router do
|
||||||
|
|
||||||
get("/conversations/:id/statuses", PleromaAPIController, :conversation_statuses)
|
get("/conversations/:id/statuses", PleromaAPIController, :conversation_statuses)
|
||||||
get("/conversations/:id", PleromaAPIController, :conversation)
|
get("/conversations/:id", PleromaAPIController, :conversation)
|
||||||
|
post("/conversations/read", PleromaAPIController, :read_conversations)
|
||||||
end
|
end
|
||||||
|
|
||||||
scope [] do
|
scope [] do
|
||||||
|
|
|
@ -133,6 +133,20 @@ test "it marks a participation as unread" do
|
||||||
refute participation.read
|
refute participation.read
|
||||||
end
|
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
|
test "gets all the participations for a user, ordered by updated at descending" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
{:ok, activity_one} = CommonAPI.post(user, %{"status" => "x", "visibility" => "direct"})
|
{:ok, activity_one} = CommonAPI.post(user, %{"status" => "x", "visibility" => "direct"})
|
||||||
|
|
|
@ -95,6 +95,33 @@ test "PATCH /api/v1/pleroma/conversations/:id", %{conn: conn} do
|
||||||
assert other_user in participation.recipients
|
assert other_user in participation.recipients
|
||||||
end
|
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
|
describe "POST /api/v1/pleroma/notifications/read" do
|
||||||
test "it marks a single notification as read", %{conn: conn} do
|
test "it marks a single notification as read", %{conn: conn} do
|
||||||
user1 = insert(:user)
|
user1 = insert(:user)
|
||||||
|
|
Loading…
Reference in a new issue