diff --git a/backend/src/main/java/pl/polskalokalnie/config/DataSeeder.java b/backend/src/main/java/pl/polskalokalnie/config/DataSeeder.java index 1a46996..1142813 100644 --- a/backend/src/main/java/pl/polskalokalnie/config/DataSeeder.java +++ b/backend/src/main/java/pl/polskalokalnie/config/DataSeeder.java @@ -10,11 +10,6 @@ import org.springframework.stereotype.Component; import pl.polskalokalnie.banner.Banner; import pl.polskalokalnie.banner.BannerRepository; import pl.polskalokalnie.banner.BannerSlot; -import pl.polskalokalnie.listing.ListingRepository; -import pl.polskalokalnie.listing.ListingStatus; -import pl.polskalokalnie.listing.OfferType; -import pl.polskalokalnie.listing.PropertyListing; -import pl.polskalokalnie.listing.PropertyType; import pl.polskalokalnie.promotion.PromotionPackage; import pl.polskalokalnie.promotion.PromotionPackageRepository; import pl.polskalokalnie.promotion.PromotionPlan; @@ -31,7 +26,6 @@ public class DataSeeder implements CommandLineRunner { private static final Logger log = LoggerFactory.getLogger(DataSeeder.class); private final UserRepository userRepository; - private final ListingRepository listingRepository; private final BannerRepository bannerRepository; private final PromotionPlanRepository promotionPlanRepository; private final PromotionPackageRepository promotionPackageRepository; @@ -44,7 +38,6 @@ public class DataSeeder implements CommandLineRunner { public DataSeeder( UserRepository userRepository, - ListingRepository listingRepository, BannerRepository bannerRepository, PromotionPlanRepository promotionPlanRepository, PromotionPackageRepository promotionPackageRepository, @@ -56,7 +49,6 @@ public class DataSeeder implements CommandLineRunner { @Value("${app.admin.reset-password:false}") boolean adminResetPassword ) { this.userRepository = userRepository; - this.listingRepository = listingRepository; this.bannerRepository = bannerRepository; this.promotionPlanRepository = promotionPlanRepository; this.promotionPackageRepository = promotionPackageRepository; @@ -71,7 +63,8 @@ public class DataSeeder implements CommandLineRunner { @Override public void run(String... args) { seedAdmin(); - seedDemoListings(); + // Bez ogloszen demo: seeder dodawal je przy kazdym starcie z pusta tabela ogloszen, + // wiec po wyczyszczeniu danych testowych na produkcji wracalyby przy kolejnym wdrozeniu. seedBanners(); seedPromotion(); } @@ -183,42 +176,4 @@ public class DataSeeder implements CommandLineRunner { + " Wylacz te zmienna po odzyskaniu dostepu.", email); } - private void seedDemoListings() { - if (listingRepository.count() > 0) { - return; - } - listingRepository.save(demoListing( - "Słoneczne 3 pokoje na Mokotowie", "Rozkładowe mieszkanie po remoncie, blisko metra.", - OfferType.SALE, PropertyType.APARTMENT, "Warszawa", "ul. Puławska 120", - new BigDecimal("749000"), 62.0, 3, ListingStatus.APPROVED)); - listingRepository.save(demoListing( - "Dom z ogrodem pod Krakowem", "Wolnostojący dom, działka 600 m², cicha okolica.", - OfferType.SALE, PropertyType.HOUSE, "Kraków", "ul. Podgórska 8", - new BigDecimal("1290000"), 145.0, 5, ListingStatus.PENDING)); - listingRepository.save(demoListing( - "Kawalerka do wynajęcia - Wrocław", "Umeblowana kawalerka w centrum, dostępna od zaraz.", - OfferType.RENT, PropertyType.APARTMENT, "Wrocław", "ul. Krupnicza 3", - new BigDecimal("2600"), 30.0, 1, ListingStatus.PENDING)); - } - - private PropertyListing demoListing( - String title, String description, OfferType offerType, PropertyType propertyType, - String city, String address, BigDecimal price, Double area, Integer rooms, ListingStatus status - ) { - PropertyListing listing = new PropertyListing(); - listing.setTitle(title); - listing.setDescription(description); - listing.setOfferType(offerType); - listing.setPropertyType(propertyType); - listing.setCity(city); - listing.setAddress(address); - listing.setPrice(price); - listing.setArea(area); - listing.setRooms(rooms); - listing.setContactName("Biuro Polska Lokalnie"); - listing.setContactPhone("+48 600 100 200"); - listing.setOwnerEmail("demo.user@polskalokalnie.pl"); - listing.setStatus(status); - return listing; - } } diff --git a/scripts/cleanup-test-data.sql b/scripts/cleanup-test-data.sql new file mode 100644 index 0000000..4d22de9 --- /dev/null +++ b/scripts/cleanup-test-data.sql @@ -0,0 +1,128 @@ +-- 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 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