ColumnRequestService.java
package com.newbit.column.service;
import com.newbit.column.domain.Series;
import com.newbit.column.dto.request.CreateColumnRequestDto;
import com.newbit.column.dto.request.DeleteColumnRequestDto;
import com.newbit.column.dto.request.UpdateColumnRequestDto;
import com.newbit.column.dto.response.CreateColumnResponseDto;
import com.newbit.column.dto.response.DeleteColumnResponseDto;
import com.newbit.column.dto.response.GetMyColumnRequestResponseDto;
import com.newbit.column.dto.response.UpdateColumnResponseDto;
import com.newbit.column.domain.Column;
import com.newbit.column.domain.ColumnRequest;
import com.newbit.column.enums.RequestType;
import com.newbit.column.mapper.ColumnMapper;
import com.newbit.column.repository.ColumnRepository;
import com.newbit.column.repository.ColumnRequestRepository;
import com.newbit.column.repository.SeriesRepository;
import com.newbit.common.exception.BusinessException;
import com.newbit.common.exception.ErrorCode;
import com.newbit.user.entity.Mentor;
import com.newbit.user.service.MentorService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class ColumnRequestService {
private final ColumnRepository columnRepository;
private final ColumnRequestRepository columnRequestRepository;
private final SeriesRepository seriesRepository;
private final MentorService mentorService;
private final ColumnMapper columnMapper;
public CreateColumnResponseDto createColumnRequest(CreateColumnRequestDto dto, Long userId) {
// 1. Mentor 조회
Mentor mentor = mentorService.getMentorEntityByUserId(userId);
// 2. 시리즈 조회
Series series = seriesRepository.findById(dto.getSeriesId())
.orElseThrow(() -> new BusinessException(ErrorCode.SERIES_NOT_FOUND));
// 3. Column 저장
Column column = columnMapper.toColumn(dto, mentor, series);
Column savedColumn = columnRepository.save(column);
// 4. ColumnRequest 저장
ColumnRequest request = columnMapper.toColumnRequest(dto, savedColumn);
ColumnRequest savedRequest = columnRequestRepository.save(request);
return CreateColumnResponseDto.builder()
.columnRequestId(savedRequest.getColumnRequestId())
.build();
}
public UpdateColumnResponseDto updateColumnRequest(UpdateColumnRequestDto dto, Long columnId) {
// 1. columnId로 Column 조회
Column column = columnRepository.findById(columnId)
.orElseThrow(() -> new BusinessException(ErrorCode.COLUMN_NOT_FOUND));
// 2. ColumnRequest 생성
ColumnRequest request = ColumnRequest.builder()
.requestType(RequestType.UPDATE)
.isApproved(false)
.updatedTitle(dto.getTitle())
.updatedContent(dto.getContent())
.updatedPrice(dto.getPrice())
.updatedThumbnailUrl(dto.getThumbnailUrl())
.column(column)
.build();
// 3. 저장
ColumnRequest saved = columnRequestRepository.save(request);
// 4. 응답
return UpdateColumnResponseDto.builder()
.columnRequestId(saved.getColumnRequestId())
.build();
}
public DeleteColumnResponseDto deleteColumnRequest(DeleteColumnRequestDto dto, Long columnId) {
Column column = columnRepository.findById(columnId)
.orElseThrow(() -> new BusinessException(ErrorCode.COLUMN_NOT_FOUND));
ColumnRequest request = ColumnRequest.builder()
.requestType(RequestType.DELETE)
.isApproved(false)
.column(column)
.build();
ColumnRequest saved = columnRequestRepository.save(request);
return DeleteColumnResponseDto.builder()
.columnRequestId(saved.getColumnRequestId())
.build();
}
public List<GetMyColumnRequestResponseDto> getMyColumnRequests(Long userId) {
Mentor mentor = mentorService.getMentorEntityByUserId(userId);
List<ColumnRequest> requests = columnRequestRepository.findAllByColumn_Mentor_MentorIdOrderByCreatedAtDesc(mentor.getMentorId());
return requests.stream()
.map(columnMapper::toMyColumnRequestResponseDto)
.toList();
}
public Integer getColumnPriceById(Long columnId) {
return columnRepository.findById(columnId)
.map(Column::getPrice)
.orElseThrow(() -> new BusinessException(ErrorCode.COLUMN_NOT_FOUND));
}
public Long getMentorId(Long columnId) {
return columnRepository.findById(columnId)
.map(column -> column.getMentor().getMentorId())
.orElseThrow(() -> new BusinessException(ErrorCode.COLUMN_NOT_FOUND));
}
}