====== 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;