Files
polskalokalnie/scripts/cleanup-test-data.sql
T
debian b9fecdea85
Deploy Polska Lokalnie / deploy (push) Successful in 12s
Spotkania na serwerze: umawianie ogladania z druga strona
Nowa tabela meetings i /api/meetings. Termin proponuje jedna ze stron
rozmowy o ogloszeniu, druga potwierdza albo odrzuca; odwolac moze kazda
ze stron. Kalendarz konta pokazuje oba rodzaje wpisow - umowione
ogladania i wlasne notatki - i jest ten sam na kazdym urzadzeniu.
Powiadomienia: wpis w watku i dzwonek przy kazdej zmianie, e-mail
wylacznie przy potwierdzeniu terminu.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-23 09:57:35 +02:00

134 lines
6.5 KiB
PL/PgSQL

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