Dodaj skrypt czyszczenia danych testowych i wylacz ogloszenia demo
Deploy Polska Lokalnie / deploy (push) Successful in 10s
Deploy Polska Lokalnie / deploy (push) Successful in 10s
scripts/cleanup-test-data.sql zostawia wylacznie konta zatorskipascal@gmail.com i admin@softspm.com. Usuwa pozostale konta, ogloszenia spoza tych dwoch kont oraz powiazane dane (wiadomosci, powiadomienia, ustawienia, leady, zamowienia promocji, zgloszenia, poradniki), w tym sieroty po kontach usunietych wczesniej z panelu admina. Domyslnie dziala na sucho (ROLLBACK), zapis tylko z -v apply=1; przerywa, gdy ktoregos z zachowywanych kont nie ma w bazie. DataSeeder nie dodaje juz ogloszen demo: robil to przy kazdym starcie z pusta tabela ogloszen, wiec po wyczyszczeniu danych wracalyby przy kolejnym wdrozeniu. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -10,11 +10,6 @@ import org.springframework.stereotype.Component;
|
|||||||
import pl.polskalokalnie.banner.Banner;
|
import pl.polskalokalnie.banner.Banner;
|
||||||
import pl.polskalokalnie.banner.BannerRepository;
|
import pl.polskalokalnie.banner.BannerRepository;
|
||||||
import pl.polskalokalnie.banner.BannerSlot;
|
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.PromotionPackage;
|
||||||
import pl.polskalokalnie.promotion.PromotionPackageRepository;
|
import pl.polskalokalnie.promotion.PromotionPackageRepository;
|
||||||
import pl.polskalokalnie.promotion.PromotionPlan;
|
import pl.polskalokalnie.promotion.PromotionPlan;
|
||||||
@@ -31,7 +26,6 @@ public class DataSeeder implements CommandLineRunner {
|
|||||||
private static final Logger log = LoggerFactory.getLogger(DataSeeder.class);
|
private static final Logger log = LoggerFactory.getLogger(DataSeeder.class);
|
||||||
|
|
||||||
private final UserRepository userRepository;
|
private final UserRepository userRepository;
|
||||||
private final ListingRepository listingRepository;
|
|
||||||
private final BannerRepository bannerRepository;
|
private final BannerRepository bannerRepository;
|
||||||
private final PromotionPlanRepository promotionPlanRepository;
|
private final PromotionPlanRepository promotionPlanRepository;
|
||||||
private final PromotionPackageRepository promotionPackageRepository;
|
private final PromotionPackageRepository promotionPackageRepository;
|
||||||
@@ -44,7 +38,6 @@ public class DataSeeder implements CommandLineRunner {
|
|||||||
|
|
||||||
public DataSeeder(
|
public DataSeeder(
|
||||||
UserRepository userRepository,
|
UserRepository userRepository,
|
||||||
ListingRepository listingRepository,
|
|
||||||
BannerRepository bannerRepository,
|
BannerRepository bannerRepository,
|
||||||
PromotionPlanRepository promotionPlanRepository,
|
PromotionPlanRepository promotionPlanRepository,
|
||||||
PromotionPackageRepository promotionPackageRepository,
|
PromotionPackageRepository promotionPackageRepository,
|
||||||
@@ -56,7 +49,6 @@ public class DataSeeder implements CommandLineRunner {
|
|||||||
@Value("${app.admin.reset-password:false}") boolean adminResetPassword
|
@Value("${app.admin.reset-password:false}") boolean adminResetPassword
|
||||||
) {
|
) {
|
||||||
this.userRepository = userRepository;
|
this.userRepository = userRepository;
|
||||||
this.listingRepository = listingRepository;
|
|
||||||
this.bannerRepository = bannerRepository;
|
this.bannerRepository = bannerRepository;
|
||||||
this.promotionPlanRepository = promotionPlanRepository;
|
this.promotionPlanRepository = promotionPlanRepository;
|
||||||
this.promotionPackageRepository = promotionPackageRepository;
|
this.promotionPackageRepository = promotionPackageRepository;
|
||||||
@@ -71,7 +63,8 @@ public class DataSeeder implements CommandLineRunner {
|
|||||||
@Override
|
@Override
|
||||||
public void run(String... args) {
|
public void run(String... args) {
|
||||||
seedAdmin();
|
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();
|
seedBanners();
|
||||||
seedPromotion();
|
seedPromotion();
|
||||||
}
|
}
|
||||||
@@ -183,42 +176,4 @@ public class DataSeeder implements CommandLineRunner {
|
|||||||
+ " Wylacz te zmienna po odzyskaniu dostepu.", email);
|
+ " 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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
Reference in New Issue
Block a user