AcquisitionChannelCommandServiceImpl.java

package com.deveagles.be15_deveagles_be.features.customers.command.infrastructure.service;

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.customers.command.application.dto.request.CreateAcquisitionChannelRequest;
import com.deveagles.be15_deveagles_be.features.customers.command.application.dto.request.UpdateAcquisitionChannelRequest;
import com.deveagles.be15_deveagles_be.features.customers.command.application.service.AcquisitionChannelCommandService;
import com.deveagles.be15_deveagles_be.features.customers.command.domain.aggregate.AcquisitionChannel;
import com.deveagles.be15_deveagles_be.features.customers.command.domain.repository.AcquisitionChannelRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional
@Slf4j
public class AcquisitionChannelCommandServiceImpl implements AcquisitionChannelCommandService {

  private final AcquisitionChannelRepository acquisitionChannelRepository;

  @Override
  public Long createAcquisitionChannel(CreateAcquisitionChannelRequest request) {
    log.info("유입경로 생성 요청 - 채널명: {}", request.getChannelName());

    validateChannelNameNotExists(request.getChannelName());

    AcquisitionChannel acquisitionChannel =
        AcquisitionChannel.builder().channelName(request.getChannelName()).build();

    AcquisitionChannel savedChannel = acquisitionChannelRepository.save(acquisitionChannel);

    log.info("유입경로 생성 완료 - ID: {}, 채널명: {}", savedChannel.getId(), savedChannel.getChannelName());
    return savedChannel.getId();
  }

  @Override
  public void updateAcquisitionChannel(Long channelId, UpdateAcquisitionChannelRequest request) {
    log.info("유입경로 수정 요청 - ID: {}, 새 채널명: {}", channelId, request.getChannelName());

    AcquisitionChannel acquisitionChannel = findAcquisitionChannelById(channelId);

    if (!acquisitionChannel.getChannelName().equals(request.getChannelName())) {
      validateChannelNameNotExists(request.getChannelName());
    }

    String oldChannelName = acquisitionChannel.getChannelName();
    acquisitionChannel.updateChannelName(request.getChannelName());

    log.info(
        "유입경로 수정 완료 - ID: {}, 기존명: {}, 새명: {}",
        channelId,
        oldChannelName,
        request.getChannelName());
  }

  @Override
  public void deleteAcquisitionChannel(Long channelId) {
    log.info("유입경로 삭제 요청 - ID: {}", channelId);

    AcquisitionChannel acquisitionChannel = findAcquisitionChannelById(channelId);
    acquisitionChannelRepository.delete(acquisitionChannel);

    log.info("유입경로 삭제 완료 - ID: {}, 채널명: {}", channelId, acquisitionChannel.getChannelName());
  }

  private AcquisitionChannel findAcquisitionChannelById(Long channelId) {
    return acquisitionChannelRepository
        .findById(channelId)
        .orElseThrow(
            () -> {
              log.error("유입경로를 찾을 수 없음 - ID: {}", channelId);
              return new BusinessException(ErrorCode.RESOURCE_NOT_FOUND, "유입경로를 찾을 수 없습니다.");
            });
  }

  private void validateChannelNameNotExists(String channelName) {
    if (acquisitionChannelRepository.existsByChannelName(channelName)) {
      log.error("중복된 유입경로명 - 채널명: {}", channelName);
      throw new BusinessException(ErrorCode.DUPLICATE_RESOURCE, "이미 존재하는 유입경로명입니다.");
    }
  }
}