Simplify DM query.

Should also use indexes better.
This commit is contained in:
lain 2018-05-26 16:25:32 +02:00
parent 4b3ec53514
commit 841ee8e3e4
2 changed files with 37 additions and 14 deletions

View File

@ -313,9 +313,11 @@ defp restrict_visibility(query, %{visibility: "direct"}) do
on: sender.ap_id == activity.actor, on: sender.ap_id == activity.actor,
# Are non-direct statuses with no to/cc possible? # Are non-direct statuses with no to/cc possible?
where: where:
fragment("not coalesce(data->'to' \\? ?, false)", ^public) and fragment(
fragment("not coalesce(data->'cc' \\? ?, false)", ^public) and "not (? && ?)",
fragment("not coalesce(data->'to' \\? ?, false)", sender.follower_address) [^public, sender.follower_address],
activity.recipients
)
) )
end end

View File

@ -136,26 +136,47 @@ test "posting a direct status", %{conn: conn} do
assert %{"id" => id, "visibility" => "direct"} = json_response(conn, 200) assert %{"id" => id, "visibility" => "direct"} = json_response(conn, 200)
assert activity = Repo.get(Activity, id) assert activity = Repo.get(Activity, id)
assert user2.follower_address not in activity.data["to"] assert activity.recipients == [user2.ap_id]
assert activity.data["to"] == [user2.ap_id]
assert activity.data["cc"] == []
end end
test "direct timeline", %{conn: conn} do test "direct timeline", %{conn: conn} do
dm = insert(:direct_note_activity) user_one = insert(:user)
reg_note = insert(:note_activity) user_two = insert(:user)
recipient = User.get_by_ap_id(hd(dm.recipients)) {:ok, user_two} = User.follow(user_two, user_one)
conn = {:ok, direct} =
CommonAPI.post(user_one, %{
"status" => "Hi @#{user_two.nickname}!",
"visibility" => "direct"
})
{:ok, _follower_only} =
CommonAPI.post(user_one, %{
"status" => "Hi @#{user_two.nickname}!",
"visibility" => "private"
})
# Only direct should be visible here
res_conn =
conn conn
|> assign(:user, recipient) |> assign(:user, user_two)
|> get("api/v1/timelines/direct") |> get("api/v1/timelines/direct")
resp = json_response(conn, 200) [status] = json_response(res_conn, 200)
first_status = hd(resp)
assert length(resp) == 1 assert %{"visibility" => "direct"} = status
assert %{"visibility" => "direct"} = first_status assert status["url"] != direct.data["id"]
assert first_status["url"] != reg_note.data["id"]
# Both should be visible here
res_conn =
conn
|> assign(:user, user_two)
|> get("api/v1/timelines/home")
[_s1, _s2] = json_response(res_conn, 200)
end end
test "replying to a status", %{conn: conn} do test "replying to a status", %{conn: conn} do