forked from AkkomaGang/akkoma
Store private announcements in object.data["announcements"], filter them on display
This commit is contained in:
parent
43e3db0951
commit
427d0c2a00
3 changed files with 32 additions and 3 deletions
|
@ -494,7 +494,7 @@ def make_unlike_data(
|
||||||
@spec add_announce_to_object(Activity.t(), Object.t()) ::
|
@spec add_announce_to_object(Activity.t(), Object.t()) ::
|
||||||
{:ok, Object.t()} | {:error, Ecto.Changeset.t()}
|
{:ok, Object.t()} | {:error, Ecto.Changeset.t()}
|
||||||
def add_announce_to_object(
|
def add_announce_to_object(
|
||||||
%Activity{data: %{"actor" => actor, "cc" => [Pleroma.Constants.as_public()]}},
|
%Activity{data: %{"actor" => actor}},
|
||||||
object
|
object
|
||||||
) do
|
) do
|
||||||
announcements = take_announcements(object)
|
announcements = take_announcements(object)
|
||||||
|
|
|
@ -242,7 +242,19 @@ def favourited_by(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
def reblogged_by(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
def reblogged_by(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
with %Activity{} = activity <- Activity.get_by_id_with_object(id),
|
with %Activity{} = activity <- Activity.get_by_id_with_object(id),
|
||||||
{:visible, true} <- {:visible, Visibility.visible_for_user?(activity, user)},
|
{:visible, true} <- {:visible, Visibility.visible_for_user?(activity, user)},
|
||||||
%Object{data: %{"announcements" => announces}} <- Object.normalize(activity) do
|
%Object{data: %{"announcements" => announces, "id" => ap_id}} <-
|
||||||
|
Object.normalize(activity) do
|
||||||
|
announces =
|
||||||
|
"Announce"
|
||||||
|
|> Activity.Queries.by_type()
|
||||||
|
|> Ecto.Query.where([a], a.actor in ^announces)
|
||||||
|
# this is to use the index
|
||||||
|
|> Activity.Queries.by_object_id(ap_id)
|
||||||
|
|> Repo.all()
|
||||||
|
|> Enum.filter(&Visibility.visible_for_user?(&1, user))
|
||||||
|
|> Enum.map(& &1.actor)
|
||||||
|
|> Enum.uniq()
|
||||||
|
|
||||||
users =
|
users =
|
||||||
User
|
User
|
||||||
|> Ecto.Query.where([u], u.ap_id in ^announces)
|
|> Ecto.Query.where([u], u.ap_id in ^announces)
|
||||||
|
|
|
@ -557,7 +557,7 @@ test "reblogs privately and returns the reblogged status", %{conn: conn} do
|
||||||
|> post("/api/v1/statuses/#{activity.id}/reblog", %{"visibility" => "private"})
|
|> post("/api/v1/statuses/#{activity.id}/reblog", %{"visibility" => "private"})
|
||||||
|
|
||||||
assert %{
|
assert %{
|
||||||
"reblog" => %{"id" => id, "reblogged" => true, "reblogs_count" => 0},
|
"reblog" => %{"id" => id, "reblogged" => true, "reblogs_count" => 1},
|
||||||
"reblogged" => true,
|
"reblogged" => true,
|
||||||
"visibility" => "private"
|
"visibility" => "private"
|
||||||
} = json_response(conn, 200)
|
} = json_response(conn, 200)
|
||||||
|
@ -1167,6 +1167,23 @@ test "does not return users who have reblogged the status but are blocked", %{
|
||||||
assert Enum.empty?(response)
|
assert Enum.empty?(response)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "does not return users who have reblogged the status privately", %{
|
||||||
|
conn: %{assigns: %{user: user}} = conn,
|
||||||
|
activity: activity
|
||||||
|
} do
|
||||||
|
other_user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, _, _} = CommonAPI.repeat(activity.id, other_user, %{"visibility" => "private"})
|
||||||
|
|
||||||
|
response =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user)
|
||||||
|
|> get("/api/v1/statuses/#{activity.id}/reblogged_by")
|
||||||
|
|> json_response(:ok)
|
||||||
|
|
||||||
|
assert Enum.empty?(response)
|
||||||
|
end
|
||||||
|
|
||||||
test "does not fail on an unauthenticated request", %{conn: conn, activity: activity} do
|
test "does not fail on an unauthenticated request", %{conn: conn, activity: activity} do
|
||||||
other_user = insert(:user)
|
other_user = insert(:user)
|
||||||
{:ok, _, _} = CommonAPI.repeat(activity.id, other_user)
|
{:ok, _, _} = CommonAPI.repeat(activity.id, other_user)
|
||||||
|
|
Loading…
Reference in a new issue