Compare commits

...

2 Commits

Author SHA1 Message Date
debian 036cb59331 Skrypt czyszczacy kampanie marketingowe
Deploy Polska Lokalnie / deploy (push) Successful in 11s
Usuwa wszystkie kampanie i ich kolejki odbiorcow, zeby stare kampanie
zawieszone w statusie SENDING nie ruszyly po wdrozeniu wysylki.
Leady, zgody marketingowe i grupy docelowe zostaja nietkniete.

Domyslnie proba na sucho (ROLLBACK), zapis tylko z -v apply=1 -
tak samo jak scripts/cleanup-test-data.sql.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-23 12:12:23 +02:00
debian dbb6cf58d0 Testy backendu przechodza - poprawki schematu tylko na PostgreSQL
SchemaFixer wykonuje SQL w skladni PostgreSQL (split_part, DO $$,
to_regclass), wiec kazdy @SpringBootTest wywracal sie przy starcie na
testowym H2. Teraz runner sprawdza rodzaj bazy i na innej niz PostgreSQL
nic nie robi - w testach schemat i tak tworzy Hibernate z encji.

mvn test: 22 testy, 0 bledow (bylo 3 bledy).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-23 11:56:43 +02:00
2 changed files with 81 additions and 0 deletions
@@ -1,5 +1,10 @@
package pl.polskalokalnie.config;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -8,9 +13,32 @@ import org.springframework.jdbc.core.JdbcTemplate;
@Configuration
public class SchemaFixer {
private static final Logger log = LoggerFactory.getLogger(SchemaFixer.class);
/**
* Laty schematu pisane sa skladnia PostgreSQL (DO $$, to_regclass, lo_get, split_part...),
* bo taka baza dziala na serwerze. W testach schemat tworzy Hibernate z encji na H2,
* wiec nie ma czego latac - bez tego warunku kazdy @SpringBootTest wywracal sie przy starcie.
*/
private static boolean isPostgres(JdbcTemplate jdbcTemplate) {
DataSource dataSource = jdbcTemplate.getDataSource();
if (dataSource == null) {
return false;
}
try (Connection connection = dataSource.getConnection()) {
return "PostgreSQL".equalsIgnoreCase(connection.getMetaData().getDatabaseProductName());
} catch (SQLException ex) {
log.warn("Nie udalo sie rozpoznac bazy danych, pomijam poprawki schematu: {}", ex.getMessage());
return false;
}
}
@Bean
ApplicationRunner ensureViewsCountColumn(JdbcTemplate jdbcTemplate) {
return args -> {
if (!isPostgres(jdbcTemplate)) {
return;
}
jdbcTemplate.execute(
"ALTER TABLE property_listings ADD COLUMN IF NOT EXISTS views_count BIGINT NOT NULL DEFAULT 0"
);
+53
View File
@@ -0,0 +1,53 @@
-- Czyszczenie kampanii marketingowych: usuwa WSZYSTKIE kampanie razem z ich kolejkami
-- odbiorcow (tabele campaigns i campaign_recipients).
--
-- Po co: do 2026-09-23 zaden proces nie wysylal kampanii z kolejki - kampania wchodzila
-- w status "wysylanie" i tak zostawala. Po wdrozeniu wysylki (CampaignSender) takie stare
-- kampanie ruszylyby naprawde. Ten skrypt czysci tabele przed pierwsza prawdziwa wysylka.
--
-- Domyslnie PROBA NA SUCHO: wszystko dzieje sie w jednej transakcji, skrypt wypisuje stan
-- 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-campaigns.sql
-- docker exec -i polskalokalnie-db-1 psql -U polskalokalnie -d polskalokalnie -v apply=1 < scripts/cleanup-campaigns.sql
--
-- NIE rusza: leadow ani ich zgod marketingowych, grup docelowych, zapytan o reklame,
-- konfiguracji SMTP/SMS. Znika wylacznie historia kampanii i ich kolejki wysylkowe.
\set ON_ERROR_STOP on
\if :{?apply}
\else
\set apply 0
\endif
BEGIN;
\echo '=== Stan przed czyszczeniem ==='
SELECT 'kampanie' AS co, count(*) AS ile FROM campaigns
UNION ALL SELECT 'pozycje w kolejkach', count(*) FROM campaign_recipients
UNION ALL SELECT 'leady (zostaja)', count(*) FROM leads
UNION ALL SELECT 'grupy docelowe (zostaja)', count(*) FROM target_groups;
\echo '=== Kampanie wedlug statusu (te w SENDING/SCHEDULED ruszylyby po wdrozeniu wysylki) ==='
SELECT status, count(*) AS ile FROM campaigns GROUP BY status ORDER BY status;
\echo '=== Ile wiadomosci czeka w kolejkach ==='
SELECT r.status, count(*) AS ile FROM campaign_recipients r GROUP BY r.status ORDER BY r.status;
-- Najpierw kolejki (maja campaign_id), potem same kampanie.
DELETE FROM campaign_recipients;
DELETE FROM campaigns;
\echo '=== Stan po czyszczeniu ==='
SELECT 'kampanie' AS co, count(*) AS ile FROM campaigns
UNION ALL SELECT 'pozycje w kolejkach', count(*) FROM campaign_recipients
UNION ALL SELECT 'leady (nietkniete)', count(*) FROM leads
UNION ALL SELECT 'grupy docelowe (nietkniete)', count(*) FROM target_groups;
\if :apply
COMMIT;
\echo '>>> ZAPISANO ZMIANY (COMMIT) - kampanie i kolejki usuniete'
\else
ROLLBACK;
\echo '>>> PROBA NA SUCHO - nic nie zostalo zmienione (ROLLBACK). Zapis: -v apply=1'
\endif