-- Czyszczenie danych testowych: zostaja wylacznie konta z listy keep_emails ponizej, -- a wraz z pozostalymi kontami znikaja ich ogloszenia i wszystkie powiazane dane -- (takze osierocone dane po kontach usunietych wczesniej). -- -- Domyslnie PROBA NA SUCHO: wszystko dzieje sie w jednej transakcji, skrypt wypisuje -- liczby przed i po, po czym robi ROLLBACK. Zapis nastepuje tylko z -v apply=1. -- -- docker exec -i polskalokalnie-db-1 psql -U polskalokalnie -d polskalokalnie < scripts/cleanup-test-data.sql -- docker exec -i polskalokalnie-db-1 psql -U polskalokalnie -d polskalokalnie -v apply=1 < scripts/cleanup-test-data.sql -- -- Nie rusza: konfiguracji, banerow, kampanii i grup docelowych, zapytan o reklame -- (kontakty z zewnatrz, nie konta), listy zablokowanych adresow ani leadow bez konta (np. z importu). \set ON_ERROR_STOP on \if :{?apply} \else \set apply 0 \endif BEGIN; CREATE TEMP TABLE keep_emails (email text PRIMARY KEY) ON COMMIT DROP; INSERT INTO keep_emails VALUES ('zatorskipascal@gmail.com'), ('admin@softspm.com'); -- Bezpiecznik: literowka w liscie usunelaby konto, ktore mialo zostac. DO $$ BEGIN IF (SELECT count(*) FROM app_users WHERE lower(email) IN (SELECT email FROM keep_emails)) <> (SELECT count(*) FROM keep_emails) THEN RAISE EXCEPTION 'Nie wszystkie konta z keep_emails istnieja w app_users - przerywam'; END IF; END $$; -- Dane powiazane liczymy wzgledem kont, KTORE ZOSTAJA, a nie tych usuwanych: usuwanie konta -- w panelu admina kasuje tylko wiersz app_users, wiec w bazie leza tez sieroty po starszych kontach. CREATE TEMP TABLE keep_users ON COMMIT DROP AS SELECT id FROM app_users WHERE lower(email) IN (SELECT email FROM keep_emails); CREATE TEMP TABLE del_users ON COMMIT DROP AS SELECT id, lower(email) AS email FROM app_users WHERE lower(email) NOT IN (SELECT email FROM keep_emails); -- Ogloszenia wszystkich wlascicieli spoza listy, takze bez konta (np. demo.user@...). CREATE TEMP TABLE del_listings ON COMMIT DROP AS SELECT id FROM property_listings WHERE owner_email IS NULL OR lower(owner_email) NOT IN (SELECT email FROM keep_emails); CREATE TEMP TABLE del_leads ON COMMIT DROP AS SELECT id FROM leads WHERE user_id NOT IN (SELECT id FROM keep_users); CREATE TEMP TABLE del_listing_reports ON COMMIT DROP AS SELECT id FROM listing_reports WHERE listing_id IN (SELECT id FROM del_listings) OR lower(reporter_email) NOT IN (SELECT email FROM keep_emails) OR lower(listing_owner_email) NOT IN (SELECT email FROM keep_emails); CREATE TEMP TABLE del_user_reports ON COMMIT DROP AS SELECT id FROM user_reports WHERE listing_id IN (SELECT id FROM del_listings) OR lower(reporter_email) NOT IN (SELECT email FROM keep_emails) OR lower(reported_email) NOT IN (SELECT email FROM keep_emails); CREATE TEMP TABLE del_articles ON COMMIT DROP AS SELECT id FROM articles WHERE lower(author_email) NOT IN (SELECT email FROM keep_emails); \echo \echo '=== Zostaja konta ===' SELECT id, email, role FROM app_users WHERE lower(email) IN (SELECT email FROM keep_emails) ORDER BY id; \echo '=== Do usuniecia ===' SELECT 'konta' AS co, count(*) AS ile FROM del_users UNION ALL SELECT 'ogloszenia', count(*) FROM del_listings UNION ALL SELECT 'leady kont spoza listy', count(*) FROM del_leads UNION ALL SELECT 'zgloszenia ogloszen', count(*) FROM del_listing_reports UNION ALL SELECT 'zgloszenia uzytkownikow', count(*) FROM del_user_reports UNION ALL SELECT 'poradniki (artykuly)', count(*) FROM del_articles; -- Najpierw tabele podrzedne (klucze obce bez ON DELETE CASCADE), potem glowne. DELETE FROM listing_photos WHERE listing_id IN (SELECT id FROM del_listings); DELETE FROM listing_media WHERE listing_id IN (SELECT id FROM del_listings); DELETE FROM listing_amenities WHERE listing_id IN (SELECT id FROM del_listings); DELETE FROM listing_favorites WHERE listing_id IN (SELECT id FROM del_listings) OR lower(user_email) NOT IN (SELECT email FROM keep_emails); DELETE FROM promotion_orders WHERE listing_id IN (SELECT id FROM del_listings) OR lower(user_email) NOT IN (SELECT email FROM keep_emails); DELETE FROM listing_report_attachments WHERE report_id IN (SELECT id FROM del_listing_reports); DELETE FROM listing_reports WHERE id IN (SELECT id FROM del_listing_reports); DELETE FROM user_report_attachments WHERE report_id IN (SELECT id FROM del_user_reports); DELETE FROM user_report_messages WHERE report_id IN (SELECT id FROM del_user_reports); DELETE FROM user_reports WHERE id IN (SELECT id FROM del_user_reports); DELETE FROM property_listings WHERE id IN (SELECT id FROM del_listings); DELETE FROM article_attachments WHERE article_id IN (SELECT id FROM del_articles); DELETE FROM articles WHERE id IN (SELECT id FROM del_articles); DELETE FROM campaign_recipients WHERE lead_id IN (SELECT id FROM del_leads); DELETE FROM lead_tags WHERE lead_id IN (SELECT id FROM del_leads); DELETE FROM leads WHERE id IN (SELECT id FROM del_leads); -- Rozmowa z usunietym kontem znika w calosci, takze po stronie konta, ktore zostaje. DELETE FROM messages WHERE sender_id NOT IN (SELECT id FROM keep_users) OR recipient_id NOT IN (SELECT id FROM keep_users); DELETE FROM notifications WHERE lower(user_email) NOT IN (SELECT email FROM keep_emails); DELETE FROM auth_tokens WHERE lower(user_email) NOT IN (SELECT email FROM keep_emails); DELETE FROM phone_otps WHERE lower(user_email) NOT IN (SELECT email FROM keep_emails); DELETE FROM support_messages WHERE lower(account_email) NOT IN (SELECT email FROM keep_emails); DELETE FROM saved_searches WHERE lower(user_email) NOT IN (SELECT email FROM keep_emails); -- Spotkanie z usunietym kontem znika w calosci, takze po stronie konta, ktore zostaje. DELETE FROM meetings WHERE proposer_id NOT IN (SELECT id FROM keep_users) OR (counterpart_id IS NOT NULL AND counterpart_id NOT IN (SELECT id FROM keep_users)); DELETE FROM user_settings WHERE user_id NOT IN (SELECT id FROM keep_users); DELETE FROM app_users WHERE id IN (SELECT id FROM del_users); \echo '=== Stan po czyszczeniu ===' SELECT 'konta' AS co, count(*) AS ile FROM app_users UNION ALL SELECT 'ogloszenia', count(*) FROM property_listings UNION ALL SELECT 'wiadomosci', count(*) FROM messages UNION ALL SELECT 'leady', count(*) FROM leads UNION ALL SELECT 'poradniki (artykuly)', count(*) FROM articles; \if :apply COMMIT; \echo '>>> ZAPISANO ZMIANY (COMMIT)' \else ROLLBACK; \echo '>>> PROBA NA SUCHO - nic nie zostalo zmienione (ROLLBACK). Zapis: -v apply=1' \endif