refactor: reformat code
This commit is contained in:
@@ -1,15 +1,11 @@
|
||||
package org.egovframe.cloud.reserveitemservice;
|
||||
|
||||
import java.security.Security;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
|
||||
import org.springframework.cloud.openfeign.EnableFeignClients;
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
|
||||
import reactivefeign.spring.config.EnableReactiveFeignClients;
|
||||
//import reactor.blockhound.BlockHound;
|
||||
|
||||
import java.security.Security;
|
||||
|
||||
@ComponentScan({"org.egovframe.cloud.common", "org.egovframe.cloud.reactive", "org.egovframe.cloud.reserveitemservice"}) // org.egovframe.cloud.common package 포함하기 위해
|
||||
@EnableDiscoveryClient
|
||||
@@ -25,5 +21,4 @@ public class ReserveItemServiceApplication {
|
||||
SpringApplication.run(ReserveItemServiceApplication.class, args);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.egovframe.cloud.reserveitemservice.api.location;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import javax.validation.Valid;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.egovframe.cloud.common.dto.RequestDto;
|
||||
@@ -11,12 +12,18 @@ import org.egovframe.cloud.reserveitemservice.service.location.LocationService;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.PutMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import javax.validation.Valid;
|
||||
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.reserveitemservice.api.location.LocationApiController
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
package org.egovframe.cloud.reserveitemservice.api.location.dto;
|
||||
|
||||
import lombok.*;
|
||||
import org.egovframe.cloud.reserveitemservice.domain.location.Location;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.ToString;
|
||||
import org.egovframe.cloud.reserveitemservice.domain.location.Location;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.reserveitemservice.api.location.dto.LocationResponseDto
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
package org.egovframe.cloud.reserveitemservice.api.location.dto;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.ToString;
|
||||
import org.egovframe.cloud.reserveitemservice.domain.location.Location;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.reserveitemservice.api.location.dto.LocationSaveRequestDto
|
||||
* <p>
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
package org.egovframe.cloud.reserveitemservice.api.location.dto;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.ToString;
|
||||
import org.egovframe.cloud.reserveitemservice.domain.location.Location;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
/**
|
||||
* org.egovframe.cloud.reserveitemservice.api.location.dto.LocationUpdateRequestDto
|
||||
* <p>
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
package org.egovframe.cloud.reserveitemservice.api.reserveItem;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.validation.Valid;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.egovframe.cloud.reserveitemservice.api.reserveItem.dto.ReserveItemListResponseDto;
|
||||
import org.egovframe.cloud.reserveitemservice.api.reserveItem.dto.ReserveItemMainResponseDto;
|
||||
import org.egovframe.cloud.reserveitemservice.api.reserveItem.dto.ReserveItemRelationResponseDto;
|
||||
@@ -26,10 +25,6 @@ import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,14 +1,11 @@
|
||||
package org.egovframe.cloud.reserveitemservice.api.reserveItem.dto;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.ToString;
|
||||
import org.egovframe.cloud.reserveitemservice.domain.reserveItem.ReserveItem;
|
||||
import org.springframework.util.NumberUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
package org.egovframe.cloud.reserveitemservice.api.reserveItem.dto;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
import org.egovframe.cloud.reserveitemservice.domain.reserveItem.ReserveItem;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.ToString;
|
||||
import org.egovframe.cloud.reserveitemservice.domain.reserveItem.ReserveItem;
|
||||
|
||||
@Getter
|
||||
@NoArgsConstructor
|
||||
|
||||
@@ -1,16 +1,14 @@
|
||||
package org.egovframe.cloud.reserveitemservice.api.reserveItem.dto;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.ToString;
|
||||
|
||||
import org.egovframe.cloud.reserveitemservice.domain.location.Location;
|
||||
import org.egovframe.cloud.reserveitemservice.domain.reserveItem.ReserveItem;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.reserveitemservice.api.reserveItem.dto.ReserveItemRelationResponseDto
|
||||
* <p>
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
package org.egovframe.cloud.reserveitemservice.api.reserveItem.dto;
|
||||
|
||||
import lombok.*;
|
||||
import java.util.Objects;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
import org.egovframe.cloud.common.dto.RequestDto;
|
||||
|
||||
/**
|
||||
@@ -28,4 +32,16 @@ public class ReserveItemRequestDto extends RequestDto {
|
||||
private Long locationId;
|
||||
private String categoryId;
|
||||
private Boolean isUse;
|
||||
|
||||
public boolean hasLocationId() {
|
||||
return hasId(locationId);
|
||||
}
|
||||
|
||||
public boolean hasCategoryId() {
|
||||
return hasId(categoryId);
|
||||
}
|
||||
|
||||
private boolean hasId(Object id) {
|
||||
return Objects.nonNull(id) && !Objects.equals("null", id) && !Objects.equals("undefined", id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
package org.egovframe.cloud.reserveitemservice.api.reserveItem.dto;
|
||||
|
||||
import lombok.*;
|
||||
import lombok.experimental.Accessors;
|
||||
import org.egovframe.cloud.reserveitemservice.domain.location.Location;
|
||||
import org.egovframe.cloud.reserveitemservice.domain.reserveItem.ReserveItem;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.ToString;
|
||||
import org.egovframe.cloud.reserveitemservice.domain.reserveItem.ReserveItem;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.reserveitemservice.api.reserveItem.dto.ReserveItemResponseDto
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
package org.egovframe.cloud.reserveitemservice.api.reserveItem.dto;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import javax.validation.constraints.PositiveOrZero;
|
||||
import javax.validation.constraints.Size;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
@@ -7,10 +13,6 @@ import lombok.ToString;
|
||||
import org.egovframe.cloud.reserveitemservice.domain.reserveItem.ReserveItem;
|
||||
import org.egovframe.cloud.reserveitemservice.validator.annotation.ReserveItemSaveValid;
|
||||
|
||||
import javax.validation.constraints.*;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.reserveitemservice.api.reserveItem.dto.ReserveItemSaveRequestDto
|
||||
* <p>
|
||||
|
||||
@@ -1,16 +1,17 @@
|
||||
package org.egovframe.cloud.reserveitemservice.api.reserveItem.dto;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import javax.validation.constraints.PositiveOrZero;
|
||||
import javax.validation.constraints.Size;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.ToString;
|
||||
import org.egovframe.cloud.reserveitemservice.domain.reserveItem.ReserveItem;
|
||||
import org.egovframe.cloud.reserveitemservice.validator.annotation.ReserveItemSaveValid;
|
||||
import org.hibernate.validator.constraints.Length;
|
||||
|
||||
import javax.validation.constraints.*;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.reserveitemservice.api.reserveItem.dto.ReserveItemUpdateRequestDto
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
package org.egovframe.cloud.reserveitemservice.api.reserveItem.dto;
|
||||
|
||||
import lombok.*;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.time.LocalDateTime;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.reserverequestservice.api.dto.ReserveSaveRequestDto
|
||||
|
||||
@@ -1,25 +1,13 @@
|
||||
package org.egovframe.cloud.reserveitemservice.config;
|
||||
|
||||
|
||||
import java.util.function.Consumer;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.egovframe.cloud.reserveitemservice.api.reserveItem.dto.ReserveSaveRequestDto;
|
||||
import org.egovframe.cloud.reserveitemservice.service.reserveItem.ReserveItemService;
|
||||
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
|
||||
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
||||
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
|
||||
import org.springframework.amqp.support.converter.MessageConverter;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.messaging.Message;
|
||||
import org.springframework.messaging.support.MessageBuilder;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.core.scheduler.Scheduler;
|
||||
import reactor.core.scheduler.Schedulers;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.reserverequestservice.config.ReserveEventConfig
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
package org.egovframe.cloud.reserveitemservice.config;
|
||||
|
||||
import java.time.Duration;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
|
||||
import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;
|
||||
import java.time.Duration;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.portalservice.config.Resilience4JConfig
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
package org.egovframe.cloud.reserveitemservice.domain.location;
|
||||
|
||||
import lombok.*;
|
||||
import javax.validation.constraints.Size;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.ToString;
|
||||
import org.egovframe.cloud.reactive.domain.BaseEntity;
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.relational.core.mapping.Column;
|
||||
import org.springframework.data.relational.core.mapping.Table;
|
||||
|
||||
import javax.validation.constraints.Size;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.reserveitemservice.domain.location.Location
|
||||
*
|
||||
|
||||
@@ -1,8 +1,14 @@
|
||||
package org.egovframe.cloud.reserveitemservice.domain.reserveItem;
|
||||
|
||||
|
||||
import lombok.*;
|
||||
import lombok.experimental.Accessors;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import javax.validation.constraints.Size;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.ToString;
|
||||
import org.egovframe.cloud.reactive.domain.BaseEntity;
|
||||
import org.egovframe.cloud.reserveitemservice.api.reserveItem.dto.ReserveItemUpdateRequestDto;
|
||||
import org.egovframe.cloud.reserveitemservice.domain.location.Location;
|
||||
@@ -11,11 +17,6 @@ import org.springframework.data.annotation.Transient;
|
||||
import org.springframework.data.relational.core.mapping.Column;
|
||||
import org.springframework.data.relational.core.mapping.Table;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import javax.validation.constraints.Size;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.reserveitemservice.domain.reserveItem.ReserveItem
|
||||
*
|
||||
@@ -312,11 +313,11 @@ public class ReserveItem extends BaseEntity {
|
||||
/**
|
||||
* 재고 변경
|
||||
*
|
||||
* @param inventoryQty
|
||||
* @param reserveQty
|
||||
* @return
|
||||
*/
|
||||
public ReserveItem updateInventoryQty(Integer inventoryQty) {
|
||||
this.inventoryQty = inventoryQty;
|
||||
public ReserveItem updateInventoryQty(Integer reserveQty) {
|
||||
this.inventoryQty = calcInventoryQty(reserveQty);
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -371,6 +372,31 @@ public class ReserveItem extends BaseEntity {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public String validate(int reserveQty) {
|
||||
if (!Category.EDUCATION.isEquals(categoryId)) {
|
||||
//해당 예약은 수정할 수 없습니다.
|
||||
return "valid.reserve_not_update";
|
||||
}
|
||||
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
if (!(now.isAfter(requestStartDate) && now.isBefore(requestEndDate))) {
|
||||
//해당 날짜에는 예약할 수 없습니다.
|
||||
return "valid.reserve_date";
|
||||
}
|
||||
|
||||
int qty = calcInventoryQty(reserveQty);
|
||||
if (qty < 0) {
|
||||
//해당 날짜에 예약할 수 있는 재고수량이 없습니다.
|
||||
return "valid.reserve_count";
|
||||
}
|
||||
|
||||
return "valid";
|
||||
}
|
||||
|
||||
private int calcInventoryQty(int reserveQty) {
|
||||
return inventoryQty - reserveQty;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package org.egovframe.cloud.reserveitemservice.domain.reserveItem;
|
||||
|
||||
import org.springframework.data.r2dbc.repository.R2dbcRepository;
|
||||
import reactor.core.publisher.Flux;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.reserveitemservice.domain.reserveItem.ReserveItemRepository
|
||||
|
||||
@@ -1,12 +1,8 @@
|
||||
package org.egovframe.cloud.reserveitemservice.domain.reserveItem;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
import org.egovframe.cloud.reserveitemservice.api.reserveItem.dto.ReserveItemMainResponseDto;
|
||||
import org.egovframe.cloud.reserveitemservice.api.reserveItem.dto.ReserveItemRequestDto;
|
||||
import org.egovframe.cloud.reserveitemservice.domain.code.Code;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
package org.egovframe.cloud.reserveitemservice.domain.reserveItem;
|
||||
|
||||
import static org.springframework.data.relational.core.query.Criteria.*;
|
||||
import static org.springframework.data.relational.core.query.Criteria.where;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.egovframe.cloud.reserveitemservice.api.reserveItem.dto.ReserveItemRequestDto;
|
||||
import org.egovframe.cloud.reserveitemservice.domain.code.Code;
|
||||
import org.egovframe.cloud.reserveitemservice.domain.location.Location;
|
||||
@@ -14,9 +15,6 @@ import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
|
||||
import org.springframework.data.relational.core.query.Criteria;
|
||||
import org.springframework.data.relational.core.query.Query;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@@ -40,7 +38,7 @@ import reactor.core.publisher.Mono;
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
public class ReserveItemRepositoryImpl implements ReserveItemRepositoryCustom{
|
||||
|
||||
private static final String SORT_COLUMN = "create_date";
|
||||
private final R2dbcEntityTemplate entityTemplate;
|
||||
|
||||
/**
|
||||
@@ -54,7 +52,7 @@ public class ReserveItemRepositoryImpl implements ReserveItemRepositoryCustom{
|
||||
public Flux<ReserveItem> search(ReserveItemRequestDto requestDto, Pageable pageable) {
|
||||
return entityTemplate.select(ReserveItem.class)
|
||||
.matching(Query.query(Criteria.from(whereQuery(requestDto)))
|
||||
.sort(Sort.by(Sort.Direction.DESC, "create_date"))
|
||||
.sort(Sort.by(Sort.Direction.DESC, SORT_COLUMN))
|
||||
.with(pageable))
|
||||
.all()
|
||||
.flatMap(this::loadRelations)
|
||||
@@ -72,7 +70,7 @@ public class ReserveItemRepositoryImpl implements ReserveItemRepositoryCustom{
|
||||
public Mono<Long> searchCount(ReserveItemRequestDto requestDto, Pageable pageable) {
|
||||
return entityTemplate.select(ReserveItem.class)
|
||||
.matching(Query.query(Criteria.from(whereQuery(requestDto)))
|
||||
.sort(Sort.by(Sort.Direction.DESC, "create_date"))
|
||||
.sort(Sort.by(Sort.Direction.DESC, SORT_COLUMN))
|
||||
.with(pageable))
|
||||
.count();
|
||||
}
|
||||
@@ -101,7 +99,7 @@ public class ReserveItemRepositoryImpl implements ReserveItemRepositoryCustom{
|
||||
@Override
|
||||
public Flux<ReserveItem> findLatestByCategory(Integer count, String categoryId) {
|
||||
Query query =Query.query(where("category_id").is(categoryId)
|
||||
.and("use_at").isTrue()).sort(Sort.by(Sort.Order.desc("create_date")));
|
||||
.and("use_at").isTrue()).sort(Sort.by(Sort.Order.desc(SORT_COLUMN)));
|
||||
|
||||
if (count > 0) {
|
||||
query.limit(count);
|
||||
@@ -216,17 +214,15 @@ public class ReserveItemRepositoryImpl implements ReserveItemRepositoryCustom{
|
||||
|
||||
List<Criteria> whereCriteria = new ArrayList<>();
|
||||
|
||||
if (StringUtils.hasText(keyword)) {
|
||||
if ("item".equals(keywordType)) {
|
||||
whereCriteria.add(where("reserve_item_name").like(likeText(keyword)));
|
||||
}
|
||||
if (StringUtils.hasText(keyword) && "item".equals(keywordType)) {
|
||||
whereCriteria.add(where("reserve_item_name").like(likeText(keyword)));
|
||||
}
|
||||
|
||||
if (requestDto.getLocationId() != null && !"null".equals(requestDto.getLocationId()) && !"undefined".equals(requestDto.getLocationId())) {
|
||||
if (requestDto.hasLocationId()) {
|
||||
whereCriteria.add(where("location_id").in(requestDto.getLocationId()));
|
||||
}
|
||||
|
||||
if (requestDto.getCategoryId() != null && !"null".equals(requestDto.getCategoryId()) && !"undefined".equals(requestDto.getCategoryId())) {
|
||||
if (requestDto.hasCategoryId()) {
|
||||
whereCriteria.add(where("category_id").in(requestDto.getCategoryId()));
|
||||
}
|
||||
|
||||
|
||||
@@ -4,9 +4,6 @@ import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.egovframe.cloud.common.dto.RequestDto;
|
||||
import org.egovframe.cloud.common.exception.BusinessMessageException;
|
||||
import org.egovframe.cloud.common.exception.EntityNotFoundException;
|
||||
import org.egovframe.cloud.common.service.AbstractService;
|
||||
import org.egovframe.cloud.common.util.MessageUtil;
|
||||
import org.egovframe.cloud.reactive.service.ReactiveAbstractService;
|
||||
import org.egovframe.cloud.reserveitemservice.api.location.dto.LocationResponseDto;
|
||||
import org.egovframe.cloud.reserveitemservice.api.location.dto.LocationSaveRequestDto;
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
package org.egovframe.cloud.reserveitemservice.service.reserveItem;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.egovframe.cloud.common.exception.BusinessMessageException;
|
||||
import org.egovframe.cloud.reactive.service.ReactiveAbstractService;
|
||||
import org.egovframe.cloud.reserveitemservice.api.reserveItem.dto.ReserveItemListResponseDto;
|
||||
@@ -17,7 +15,6 @@ import org.egovframe.cloud.reserveitemservice.api.reserveItem.dto.ReserveItemRes
|
||||
import org.egovframe.cloud.reserveitemservice.api.reserveItem.dto.ReserveItemSaveRequestDto;
|
||||
import org.egovframe.cloud.reserveitemservice.api.reserveItem.dto.ReserveItemUpdateRequestDto;
|
||||
import org.egovframe.cloud.reserveitemservice.config.RequestMessage;
|
||||
import org.egovframe.cloud.reserveitemservice.domain.reserveItem.Category;
|
||||
import org.egovframe.cloud.reserveitemservice.domain.reserveItem.ReserveItem;
|
||||
import org.egovframe.cloud.reserveitemservice.domain.reserveItem.ReserveItemRepository;
|
||||
import org.springframework.cloud.stream.function.StreamBridge;
|
||||
@@ -27,10 +24,6 @@ import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.messaging.support.MessageBuilder;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.core.scheduler.Schedulers;
|
||||
|
||||
@@ -58,31 +51,14 @@ import reactor.core.scheduler.Schedulers;
|
||||
public class ReserveItemService extends ReactiveAbstractService {
|
||||
|
||||
private static final String RESERVE_CATEGORY_CODE = "reserve-category";
|
||||
private static final String RESERVE_CATEGORY_CODE_ALL = "all";
|
||||
private static final String INVENTORY_UPDATED_BINDING_NAME = "inventoryUpdated-out-0";
|
||||
private static final String EVENT_HEADER_NAME = "reserveUUID";
|
||||
|
||||
private final ReserveItemRepository reserveItemRepository;
|
||||
private final StreamBridge streamBridge;
|
||||
|
||||
|
||||
/**
|
||||
* entity -> dto 변환
|
||||
*
|
||||
* @param reserveItem
|
||||
* @return
|
||||
*/
|
||||
private Mono<ReserveItemResponseDto> convertReserveItemResponseDto(ReserveItem reserveItem) {
|
||||
return Mono.just(ReserveItemResponseDto.builder().reserveItem(reserveItem).build());
|
||||
}
|
||||
|
||||
/**
|
||||
* entity -> dto 변환
|
||||
*
|
||||
* @param reserveItem
|
||||
* @return
|
||||
*/
|
||||
private Mono<ReserveItemListResponseDto> convertReserveItemListResponseDto(ReserveItem reserveItem) {
|
||||
return Mono.just(ReserveItemListResponseDto.builder().entity(reserveItem).build());
|
||||
}
|
||||
|
||||
/**
|
||||
* 목록 조회
|
||||
*
|
||||
@@ -109,7 +85,7 @@ public class ReserveItemService extends ReactiveAbstractService {
|
||||
*/
|
||||
@Transactional(readOnly = true)
|
||||
public Mono<Page<ReserveItemListResponseDto>> searchForUser(String categoryId, ReserveItemRequestDto requestDto, Pageable pageable) {
|
||||
if (!"all".equals(categoryId)) {
|
||||
if (!RESERVE_CATEGORY_CODE_ALL.equals(categoryId)) {
|
||||
requestDto.setCategoryId(categoryId);
|
||||
}
|
||||
return reserveItemRepository.search(requestDto, pageable)
|
||||
@@ -203,24 +179,11 @@ public class ReserveItemService extends ReactiveAbstractService {
|
||||
return reserveItemRepository.findById(reserveItemId)
|
||||
.switchIfEmpty(monoResponseStatusEntityNotFoundException(reserveItemId))
|
||||
.flatMap(reserveItem -> {
|
||||
if (!Category.EDUCATION.isEquals(reserveItem.getCategoryId())) {
|
||||
//해당 예약은 수정할 수 없습니다.
|
||||
return Mono.error(new BusinessMessageException(getMessage("valid.reserve_not_update")));
|
||||
String validate = reserveItem.validate(reserveQty);
|
||||
if (!"valid".equals(validate)) {
|
||||
return Mono.error(new BusinessMessageException(getMessage(validate)));
|
||||
}
|
||||
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
if (!(now.isAfter(reserveItem.getRequestStartDate()) && now.isBefore(reserveItem.getRequestEndDate()))) {
|
||||
//해당 날짜에는 예약할 수 없습니다.
|
||||
return Mono.error(new BusinessMessageException(getMessage("valid.reserve_date")));
|
||||
}
|
||||
|
||||
int qty = reserveItem.getInventoryQty() - reserveQty;
|
||||
if (qty < 0) {
|
||||
//해당 날짜에 예약할 수 있는 재고수량이 없습니다.
|
||||
return Mono.error(new BusinessMessageException(getMessage("valid.reserve_count")));
|
||||
}
|
||||
|
||||
return Mono.just(reserveItem.updateInventoryQty(qty));
|
||||
return Mono.just(reserveItem.updateInventoryQty(reserveQty));
|
||||
})
|
||||
.flatMap(reserveItemRepository::save)
|
||||
.delayElement(Duration.ofSeconds(5))
|
||||
@@ -236,23 +199,6 @@ public class ReserveItemService extends ReactiveAbstractService {
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 재고 변경 성공 여부 이벤트 발생
|
||||
*
|
||||
* @param reserveId
|
||||
* @param isItemUpdated
|
||||
*/
|
||||
private void sendMessage(String reserveId, Boolean isItemUpdated) {
|
||||
streamBridge.send("inventoryUpdated-out-0",
|
||||
MessageBuilder.withPayload(
|
||||
RequestMessage.builder()
|
||||
.reserveId(reserveId)
|
||||
.isItemUpdated(isItemUpdated)
|
||||
.build())
|
||||
.setHeader("reserveUUID", reserveId).build());
|
||||
}
|
||||
|
||||
/**
|
||||
* 한건 조회 - 연관된 데이터도 같이 조회 (e.g. codename, location)
|
||||
*
|
||||
@@ -274,13 +220,48 @@ public class ReserveItemService extends ReactiveAbstractService {
|
||||
* @return
|
||||
*/
|
||||
public Mono<Map<String, Collection<ReserveItemMainResponseDto>>> findLatest(Integer count) {
|
||||
return reserveItemRepository.findCodeDetail(
|
||||
RESERVE_CATEGORY_CODE)
|
||||
return reserveItemRepository.findCodeDetail(RESERVE_CATEGORY_CODE)
|
||||
.flatMap(code -> reserveItemRepository.findLatestByCategory(count, code.getCodeId()))
|
||||
.map(reserveItem -> ReserveItemMainResponseDto.builder().entity(reserveItem).build())
|
||||
.collectMultimap(reserveItem -> reserveItem.getCategoryName());
|
||||
.collectMultimap(ReserveItemMainResponseDto::getCategoryName);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* entity -> dto 변환
|
||||
*
|
||||
* @param reserveItem
|
||||
* @return
|
||||
*/
|
||||
private Mono<ReserveItemResponseDto> convertReserveItemResponseDto(ReserveItem reserveItem) {
|
||||
return Mono.just(ReserveItemResponseDto.builder().reserveItem(reserveItem).build());
|
||||
}
|
||||
|
||||
/**
|
||||
* entity -> dto 변환
|
||||
*
|
||||
* @param reserveItem
|
||||
* @return
|
||||
*/
|
||||
private Mono<ReserveItemListResponseDto> convertReserveItemListResponseDto(ReserveItem reserveItem) {
|
||||
return Mono.just(ReserveItemListResponseDto.builder().entity(reserveItem).build());
|
||||
}
|
||||
|
||||
/**
|
||||
* 재고 변경 성공 여부 이벤트 발생
|
||||
*
|
||||
* @param reserveId
|
||||
* @param isItemUpdated
|
||||
*/
|
||||
private void sendMessage(String reserveId, Boolean isItemUpdated) {
|
||||
streamBridge.send(INVENTORY_UPDATED_BINDING_NAME,
|
||||
MessageBuilder.withPayload(
|
||||
RequestMessage.builder()
|
||||
.reserveId(reserveId)
|
||||
.isItemUpdated(isItemUpdated)
|
||||
.build())
|
||||
.setHeader(EVENT_HEADER_NAME, reserveId).build());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,21 +1,19 @@
|
||||
package org.egovframe.cloud.reserveitemservice.validator;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.time.LocalDateTime;
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.ConstraintValidator;
|
||||
import javax.validation.ConstraintValidatorContext;
|
||||
import lombok.SneakyThrows;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import org.egovframe.cloud.common.util.MessageUtil;
|
||||
import org.egovframe.cloud.reserveitemservice.validator.annotation.ReserveItemSaveValid;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.ConstraintValidator;
|
||||
import javax.validation.ConstraintValidatorContext;
|
||||
import java.lang.reflect.Field;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.reserveitemservice.validator.ReserveItemSaveValidator
|
||||
*
|
||||
* <p>
|
||||
* 예약 물품 저장 시 validation check를 하기 위한 custom validator
|
||||
*
|
||||
* @author 표준프레임워크센터 shinmj
|
||||
@@ -39,6 +37,7 @@ public class ReserveItemSaveValidator implements ConstraintValidator<ReserveItem
|
||||
protected MessageUtil messageUtil;
|
||||
|
||||
private String message;
|
||||
private boolean fieldValid;
|
||||
|
||||
@Override
|
||||
public void initialize(ReserveItemSaveValid constraintAnnotation) {
|
||||
@@ -55,128 +54,282 @@ public class ReserveItemSaveValidator implements ConstraintValidator<ReserveItem
|
||||
@SneakyThrows
|
||||
@Override
|
||||
public boolean isValid(Object value, ConstraintValidatorContext context) {
|
||||
boolean fieldValid = true;
|
||||
fieldValid = true;
|
||||
|
||||
// 운영 시작일, 종료일 체크
|
||||
LocalDateTime operationStartDate = (LocalDateTime) getFieldValue(value, "operationStartDate");
|
||||
LocalDateTime operationEndDate = (LocalDateTime) getFieldValue(value, "operationEndDate");
|
||||
if (operationStartDate.isAfter(operationEndDate)) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
//시작일, 종료일, {0}이 {1}보다 늦습니다.
|
||||
context.buildConstraintViolationWithTemplate(messageUtil.getMessage("valid.to_be_slow.format", new Object[]{messageUtil.getMessage("common.start_date"), messageUtil.getMessage("common.end_date")}))
|
||||
.addPropertyNode("operationStartDate")
|
||||
.addConstraintViolation();
|
||||
fieldValid = false;
|
||||
}
|
||||
validateOperationDate(value, context);
|
||||
|
||||
// 유료인 경우 이용 요금 필수
|
||||
validatePaid(value, context);
|
||||
|
||||
String reserveMethodId = String.valueOf(getFieldValue(value, "reserveMethodId"));
|
||||
//예약 방법이 '인터넷' 인경우
|
||||
if ("internet".equals(reserveMethodId)) {
|
||||
// 예약 구분 필수
|
||||
if (isNull(value, "reserveMeansId")) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
//인터넷 예약 구분 값은 필수 입니다.
|
||||
context.buildConstraintViolationWithTemplate(messageUtil.getMessage("reserve_item.reserve_means")+ messageUtil.getMessage("valid.required"))
|
||||
.addPropertyNode("reserveMeansId")
|
||||
.addConstraintViolation();
|
||||
fieldValid = false;
|
||||
}else {
|
||||
String reserveMeansId = String.valueOf(getFieldValue(value, "reserveMeansId"));
|
||||
//예약 구분이 실시간 인 경우
|
||||
if ("realtime".equals(reserveMeansId)) {
|
||||
// 예약 신청 기간 필수
|
||||
if (isNull(value, "requestStartDate")) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
// 예약 신청 시작일 값은 필수 입니다.
|
||||
context.buildConstraintViolationWithTemplate(messageUtil.getMessage("reserve_item.request")+" "+messageUtil.getMessage("common.start_datetime") + messageUtil.getMessage("valid.required"))
|
||||
.addPropertyNode("requestStartDate")
|
||||
.addConstraintViolation();
|
||||
|
||||
fieldValid = false;
|
||||
} else if (isNull(value, "requestEndDate")) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
// 예약 신청 종료일 값은 필수 입니다.
|
||||
context.buildConstraintViolationWithTemplate(messageUtil.getMessage("reserve_item.request")+" "+messageUtil.getMessage("common.end_datetime") + messageUtil.getMessage("valid.required"))
|
||||
.addPropertyNode("requestEndDate")
|
||||
.addConstraintViolation();
|
||||
fieldValid = false;
|
||||
}else {
|
||||
LocalDateTime requestStartDate = (LocalDateTime) getFieldValue(value, "requestStartDate");
|
||||
LocalDateTime requestEndDate = (LocalDateTime) getFieldValue(value, "requestEndDate");
|
||||
if (requestStartDate.isAfter(requestEndDate)) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
//시작일, 종료일, {0}이 {1}보다 늦습니다.
|
||||
context.buildConstraintViolationWithTemplate(messageUtil.getMessage("valid.to_be_slow.format", new Object[]{messageUtil.getMessage("common.start_date"), messageUtil.getMessage("common.end_date")}))
|
||||
.addPropertyNode("requestStartDate")
|
||||
.addConstraintViolation();
|
||||
fieldValid = false;
|
||||
}
|
||||
}
|
||||
|
||||
//기간 지정 필수
|
||||
if (isNull(value, "isPeriod")) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
//기간 지정 가능 여부 값은 필수 입니다.
|
||||
context.buildConstraintViolationWithTemplate(messageUtil.getMessage("reserve_item.period_possible")+ messageUtil.getMessage("valid.required"))
|
||||
.addPropertyNode("requestEndDate")
|
||||
.addConstraintViolation();
|
||||
fieldValid = false;
|
||||
}else {
|
||||
Boolean isPeriod = Boolean.valueOf(String.valueOf(getFieldValue(value, "isPeriod")));
|
||||
// 기간 지정 가능인 경우 최대 얘약일 수 필수
|
||||
if (isPeriod && isNull(value, "periodMaxCount")) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
//최대 예약 가능 일수 값은 필수 입니다.
|
||||
context.buildConstraintViolationWithTemplate(messageUtil.getMessage("reserve_item.max_period_days")+ messageUtil.getMessage("valid.required"))
|
||||
.addPropertyNode("periodMaxCount")
|
||||
.addConstraintViolation();
|
||||
fieldValid = false;
|
||||
}
|
||||
}
|
||||
}else if ("external".equals(reserveMeansId)) {
|
||||
//예약 구분이 외부 링크인 경우 외부 링크 url 필수
|
||||
if (isNull(value, "externalUrl")) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
//외부링크 URL 값은 필수 입니다.
|
||||
context.buildConstraintViolationWithTemplate(messageUtil.getMessage("reserve_item.external_url")+ messageUtil.getMessage("valid.required"))
|
||||
.addPropertyNode("externalUrl")
|
||||
.addConstraintViolation();
|
||||
fieldValid = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if ("telephone".equals(reserveMethodId)) {
|
||||
//예약 방법인 '전화'인 경우 contact 필수
|
||||
if (isNull(value, "contact")) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
//문의처 값은 필수입니다.
|
||||
context.buildConstraintViolationWithTemplate(messageUtil.getMessage("reserve_item.contact")+ messageUtil.getMessage("valid.required"))
|
||||
.addPropertyNode("contact")
|
||||
.addConstraintViolation();
|
||||
fieldValid = false;
|
||||
}
|
||||
}else if ("visit".equals(reserveMethodId)) {
|
||||
//예약 방법인 '방문'인 경우 주소 필수
|
||||
if (isNull(value, "address")) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
//주소 값은 필수 입니다.
|
||||
context.buildConstraintViolationWithTemplate(messageUtil.getMessage("common.address")+ messageUtil.getMessage("valid.required"))
|
||||
.addPropertyNode("address")
|
||||
.addConstraintViolation();
|
||||
fieldValid = false;
|
||||
}
|
||||
return validateInternet(value, context);
|
||||
}
|
||||
|
||||
// 유료인 경우 이용 요금 필수
|
||||
if ("telephone".equals(reserveMethodId)) {
|
||||
return validateTelephone(value, context);
|
||||
}
|
||||
|
||||
if ("visit".equals(reserveMethodId)) {
|
||||
return validateVisit(value, context);
|
||||
}
|
||||
|
||||
return fieldValid;
|
||||
}
|
||||
|
||||
/**
|
||||
* 운영 시작일, 종료일 체크
|
||||
*
|
||||
* @param value
|
||||
* @param context
|
||||
* @return
|
||||
* @throws NoSuchFieldException
|
||||
* @throws IllegalAccessException
|
||||
*/
|
||||
private void validateOperationDate(Object value, ConstraintValidatorContext context)
|
||||
throws NoSuchFieldException, IllegalAccessException {
|
||||
LocalDateTime operationStartDate = (LocalDateTime) getFieldValue(value,
|
||||
"operationStartDate");
|
||||
LocalDateTime operationEndDate = (LocalDateTime) getFieldValue(value, "operationEndDate");
|
||||
|
||||
if (operationStartDate.isAfter(operationEndDate)) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
//시작일, 종료일, {0}이 {1}보다 늦습니다.
|
||||
context.buildConstraintViolationWithTemplate(messageUtil
|
||||
.getMessage("valid.to_be_slow.format",
|
||||
new Object[]{messageUtil.getMessage("common.start_date"),
|
||||
messageUtil.getMessage("common.end_date")}))
|
||||
.addPropertyNode("operationStartDate")
|
||||
.addConstraintViolation();
|
||||
fieldValid = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 유료인 경우 이용 요금 필수
|
||||
*
|
||||
* @param value
|
||||
* @param context
|
||||
* @return
|
||||
* @throws NoSuchFieldException
|
||||
* @throws IllegalAccessException
|
||||
*/
|
||||
private void validatePaid(Object value, ConstraintValidatorContext context)
|
||||
throws NoSuchFieldException, IllegalAccessException {
|
||||
Boolean isPaid = Boolean.valueOf(String.valueOf(getFieldValue(value, "isPaid")));
|
||||
if (isPaid && isNull(value, "usageCost")) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
//이용요금 값은 필수입니다.
|
||||
context.buildConstraintViolationWithTemplate(messageUtil.getMessage("reserve_item.usage_fee")+ messageUtil.getMessage("valid.required"))
|
||||
.addPropertyNode("usageCost")
|
||||
.addConstraintViolation();
|
||||
context.buildConstraintViolationWithTemplate(
|
||||
messageUtil.getMessage("reserve_item.usage_fee") + messageUtil
|
||||
.getMessage("valid.required"))
|
||||
.addPropertyNode("usageCost")
|
||||
.addConstraintViolation();
|
||||
fieldValid = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 예약 방법인 '방문'인 경우 주소 필수
|
||||
*
|
||||
* @param value
|
||||
* @param context
|
||||
* @return
|
||||
* @throws NoSuchFieldException
|
||||
* @throws IllegalAccessException
|
||||
*/
|
||||
private boolean validateVisit(Object value, ConstraintValidatorContext context)
|
||||
throws NoSuchFieldException, IllegalAccessException {
|
||||
if (isNull(value, "address")) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
//주소 값은 필수 입니다.
|
||||
context.buildConstraintViolationWithTemplate(
|
||||
messageUtil.getMessage("common.address") + messageUtil.getMessage("valid.required"))
|
||||
.addPropertyNode("address")
|
||||
.addConstraintViolation();
|
||||
return false;
|
||||
}
|
||||
|
||||
return fieldValid;
|
||||
}
|
||||
|
||||
/**
|
||||
* 예약 방법인 '전화'인 경우 contact 필수
|
||||
*
|
||||
* @param value
|
||||
* @param context
|
||||
* @return
|
||||
* @throws NoSuchFieldException
|
||||
* @throws IllegalAccessException
|
||||
*/
|
||||
private boolean validateTelephone(Object value, ConstraintValidatorContext context)
|
||||
throws NoSuchFieldException, IllegalAccessException {
|
||||
|
||||
if (isNull(value, "contact")) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
//문의처 값은 필수입니다.
|
||||
context.buildConstraintViolationWithTemplate(
|
||||
messageUtil.getMessage("reserve_item.contact") + messageUtil
|
||||
.getMessage("valid.required"))
|
||||
.addPropertyNode("contact")
|
||||
.addConstraintViolation();
|
||||
return false;
|
||||
}
|
||||
return fieldValid;
|
||||
}
|
||||
|
||||
/**
|
||||
* 인터넷 예약인 경우 정합성 체크
|
||||
*
|
||||
* @param value
|
||||
* @param context
|
||||
* @return
|
||||
* @throws NoSuchFieldException
|
||||
* @throws IllegalAccessException
|
||||
*/
|
||||
private boolean validateInternet(Object value, ConstraintValidatorContext context)
|
||||
throws NoSuchFieldException, IllegalAccessException {
|
||||
// 예약 구분 필수
|
||||
if (isNull(value, "reserveMeansId")) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
//인터넷 예약 구분 값은 필수 입니다.
|
||||
context.buildConstraintViolationWithTemplate(
|
||||
messageUtil.getMessage("reserve_item.reserve_means") + messageUtil
|
||||
.getMessage("valid.required"))
|
||||
.addPropertyNode("reserveMeansId")
|
||||
.addConstraintViolation();
|
||||
return false;
|
||||
}
|
||||
|
||||
String reserveMeansId = String.valueOf(getFieldValue(value, "reserveMeansId"));
|
||||
//예약 구분이 실시간 인 경우
|
||||
if ("realtime".equals(reserveMeansId)) {
|
||||
return validateRealTime(value, context);
|
||||
}
|
||||
|
||||
if ("external".equals(reserveMeansId)) {
|
||||
//예약 구분이 외부 링크인 경우 외부 링크 url 필수
|
||||
if (isNull(value, "externalUrl")) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
//외부링크 URL 값은 필수 입니다.
|
||||
context.buildConstraintViolationWithTemplate(
|
||||
messageUtil.getMessage("reserve_item.external_url") + messageUtil
|
||||
.getMessage("valid.required"))
|
||||
.addPropertyNode("externalUrl")
|
||||
.addConstraintViolation();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return fieldValid;
|
||||
}
|
||||
|
||||
/**
|
||||
* 실시간 인 경우 정합성 체크
|
||||
*
|
||||
* @param value
|
||||
* @param context
|
||||
* @return
|
||||
* @throws NoSuchFieldException
|
||||
* @throws IllegalAccessException
|
||||
*/
|
||||
private boolean validateRealTime(Object value, ConstraintValidatorContext context)
|
||||
throws NoSuchFieldException, IllegalAccessException {
|
||||
// 예약 신청 기간 필수
|
||||
fieldValid = validateRequestDate(value, context);
|
||||
|
||||
//기간 지정 필수
|
||||
fieldValid = validatePeriod(value, context);
|
||||
|
||||
return fieldValid;
|
||||
}
|
||||
|
||||
/**
|
||||
* 기간 지정 정합성 체크
|
||||
*
|
||||
* @param value
|
||||
* @param context
|
||||
* @throws NoSuchFieldException
|
||||
* @throws IllegalAccessException
|
||||
*/
|
||||
private boolean validatePeriod(Object value, ConstraintValidatorContext context)
|
||||
throws NoSuchFieldException, IllegalAccessException {
|
||||
if (isNull(value, "isPeriod")) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
//기간 지정 가능 여부 값은 필수 입니다.
|
||||
context.buildConstraintViolationWithTemplate(
|
||||
messageUtil.getMessage("reserve_item.period_possible") + messageUtil
|
||||
.getMessage("valid.required"))
|
||||
.addPropertyNode("requestEndDate")
|
||||
.addConstraintViolation();
|
||||
return false;
|
||||
}
|
||||
|
||||
Boolean isPeriod = Boolean.valueOf(String.valueOf(getFieldValue(value, "isPeriod")));
|
||||
// 기간 지정 가능인 경우 최대 얘약일 수 필수
|
||||
if (isPeriod && isNull(value, "periodMaxCount")) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
//최대 예약 가능 일수 값은 필수 입니다.
|
||||
context.buildConstraintViolationWithTemplate(
|
||||
messageUtil.getMessage("reserve_item.max_period_days") + messageUtil
|
||||
.getMessage("valid.required"))
|
||||
.addPropertyNode("periodMaxCount")
|
||||
.addConstraintViolation();
|
||||
return false;
|
||||
}
|
||||
|
||||
return fieldValid;
|
||||
}
|
||||
|
||||
/**
|
||||
* 예약 신청 일자 정합성 체크
|
||||
*
|
||||
* @param value
|
||||
* @param context
|
||||
* @throws NoSuchFieldException
|
||||
* @throws IllegalAccessException
|
||||
*/
|
||||
private boolean validateRequestDate(Object value, ConstraintValidatorContext context)
|
||||
throws NoSuchFieldException, IllegalAccessException {
|
||||
|
||||
if (isNull(value, "requestStartDate")) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
// 예약 신청 시작일 값은 필수 입니다.
|
||||
context.buildConstraintViolationWithTemplate(
|
||||
messageUtil.getMessage("reserve_item.request") + " " + messageUtil
|
||||
.getMessage("common.start_datetime") + messageUtil.getMessage("valid.required"))
|
||||
.addPropertyNode("requestStartDate")
|
||||
.addConstraintViolation();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isNull(value, "requestEndDate")) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
// 예약 신청 종료일 값은 필수 입니다.
|
||||
context.buildConstraintViolationWithTemplate(
|
||||
messageUtil.getMessage("reserve_item.request") + " " + messageUtil
|
||||
.getMessage("common.end_datetime") + messageUtil.getMessage("valid.required"))
|
||||
.addPropertyNode("requestEndDate")
|
||||
.addConstraintViolation();
|
||||
return false;
|
||||
}
|
||||
|
||||
LocalDateTime requestStartDate = (LocalDateTime) getFieldValue(value, "requestStartDate");
|
||||
LocalDateTime requestEndDate = (LocalDateTime) getFieldValue(value, "requestEndDate");
|
||||
if (requestStartDate.isAfter(requestEndDate)) {
|
||||
context.disableDefaultConstraintViolation();
|
||||
//시작일, 종료일, {0}이 {1}보다 늦습니다.
|
||||
context.buildConstraintViolationWithTemplate(messageUtil
|
||||
.getMessage("valid.to_be_slow.format",
|
||||
new Object[]{messageUtil.getMessage("common.start_date"),
|
||||
messageUtil.getMessage("common.end_date")}))
|
||||
.addPropertyNode("requestStartDate")
|
||||
.addConstraintViolation();
|
||||
return false;
|
||||
}
|
||||
|
||||
return fieldValid;
|
||||
}
|
||||
@@ -190,7 +343,8 @@ public class ReserveItemSaveValidator implements ConstraintValidator<ReserveItem
|
||||
* @throws NoSuchFieldException
|
||||
* @throws IllegalAccessException
|
||||
*/
|
||||
private Object getFieldValue(Object object, String fieldName) throws NoSuchFieldException, IllegalAccessException {
|
||||
private Object getFieldValue(Object object, String fieldName)
|
||||
throws NoSuchFieldException, IllegalAccessException {
|
||||
Class<?> clazz = object.getClass();
|
||||
Field field = clazz.getDeclaredField(fieldName);
|
||||
field.setAccessible(true);
|
||||
@@ -206,10 +360,12 @@ public class ReserveItemSaveValidator implements ConstraintValidator<ReserveItem
|
||||
* @throws NoSuchFieldException
|
||||
* @throws IllegalAccessException
|
||||
*/
|
||||
private boolean isNull(Object object, String fieldName) throws NoSuchFieldException, IllegalAccessException {
|
||||
private boolean isNull(Object object, String fieldName)
|
||||
throws NoSuchFieldException, IllegalAccessException {
|
||||
Class<?> clazz = object.getClass();
|
||||
Field field = clazz.getDeclaredField(fieldName);
|
||||
field.setAccessible(true);
|
||||
return field.get(object) == null || !StringUtils.hasLength(String.valueOf(field.get(object)));
|
||||
return field.get(object) == null || !StringUtils
|
||||
.hasLength(String.valueOf(field.get(object)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
package org.egovframe.cloud.reserveitemservice.validator.annotation;
|
||||
|
||||
import org.egovframe.cloud.reserveitemservice.validator.ReserveItemSaveValidator;
|
||||
|
||||
import javax.validation.Constraint;
|
||||
import javax.validation.Payload;
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import javax.validation.Constraint;
|
||||
import javax.validation.Payload;
|
||||
import org.egovframe.cloud.reserveitemservice.validator.ReserveItemSaveValidator;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.reserveitemservice.validator.annotation.ReserveItemSaveValid
|
||||
|
||||
@@ -108,7 +108,7 @@ class ReserveItemApiControllerTest {
|
||||
|
||||
|
||||
@Test
|
||||
public void 사용자목록조회_성공() throws Exception {
|
||||
public void 사용자목록조회_성공() {
|
||||
|
||||
ReserveItem saved = reserveItemRepository.save(reserveItem).block();
|
||||
assertNotNull(saved);
|
||||
@@ -123,7 +123,7 @@ class ReserveItemApiControllerTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void 관리자목록조회_성공() throws Exception {
|
||||
public void 관리자목록조회_성공() {
|
||||
|
||||
ReserveItem saved = reserveItemRepository.save(reserveItem).block();
|
||||
assertNotNull(saved);
|
||||
@@ -138,7 +138,7 @@ class ReserveItemApiControllerTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void 한건조회_성공() throws Exception {
|
||||
public void 한건조회_성공() {
|
||||
ReserveItem saved = reserveItemRepository.save(reserveItem).block();
|
||||
assertNotNull(saved);
|
||||
|
||||
@@ -155,7 +155,7 @@ class ReserveItemApiControllerTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void 사용자_포털_메인_예약목록_조회_성공() throws Exception {
|
||||
public void 사용자_포털_메인_예약목록_조회_성공() {
|
||||
ReserveItem saved = reserveItemRepository.save(reserveItem).block();
|
||||
assertNotNull(saved);
|
||||
|
||||
@@ -176,7 +176,7 @@ class ReserveItemApiControllerTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void 한건_등록_성공() throws Exception {
|
||||
public void 한건_등록_성공() {
|
||||
ReserveItemSaveRequestDto requestDto = ReserveItemSaveRequestDto.builder()
|
||||
.reserveItemName(reserveItem.getReserveItemName())
|
||||
.categoryId(reserveItem.getCategoryId())
|
||||
@@ -208,7 +208,7 @@ class ReserveItemApiControllerTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void 한건_수정_성공() throws Exception {
|
||||
public void 한건_수정_성공() {
|
||||
ReserveItem saved = reserveItemRepository.save(reserveItem).block();
|
||||
assertNotNull(saved);
|
||||
|
||||
@@ -241,7 +241,7 @@ class ReserveItemApiControllerTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void 사용여부_false_수정_성공() throws Exception {
|
||||
public void 사용여부_false_수정_성공() {
|
||||
ReserveItem saved = reserveItemRepository.save(reserveItem).block();
|
||||
assertNotNull(saved);
|
||||
|
||||
@@ -255,7 +255,7 @@ class ReserveItemApiControllerTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void 한건_저장_validation_실패() throws Exception {
|
||||
public void 한건_저장_validation_실패() {
|
||||
ReserveItemSaveRequestDto requestDto = ReserveItemSaveRequestDto.builder()
|
||||
.reserveItemName(reserveItem.getReserveItemName())
|
||||
.categoryId(reserveItem.getCategoryId())
|
||||
@@ -271,6 +271,8 @@ class ReserveItemApiControllerTest {
|
||||
.selectionMeansId(reserveItem.getSelectionMeansId())
|
||||
.build();
|
||||
|
||||
System.out.println(requestDto);
|
||||
|
||||
ErrorResponse responseBody = webTestClient.post()
|
||||
.uri(API_URL)
|
||||
.bodyValue(requestDto)
|
||||
|
||||
Reference in New Issue
Block a user