refactor: reformat code

This commit is contained in:
shinmj
2021-12-30 13:56:05 +09:00
parent c62eb513e4
commit 64a3877619
55 changed files with 1586 additions and 1305 deletions

View File

@@ -1,10 +1,12 @@
package org.egovframe.cloud.reserverequestservice.api.dto;
import java.util.UUID;
import lombok.*;
import org.egovframe.cloud.reserverequestservice.domain.Reserve;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import org.egovframe.cloud.reserverequestservice.domain.ReserveStatus;
/**
* org.egovframe.cloud.reserverequestservice.api.dto.ReserveSaveRequestDto
@@ -90,6 +92,18 @@ public class ReserveSaveRequestDto {
this.userEmail = userEmail;
}
public Reserve createRequestReserve() {
this.reserveId = String.valueOf(UUID.randomUUID());
this.reserveStatusId = ReserveStatus.REQUEST.getKey();
return toEntity();
}
public Reserve createApproveReserve() {
this.reserveId = String.valueOf(UUID.randomUUID());
this.reserveStatusId = ReserveStatus.APPROVE.getKey();
return toEntity();
}
public Reserve toEntity() {
return Reserve.builder()
.reserveId(this.reserveId)

View File

@@ -0,0 +1,176 @@
package org.egovframe.cloud.reserverequestservice.domain;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.stream.IntStream;
import javax.annotation.Resource;
import lombok.RequiredArgsConstructor;
import org.egovframe.cloud.common.exception.BusinessMessageException;
import org.egovframe.cloud.common.util.MessageUtil;
import org.egovframe.cloud.reserverequestservice.api.dto.ReserveSaveRequestDto;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@RequiredArgsConstructor
@Component
public class ReserveValidator {
@Resource(
name = "messageUtil"
)
protected MessageUtil messageUtil;
private final ReserveRepository reserveRepository;
public Mono<ReserveSaveRequestDto> checkValidation(ReserveSaveRequestDto saveRequestDto) {
if (Category.EQUIPMENT.isEquals(saveRequestDto.getCategoryId())) {
return checkEquipment(saveRequestDto);
}else if (Category.SPACE.isEquals(saveRequestDto.getCategoryId())) {
return checkSpace(saveRequestDto);
}
//해당 날짜에는 예약할 수 없습니다.
return Mono.error(new BusinessMessageException(getMessage("valid.reserve_date")));
}
/**
* 예약 날자 validation
*
* @param saveRequestDto
* @return
*/
public Mono<ReserveSaveRequestDto> checkReserveDate(ReserveSaveRequestDto saveRequestDto) {
LocalDateTime startDate = saveRequestDto.getReserveMeansId().equals("realtime") ?
saveRequestDto.getRequestStartDate() : saveRequestDto.getOperationStartDate();
LocalDateTime endDate = saveRequestDto.getReserveMeansId().equals("realtime") ?
saveRequestDto.getRequestEndDate() : saveRequestDto.getOperationEndDate();
if (saveRequestDto.getReserveStartDate().isBefore(startDate)) {
//{0}이 {1} 보다 빠릅니다. 시작일, 운영/예약 시작일
return Mono.error(new BusinessMessageException(getMessage("valid.to_be_fast.format", new Object[]{getMessage("common.start_date"),
getMessage("reserve_item.operation")+getMessage("reserve")+" "+getMessage("common.start_date")})));
}
if (saveRequestDto.getReserveEndDate().isAfter(endDate)) {
//{0}이 {1} 보다 늦습니다. 종료일, 운영/예약 종료일
return Mono.error(new BusinessMessageException(getMessage("valid.to_be_slow.format", new Object[]{getMessage("common.end_date"),
getMessage("reserve_item.operation")+getMessage("reserve")+" "+getMessage("common.end_date")})));
}
if (saveRequestDto.getIsPeriod()) {
long between = ChronoUnit.DAYS.between(saveRequestDto.getReserveStartDate(),
saveRequestDto.getReserveEndDate());
if (saveRequestDto.getPeriodMaxCount() < between) {
//최대 예약 가능 일수보다 예약기간이 깁니다. (최대 예약 가능일 수 : {0})
return Mono.error(new BusinessMessageException(getMessage("valid.reserve_period", new Object[]{saveRequestDto.getPeriodMaxCount()})));
}
}
return Mono.just(saveRequestDto);
}
/**
* 공간 예약 시 예약 날짜에 다른 예약이 있는지 체크
*
* @param saveRequestDto
* @return
*/
public Mono<ReserveSaveRequestDto> checkSpace(ReserveSaveRequestDto saveRequestDto) {
return this.checkReserveDate(saveRequestDto)
.flatMap(result -> reserveRepository.findAllByReserveDateCount(
result.getReserveItemId(),
result.getReserveStartDate(),
result.getReserveEndDate())
.flatMap(count -> {
if (count > 0) {
//해당 날짜에는 예약할 수 없습니다.
return Mono.error(new BusinessMessageException(getMessage("valid.reserve_date")));
}
return Mono.just(result);
})
);
}
/**
* 장비 예약 시 예약 날짜에 예약 가능한 재고 체크
*
* @param saveRequestDto
* @return
*/
public Mono<ReserveSaveRequestDto> checkEquipment(ReserveSaveRequestDto saveRequestDto) {
return this.checkReserveDate(saveRequestDto)
.flatMap(result -> this.getMaxByReserveDate(
result.getReserveItemId(),
result.getReserveStartDate(),
result.getReserveEndDate())
.flatMap(max -> {
if ((result.getTotalQty() - max) < result.getReserveQty()) {
return Mono.just(false);
}
return Mono.just(true);
})
.flatMap(isValid -> {
if (!isValid) {
//해당 날짜에 예약할 수 있는 재고수량이 없습니다.
return Mono.error(new BusinessMessageException(getMessage("valid.reserve_count")));
}
return Mono.just(saveRequestDto);
})
);
}
/**
* 예약물품에 대해 날짜별 예약된 수량 max 조회
* 현 예약 건 제외
*
* @param reserveItemId
* @param startDate
* @param endDate
* @return
*/
private Mono<Integer> getMaxByReserveDate( Long reserveItemId, LocalDateTime startDate, LocalDateTime endDate) {
Flux<Reserve> reserveFlux = reserveRepository.findAllByReserveDate(reserveItemId, startDate, endDate)
.switchIfEmpty(Flux.empty());
if (reserveFlux.equals(Flux.empty())) {
return Mono.just(0);
}
long between = ChronoUnit.DAYS.between(startDate, endDate);
if (between == 0) {
return reserveFlux.map(reserve -> {
if (startDate.isAfter(reserve.getReserveStartDate())
|| startDate.isBefore(reserve.getReserveEndDate())
|| startDate.isEqual(reserve.getReserveStartDate()) || startDate.isEqual(reserve.getReserveEndDate())) {
return reserve.getReserveQty();
}
return 0;
}).reduce(0, (x1, x2) -> x1 + x2);
}
return Flux.fromStream(IntStream.iterate(0, i -> i + 1)
.limit(between)
.mapToObj(i -> startDate.plusDays(i)))
.flatMap(localDateTime ->
reserveFlux.map(findReserve -> {
if (localDateTime.isAfter(findReserve.getReserveStartDate())
|| localDateTime.isBefore(findReserve.getReserveEndDate())
|| localDateTime.isEqual(findReserve.getReserveStartDate()) || localDateTime.isEqual(findReserve.getReserveEndDate())
) {
return findReserve.getReserveQty();
}
return 0;
}).reduce(0, (x1, x2) -> x1 + x2))
.groupBy(integer -> integer)
.flatMap(group -> group.reduce((x1,x2) -> x1 > x2?x1:x2))
.last(0);
}
private String getMessage(String code) {
return this.messageUtil.getMessage(code);
}
private String getMessage(String code, Object[] args) {
return this.messageUtil.getMessage(code, args);
}
}

View File

@@ -1,5 +1,6 @@
package org.egovframe.cloud.reserverequestservice.service;
import java.time.LocalDateTime;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.egovframe.cloud.common.config.GlobalConstant;
@@ -12,23 +13,23 @@ import org.egovframe.cloud.reserverequestservice.domain.Category;
import org.egovframe.cloud.reserverequestservice.domain.Reserve;
import org.egovframe.cloud.reserverequestservice.domain.ReserveRepository;
import org.egovframe.cloud.reserverequestservice.domain.ReserveStatus;
import org.springframework.amqp.core.*;
import org.egovframe.cloud.reserverequestservice.domain.ReserveValidator;
import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Exchange;
import org.springframework.amqp.core.ExchangeBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.cloud.stream.function.StreamBridge;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.ReactiveSecurityContextHolder;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
import java.util.stream.IntStream;
/**
* org.egovframe.cloud.reserverequestservice.service.ReserveService
* <p>
@@ -52,33 +53,10 @@ import java.util.stream.IntStream;
@Service
public class ReserveService extends ReactiveAbstractService {
private final ReserveRepository reserveRepository;
private final ReserveValidator reserveValidator;
private final StreamBridge streamBridge;
private final AmqpAdmin amqpAdmin;
/**
* entity -> dto 변환
*
* @param reserve
* @return
*/
private Mono<ReserveResponseDto> convertReserveResponseDto(Reserve reserve) {
return Mono.just(ReserveResponseDto.builder()
.entity(reserve)
.build());
}
/**
* 현재 로그인 사용자 id
*
* @return
*/
private Mono<String> getUserId() {
return ReactiveSecurityContextHolder.getContext()
.map(SecurityContext::getAuthentication)
.filter(Authentication::isAuthenticated)
.map(Authentication::getPrincipal)
.map(String.class::cast);
}
/**
* 예약 신청 저장
@@ -88,12 +66,7 @@ public class ReserveService extends ReactiveAbstractService {
*/
public Mono<ReserveResponseDto> create(ReserveSaveRequestDto saveRequestDto) {
return Mono.just(saveRequestDto)
.flatMap(dto -> {
String uuid = UUID.randomUUID().toString();
dto.setReserveId(uuid);
dto.setReserveStatusId(ReserveStatus.REQUEST.getKey());
return Mono.just(dto.toEntity());
})
.flatMap(dto -> Mono.just(dto.createRequestReserve()))
.zipWith(getUserId())
.flatMap(tuple -> {
tuple.getT1().setCreatedInfo(LocalDateTime.now(), tuple.getT2());
@@ -152,162 +125,14 @@ public class ReserveService extends ReactiveAbstractService {
*/
public Mono<ReserveResponseDto> save(ReserveSaveRequestDto saveRequestDto) {
return Mono.just(saveRequestDto)
.flatMap(this::checkValidation)
.flatMap(this::validate)
.onErrorResume(throwable -> Mono.error(throwable))
.flatMap(dto -> {
String uuid = UUID.randomUUID().toString();
dto.setReserveId(uuid);
dto.setReserveStatusId(ReserveStatus.APPROVE.getKey());
return Mono.just(dto.toEntity());
}).zipWith(getUserId())
.flatMap(dto -> Mono.just(dto.createApproveReserve())).zipWith(getUserId())
.flatMap(tuple -> Mono.just(tuple.getT1().setCreatedInfo(LocalDateTime.now(), tuple.getT2())))
.flatMap(reserveRepository::insert)
.flatMap(this::convertReserveResponseDto);
}
private Mono<ReserveSaveRequestDto> checkValidation(ReserveSaveRequestDto saveRequestDto) {
if (Category.EQUIPMENT.isEquals(saveRequestDto.getCategoryId())) {
return checkEquipment(saveRequestDto);
}else if (Category.SPACE.isEquals(saveRequestDto.getCategoryId())) {
return checkSpace(saveRequestDto);
}
//해당 날짜에는 예약할 수 없습니다.
return Mono.error(new BusinessMessageException(getMessage("valid.reserve_date")));
}
/**
* 예약 날자 validation
*
* @param saveRequestDto
* @return
*/
private Mono<ReserveSaveRequestDto> checkReserveDate(ReserveSaveRequestDto saveRequestDto) {
LocalDateTime startDate = saveRequestDto.getReserveMeansId().equals("realtime") ?
saveRequestDto.getRequestStartDate() : saveRequestDto.getOperationStartDate();
LocalDateTime endDate = saveRequestDto.getReserveMeansId().equals("realtime") ?
saveRequestDto.getRequestEndDate() : saveRequestDto.getOperationEndDate();
if (saveRequestDto.getReserveStartDate().isBefore(startDate)) {
//{0}이 {1} 보다 빠릅니다. 시작일, 운영/예약 시작일
return Mono.error(new BusinessMessageException(getMessage("valid.to_be_fast.format", new Object[]{getMessage("common.start_date"),
getMessage("reserve_item.operation")+getMessage("reserve")+" "+getMessage("common.start_date")})));
}
if (saveRequestDto.getReserveEndDate().isAfter(endDate)) {
//{0}이 {1} 보다 늦습니다. 종료일, 운영/예약 종료일
return Mono.error(new BusinessMessageException(getMessage("valid.to_be_slow.format", new Object[]{getMessage("common.end_date"),
getMessage("reserve_item.operation")+getMessage("reserve")+" "+getMessage("common.end_date")})));
}
if (saveRequestDto.getIsPeriod()) {
long between = ChronoUnit.DAYS.between(saveRequestDto.getReserveStartDate(),
saveRequestDto.getReserveEndDate());
if (saveRequestDto.getPeriodMaxCount() < between) {
//최대 예약 가능 일수보다 예약기간이 깁니다. (최대 예약 가능일 수 : {0})
return Mono.error(new BusinessMessageException(getMessage("valid.reserve_period", new Object[]{saveRequestDto.getPeriodMaxCount()})));
}
}
return Mono.just(saveRequestDto);
}
/**
* 공간 예약 시 예약 날짜에 다른 예약이 있는지 체크
*
* @param saveRequestDto
* @return
*/
private Mono<ReserveSaveRequestDto> checkSpace(ReserveSaveRequestDto saveRequestDto) {
return this.checkReserveDate(saveRequestDto)
.flatMap(result -> reserveRepository.findAllByReserveDateCount(
result.getReserveItemId(),
result.getReserveStartDate(),
result.getReserveEndDate())
.flatMap(count -> {
if (count > 0) {
//해당 날짜에는 예약할 수 없습니다.
return Mono.error(new BusinessMessageException(getMessage("valid.reserve_date")));
}
return Mono.just(result);
})
);
}
/**
* 장비 예약 시 예약 날짜에 예약 가능한 재고 체크
*
* @param saveRequestDto
* @return
*/
private Mono<ReserveSaveRequestDto> checkEquipment(ReserveSaveRequestDto saveRequestDto) {
return this.checkReserveDate(saveRequestDto)
.flatMap(result -> this.getMaxByReserveDate(
result.getReserveItemId(),
result.getReserveStartDate(),
result.getReserveEndDate())
.flatMap(max -> {
if ((result.getTotalQty() - max) < result.getReserveQty()) {
return Mono.just(false);
}
return Mono.just(true);
})
.flatMap(isValid -> {
if (!isValid) {
//해당 날짜에 예약할 수 있는 재고수량이 없습니다.
return Mono.error(new BusinessMessageException(getMessage("valid.reserve_count")));
}
return Mono.just(saveRequestDto);
})
);
}
/**
* 예약물품에 대해 날짜별 예약된 수량 max 조회
* 현 예약 건 제외
*
* @param reserveItemId
* @param startDate
* @param endDate
* @return
*/
private Mono<Integer> getMaxByReserveDate( Long reserveItemId, LocalDateTime startDate, LocalDateTime endDate) {
Flux<Reserve> reserveFlux = reserveRepository.findAllByReserveDate(reserveItemId, startDate, endDate)
.switchIfEmpty(Flux.empty());
if (reserveFlux.equals(Flux.empty())) {
return Mono.just(0);
}
long between = ChronoUnit.DAYS.between(startDate, endDate);
if (between == 0) {
return reserveFlux.map(reserve -> {
if (startDate.isAfter(reserve.getReserveStartDate())
|| startDate.isBefore(reserve.getReserveEndDate())
|| startDate.isEqual(reserve.getReserveStartDate()) || startDate.isEqual(reserve.getReserveEndDate())) {
return reserve.getReserveQty();
}
return 0;
}).reduce(0, (x1, x2) -> x1 + x2);
}
return Flux.fromStream(IntStream.iterate(0, i -> i + 1)
.limit(between)
.mapToObj(i -> startDate.plusDays(i)))
.flatMap(localDateTime ->
reserveFlux.map(findReserve -> {
if (localDateTime.isAfter(findReserve.getReserveStartDate())
|| localDateTime.isBefore(findReserve.getReserveEndDate())
|| localDateTime.isEqual(findReserve.getReserveStartDate()) || localDateTime.isEqual(findReserve.getReserveEndDate())
) {
return findReserve.getReserveQty();
}
return 0;
}).reduce(0, (x1, x2) -> x1 + x2))
.groupBy(integer -> integer)
.flatMap(group -> group.reduce((x1,x2) -> x1 > x2?x1:x2))
.last(0);
}
/**
* 예약 신청 후 예약 물품 재고 변경 성공 시 예약승인으로 상태 변경
*
@@ -336,4 +161,47 @@ public class ReserveService extends ReactiveAbstractService {
.then();
}
/**
* entity -> dto 변환
*
* @param reserve
* @return
*/
private Mono<ReserveResponseDto> convertReserveResponseDto(Reserve reserve) {
return Mono.just(ReserveResponseDto.builder()
.entity(reserve)
.build());
}
/**
* 현재 로그인 사용자 id
*
* @return
*/
private Mono<String> getUserId() {
return ReactiveSecurityContextHolder.getContext()
.map(SecurityContext::getAuthentication)
.filter(Authentication::isAuthenticated)
.map(Authentication::getPrincipal)
.map(String.class::cast);
}
/**
* 저장 시 정합성 체크
*
* @param saveRequestDto
* @return
*/
private Mono<ReserveSaveRequestDto> validate(ReserveSaveRequestDto saveRequestDto) {
if (Category.EQUIPMENT.isEquals(saveRequestDto.getCategoryId())) {
return reserveValidator.checkEquipment(saveRequestDto);
}
if (Category.SPACE.isEquals(saveRequestDto.getCategoryId())) {
return reserveValidator.checkSpace(saveRequestDto);
}
//해당 날짜에는 예약할 수 없습니다.
return Mono.error(new BusinessMessageException(getMessage("valid.reserve_date")));
}
}