Pleroma Conversations API: Add a way to set recipients.

This commit is contained in:
lain 2019-08-05 15:09:19 +02:00
commit 3af6d14da7
6 changed files with 120 additions and 2 deletions

View file

@ -99,4 +99,24 @@ defmodule Pleroma.Conversation.Participation do
def get(id) do
Repo.get(__MODULE__, id)
end
def set_recipients(participation, user_ids) do
Repo.transaction(fn ->
query =
from(r in RecipientShip,
where: r.participation_id == ^participation.id
)
Repo.delete_all(query)
users =
from(u in User,
where: u.id in ^user_ids
)
|> Repo.all()
RecipientShip.create(users, participation)
:ok
end)
end
end

View file

@ -12,7 +12,7 @@ defmodule Pleroma.Web.MastodonAPI.ConversationView do
alias Pleroma.Web.MastodonAPI.StatusView
def render("participation.json", %{participation: participation, user: user}) do
participation = Repo.preload(participation, conversation: :users)
participation = Repo.preload(participation, conversation: :users, recipients: [])
last_activity_id =
with nil <- participation.last_activity_id do
@ -37,11 +37,20 @@ defmodule Pleroma.Web.MastodonAPI.ConversationView do
as: :user
})
recipients =
AccountView.render("accounts.json", %{
users: participation.recipients,
as: :user
})
%{
id: participation.id |> to_string(),
accounts: accounts,
unread: !participation.read,
last_status: last_status
last_status: last_status,
pleroma: %{
recipients: recipients
}
}
end
end

View file

@ -10,6 +10,7 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIController do
alias Pleroma.Conversation.Participation
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.MastodonAPI.StatusView
alias Pleroma.Web.MastodonAPI.ConversationView
alias Pleroma.Repo
def conversation_statuses(
@ -46,4 +47,20 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIController do
|> render("index.json", %{activities: activities, for: user, as: :activity})
end
end
def update_conversation(
%{assigns: %{user: user}} = conn,
%{"id" => participation_id, "recipients" => recipients}
) do
participation =
participation_id
|> Participation.get()
with true <- user.id == participation.user_id,
{:ok, _} <- Participation.set_recipients(participation, recipients) do
conn
|> put_view(ConversationView)
|> render("participation.json", %{participation: participation, user: user})
end
end
end

View file

@ -263,6 +263,7 @@ defmodule Pleroma.Web.Router do
scope [] do
pipe_through(:oauth_write)
get("/conversations/:id/statuses", PleromaAPIController, :conversation_statuses)
patch("/conversations/:id", PleromaAPIController, :update_conversation)
end
end