forked from AkkomaGang/akkoma
Clean up bookmarks after prune_objects
When doing prune_objects, it's possible that bookmarked objects are deleted. This gave problems when fetching the bookmark TL. Here we clean up the bookmarks during pruning in the case were it's possible that bookmarked objects are deleted.
This commit is contained in:
parent
c7fb78cc32
commit
f49e9e6d4c
2 changed files with 39 additions and 0 deletions
|
@ -171,6 +171,21 @@ def run(["prune_objects" | args]) do
|
||||||
end
|
end
|
||||||
|> Repo.delete_all(timeout: :infinity)
|
|> Repo.delete_all(timeout: :infinity)
|
||||||
|
|
||||||
|
if !Keyword.get(options, :keep_threads) do
|
||||||
|
# Without the --keep-threads option, it's possible that bookmarked
|
||||||
|
# objects have been deleted. We remove the corresponding bookmarks.
|
||||||
|
"""
|
||||||
|
delete from public.bookmarks
|
||||||
|
where id in (
|
||||||
|
select b.id from public.bookmarks b
|
||||||
|
left join public.activities a on b.activity_id = a.id
|
||||||
|
left join public.objects o on a."data" ->> 'object' = o.data ->> 'id'
|
||||||
|
where o.id is null
|
||||||
|
)
|
||||||
|
"""
|
||||||
|
|> Repo.query([], timeout: :infinity)
|
||||||
|
end
|
||||||
|
|
||||||
if Keyword.get(options, :prune_orphaned_activities) do
|
if Keyword.get(options, :prune_orphaned_activities) do
|
||||||
# Prune activities who link to a single object
|
# Prune activities who link to a single object
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -7,6 +7,7 @@ defmodule Mix.Tasks.Pleroma.DatabaseTest do
|
||||||
use Oban.Testing, repo: Pleroma.Repo
|
use Oban.Testing, repo: Pleroma.Repo
|
||||||
|
|
||||||
alias Pleroma.Activity
|
alias Pleroma.Activity
|
||||||
|
alias Pleroma.Bookmark
|
||||||
alias Pleroma.Object
|
alias Pleroma.Object
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
|
@ -87,6 +88,29 @@ test "it prunes old objects from the database", %{old_insert_date: old_insert_da
|
||||||
refute Object.get_by_id(note_remote_non_public_id)
|
refute Object.get_by_id(note_remote_non_public_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "it cleans up bookmarks", %{old_insert_date: old_insert_date} do
|
||||||
|
user = insert(:user)
|
||||||
|
{:ok, old_object_activity} = CommonAPI.post(user, %{status: "yadayada"})
|
||||||
|
|
||||||
|
Repo.one(Object)
|
||||||
|
|> Ecto.Changeset.change(%{updated_at: old_insert_date})
|
||||||
|
|> Repo.update!()
|
||||||
|
|
||||||
|
{:ok, new_object_activity} = CommonAPI.post(user, %{status: "yadayada"})
|
||||||
|
|
||||||
|
{:ok, _} = Bookmark.create(user.id, old_object_activity.id)
|
||||||
|
{:ok, _} = Bookmark.create(user.id, new_object_activity.id)
|
||||||
|
|
||||||
|
assert length(Repo.all(Object)) == 2
|
||||||
|
assert length(Repo.all(Bookmark)) == 2
|
||||||
|
|
||||||
|
Mix.Tasks.Pleroma.Database.run(["prune_objects"])
|
||||||
|
|
||||||
|
assert length(Repo.all(Object)) == 1
|
||||||
|
assert length(Repo.all(Bookmark)) == 1
|
||||||
|
refute Bookmark.get(user.id, old_object_activity.id)
|
||||||
|
end
|
||||||
|
|
||||||
test "with the --keep-non-public option it still keeps non-public posts even if they are not local",
|
test "with the --keep-non-public option it still keeps non-public posts even if they are not local",
|
||||||
%{old_insert_date: old_insert_date} do
|
%{old_insert_date: old_insert_date} do
|
||||||
insert(:note)
|
insert(:note)
|
||||||
|
|
Loading…
Reference in a new issue