Istotna edycja zatwierdzonego ogloszenia wraca do moderacji
Deploy Polska Lokalnie / deploy (push) Successful in 12s

- Zmiana tytulu, opisu, zdjec, danych kontaktowych lub linku spaceru
  w ogloszeniu opublikowanym albo wstrzymanym ustawia status PENDING;
  cena i parametry zmieniaja sie od razu.
- Frontend nie koduje ponownie zapisanych zdjec JPEG przy edycji (bez utraty
  jakosci i bez falszywej zmiany zdjec); informacja o weryfikacji w formularzu.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-23 16:39:15 +02:00
parent b850e4c092
commit a53cae7c37
3 changed files with 97 additions and 3 deletions
@@ -216,8 +216,8 @@ public class ListingService {
return detailOf(saved);
}
// Edycja wlasnego ogloszenia. Waliduje tresc filtrem, ale NIE zmienia statusu -
// zatwierdzone ogloszenie pozostaje widoczne od razu po zapisie zmian.
// Edycja wlasnego ogloszenia. Waliduje tresc filtrem; istotna zmiana tresci odsyla ogloszenie
// do ponownej weryfikacji, a drobne zmiany (cena, metraz, parametry) sa widoczne od razu.
@Transactional
public ListingDetailResponse updateOwn(Long id, String ownerEmail, ListingCreateRequest request) {
PropertyListing listing = listingRepository.findById(id)
@@ -228,13 +228,27 @@ public class ListingService {
request.title(), request.description(), request.city(), request.address(),
request.district(), request.street(), request.contactName());
List<Object> before = moderatedContent(listing);
applyRequest(listing, request);
// ownerEmail i status pozostaja bez zmian.
// Zmiana tresci widocznej dla kupujacych (tytul, opis, zdjecia, kontakt, link spaceru) wraca do
// weryfikacji - inaczej zatwierdzone ogloszenie mozna bylo podmienic na dowolne, np. oszustwo.
// Dotyczy tez wstrzymanego, bo wlasciciel sam je wznawia. Cena, metraz itp. zmieniaja sie od razu.
boolean visible = listing.getStatus() == ListingStatus.APPROVED || listing.getStatus() == ListingStatus.PAUSED;
if (visible && !before.equals(moderatedContent(listing))) {
listing.setStatus(ListingStatus.PENDING);
}
PropertyListing saved = listingRepository.save(listing);
return detailOf(saved);
}
// Pola, ktorych zmiana wymaga ponownej akceptacji administracji.
static List<Object> moderatedContent(PropertyListing listing) {
return java.util.Arrays.asList(listing.getTitle(), listing.getDescription(), List.copyOf(listing.getPhotos()),
listing.getContactName(), listing.getContactPhone(), listing.getContactEmail(),
listing.getVirtualTourUrl());
}
// Wspolne mapowanie pol requestu na encje (uzywane przez create i updateOwn).
private void applyRequest(PropertyListing listing, ListingCreateRequest request) {
listing.setTitle(request.title().trim());