PrepaidPassCommandServiceImpl.java

package com.deveagles.be15_deveagles_be.features.membership.command.application.service.impl;

import com.deveagles.be15_deveagles_be.common.exception.BusinessException;
import com.deveagles.be15_deveagles_be.common.exception.ErrorCode;
import com.deveagles.be15_deveagles_be.features.membership.command.application.dto.request.PrepaidPassRequest;
import com.deveagles.be15_deveagles_be.features.membership.command.application.service.PrepaidPassCommandService;
import com.deveagles.be15_deveagles_be.features.membership.command.domain.aggregate.PrepaidPass;
import com.deveagles.be15_deveagles_be.features.membership.command.domain.repository.PrepaidPassRepository;
import com.deveagles.be15_deveagles_be.features.shops.command.domain.aggregate.Shop;
import com.deveagles.be15_deveagles_be.features.shops.command.repository.ShopRepository;
import java.time.LocalDateTime;
import java.util.Objects;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class PrepaidPassCommandServiceImpl implements PrepaidPassCommandService {

  private final PrepaidPassRepository prepaidPassRepository;
  private final ShopRepository shopRepository;

  @Override
  public void registPrepaidPass(PrepaidPassRequest request) {

    if (request.getShopId() == null) {
      throw new BusinessException(ErrorCode.ITEMS_SHOP_NOT_FOUND);
    }
    if (Objects.isNull(request.getPrepaidPassName()) || request.getPrepaidPassName().isBlank()) {
      throw new BusinessException(ErrorCode.MEMBERSHIP_NAME_REQUIRED);
    }
    if (Objects.isNull(request.getPrepaidPassPrice()) || request.getPrepaidPassPrice() <= 0) {
      throw new BusinessException(ErrorCode.MEMBERSHIP_PRICE_REQUIRED);
    }
    if (Objects.isNull(request.getExpirationPeriod()) || request.getExpirationPeriod() <= 0) {
      throw new BusinessException(ErrorCode.MEMBERSHIP_EXPIRATION_PERIOD_REQUIRED);
    }
    if (Objects.isNull(request.getExpirationPeriodType())) {
      throw new BusinessException(ErrorCode.MEMBERSHIP_EXPIRATION_PERIOD_TYPE_REQUIRED);
    }

    Shop shop =
        shopRepository
            .findById(request.getShopId())
            .orElseThrow(() -> new BusinessException(ErrorCode.ITEMS_SHOP_NOT_FOUND));
    PrepaidPass prepaidPass =
        PrepaidPass.builder()
            .shopId(shop)
            .prepaidPassName(request.getPrepaidPassName())
            .prepaidPassPrice(request.getPrepaidPassPrice())
            .expirationPeriod(request.getExpirationPeriod())
            .expirationPeriodType(request.getExpirationPeriodType())
            .bonus(request.getBonus())
            .discountRate(request.getDiscountRate())
            .prepaidPassMemo(request.getPrepaidPassMemo())
            .createdAt(LocalDateTime.now())
            .modifiedAt(LocalDateTime.now())
            .build();

    prepaidPassRepository.save(prepaidPass);
  }

  @Override
  public void updatePrepaidPass(Long prepaidPassId, PrepaidPassRequest request) {

    if (Objects.isNull(request.getPrepaidPassName()) || request.getPrepaidPassName().isBlank()) {
      throw new BusinessException(ErrorCode.MEMBERSHIP_NAME_REQUIRED);
    }
    if (Objects.isNull(request.getPrepaidPassPrice()) || request.getPrepaidPassPrice() <= 0) {
      throw new BusinessException(ErrorCode.MEMBERSHIP_PRICE_REQUIRED);
    }
    if (Objects.isNull(request.getExpirationPeriod()) || request.getExpirationPeriod() <= 0) {
      throw new BusinessException(ErrorCode.MEMBERSHIP_EXPIRATION_PERIOD_REQUIRED);
    }
    if (Objects.isNull(request.getExpirationPeriodType())) {
      throw new BusinessException(ErrorCode.MEMBERSHIP_EXPIRATION_PERIOD_TYPE_REQUIRED);
    }

    boolean shopExists = shopRepository.existsById(request.getShopId());
    if (!shopExists) {
      throw new BusinessException(ErrorCode.ITEMS_SHOP_NOT_FOUND);
    }
    PrepaidPass prepaidPass =
        prepaidPassRepository
            .findById(prepaidPassId)
            .orElseThrow(() -> new BusinessException(ErrorCode.PREPAIDPASS_NOT_FOUND));

    // 필드 수정
    prepaidPass.updatePrepaidPass(
        request.getPrepaidPassName(),
        request.getPrepaidPassPrice(),
        request.getExpirationPeriod(),
        request.getExpirationPeriodType(),
        request.getBonus(),
        request.getDiscountRate(),
        request.getPrepaidPassMemo());

    prepaidPassRepository.save(prepaidPass);
  }

  @Override
  public void deletePrepaidPass(Long id) {
    PrepaidPass prepaidPass =
        prepaidPassRepository
            .findById(id)
            .orElseThrow(() -> new BusinessException(ErrorCode.PREPAIDPASS_NOT_FOUND));

    prepaidPass.setDeletedAt();
    prepaidPassRepository.save(prepaidPass);
  }
}