CouponQueryServiceImpl.java
package com.deveagles.be15_deveagles_be.features.coupons.application.query;
import com.deveagles.be15_deveagles_be.common.dto.PagedResult;
import com.deveagles.be15_deveagles_be.features.coupons.common.CouponDto;
import com.deveagles.be15_deveagles_be.features.coupons.domain.repository.CouponQueryRepository;
import com.deveagles.be15_deveagles_be.features.coupons.infrastructure.repository.CouponJpaRepository;
import com.deveagles.be15_deveagles_be.features.coupons.presentation.dto.response.CouponResponse;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
@Slf4j
public class CouponQueryServiceImpl implements CouponQueryService {
private final CouponJpaRepository couponJpaRepository;
private final CouponQueryRepository couponQueryRepository;
@Override
public Optional<CouponResponse> getCouponById(Long id, Long shopId) {
log.info("쿠폰 ID로 조회 - ID: {}, 매장ID: {}", id, shopId);
return couponJpaRepository
.findByIdAndShopIdAndDeletedAtIsNull(id, shopId)
.map(CouponResponse::from);
}
@Override
public Optional<CouponResponse> getCouponByCode(String couponCode, Long shopId) {
log.info("쿠폰 코드로 조회 - 코드: {}, 매장ID: {}", couponCode, shopId);
return couponJpaRepository
.findByCouponCodeAndShopIdAndDeletedAtIsNull(couponCode, shopId)
.map(CouponResponse::from);
}
@Override
public PagedResult<CouponResponse> searchCoupons(CouponSearchQuery query) {
log.info(
"쿠폰 검색 시작 - 조건: 매장ID={}, 활성상태={}, 직원ID={}, 상품ID={}",
query.getShopId(),
query.getIsActive(),
query.getStaffId(),
query.getPrimaryItemId());
int page = query.getPage() != null ? query.getPage() : 0;
int size = query.getSize() != null ? query.getSize() : 10;
Pageable pageable = PageRequest.of(page, size);
Page<CouponDto> coupons = couponQueryRepository.searchCoupons(query, pageable);
Page<CouponResponse> pageResult = coupons.map(CouponResponse::from);
log.info("쿠폰 검색 완료 - 총 {}개, 현재 페이지: {}", coupons.getTotalElements(), page);
return PagedResult.from(pageResult);
}
}