mirror of
https://git.pleroma.social/pleroma/pleroma.git
synced 2024-11-15 21:51:09 +00:00
Remove Object.get_by_id_and_maybe_refetch/2
This was only used for poll refreshing and is not a good approach to the problem.
This commit is contained in:
parent
d2eb4992e2
commit
382426e033
3 changed files with 1 additions and 166 deletions
|
@ -99,27 +99,6 @@ defmodule Pleroma.Object do
|
||||||
def get_by_id(nil), do: nil
|
def get_by_id(nil), do: nil
|
||||||
def get_by_id(id), do: Repo.get(Object, id)
|
def get_by_id(id), do: Repo.get(Object, id)
|
||||||
|
|
||||||
@spec get_by_id_and_maybe_refetch(integer(), list()) :: Object.t() | nil
|
|
||||||
def get_by_id_and_maybe_refetch(id, opts \\ []) do
|
|
||||||
with %Object{updated_at: updated_at} = object <- get_by_id(id) do
|
|
||||||
if opts[:interval] &&
|
|
||||||
NaiveDateTime.diff(NaiveDateTime.utc_now(), updated_at) > opts[:interval] do
|
|
||||||
case Fetcher.refetch_object(object) do
|
|
||||||
{:ok, %Object{} = object} ->
|
|
||||||
object
|
|
||||||
|
|
||||||
e ->
|
|
||||||
Logger.error("Couldn't refresh #{object.data["id"]}:\n#{inspect(e)}")
|
|
||||||
object
|
|
||||||
end
|
|
||||||
else
|
|
||||||
object
|
|
||||||
end
|
|
||||||
else
|
|
||||||
nil -> nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_by_ap_id(nil), do: nil
|
def get_by_ap_id(nil), do: nil
|
||||||
|
|
||||||
def get_by_ap_id(ap_id) do
|
def get_by_ap_id(ap_id) do
|
||||||
|
|
|
@ -30,7 +30,7 @@ defmodule Pleroma.Web.MastodonAPI.PollController do
|
||||||
|
|
||||||
@doc "GET /api/v1/polls/:id"
|
@doc "GET /api/v1/polls/:id"
|
||||||
def show(%{assigns: %{user: user}, private: %{open_api_spex: %{params: %{id: id}}}} = conn, _) do
|
def show(%{assigns: %{user: user}, private: %{open_api_spex: %{params: %{id: id}}}} = conn, _) do
|
||||||
with %Object{} = object <- Object.get_by_id_and_maybe_refetch(id, interval: 60),
|
with %Object{} = object <- Object.get_by_id(id),
|
||||||
%Activity{} = activity <- Activity.get_create_by_object_ap_id(object.data["id"]),
|
%Activity{} = activity <- Activity.get_create_by_object_ap_id(object.data["id"]),
|
||||||
true <- Visibility.visible_for_user?(activity, user) do
|
true <- Visibility.visible_for_user?(activity, user) do
|
||||||
try_render(conn, "show.json", %{object: object, for: user})
|
try_render(conn, "show.json", %{object: object, for: user})
|
||||||
|
|
|
@ -6,12 +6,10 @@ defmodule Pleroma.ObjectTest do
|
||||||
use Pleroma.DataCase
|
use Pleroma.DataCase
|
||||||
use Oban.Testing, repo: Pleroma.Repo
|
use Oban.Testing, repo: Pleroma.Repo
|
||||||
|
|
||||||
import ExUnit.CaptureLog
|
|
||||||
import Mox
|
import Mox
|
||||||
import Pleroma.Factory
|
import Pleroma.Factory
|
||||||
import Tesla.Mock
|
import Tesla.Mock
|
||||||
|
|
||||||
alias Pleroma.Activity
|
|
||||||
alias Pleroma.Hashtag
|
alias Pleroma.Hashtag
|
||||||
alias Pleroma.Object
|
alias Pleroma.Object
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
|
@ -282,148 +280,6 @@ defmodule Pleroma.ObjectTest do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "get_by_id_and_maybe_refetch" do
|
|
||||||
setup do
|
|
||||||
mock(fn
|
|
||||||
%{method: :get, url: "https://patch.cx/objects/9a172665-2bc5-452d-8428-2361d4c33b1d"} ->
|
|
||||||
%Tesla.Env{
|
|
||||||
status: 200,
|
|
||||||
body: File.read!("test/fixtures/tesla_mock/poll_original.json"),
|
|
||||||
headers: HttpRequestMock.activitypub_object_headers()
|
|
||||||
}
|
|
||||||
|
|
||||||
env ->
|
|
||||||
apply(HttpRequestMock, :request, [env])
|
|
||||||
end)
|
|
||||||
|
|
||||||
mock_modified = fn resp ->
|
|
||||||
mock(fn
|
|
||||||
%{method: :get, url: "https://patch.cx/objects/9a172665-2bc5-452d-8428-2361d4c33b1d"} ->
|
|
||||||
resp
|
|
||||||
|
|
||||||
env ->
|
|
||||||
apply(HttpRequestMock, :request, [env])
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
on_exit(fn -> mock(fn env -> apply(HttpRequestMock, :request, [env]) end) end)
|
|
||||||
|
|
||||||
[mock_modified: mock_modified]
|
|
||||||
end
|
|
||||||
|
|
||||||
test "refetches if the time since the last refetch is greater than the interval", %{
|
|
||||||
mock_modified: mock_modified
|
|
||||||
} do
|
|
||||||
%Object{} =
|
|
||||||
object =
|
|
||||||
Object.normalize("https://patch.cx/objects/9a172665-2bc5-452d-8428-2361d4c33b1d",
|
|
||||||
fetch: true
|
|
||||||
)
|
|
||||||
|
|
||||||
Object.set_cache(object)
|
|
||||||
|
|
||||||
assert Enum.at(object.data["oneOf"], 0)["replies"]["totalItems"] == 4
|
|
||||||
assert Enum.at(object.data["oneOf"], 1)["replies"]["totalItems"] == 0
|
|
||||||
|
|
||||||
mock_modified.(%Tesla.Env{
|
|
||||||
status: 200,
|
|
||||||
body: File.read!("test/fixtures/tesla_mock/poll_modified.json"),
|
|
||||||
headers: HttpRequestMock.activitypub_object_headers()
|
|
||||||
})
|
|
||||||
|
|
||||||
updated_object = Object.get_by_id_and_maybe_refetch(object.id, interval: -1)
|
|
||||||
object_in_cache = Object.get_cached_by_ap_id(object.data["id"])
|
|
||||||
assert updated_object == object_in_cache
|
|
||||||
assert Enum.at(updated_object.data["oneOf"], 0)["replies"]["totalItems"] == 8
|
|
||||||
assert Enum.at(updated_object.data["oneOf"], 1)["replies"]["totalItems"] == 3
|
|
||||||
end
|
|
||||||
|
|
||||||
test "returns the old object if refetch fails", %{mock_modified: mock_modified} do
|
|
||||||
%Object{} =
|
|
||||||
object =
|
|
||||||
Object.normalize("https://patch.cx/objects/9a172665-2bc5-452d-8428-2361d4c33b1d",
|
|
||||||
fetch: true
|
|
||||||
)
|
|
||||||
|
|
||||||
Object.set_cache(object)
|
|
||||||
|
|
||||||
assert Enum.at(object.data["oneOf"], 0)["replies"]["totalItems"] == 4
|
|
||||||
assert Enum.at(object.data["oneOf"], 1)["replies"]["totalItems"] == 0
|
|
||||||
|
|
||||||
assert capture_log(fn ->
|
|
||||||
mock_modified.(%Tesla.Env{status: 404, body: ""})
|
|
||||||
|
|
||||||
updated_object = Object.get_by_id_and_maybe_refetch(object.id, interval: -1)
|
|
||||||
object_in_cache = Object.get_cached_by_ap_id(object.data["id"])
|
|
||||||
assert updated_object == object_in_cache
|
|
||||||
assert Enum.at(updated_object.data["oneOf"], 0)["replies"]["totalItems"] == 4
|
|
||||||
assert Enum.at(updated_object.data["oneOf"], 1)["replies"]["totalItems"] == 0
|
|
||||||
end) =~
|
|
||||||
"[error] Couldn't refresh https://patch.cx/objects/9a172665-2bc5-452d-8428-2361d4c33b1d"
|
|
||||||
end
|
|
||||||
|
|
||||||
test "does not refetch if the time since the last refetch is greater than the interval", %{
|
|
||||||
mock_modified: mock_modified
|
|
||||||
} do
|
|
||||||
%Object{} =
|
|
||||||
object =
|
|
||||||
Object.normalize("https://patch.cx/objects/9a172665-2bc5-452d-8428-2361d4c33b1d",
|
|
||||||
fetch: true
|
|
||||||
)
|
|
||||||
|
|
||||||
Object.set_cache(object)
|
|
||||||
|
|
||||||
assert Enum.at(object.data["oneOf"], 0)["replies"]["totalItems"] == 4
|
|
||||||
assert Enum.at(object.data["oneOf"], 1)["replies"]["totalItems"] == 0
|
|
||||||
|
|
||||||
mock_modified.(%Tesla.Env{
|
|
||||||
status: 200,
|
|
||||||
body: File.read!("test/fixtures/tesla_mock/poll_modified.json"),
|
|
||||||
headers: HttpRequestMock.activitypub_object_headers()
|
|
||||||
})
|
|
||||||
|
|
||||||
updated_object = Object.get_by_id_and_maybe_refetch(object.id, interval: 100)
|
|
||||||
object_in_cache = Object.get_cached_by_ap_id(object.data["id"])
|
|
||||||
assert updated_object == object_in_cache
|
|
||||||
assert Enum.at(updated_object.data["oneOf"], 0)["replies"]["totalItems"] == 4
|
|
||||||
assert Enum.at(updated_object.data["oneOf"], 1)["replies"]["totalItems"] == 0
|
|
||||||
end
|
|
||||||
|
|
||||||
test "preserves internal fields on refetch", %{mock_modified: mock_modified} do
|
|
||||||
%Object{} =
|
|
||||||
object =
|
|
||||||
Object.normalize("https://patch.cx/objects/9a172665-2bc5-452d-8428-2361d4c33b1d",
|
|
||||||
fetch: true
|
|
||||||
)
|
|
||||||
|
|
||||||
Object.set_cache(object)
|
|
||||||
|
|
||||||
assert Enum.at(object.data["oneOf"], 0)["replies"]["totalItems"] == 4
|
|
||||||
assert Enum.at(object.data["oneOf"], 1)["replies"]["totalItems"] == 0
|
|
||||||
|
|
||||||
user = insert(:user)
|
|
||||||
activity = Activity.get_create_by_object_ap_id(object.data["id"])
|
|
||||||
{:ok, activity} = CommonAPI.favorite(activity.id, user)
|
|
||||||
object = Object.get_by_ap_id(activity.data["object"])
|
|
||||||
|
|
||||||
assert object.data["like_count"] == 1
|
|
||||||
|
|
||||||
mock_modified.(%Tesla.Env{
|
|
||||||
status: 200,
|
|
||||||
body: File.read!("test/fixtures/tesla_mock/poll_modified.json"),
|
|
||||||
headers: HttpRequestMock.activitypub_object_headers()
|
|
||||||
})
|
|
||||||
|
|
||||||
updated_object = Object.get_by_id_and_maybe_refetch(object.id, interval: -1)
|
|
||||||
object_in_cache = Object.get_cached_by_ap_id(object.data["id"])
|
|
||||||
assert updated_object == object_in_cache
|
|
||||||
assert Enum.at(updated_object.data["oneOf"], 0)["replies"]["totalItems"] == 8
|
|
||||||
assert Enum.at(updated_object.data["oneOf"], 1)["replies"]["totalItems"] == 3
|
|
||||||
|
|
||||||
assert updated_object.data["like_count"] == 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe ":hashtags association" do
|
describe ":hashtags association" do
|
||||||
test "Hashtag records are created with Object record and updated on its change" do
|
test "Hashtag records are created with Object record and updated on its change" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
Loading…
Reference in a new issue