Skip to content

Commit

Permalink
[fix] #219 - 캐러셀 번호가 중복된 항목 중에서 promotionId가 다른 경우에만 삭제하도록 수정 (#220)
Browse files Browse the repository at this point in the history
* [#219] fix(AdminFacade): 중복된 캐러셀 번호 처리 및 삭제 로직 수정

- Promotion ID가 다른 중복된 캐러셀 번호만 삭제하도록 수정
- 삭제할 캐러셀 번호와 중복된 캐러셀 번호를 분리하여 처리
- 중복된 캐러셀 번호를 처리하는 로직을 메서드로 분리하여 가독성 향상
- Promotion 수정 및 생성 요청을 명확하게 분리하여 처리

* [#219] feat(AdminService): 중복된 캐러셀 번호 처리 및 프로모션 삭제 로직 추가

* [#219] refactor(AdminUseCase): 메서드 시그니처 변경

* [#219] refactor(PromotionService): 캐러셀넘버로 Promotion 객체를 찾는 메서드 구현 및 캐러셀 넘버로 삭제 시 리스트 형태로 주도록 변경

* [#219] refactor(PromotionUseCase): 메서드 시그니처 변경 및 캐러셀 넘버로 Promotion 객체를 조회하는 메서드 선언

* [#219] refactor(PromotionRepository): 캐러셀 번호 기반 프로모션 삭제 로직 변경 및 조회 기능 추가

- `deleteByCarouselNumbers` 메서드 변: 여러 캐러셀 번호에 해당하는 프로모션을 한 경에 삭제하도록 로직 변경
- `findByCarouselNumber` 메서드 추가: 캐러셀 번호로 프로모션을 조회하는 기능 구현
- JPA 쿼리 최적화를 위해 `@Modifying` 및 `@Transactional` 어노테이션 추가
  • Loading branch information
hoonyworld authored Sep 30, 2024
1 parent 9667c19 commit 2846432
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 36 deletions.
24 changes: 18 additions & 6 deletions src/main/java/com/beat/admin/application/AdminService.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,21 +36,37 @@ public List<Promotion> findAllPromotionsSortedByCarouselNumber() {
@Override
@Transactional
public List<Promotion> processPromotionsAndSortByCarouselNumber(List<PromotionModifyRequest> modifyRequests,
List<PromotionGenerateRequest> generateRequests, List<CarouselNumber> deleteCarouselNumbers) {
List<PromotionGenerateRequest> generateRequests, List<CarouselNumber> deleteCarouselNumbers,
List<CarouselNumber> overlappingCarouselNumbers) {

handleOverlappingCarouselNumbersPromotionDeletion(overlappingCarouselNumbers);
handlePromotionDeletion(deleteCarouselNumbers);
List<Promotion> modifiedPromotions = handlePromotionModification(modifyRequests);
List<Promotion> addedPromotions = handlePromotionGeneration(generateRequests);
handlePromotionDeletion(deleteCarouselNumbers);

List<Promotion> applyPromotionChanges = new ArrayList<>(modifiedPromotions);
applyPromotionChanges.addAll(addedPromotions);

return sortPromotionsByCarouselNumber(applyPromotionChanges);
}

private void handleOverlappingCarouselNumbersPromotionDeletion(List<CarouselNumber> overlappingCarouselNumbers) {
if (!overlappingCarouselNumbers.isEmpty()) {
promotionUseCase.deleteByCarouselNumber(overlappingCarouselNumbers);
}
}

private void handlePromotionDeletion(List<CarouselNumber> deleteCarouselNumbers) {
if (!deleteCarouselNumbers.isEmpty()) {
promotionUseCase.deleteByCarouselNumber(deleteCarouselNumbers);
}
}

private List<Promotion> handlePromotionModification(List<PromotionModifyRequest> modifyRequests) {
return modifyRequests.stream().map(modifyRequest -> {

Promotion promotion = promotionUseCase.findById(modifyRequest.promotionId());

Performance performance = Optional.ofNullable(modifyRequest.performanceId())
.map(performanceUseCase::findById)
.orElse(null);
Expand All @@ -70,10 +86,6 @@ private List<Promotion> handlePromotionGeneration(List<PromotionGenerateRequest>
}).toList();
}

private void handlePromotionDeletion(List<CarouselNumber> deleteCarouselNumbers) {
deleteCarouselNumbers.forEach(promotionUseCase::deleteByCarouselNumber);
}

private List<Promotion> sortPromotionsByCarouselNumber(List<Promotion> promotions) {
return promotions.stream()
.sorted(Comparator.comparing(Promotion::getCarouselNumber, Comparator.comparingInt(Enum::ordinal)))
Expand Down
46 changes: 38 additions & 8 deletions src/main/java/com/beat/admin/facade/AdminFacade.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,32 @@ public CarouselFindAllResponse checkMemberAndFindAllPromotionsSortedByCarouselNu

public CarouselProcessAllResponse checkMemberAndProcessAllPromotionsSortedByCarouselNumber(Long memberId,
CarouselProcessRequest request) {

memberUseCase.findMemberById(memberId);

List<PromotionModifyRequest> modifyRequests = new ArrayList<>();
List<PromotionGenerateRequest> generateRequests = new ArrayList<>();
Set<CarouselNumber> requestCarouselNumbers = new HashSet<>();

categorizePromotionRequests(request, modifyRequests, generateRequests, requestCarouselNumbers);

List<CarouselNumber> allExistingCarouselNumbers = promotionUseCase.findAllCarouselNumbers();

List<CarouselNumber> deleteCarouselNumbers = findDeleteCarouselNumbers(requestCarouselNumbers,
allExistingCarouselNumbers);
List<CarouselNumber> overlappingCarouselNumbers = findOverlappingCarouselNumbers(requestCarouselNumbers,
allExistingCarouselNumbers, request);

List<Promotion> sortedPromotions = adminUsecase.processPromotionsAndSortByCarouselNumber(modifyRequests,
generateRequests, deleteCarouselNumbers, overlappingCarouselNumbers);

return CarouselProcessAllResponse.from(sortedPromotions);
}

private void categorizePromotionRequests(CarouselProcessRequest request,
List<PromotionModifyRequest> modifyRequests, List<PromotionGenerateRequest> generateRequests,
Set<CarouselNumber> requestCarouselNumbers) {

for (PromotionHandleRequest promotionRequest : request.carousels()) {
requestCarouselNumbers.add(promotionRequest.carouselNumber());

Expand All @@ -81,17 +101,27 @@ public CarouselProcessAllResponse checkMemberAndProcessAllPromotionsSortedByCaro
generateRequests.add(generateRequest);
}
}
}

List<CarouselNumber> allExistingCarouselNumbers = promotionUseCase.findAllCarouselNumbers();

List<CarouselNumber> deleteCarouselNumbers = allExistingCarouselNumbers.stream()
private List<CarouselNumber> findDeleteCarouselNumbers(Set<CarouselNumber> requestCarouselNumbers,
List<CarouselNumber> allExistingCarouselNumbers) {
return allExistingCarouselNumbers.stream()
.filter(existingCarouselNumber -> !requestCarouselNumbers.contains(existingCarouselNumber))
.toList();
}

List<Promotion> sortedPromotions = adminUsecase.
processPromotionsAndSortByCarouselNumber(modifyRequests, generateRequests,
deleteCarouselNumbers);

return CarouselProcessAllResponse.from(sortedPromotions);
private List<CarouselNumber> findOverlappingCarouselNumbers(Set<CarouselNumber> requestCarouselNumbers,
List<CarouselNumber> allExistingCarouselNumbers, CarouselProcessRequest request) {
return allExistingCarouselNumbers.stream()
.filter(requestCarouselNumbers::contains)
.filter(existingCarouselNumber -> {
Promotion existingPromotion = promotionUseCase.findPromotionByCarouselNumber(existingCarouselNumber);
return request.carousels()
.stream()
.filter(req -> req instanceof CarouselProcessRequest.PromotionModifyRequest)
.map(req -> (CarouselProcessRequest.PromotionModifyRequest)req)
.noneMatch(req -> req.promotionId() != null && req.promotionId().equals(existingPromotion.getId()));
})
.toList();
}
}
2 changes: 1 addition & 1 deletion src/main/java/com/beat/admin/port/in/AdminUseCase.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@ public interface AdminUseCase {
List<Promotion> findAllPromotionsSortedByCarouselNumber();

List<Promotion> processPromotionsAndSortByCarouselNumber(List<PromotionModifyRequest> modifyRequests,
List<PromotionGenerateRequest> generateRequests, List<CarouselNumber> deleteCarouselNumbers);
List<PromotionGenerateRequest> generateRequests, List<CarouselNumber> deleteCarouselNumbers, List<CarouselNumber> overlappingCarouselNumbers);
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import java.util.List;

@Service
@Transactional
@RequiredArgsConstructor
public class PromotionService implements PromotionUseCase {

Expand All @@ -36,41 +37,34 @@ public List<Promotion> findAllPromotions() {
}

@Override
@Transactional
public Promotion createPromotion(String newImageUrl, Performance performance, String redirectUrl,
boolean isExternal, CarouselNumber carouselNumber) {
Promotion newPromotion = Promotion.create(
newImageUrl,
performance,
redirectUrl,
isExternal,
carouselNumber
);
Promotion newPromotion = Promotion.create(newImageUrl, performance, redirectUrl, isExternal, carouselNumber);
return promotionRepository.save(newPromotion);
}

@Override
@Transactional
public Promotion modifyPromotion(Promotion promotion, Performance performance, PromotionModifyRequest request) {
promotion.updatePromotionDetails(
request.carouselNumber(),
request.newImageUrl(),
request.isExternal(),
request.redirectUrl(),
performance
);
promotion.updatePromotionDetails(request.carouselNumber(), request.newImageUrl(), request.isExternal(),
request.redirectUrl(), performance);
return promotionRepository.save(promotion);
}

@Override
@Transactional
public void deleteByCarouselNumber(CarouselNumber carouselNumber) {
promotionRepository.deleteByCarouselNumber(carouselNumber);
public void deleteByCarouselNumber(List<CarouselNumber> carouselNumber) {
promotionRepository.deleteByCarouselNumbers(carouselNumber);
}

@Override
@Transactional(readOnly = true)
public List<CarouselNumber> findAllCarouselNumbers() {
return promotionRepository.findAllCarouselNumbers();
}

@Override
@Transactional(readOnly = true)
public Promotion findPromotionByCarouselNumber(CarouselNumber carouselNumber) {
return promotionRepository.findByCarouselNumber(carouselNumber)
.orElseThrow(() -> new NotFoundException(PromotionErrorCode.PROMOTION_NOT_FOUND));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,25 @@
import com.beat.domain.promotion.domain.CarouselNumber;
import com.beat.domain.promotion.domain.Promotion;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

public interface PromotionRepository extends JpaRepository<Promotion, Long> {
List<Promotion> findAll();

@Query("SELECT p.carouselNumber FROM Promotion p")
List<CarouselNumber> findAllCarouselNumbers();

void deleteByCarouselNumber(CarouselNumber carouselNumber);
@Modifying(clearAutomatically = true)
@Transactional
@Query("DELETE FROM Promotion p WHERE p.carouselNumber IN :carouselNumbers")
void deleteByCarouselNumbers(@Param("carouselNumbers") List<CarouselNumber> carouselNumbers);

@Query("SELECT p FROM Promotion p WHERE p.carouselNumber = :carouselNumber")
Optional<Promotion> findByCarouselNumber(@Param("carouselNumber") CarouselNumber carouselNumber);
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ Promotion createPromotion(String newImageUrl, Performance performance, String re

Promotion modifyPromotion(Promotion promotion, Performance performance, PromotionModifyRequest request);

void deleteByCarouselNumber(CarouselNumber carouselNumber);
void deleteByCarouselNumber(List<CarouselNumber> carouselNumbers);

List<CarouselNumber> findAllCarouselNumbers();

Promotion findPromotionByCarouselNumber(CarouselNumber carouselNumber);
}

0 comments on commit 2846432

Please sign in to comment.