Table des matières

Suppressions des activités et objets distants anciens

Sans tenir compte des personnes suivies

-- Il est important de d'abord traiter la table activities
-- puisqu'ensuite on supprime les objets qui n'ont plus
-- de lien avec cette table.
--
-- 1ère partie pour la table activities
--
DELETE FROM activities
WHERE LOCAL = FALSE 
AND updated_at < (CURRENT_DATE - INTERVAL '90 days'); -- Ici 90 jours, à ajuster si besoin
--
-- 2ème partie pour la table objects
--
DELETE FROM objects 
WHERE id NOT IN (SELECT CAST(data->>'context_id' AS BIGINT) FROM activities)
AND data->>'actor' NOT LIKE '%pleroma.antoineve.me%' -- Personnaliser le nom de l'instance !
AND updated_at < (CURRENT_DATE - INTERVAL '90 days'); -- Ici 90 jours, à ajuster si besoin

En tenant compte des personnes suivies

Seul la première partie de la commande change :

-- Il est important de d'abord traiter la table activities
-- puisqu'ensuite on supprime les objets qui n'ont plus
-- de lien avec cette table.
--
-- 1ère partie pour la table activities
--
DELETE FROM activities
WHERE LOCAL = FALSE 
AND updated_at < (CURRENT_DATE - INTERVAL '90 days') -- Ici 90 jours, à ajuster si besoin
AND data->>'actor' 
NOT IN (
SELECT ap_id FROM users WHERE id IN (
SELECT following_id FROM following_relationships WHERE follower_id IN (
SELECT id FROM users WHERE ap_id LIKE '%pleroma.antoineve.me%' -- Personnaliser le nom de l'instance !
AND nickname IS NOT NULL AND nickname NOT LIKE '%fetch%')));
--
-- 2ème partie pour la table objects
--
DELETE FROM objects 
WHERE id NOT IN (SELECT CAST(data->>'context_id' AS BIGINT) FROM activities)
AND data->>'actor' NOT LIKE '%pleroma.antoineve.me%' -- Personnaliser le nom de l'instance !
AND updated_at < (CURRENT_DATE - INTERVAL '90 days'); -- Ici 90 jours, à ajuster si besoin

Suppressions d'utilisateurs (distants)

Ceux qui n'ont aucun lien avec les activités ou les objets

DELETE FROM users
WHERE ap_id NOT IN (
SELECT data->>'actor' AS actor FROM objects
WHERE data->>'actor' IS NOT NULL GROUP BY actor HAVING COUNT(*) > 1) -- Pour dédupliquer 8-)
AND ap_id NOT IN (
SELECT actor FROM activities GROUP BY actor HAVING COUNT(*) > 1)
AND (
ap_id LIKE '%/u%/%'               -- Certains services ActivityPub
OR ap_id LIKE '%/account%/%'      -- utilisent d'autres termes
OR ap_id LIKE '%/profile/%'       -- pour l'uri du profil utilisateur.
OR ap_id LIKE '%/@/%'             -- Ce filtre permet d'éviter d'effacer
OR ap_id LIKE '%/author/%');      -- des relais, des collections, ...

Ceux qui n'ont aucun followers et ne suivent personnes

DELETE FROM users
WHERE following_count = 0
AND follower_count = 0;