Merge branch 'main' of https://github.com/eGovFramework/egovframe-msa-edu
This commit is contained in:
@@ -8,12 +8,12 @@
|
|||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
<!-- 로컬에서는 로그를 전송하지 않도록 설정 -->
|
<!-- 로컬에서는 로그를 전송하지 않도록 설정 -->
|
||||||
<springProfile name="native">
|
<springProfile name="default">
|
||||||
<root level="INFO">
|
<root level="INFO">
|
||||||
<appender-ref ref="STDOUT" />
|
<appender-ref ref="STDOUT" />
|
||||||
</root>
|
</root>
|
||||||
</springProfile>
|
</springProfile>
|
||||||
<springProfile name="!native">
|
<springProfile name="!default">
|
||||||
<!-- java -Dlogstash_hostname="localhost:5001" 와 같이 변경할 수 있다. cf 환경에서는 manifest.yml 파일에 환경변수로 추가 -->
|
<!-- java -Dlogstash_hostname="localhost:5001" 와 같이 변경할 수 있다. cf 환경에서는 manifest.yml 파일에 환경변수로 추가 -->
|
||||||
<property name="destination" value="${logstash_hostname:-localhost:5001}" />
|
<property name="destination" value="${logstash_hostname:-localhost:5001}" />
|
||||||
<property name="app_name" value="${app_name:-config-server}" />
|
<property name="app_name" value="${app_name:-config-server}" />
|
||||||
|
|||||||
@@ -41,6 +41,10 @@ dependencies {
|
|||||||
implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j'
|
implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j'
|
||||||
implementation 'com.playtika.reactivefeign:feign-reactor-spring-cloud-starter:3.1.0'
|
implementation 'com.playtika.reactivefeign:feign-reactor-spring-cloud-starter:3.1.0'
|
||||||
|
|
||||||
|
implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'
|
||||||
|
implementation 'org.springframework.cloud:spring-cloud-sleuth-zipkin'
|
||||||
|
implementation 'net.logstash.logback:logstash-logback-encoder:6.6' // logstash logback
|
||||||
|
|
||||||
//messaging
|
//messaging
|
||||||
implementation 'org.springframework.cloud:spring-cloud-stream'
|
implementation 'org.springframework.cloud:spring-cloud-stream'
|
||||||
implementation 'org.springframework.cloud:spring-cloud-stream-binder-rabbit'
|
implementation 'org.springframework.cloud:spring-cloud-stream-binder-rabbit'
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ public class ReserveApiController {
|
|||||||
public Mono<Integer> countInventory(@PathVariable Long reserveItemId,
|
public Mono<Integer> countInventory(@PathVariable Long reserveItemId,
|
||||||
@RequestParam(name = "startDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate,
|
@RequestParam(name = "startDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate,
|
||||||
@RequestParam(name = "endDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate) {
|
@RequestParam(name = "endDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate) {
|
||||||
return reserveService.countInventory(reserveItemId,startDate.atTime(1,1), endDate.atTime(1,1));
|
return reserveService.countInventory(reserveItemId,startDate.atTime(0,0), endDate.atTime(23, 59));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package org.egovframe.cloud.reservechecksevice.client.dto;
|
|||||||
|
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* org.egovframe.cloud.userservice.api.user.dto.UserResponseDto
|
* org.egovframe.cloud.userservice.api.user.dto.UserResponseDto
|
||||||
@@ -21,6 +22,7 @@ import lombok.Getter;
|
|||||||
* </pre>
|
* </pre>
|
||||||
*/
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
|
@NoArgsConstructor
|
||||||
public class UserResponseDto {
|
public class UserResponseDto {
|
||||||
|
|
||||||
private String userId;
|
private String userId;
|
||||||
|
|||||||
@@ -197,7 +197,10 @@ public class Reserve extends BaseEntity {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public Reserve conversionReserveQty() {
|
public Reserve conversionReserveQty() {
|
||||||
this.reserveQty = (this.reserveQty * -1);
|
if (this.reserveQty != null) {
|
||||||
|
this.reserveQty = (this.reserveQty * -1);
|
||||||
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,9 @@ package org.egovframe.cloud.reservechecksevice.domain.reserve;
|
|||||||
|
|
||||||
import static org.springframework.data.relational.core.query.Criteria.*;
|
import static org.springframework.data.relational.core.query.Criteria.*;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.LocalTime;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -174,6 +176,7 @@ public class ReserveRepositoryImpl implements ReserveRepositoryCustom{
|
|||||||
.matching(Query.query(where("reserve_item_id").is(reserveItemId)
|
.matching(Query.query(where("reserve_item_id").is(reserveItemId)
|
||||||
.and ("reserve_start_date").lessThanOrEquals(endDate)
|
.and ("reserve_start_date").lessThanOrEquals(endDate)
|
||||||
.and("reserve_end_date").greaterThanOrEquals(startDate)
|
.and("reserve_end_date").greaterThanOrEquals(startDate)
|
||||||
|
.and("reserve_status_id").not(ReserveStatus.CANCEL.getKey())
|
||||||
))
|
))
|
||||||
.all();
|
.all();
|
||||||
}
|
}
|
||||||
@@ -194,6 +197,7 @@ public class ReserveRepositoryImpl implements ReserveRepositoryCustom{
|
|||||||
.and ("reserve_start_date").lessThanOrEquals(endDate)
|
.and ("reserve_start_date").lessThanOrEquals(endDate)
|
||||||
.and("reserve_end_date").greaterThanOrEquals(startDate)
|
.and("reserve_end_date").greaterThanOrEquals(startDate)
|
||||||
.and("reserve_id").not(reserveId)
|
.and("reserve_id").not(reserveId)
|
||||||
|
.and("reserve_status_id").not(ReserveStatus.CANCEL.getKey())
|
||||||
))
|
))
|
||||||
.all();
|
.all();
|
||||||
}
|
}
|
||||||
@@ -214,6 +218,7 @@ public class ReserveRepositoryImpl implements ReserveRepositoryCustom{
|
|||||||
.and ("reserve_start_date").lessThanOrEquals(endDate)
|
.and ("reserve_start_date").lessThanOrEquals(endDate)
|
||||||
.and("reserve_end_date").greaterThanOrEquals(startDate)
|
.and("reserve_end_date").greaterThanOrEquals(startDate)
|
||||||
.and("reserve_id").not(reserveId)
|
.and("reserve_id").not(reserveId)
|
||||||
|
.and("reserve_status_id").not(ReserveStatus.CANCEL.getKey())
|
||||||
))
|
))
|
||||||
.count();
|
.count();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package org.egovframe.cloud.reservechecksevice.service.reserve;
|
package org.egovframe.cloud.reservechecksevice.service.reserve;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -534,17 +535,16 @@ public class ReserveService extends ReactiveAbstractService {
|
|||||||
if (!Category.EDUCATION.isEquals(reserve1.getCategoryId())) {
|
if (!Category.EDUCATION.isEquals(reserve1.getCategoryId())) {
|
||||||
return Mono.just(reserve1);
|
return Mono.just(reserve1);
|
||||||
}
|
}
|
||||||
// return reserveItemServiceClient.updateInventory(reserve.getReserveItemId(), reserve.getReserveQty())
|
return reserveItemServiceClient.updateInventory(reserve.getReserveItemId(), reserve.getReserveQty())
|
||||||
// .transform(CircuitBreakerOperator.of(circuitBreakerRegistry.circuitBreaker(RESERVE_ITEM_CIRCUIT_BREAKER_NAME)))
|
.transform(CircuitBreakerOperator.of(circuitBreakerRegistry.circuitBreaker(RESERVE_ITEM_CIRCUIT_BREAKER_NAME)))
|
||||||
// .onErrorResume(throwable -> Mono.just(false))
|
.onErrorResume(throwable -> Mono.just(false))
|
||||||
// .flatMap(isSuccess -> {
|
.flatMap(isSuccess -> {
|
||||||
// if (isSuccess) {
|
if (isSuccess) {
|
||||||
// return Mono.just(reserve);
|
return Mono.just(reserve);
|
||||||
// }
|
}
|
||||||
// //재고 업데이트에 실패했습니다.
|
//재고 업데이트에 실패했습니다.
|
||||||
// return Mono.error(new BusinessMessageException(getMessage("msg.inventory_failed")));
|
return Mono.error(new BusinessMessageException(getMessage("msg.inventory_failed")));
|
||||||
// });
|
});
|
||||||
return null;
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -561,6 +561,7 @@ public class ReserveService extends ReactiveAbstractService {
|
|||||||
.transform(CircuitBreakerOperator.of(circuitBreakerRegistry.circuitBreaker(RESERVE_ITEM_CIRCUIT_BREAKER_NAME)))
|
.transform(CircuitBreakerOperator.of(circuitBreakerRegistry.circuitBreaker(RESERVE_ITEM_CIRCUIT_BREAKER_NAME)))
|
||||||
.onErrorResume(throwable -> Mono.empty())
|
.onErrorResume(throwable -> Mono.empty())
|
||||||
.zipWith(getMaxByReserveDate(reserveItemId, startDate, endDate))
|
.zipWith(getMaxByReserveDate(reserveItemId, startDate, endDate))
|
||||||
|
.log("countinventory")
|
||||||
.flatMap(tuple -> Mono.just(tuple.getT1().getTotalQty() - tuple.getT2()));
|
.flatMap(tuple -> Mono.just(tuple.getT1().getTotalQty() - tuple.getT2()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -607,20 +608,33 @@ public class ReserveService extends ReactiveAbstractService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
long between = ChronoUnit.DAYS.between(startDate, endDate);
|
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)
|
return Flux.fromStream(IntStream.iterate(0, i -> i + 1)
|
||||||
.limit(between)
|
.limit(between)
|
||||||
.mapToObj(i -> startDate.plusDays(i)))
|
.mapToObj(i -> startDate.plusDays(i)))
|
||||||
.flatMap(localDateTime ->
|
.flatMap(localDateTime ->
|
||||||
reserveFlux.map(findReserve -> {
|
reserveFlux.map(findReserve -> {
|
||||||
if (localDateTime.isAfter(findReserve.getReserveStartDate())
|
if (localDateTime.isAfter(findReserve.getReserveStartDate())
|
||||||
|| localDateTime.isBefore(findReserve.getReserveEndDate())) {
|
|| localDateTime.isBefore(findReserve.getReserveEndDate())
|
||||||
|
|| localDateTime.isEqual(findReserve.getReserveStartDate()) || localDateTime.isEqual(findReserve.getReserveEndDate())) {
|
||||||
return findReserve.getReserveQty();
|
return findReserve.getReserveQty();
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}).reduce(0, (x1, x2) -> x1 + x2))
|
}).reduce(0, (x1, x2) -> x1 + x2))
|
||||||
.groupBy(integer -> integer)
|
.groupBy(integer -> integer)
|
||||||
.flatMap(group -> group.reduce((x1,x2) -> x1 > x2?x1:x2))
|
.flatMap(group -> group.reduce((x1,x2) -> x1 > x2?x1:x2))
|
||||||
.last();
|
.last(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration>
|
||||||
|
|
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %thread %-5level %logger - %m%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- 로컬에서는 로그를 전송하지 않도록 설정 -->
|
||||||
|
<springProfile name="default">
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
</root>
|
||||||
|
</springProfile>
|
||||||
|
<springProfile name="!default">
|
||||||
|
<!-- java -Ddestination="localhost:5001" 와 같이 변경할 수 있다. cf 환경에서는 manifest.yml 파일에 환경변수로 추가 -->
|
||||||
|
<property name="destination" value="${logstash_hostname:-localhost:5001}" />
|
||||||
|
<property name="app_name" value="${app_name:-reserve-check-service}" />
|
||||||
|
|
||||||
|
<!-- ELK - Logstash 로 로그를 전송하기 위한 appender -->
|
||||||
|
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
|
||||||
|
<destination>${destination}</destination><!-- native profile => localhost:8088 -->
|
||||||
|
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
|
||||||
|
<customFields>{"app.name":"${app_name}"}</customFields>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
<root level="WARN">
|
||||||
|
<appender-ref ref="LOGSTASH" />
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
</root>
|
||||||
|
</springProfile>
|
||||||
|
|
||||||
|
</configuration>
|
||||||
@@ -34,6 +34,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
|
|||||||
import org.springframework.boot.test.context.SpringBootTest;
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||||
import org.springframework.core.ParameterizedTypeReference;
|
import org.springframework.core.ParameterizedTypeReference;
|
||||||
|
import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
|
||||||
import org.springframework.test.context.ActiveProfiles;
|
import org.springframework.test.context.ActiveProfiles;
|
||||||
import org.springframework.test.context.TestPropertySource;
|
import org.springframework.test.context.TestPropertySource;
|
||||||
import org.springframework.test.web.reactive.server.WebTestClient;
|
import org.springframework.test.web.reactive.server.WebTestClient;
|
||||||
@@ -58,6 +59,9 @@ public class ReserveApiControllerTest {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private WebTestClient webTestClient;
|
private WebTestClient webTestClient;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private R2dbcEntityTemplate entityTemplate;
|
||||||
|
|
||||||
private static final String API_URL = "/api/v1/reserves";
|
private static final String API_URL = "/api/v1/reserves";
|
||||||
|
|
||||||
private UserResponseDto user;
|
private UserResponseDto user;
|
||||||
@@ -527,4 +531,39 @@ public class ReserveApiControllerTest {
|
|||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void 물품재고조회_성공() throws Exception {
|
||||||
|
|
||||||
|
BDDMockito.when(reserveItemServiceClient.findById(ArgumentMatchers.anyLong()))
|
||||||
|
.thenReturn(Mono.just(ReserveItemResponseDto.builder().reserveItem(reserveItem).build()));
|
||||||
|
|
||||||
|
Reserve inventoryreserve = Reserve.builder()
|
||||||
|
.reserveId("1")
|
||||||
|
.reserveItemId(reserveItem.getReserveItemId())
|
||||||
|
.reserveQty(50)
|
||||||
|
.reservePurposeContent("test")
|
||||||
|
.reserveStatusId("request")
|
||||||
|
.reserveStartDate(LocalDateTime.of(2021, 9, 9, 0, 0))
|
||||||
|
.reserveEndDate(LocalDateTime.of(2021, 9, 9, 0, 0))
|
||||||
|
.userId(user.getUserId())
|
||||||
|
.userEmail("user@email.com")
|
||||||
|
.userContactNo("contact")
|
||||||
|
.build();
|
||||||
|
inventoryreserve.setReserveItem(reserveItem);
|
||||||
|
inventoryreserve.setUser(user);
|
||||||
|
Reserve saved = reserveRepository.insert(inventoryreserve).block();
|
||||||
|
assertNotNull(saved);
|
||||||
|
|
||||||
|
Integer responseBody = webTestClient.get()
|
||||||
|
.uri("/api/v1/reserves/" + reserveItem.getReserveItemId()
|
||||||
|
+ "/inventories?startDate=2021-09-09&endDate=2021-09-09")
|
||||||
|
.exchange()
|
||||||
|
.expectStatus().isOk()
|
||||||
|
.expectBody(Integer.class)
|
||||||
|
.returnResult().getResponseBody();
|
||||||
|
|
||||||
|
assertThat(responseBody).isEqualTo(50);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,6 +41,10 @@ dependencies {
|
|||||||
implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j'
|
implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j'
|
||||||
implementation 'com.playtika.reactivefeign:feign-reactor-spring-cloud-starter:3.1.0'
|
implementation 'com.playtika.reactivefeign:feign-reactor-spring-cloud-starter:3.1.0'
|
||||||
|
|
||||||
|
implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'
|
||||||
|
implementation 'org.springframework.cloud:spring-cloud-sleuth-zipkin'
|
||||||
|
implementation 'net.logstash.logback:logstash-logback-encoder:6.6' // logstash logback
|
||||||
|
|
||||||
implementation 'io.jsonwebtoken:jjwt:0.9.1'
|
implementation 'io.jsonwebtoken:jjwt:0.9.1'
|
||||||
|
|
||||||
implementation 'dev.miku:r2dbc-mysql:0.8.2.RELEASE'
|
implementation 'dev.miku:r2dbc-mysql:0.8.2.RELEASE'
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration>
|
||||||
|
|
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %thread %-5level %logger - %m%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- 로컬에서는 로그를 전송하지 않도록 설정 -->
|
||||||
|
<springProfile name="default">
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
</root>
|
||||||
|
</springProfile>
|
||||||
|
<springProfile name="!default">
|
||||||
|
<!-- java -Ddestination="localhost:5001" 와 같이 변경할 수 있다. cf 환경에서는 manifest.yml 파일에 환경변수로 추가 -->
|
||||||
|
<property name="destination" value="${logstash_hostname:-localhost:5001}" />
|
||||||
|
<property name="app_name" value="${app_name:-reserve-item-service}" />
|
||||||
|
|
||||||
|
<!-- ELK - Logstash 로 로그를 전송하기 위한 appender -->
|
||||||
|
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
|
||||||
|
<destination>${destination}</destination><!-- native profile => localhost:8088 -->
|
||||||
|
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
|
||||||
|
<customFields>{"app.name":"${app_name}"}</customFields>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
<root level="WARN">
|
||||||
|
<appender-ref ref="LOGSTASH" />
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
</root>
|
||||||
|
</springProfile>
|
||||||
|
|
||||||
|
</configuration>
|
||||||
@@ -42,6 +42,10 @@ dependencies {
|
|||||||
implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j'
|
implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j'
|
||||||
implementation 'com.playtika.reactivefeign:feign-reactor-spring-cloud-starter:3.1.0'
|
implementation 'com.playtika.reactivefeign:feign-reactor-spring-cloud-starter:3.1.0'
|
||||||
|
|
||||||
|
implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'
|
||||||
|
implementation 'org.springframework.cloud:spring-cloud-sleuth-zipkin'
|
||||||
|
implementation 'net.logstash.logback:logstash-logback-encoder:6.6' // logstash logback
|
||||||
|
|
||||||
//messaging
|
//messaging
|
||||||
implementation 'org.springframework.cloud:spring-cloud-stream'
|
implementation 'org.springframework.cloud:spring-cloud-stream'
|
||||||
implementation 'org.springframework.cloud:spring-cloud-stream-binder-rabbit'
|
implementation 'org.springframework.cloud:spring-cloud-stream-binder-rabbit'
|
||||||
|
|||||||
@@ -84,7 +84,8 @@ public class ReserveApiController {
|
|||||||
@PostMapping("/api/v1/requests")
|
@PostMapping("/api/v1/requests")
|
||||||
@ResponseStatus(HttpStatus.CREATED)
|
@ResponseStatus(HttpStatus.CREATED)
|
||||||
public Mono<ReserveResponseDto> save(@RequestBody Mono<ReserveSaveRequestDto> saveRequestDtoMono) {
|
public Mono<ReserveResponseDto> save(@RequestBody Mono<ReserveSaveRequestDto> saveRequestDtoMono) {
|
||||||
return saveRequestDtoMono.flatMap(saveRequestDto -> {
|
return saveRequestDtoMono
|
||||||
|
.flatMap(saveRequestDto -> {
|
||||||
if (Category.EDUCATION.isEquals(saveRequestDto.getCategoryId())) {
|
if (Category.EDUCATION.isEquals(saveRequestDto.getCategoryId())) {
|
||||||
return reserveService.saveForEvent(saveRequestDto);
|
return reserveService.saveForEvent(saveRequestDto);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ public class ReserveRepositoryImpl implements ReserveRepositoryCustom {
|
|||||||
.matching(Query.query(where("reserve_item_id").is(reserveItemId)
|
.matching(Query.query(where("reserve_item_id").is(reserveItemId)
|
||||||
.and ("reserve_start_date").lessThanOrEquals(endDate)
|
.and ("reserve_start_date").lessThanOrEquals(endDate)
|
||||||
.and("reserve_end_date").greaterThanOrEquals(startDate)
|
.and("reserve_end_date").greaterThanOrEquals(startDate)
|
||||||
|
.and("reserve_status_id").not(ReserveStatus.CANCEL.getKey())
|
||||||
))
|
))
|
||||||
.count();
|
.count();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -278,20 +278,34 @@ public class ReserveService extends ReactiveAbstractService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
long between = ChronoUnit.DAYS.between(startDate, endDate);
|
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)
|
return Flux.fromStream(IntStream.iterate(0, i -> i + 1)
|
||||||
.limit(between)
|
.limit(between)
|
||||||
.mapToObj(i -> startDate.plusDays(i)))
|
.mapToObj(i -> startDate.plusDays(i)))
|
||||||
.flatMap(localDateTime ->
|
.flatMap(localDateTime ->
|
||||||
reserveFlux.map(findReserve -> {
|
reserveFlux.map(findReserve -> {
|
||||||
if (localDateTime.isAfter(findReserve.getReserveStartDate())
|
if (localDateTime.isAfter(findReserve.getReserveStartDate())
|
||||||
|| localDateTime.isBefore(findReserve.getReserveEndDate())) {
|
|| localDateTime.isBefore(findReserve.getReserveEndDate())
|
||||||
|
|| localDateTime.isEqual(findReserve.getReserveStartDate()) || localDateTime.isEqual(findReserve.getReserveEndDate())
|
||||||
|
) {
|
||||||
return findReserve.getReserveQty();
|
return findReserve.getReserveQty();
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}).reduce(0, (x1, x2) -> x1 + x2))
|
}).reduce(0, (x1, x2) -> x1 + x2))
|
||||||
.groupBy(integer -> integer)
|
.groupBy(integer -> integer)
|
||||||
.flatMap(group -> group.reduce((x1,x2) -> x1 > x2?x1:x2))
|
.flatMap(group -> group.reduce((x1,x2) -> x1 > x2?x1:x2))
|
||||||
.last();
|
.last(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration>
|
||||||
|
|
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %thread %-5level %logger - %m%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- 로컬에서는 로그를 전송하지 않도록 설정 -->
|
||||||
|
<springProfile name="default">
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
</root>
|
||||||
|
</springProfile>
|
||||||
|
<springProfile name="!default">
|
||||||
|
<!-- java -Ddestination="localhost:5001" 와 같이 변경할 수 있다. cf 환경에서는 manifest.yml 파일에 환경변수로 추가 -->
|
||||||
|
<property name="destination" value="${logstash_hostname:-localhost:5001}" />
|
||||||
|
<property name="app_name" value="${app_name:-reserve-request-service}" />
|
||||||
|
|
||||||
|
<!-- ELK - Logstash 로 로그를 전송하기 위한 appender -->
|
||||||
|
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
|
||||||
|
<destination>${destination}</destination><!-- native profile => localhost:8088 -->
|
||||||
|
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
|
||||||
|
<customFields>{"app.name":"${app_name}"}</customFields>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
<root level="WARN">
|
||||||
|
<appender-ref ref="LOGSTASH" />
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
</root>
|
||||||
|
</springProfile>
|
||||||
|
|
||||||
|
</configuration>
|
||||||
@@ -3,6 +3,7 @@ package org.egovframe.cloud.reserverequestservice.api;
|
|||||||
import static org.assertj.core.api.Assertions.*;
|
import static org.assertj.core.api.Assertions.*;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.ZoneId;
|
||||||
|
|
||||||
import org.egovframe.cloud.common.domain.Role;
|
import org.egovframe.cloud.common.domain.Role;
|
||||||
import org.egovframe.cloud.reserverequestservice.api.dto.ReserveResponseDto;
|
import org.egovframe.cloud.reserverequestservice.api.dto.ReserveResponseDto;
|
||||||
|
|||||||
@@ -17,8 +17,6 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
import java.io.IOException;
|
|
||||||
import java.security.GeneralSecurityException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* org.egovframe.cloud.userservice.api.user.UserApiController
|
* org.egovframe.cloud.userservice.api.user.UserApiController
|
||||||
@@ -127,7 +125,7 @@ public class UserApiController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 사용자 회원 가입
|
* 사용자 소셜 정보 조회
|
||||||
*
|
*
|
||||||
* @param requestDto 사용자 가입 요청 DTO
|
* @param requestDto 사용자 가입 요청 DTO
|
||||||
* @return Boolean 성공 여부
|
* @return Boolean 성공 여부
|
||||||
@@ -239,23 +237,21 @@ public class UserApiController {
|
|||||||
/**
|
/**
|
||||||
* 사용자 회원탈퇴
|
* 사용자 회원탈퇴
|
||||||
*
|
*
|
||||||
* @param requestDto 사용자 비밀번호 확인 요청 DTO
|
* @param requestDto 사용자 검증 요청 DTO
|
||||||
* @return Boolean 일치 여부
|
* @return Boolean 처리 여부
|
||||||
* @throws GeneralSecurityException 보안 예외
|
|
||||||
* @throws IOException 입출력 예외
|
|
||||||
*/
|
*/
|
||||||
@PostMapping("/api/v1/users/leave")
|
@PostMapping("/api/v1/users/leave")
|
||||||
public Boolean leave(@RequestBody @Valid UserVerifyRequestDto requestDto) throws GeneralSecurityException, IOException {
|
public Boolean leave(@RequestBody @Valid UserVerifyRequestDto requestDto) {
|
||||||
final String userId = SecurityContextHolder.getContext().getAuthentication().getName();
|
final String userId = SecurityContextHolder.getContext().getAuthentication().getName();
|
||||||
|
|
||||||
return userService.leave(userId, requestDto);
|
return userService.leave(userId, requestDto);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 사용자 회원탈퇴
|
* 사용자 삭제
|
||||||
*
|
*
|
||||||
* @param userId 사용자 비밀번호 확인 요청 DTO
|
* @param userId 사용자 id
|
||||||
* @return Boolean 일치 여부
|
* @return Boolean 처리 여부
|
||||||
*/
|
*/
|
||||||
@DeleteMapping("/api/v1/users/delete/{userId}")
|
@DeleteMapping("/api/v1/users/delete/{userId}")
|
||||||
public Boolean delete(@PathVariable String userId) {
|
public Boolean delete(@PathVariable String userId) {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import javax.validation.constraints.Pattern;
|
|||||||
/**
|
/**
|
||||||
* org.egovframe.cloud.userservice.api.user.dto.UserVerifyRequestDto
|
* org.egovframe.cloud.userservice.api.user.dto.UserVerifyRequestDto
|
||||||
*
|
*
|
||||||
* 사용자 탈퇴 요청 DTO 클래스
|
* 사용자 검증 요청 DTO 클래스
|
||||||
*
|
*
|
||||||
* @author 표준프레임워크센터 jooho
|
* @author 표준프레임워크센터 jooho
|
||||||
* @version 1.0
|
* @version 1.0
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ public class UserService extends AbstractService implements UserDetailsService {
|
|||||||
@Transactional
|
@Transactional
|
||||||
public String updateRefreshToken(String userId, String updateRefreshToken) {
|
public String updateRefreshToken(String userId, String updateRefreshToken) {
|
||||||
User user = userRepository.findByUserId(userId)
|
User user = userRepository.findByUserId(userId)
|
||||||
.orElseThrow(() -> new UsernameNotFoundException("해당 사용자가 없습니다."));
|
.orElseThrow(() -> new UsernameNotFoundException(getMessage("err.user.notexists")));
|
||||||
|
|
||||||
user.updateRefreshToken(updateRefreshToken);
|
user.updateRefreshToken(updateRefreshToken);
|
||||||
|
|
||||||
@@ -178,7 +178,7 @@ public class UserService extends AbstractService implements UserDetailsService {
|
|||||||
*/
|
*/
|
||||||
public User findByRefreshToken(String refreshToken) {
|
public User findByRefreshToken(String refreshToken) {
|
||||||
return userRepository.findByRefreshToken(refreshToken)
|
return userRepository.findByRefreshToken(refreshToken)
|
||||||
.orElseThrow(() -> new UsernameNotFoundException("해당 사용자가 없습니다."));
|
.orElseThrow(() -> new UsernameNotFoundException(getMessage("err.user.notexists")));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -189,7 +189,7 @@ public class UserService extends AbstractService implements UserDetailsService {
|
|||||||
*/
|
*/
|
||||||
public UserResponseDto findByUserId(String userId) {
|
public UserResponseDto findByUserId(String userId) {
|
||||||
User user = userRepository.findByUserId(userId)
|
User user = userRepository.findByUserId(userId)
|
||||||
.orElseThrow(() -> new UsernameNotFoundException("해당 사용자가 없습니다."));
|
.orElseThrow(() -> new UsernameNotFoundException(getMessage("err.user.notexists")));
|
||||||
|
|
||||||
return new UserResponseDto(user);
|
return new UserResponseDto(user);
|
||||||
}
|
}
|
||||||
@@ -202,7 +202,7 @@ public class UserService extends AbstractService implements UserDetailsService {
|
|||||||
*/
|
*/
|
||||||
public UserResponseDto findByEmail(String email) {
|
public UserResponseDto findByEmail(String email) {
|
||||||
User user = userRepository.findByEmail(email)
|
User user = userRepository.findByEmail(email)
|
||||||
.orElseThrow(() -> new UsernameNotFoundException("해당 사용자가 없습니다."));
|
.orElseThrow(() -> new UsernameNotFoundException(getMessage("err.user.notexists")));
|
||||||
|
|
||||||
return new UserResponseDto(user);
|
return new UserResponseDto(user);
|
||||||
}
|
}
|
||||||
@@ -297,7 +297,6 @@ public class UserService extends AbstractService implements UserDetailsService {
|
|||||||
throw new BusinessMessageException(getMessage("valid.required.format", new Object[]{getMessage("user.email")}));
|
throw new BusinessMessageException(getMessage("valid.required.format", new Object[]{getMessage("user.email")}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (userId == null || "".equals(userId)) {
|
if (userId == null || "".equals(userId)) {
|
||||||
return userRepository.findByEmail(email).isPresent();
|
return userRepository.findByEmail(email).isPresent();
|
||||||
} else {
|
} else {
|
||||||
@@ -431,7 +430,7 @@ public class UserService extends AbstractService implements UserDetailsService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
User user = userRepository.findByEmail(entity.getUserFindPasswordId().getEmailAddr())
|
User user = userRepository.findByEmail(entity.getUserFindPasswordId().getEmailAddr())
|
||||||
.orElseThrow(() -> new UsernameNotFoundException("해당 사용자가 없습니다."));
|
.orElseThrow(() -> new UsernameNotFoundException(getMessage("err.user.notexists")));
|
||||||
|
|
||||||
user.updatePassword(passwordEncoder.encode(requestDto.getPassword())); // 비밀번호 수정
|
user.updatePassword(passwordEncoder.encode(requestDto.getPassword())); // 비밀번호 수정
|
||||||
|
|
||||||
@@ -449,9 +448,14 @@ public class UserService extends AbstractService implements UserDetailsService {
|
|||||||
*/
|
*/
|
||||||
@Transactional
|
@Transactional
|
||||||
public Boolean updatePassword(String userId, UserPasswordUpdateRequestDto requestDto) {
|
public Boolean updatePassword(String userId, UserPasswordUpdateRequestDto requestDto) {
|
||||||
User entity = findUserVerify(userId, requestDto);
|
try {
|
||||||
|
User entity = findUserVerify(userId, requestDto);
|
||||||
|
|
||||||
entity.updatePassword(passwordEncoder.encode(requestDto.getNewPassword())); // 비밀번호 수정
|
entity.updatePassword(passwordEncoder.encode(requestDto.getNewPassword())); // 비밀번호 수정
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -547,7 +551,12 @@ public class UserService extends AbstractService implements UserDetailsService {
|
|||||||
* @return User 사용자 엔티티
|
* @return User 사용자 엔티티
|
||||||
*/
|
*/
|
||||||
private User findUserVerify(String userId, UserVerifyRequestDto requestDto) {
|
private User findUserVerify(String userId, UserVerifyRequestDto requestDto) {
|
||||||
|
if (userId == null || "".equals(userId)) {
|
||||||
|
throw new BusinessMessageException(getMessage("err.required.login"));
|
||||||
|
}
|
||||||
|
|
||||||
User user = null;
|
User user = null;
|
||||||
|
|
||||||
if ("password".equals(requestDto.getProvider())) {
|
if ("password".equals(requestDto.getProvider())) {
|
||||||
user = findUserVerifyPassword(userId, requestDto.getPassword());
|
user = findUserVerifyPassword(userId, requestDto.getPassword());
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,143 +0,0 @@
|
|||||||
package org.egovframe.cloud.userservice.api;
|
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.egovframe.cloud.common.domain.Role;
|
|
||||||
import org.egovframe.cloud.userservice.api.user.dto.UserResponseDto;
|
|
||||||
import org.egovframe.cloud.userservice.api.user.dto.UserSaveRequestDto;
|
|
||||||
import org.egovframe.cloud.userservice.api.user.dto.UserUpdateRequestDto;
|
|
||||||
import org.egovframe.cloud.userservice.domain.user.User;
|
|
||||||
import org.egovframe.cloud.userservice.domain.user.UserRepository;
|
|
||||||
import org.egovframe.cloud.userservice.service.user.UserService;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.junit.jupiter.api.Assertions;
|
|
||||||
import org.junit.jupiter.api.MethodOrderer;
|
|
||||||
import org.junit.jupiter.api.Order;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
import org.junit.jupiter.api.TestMethodOrder;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
|
||||||
import org.springframework.boot.test.web.client.TestRestTemplate;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
import org.springframework.test.context.ActiveProfiles;
|
|
||||||
import org.springframework.test.context.TestPropertySource;
|
|
||||||
import org.springframework.web.client.RestClientException;
|
|
||||||
|
|
||||||
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
|
||||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
|
||||||
@EnableConfigurationProperties
|
|
||||||
@TestPropertySource(properties = {"spring.config.location=classpath:application-test.yml"})
|
|
||||||
@ActiveProfiles(profiles = "test")
|
|
||||||
class UserApiControllerTest {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private UserRepository userRepository;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private UserService userService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private TestRestTemplate restTemplate;
|
|
||||||
|
|
||||||
// private static final String USER_SERVICE_URL = "http://localhost:8000/user-service";
|
|
||||||
private static final String TEST_COM = "@test.com";
|
|
||||||
private static final String TEST_EMAIL = System.currentTimeMillis() + TEST_COM;
|
|
||||||
private static final String TEST_PASSWORD = "test1234!";
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Order(Integer.MAX_VALUE)
|
|
||||||
public void cleanup() throws Exception {
|
|
||||||
// 테스트 후 데이터 삭제
|
|
||||||
List<User> users = userRepository.findByEmailContains("test.com");
|
|
||||||
users.forEach(user -> userRepository.deleteById(user.getId()));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Order(Integer.MIN_VALUE)
|
|
||||||
public void 사용자_등록된다() throws Exception {
|
|
||||||
// given
|
|
||||||
UserSaveRequestDto userSaveRequestDto = UserSaveRequestDto.builder()
|
|
||||||
.userName("사용자")
|
|
||||||
.email(TEST_EMAIL)
|
|
||||||
.password(TEST_PASSWORD)
|
|
||||||
.roleId(Role.USER.getKey())
|
|
||||||
.userStateCode("01")
|
|
||||||
.build();
|
|
||||||
userService.save(userSaveRequestDto);
|
|
||||||
|
|
||||||
// when
|
|
||||||
UserResponseDto findUser = userService.findByEmail(TEST_EMAIL);
|
|
||||||
|
|
||||||
// then
|
|
||||||
assertThat(findUser.getEmail()).isEqualTo(TEST_EMAIL);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Order(2)
|
|
||||||
public void 사용자_수정된다() throws Exception {
|
|
||||||
// given
|
|
||||||
UserResponseDto findUser = userService.findByEmail(TEST_EMAIL);
|
|
||||||
UserUpdateRequestDto userUpdateRequestDto = UserUpdateRequestDto.builder()
|
|
||||||
.userName("사용자수정")
|
|
||||||
.email(TEST_EMAIL)
|
|
||||||
.roleId(Role.USER.getKey())
|
|
||||||
.userStateCode("01")
|
|
||||||
.build();
|
|
||||||
|
|
||||||
// when
|
|
||||||
userService.update(findUser.getUserId(), userUpdateRequestDto);
|
|
||||||
UserResponseDto updatedUser = userService.findByEmail(TEST_EMAIL);
|
|
||||||
|
|
||||||
// then
|
|
||||||
assertThat(updatedUser.getUserName()).isEqualTo("사용자수정");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void 사용자_등록오류() throws Exception {
|
|
||||||
// given
|
|
||||||
UserSaveRequestDto userSaveRequestDto = UserSaveRequestDto.builder()
|
|
||||||
.userName("사용자")
|
|
||||||
.email("email")
|
|
||||||
.password("test")
|
|
||||||
.build();
|
|
||||||
|
|
||||||
String url = "/api/v1/users";
|
|
||||||
|
|
||||||
RestClientException restClientException = Assertions.assertThrows(RestClientException.class, () -> {
|
|
||||||
restTemplate.postForEntity(url, userSaveRequestDto, Long.class);
|
|
||||||
});
|
|
||||||
System.out.println("restClientException.getMessage() = " + restClientException.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void 사용자_로그인된다() throws Exception {
|
|
||||||
// given
|
|
||||||
JSONObject loginJson = new JSONObject();
|
|
||||||
loginJson.put("email", TEST_EMAIL);
|
|
||||||
loginJson.put("password", TEST_PASSWORD);
|
|
||||||
|
|
||||||
String url = "/login";
|
|
||||||
|
|
||||||
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, loginJson.toString(), String.class);
|
|
||||||
responseEntity.getHeaders().entrySet().forEach(System.out::println);
|
|
||||||
assertThat(responseEntity.getHeaders().containsKey("access-token")).isTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void 사용자_로그인_오류발생한다() throws Exception {
|
|
||||||
// given
|
|
||||||
JSONObject loginJson = new JSONObject();
|
|
||||||
loginJson.put("email", TEST_EMAIL);
|
|
||||||
loginJson.put("password", "test");
|
|
||||||
|
|
||||||
String url = "/login";
|
|
||||||
|
|
||||||
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, loginJson.toString(), String.class);
|
|
||||||
System.out.println("responseEntity = " + responseEntity);
|
|
||||||
assertThat(responseEntity.getHeaders().containsKey("access-token")).isFalse();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -218,7 +218,7 @@ class AuthorizationApiControllerTest {
|
|||||||
.andDo(MockMvcResultHandlers.print())
|
.andDo(MockMvcResultHandlers.print())
|
||||||
.andExpect(MockMvcResultMatchers.status().isOk())
|
.andExpect(MockMvcResultMatchers.status().isOk())
|
||||||
// .andExpect(MockMvcResultMatchers.content().string("11"));
|
// .andExpect(MockMvcResultMatchers.content().string("11"));
|
||||||
.andExpect(MockMvcResultMatchers.content().string("129")); // /src/test/resources/h2/data.sql 초기화 데이터의 마지막 순번 + 1
|
.andExpect(MockMvcResultMatchers.content().string("130")); // /src/test/resources/h2/data.sql 초기화 데이터의 마지막 순번 + 1
|
||||||
|
|
||||||
deleteTestDatas();
|
deleteTestDatas();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,664 @@
|
|||||||
|
package org.egovframe.cloud.userservice.api.user;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import org.egovframe.cloud.common.domain.Role;
|
||||||
|
import org.egovframe.cloud.userservice.api.user.dto.UserResponseDto;
|
||||||
|
import org.egovframe.cloud.userservice.api.user.dto.UserSaveRequestDto;
|
||||||
|
import org.egovframe.cloud.userservice.api.user.dto.UserUpdateRequestDto;
|
||||||
|
import org.egovframe.cloud.userservice.domain.user.User;
|
||||||
|
import org.egovframe.cloud.userservice.domain.user.UserRepository;
|
||||||
|
import org.egovframe.cloud.userservice.domain.user.UserStateCode;
|
||||||
|
import org.egovframe.cloud.userservice.service.user.UserService;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.junit.jupiter.api.*;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.boot.test.web.client.TestRestTemplate;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||||
|
import org.springframework.security.test.context.support.WithMockUser;
|
||||||
|
import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers;
|
||||||
|
import org.springframework.test.context.ActiveProfiles;
|
||||||
|
import org.springframework.test.context.TestPropertySource;
|
||||||
|
import org.springframework.test.web.servlet.MockMvc;
|
||||||
|
import org.springframework.test.web.servlet.ResultActions;
|
||||||
|
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
|
||||||
|
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
|
||||||
|
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
|
||||||
|
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
||||||
|
import org.springframework.util.LinkedMultiValueMap;
|
||||||
|
import org.springframework.util.MultiValueMap;
|
||||||
|
import org.springframework.web.client.RestClientException;
|
||||||
|
import org.springframework.web.context.WebApplicationContext;
|
||||||
|
import org.springframework.web.filter.CharacterEncodingFilter;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
||||||
|
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
||||||
|
@EnableConfigurationProperties
|
||||||
|
@TestPropertySource(properties = {"spring.config.location=classpath:application-test.yml"})
|
||||||
|
@ActiveProfiles(profiles = "test")
|
||||||
|
class UserApiControllerTest {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UserRepository userRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UserService userService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private TestRestTemplate restTemplate;
|
||||||
|
|
||||||
|
// private static final String USER_SERVICE_URL = "http://localhost:8000/user-service";
|
||||||
|
private static final String TEST_COM = "@test.com";
|
||||||
|
private static final String TEST_EMAIL = System.currentTimeMillis() + TEST_COM;
|
||||||
|
private static final String TEST_PASSWORD = "test1234!";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* API 경로
|
||||||
|
*/
|
||||||
|
private static final String URL = "/api/v1/users";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* WebApplicationContext
|
||||||
|
*/
|
||||||
|
@Autowired
|
||||||
|
private WebApplicationContext context;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MockMvc
|
||||||
|
*/
|
||||||
|
private MockMvc mvc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ObjectMapper
|
||||||
|
*/
|
||||||
|
@Autowired
|
||||||
|
private ObjectMapper objectMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 테스트 데이터
|
||||||
|
*/
|
||||||
|
private List<User> datas = new ArrayList<>();
|
||||||
|
private final Integer GIVEN_DATA_COUNT = 10;
|
||||||
|
private final String USER_NAME_PREFIX = "USER";
|
||||||
|
private final String TOKEN = "1234567890";
|
||||||
|
private final String DECRYPTED_PASSWORD = "test1234!";
|
||||||
|
private final String ENCRYPTED_PASSWORD = "$2a$10$Xf9rt9ziTa3AXCuxG2TTruCC0RKCG62ukI6cHrptHnTMgCrviC8j.";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 테스트 시작 전 수행
|
||||||
|
*/
|
||||||
|
@BeforeEach
|
||||||
|
void setUp() {
|
||||||
|
mvc = MockMvcBuilders.webAppContextSetup(context)
|
||||||
|
.addFilter(new CharacterEncodingFilter("UTF-8"))
|
||||||
|
.apply(SecurityMockMvcConfigurers.springSecurity())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(Integer.MAX_VALUE)
|
||||||
|
public void cleanup() {
|
||||||
|
// 테스트 후 데이터 삭제
|
||||||
|
List<User> users = userRepository.findByEmailContains("test.com");
|
||||||
|
users.forEach(user -> userRepository.deleteById(user.getId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(Integer.MIN_VALUE)
|
||||||
|
public void 사용자_등록된다() {
|
||||||
|
// given
|
||||||
|
UserSaveRequestDto userSaveRequestDto = UserSaveRequestDto.builder()
|
||||||
|
.userName("사용자")
|
||||||
|
.email(TEST_EMAIL)
|
||||||
|
.password(TEST_PASSWORD)
|
||||||
|
.roleId(Role.USER.getKey())
|
||||||
|
.userStateCode("01")
|
||||||
|
.build();
|
||||||
|
userService.save(userSaveRequestDto);
|
||||||
|
|
||||||
|
// when
|
||||||
|
UserResponseDto findUser = userService.findByEmail(TEST_EMAIL);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(findUser.getEmail()).isEqualTo(TEST_EMAIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(2)
|
||||||
|
public void 사용자_수정된다() {
|
||||||
|
// given
|
||||||
|
UserResponseDto findUser = userService.findByEmail(TEST_EMAIL);
|
||||||
|
UserUpdateRequestDto userUpdateRequestDto = UserUpdateRequestDto.builder()
|
||||||
|
.userName("사용자수정")
|
||||||
|
.email(TEST_EMAIL)
|
||||||
|
.roleId(Role.USER.getKey())
|
||||||
|
.userStateCode("01")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// when
|
||||||
|
userService.update(findUser.getUserId(), userUpdateRequestDto);
|
||||||
|
UserResponseDto updatedUser = userService.findByEmail(TEST_EMAIL);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(updatedUser.getUserName()).isEqualTo("사용자수정");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void 사용자_등록오류() {
|
||||||
|
// given
|
||||||
|
UserSaveRequestDto userSaveRequestDto = UserSaveRequestDto.builder()
|
||||||
|
.userName("사용자")
|
||||||
|
.email("email")
|
||||||
|
.password("test")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
String url = "/api/v1/users";
|
||||||
|
|
||||||
|
RestClientException restClientException = Assertions.assertThrows(RestClientException.class, () -> {
|
||||||
|
restTemplate.postForEntity(url, userSaveRequestDto, Long.class);
|
||||||
|
});
|
||||||
|
System.out.println("restClientException.getMessage() = " + restClientException.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void 사용자_로그인된다() throws Exception {
|
||||||
|
// given
|
||||||
|
JSONObject loginJson = new JSONObject();
|
||||||
|
loginJson.put("email", TEST_EMAIL);
|
||||||
|
loginJson.put("password", TEST_PASSWORD);
|
||||||
|
|
||||||
|
String url = "/login";
|
||||||
|
|
||||||
|
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, loginJson.toString(), String.class);
|
||||||
|
responseEntity.getHeaders().entrySet().forEach(System.out::println);
|
||||||
|
assertThat(responseEntity.getHeaders().containsKey("access-token")).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void 사용자_로그인_오류발생한다() throws Exception {
|
||||||
|
// given
|
||||||
|
JSONObject loginJson = new JSONObject();
|
||||||
|
loginJson.put("email", TEST_EMAIL);
|
||||||
|
loginJson.put("password", "test");
|
||||||
|
|
||||||
|
String url = "/login";
|
||||||
|
|
||||||
|
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, loginJson.toString(), String.class);
|
||||||
|
System.out.println("responseEntity = " + responseEntity);
|
||||||
|
assertThat(responseEntity.getHeaders().containsKey("access-token")).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 사용자 페이지 목록 조회 테스트
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
@WithMockUser(roles = "ADMIN")
|
||||||
|
void 사용자_페이지_목록_조회() throws Exception {
|
||||||
|
// given
|
||||||
|
insertUsers();
|
||||||
|
|
||||||
|
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
|
||||||
|
params.add("keywordType", "userName");
|
||||||
|
params.add("keyword", USER_NAME_PREFIX);
|
||||||
|
params.add("page", "0");
|
||||||
|
params.add("size", "10");
|
||||||
|
|
||||||
|
// when
|
||||||
|
ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.get(URL)
|
||||||
|
.params(params));
|
||||||
|
|
||||||
|
// then
|
||||||
|
resultActions
|
||||||
|
.andDo(MockMvcResultHandlers.print())
|
||||||
|
.andExpect(MockMvcResultMatchers.status().isOk())
|
||||||
|
.andExpect(MockMvcResultMatchers.jsonPath("$.numberOfElements").value(GIVEN_DATA_COUNT))
|
||||||
|
.andExpect(MockMvcResultMatchers.jsonPath("$.content[0].userName").value(USER_NAME_PREFIX + "1"));
|
||||||
|
|
||||||
|
deleteUsers();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 사용자 상세 조회 테스트
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
@WithMockUser(roles = "ADMIN")
|
||||||
|
void 사용자_상세_조회() throws Exception {
|
||||||
|
// given
|
||||||
|
User entity = insertUser();
|
||||||
|
|
||||||
|
final String userId = entity.getUserId();
|
||||||
|
|
||||||
|
// when
|
||||||
|
ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.get(URL + "/" + userId));
|
||||||
|
|
||||||
|
// then
|
||||||
|
resultActions
|
||||||
|
.andDo(MockMvcResultHandlers.print())
|
||||||
|
.andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON))
|
||||||
|
.andExpect(MockMvcResultMatchers.status().isOk())
|
||||||
|
.andExpect(MockMvcResultMatchers.jsonPath("$.userId").value(userId))
|
||||||
|
.andExpect(MockMvcResultMatchers.jsonPath("$.userName").value(entity.getUserName()))
|
||||||
|
.andExpect(MockMvcResultMatchers.jsonPath("$.email").value(entity.getEmail()))
|
||||||
|
.andExpect(MockMvcResultMatchers.jsonPath("$.roleId").value(entity.getRole().getKey()))
|
||||||
|
.andExpect(MockMvcResultMatchers.jsonPath("$.userStateCode").value(entity.getUserStateCode()));
|
||||||
|
|
||||||
|
deleteUser(entity.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 사용자 소셜 정보 조회 테스트
|
||||||
|
* 많이 시도하면 구글에서 블락 할수도..
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
void 사용자_소셜_정보_조회_테스트() throws Exception {
|
||||||
|
// given
|
||||||
|
Map<String, Object> params = new HashMap<>();
|
||||||
|
params.put("provider", "google");
|
||||||
|
params.put("token", TOKEN);
|
||||||
|
|
||||||
|
// when
|
||||||
|
ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.post(URL + "/social")
|
||||||
|
.accept(MediaType.APPLICATION_JSON)
|
||||||
|
.contentType("application/json;charset=UTF-8")
|
||||||
|
.content(objectMapper.writeValueAsString(params)));
|
||||||
|
|
||||||
|
// then
|
||||||
|
resultActions
|
||||||
|
.andDo(MockMvcResultHandlers.print())
|
||||||
|
.andExpect(MockMvcResultMatchers.status().is(HttpStatus.BAD_REQUEST.value())); // org.egovframe.cloud.common.exception.BusinessMessageException: 공급사에서 회원 정보를 확인할 수 없습니다.
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 이메일 중복 확인 테스트
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
void 이메일_중복_확인_테스트() throws Exception {
|
||||||
|
// given
|
||||||
|
User entity = insertUser();
|
||||||
|
|
||||||
|
Map<String, Object> params = new HashMap<>();
|
||||||
|
params.put("email", "1" + TEST_COM);
|
||||||
|
|
||||||
|
// when
|
||||||
|
ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.post(URL + "/exists")
|
||||||
|
.accept(MediaType.APPLICATION_JSON)
|
||||||
|
.contentType("application/json;charset=UTF-8")
|
||||||
|
.content(objectMapper.writeValueAsString(params)));
|
||||||
|
|
||||||
|
// then
|
||||||
|
resultActions
|
||||||
|
.andDo(MockMvcResultHandlers.print())
|
||||||
|
.andExpect(MockMvcResultMatchers.status().isOk())
|
||||||
|
.andExpect(MockMvcResultMatchers.content().string("true"));
|
||||||
|
|
||||||
|
deleteUser(entity.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 사용자 회원 가입 테스트
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
void 사용자_회원_가입_테스트() throws Exception {
|
||||||
|
// given
|
||||||
|
final String email = "test_join" + TEST_COM;
|
||||||
|
|
||||||
|
Map<String, Object> params = new HashMap<>();
|
||||||
|
params.put("userName", USER_NAME_PREFIX + "1");
|
||||||
|
params.put("email", email);
|
||||||
|
params.put("password", DECRYPTED_PASSWORD);
|
||||||
|
|
||||||
|
// when
|
||||||
|
ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.post(URL + "/join")
|
||||||
|
.accept(MediaType.APPLICATION_JSON)
|
||||||
|
.contentType("application/json;charset=UTF-8")
|
||||||
|
.content(objectMapper.writeValueAsString(params)));
|
||||||
|
|
||||||
|
// then
|
||||||
|
resultActions
|
||||||
|
.andDo(MockMvcResultHandlers.print())
|
||||||
|
.andExpect(MockMvcResultMatchers.status().isOk())
|
||||||
|
.andExpect(MockMvcResultMatchers.content().string("true"));
|
||||||
|
|
||||||
|
// userRepository.findByEmail("test_join" + TEST_COM).ifPresent(u -> deleteUser(u.getId()));
|
||||||
|
|
||||||
|
User user = userRepository.findByEmail(email).orElseThrow(() -> new UsernameNotFoundException(String.format("[%s]사용자가 없습니다.", email)));
|
||||||
|
assertThat(user.getUserName()).isEqualTo(USER_NAME_PREFIX + "1");
|
||||||
|
assertThat(user.getEmail()).isEqualTo(email);
|
||||||
|
|
||||||
|
deleteUser(user.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 사용자 비밀번호 찾기 테스트
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
void 사용자_비밀번호_찾기_테스트() throws Exception {
|
||||||
|
// given
|
||||||
|
Map<String, Object> userData = new HashMap<>();
|
||||||
|
userData.put("email", "give928@gmail.com");
|
||||||
|
|
||||||
|
User user = insertUser(userData);
|
||||||
|
|
||||||
|
Map<String, Object> params = new HashMap<>();
|
||||||
|
params.put("userName", user.getUserName());
|
||||||
|
params.put("emailAddr", user.getEmail());
|
||||||
|
params.put("mainUrl", "http://localhost:4000");
|
||||||
|
params.put("changePasswordUrl", "http://localhost:4000/user/password/change");
|
||||||
|
|
||||||
|
// when
|
||||||
|
ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.post(URL + "/password/find")
|
||||||
|
.accept(MediaType.APPLICATION_JSON)
|
||||||
|
.contentType("application/json;charset=UTF-8")
|
||||||
|
.content(objectMapper.writeValueAsString(params)));
|
||||||
|
|
||||||
|
// then
|
||||||
|
resultActions
|
||||||
|
.andDo(MockMvcResultHandlers.print())
|
||||||
|
.andExpect(MockMvcResultMatchers.status().isOk())
|
||||||
|
.andExpect(MockMvcResultMatchers.content().string("true")); // 이메일 수신 확인
|
||||||
|
|
||||||
|
deleteUser(user.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 사용자 비밀번호 찾기 유효성 확인 테스트
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
void 사용자_비밀번호_찾기_유효성_확인_테스트() throws Exception {
|
||||||
|
// given
|
||||||
|
final String token = TOKEN;
|
||||||
|
|
||||||
|
// when
|
||||||
|
ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.get(URL + "/password/valid/" + token)
|
||||||
|
.accept(MediaType.APPLICATION_JSON)
|
||||||
|
.contentType("application/json;charset=UTF-8"));
|
||||||
|
|
||||||
|
// then
|
||||||
|
resultActions
|
||||||
|
.andDo(MockMvcResultHandlers.print())
|
||||||
|
.andExpect(MockMvcResultMatchers.status().isOk())
|
||||||
|
.andExpect(MockMvcResultMatchers.content().string("false"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 사용자 비밀번호 찾기 변경 테스트
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
void 사용자_비밀번호_찾기_변경_테스트() throws Exception {
|
||||||
|
// given
|
||||||
|
Map<String, Object> params = new HashMap<>();
|
||||||
|
params.put("tokenValue", TOKEN);
|
||||||
|
params.put("password", DECRYPTED_PASSWORD);
|
||||||
|
|
||||||
|
// when
|
||||||
|
ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.put(URL + "/password/change")
|
||||||
|
.accept(MediaType.APPLICATION_JSON)
|
||||||
|
.contentType("application/json;charset=UTF-8")
|
||||||
|
.content(objectMapper.writeValueAsString(params)));
|
||||||
|
|
||||||
|
// then
|
||||||
|
resultActions
|
||||||
|
.andDo(MockMvcResultHandlers.print())
|
||||||
|
.andExpect(MockMvcResultMatchers.status().is(HttpStatus.BAD_REQUEST.value())); // org.egovframe.cloud.common.exception.BusinessMessageException: 인증시간이 만료되었습니다. 처음부터 다시 진행해주시기 바랍니다.
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 사용자 비밀번호 변경 테스트
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
@WithMockUser(roles = "USER", username = "test-user")
|
||||||
|
void 사용자_비밀번호_변경_테스트() throws Exception {
|
||||||
|
// given
|
||||||
|
final String userId = "test-user";
|
||||||
|
|
||||||
|
Map<String, Object> userData = new HashMap<>();
|
||||||
|
userData.put("userId", userId);
|
||||||
|
|
||||||
|
User entity = insertUser(userData);
|
||||||
|
|
||||||
|
final Long userNo = entity.getId();
|
||||||
|
|
||||||
|
Map<String, Object> params = new HashMap<>();
|
||||||
|
params.put("provider", "password");
|
||||||
|
params.put("password", DECRYPTED_PASSWORD);
|
||||||
|
params.put("newPassword", "P@ssw0rd1");
|
||||||
|
|
||||||
|
// when
|
||||||
|
ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.put(URL + "/password/update")
|
||||||
|
.accept(MediaType.APPLICATION_JSON)
|
||||||
|
.contentType("application/json;charset=UTF-8")
|
||||||
|
.content(objectMapper.writeValueAsString(params)));
|
||||||
|
|
||||||
|
// then
|
||||||
|
resultActions
|
||||||
|
.andDo(MockMvcResultHandlers.print())
|
||||||
|
.andExpect(MockMvcResultMatchers.status().isOk())
|
||||||
|
.andExpect(MockMvcResultMatchers.content().string("true"));
|
||||||
|
|
||||||
|
User user = selectUser(userNo).orElseThrow(() -> new UsernameNotFoundException(String.format("[%d]사용자가 없습니다.", userNo)));
|
||||||
|
assertThat(user.getEncryptedPassword()).isNotEqualTo(entity.getEncryptedPassword());
|
||||||
|
|
||||||
|
deleteUser(entity.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 사용자 비밀번호 확인 테스트
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
@WithMockUser(roles = "USER", username = "test-user")
|
||||||
|
void 사용자_비밀번호_확인_테스트() throws Exception {
|
||||||
|
// given
|
||||||
|
final String userId = "test-user";
|
||||||
|
|
||||||
|
Map<String, Object> userData = new HashMap<>();
|
||||||
|
userData.put("userId", userId);
|
||||||
|
|
||||||
|
User entity = insertUser(userData);
|
||||||
|
|
||||||
|
Map<String, Object> params = new HashMap<>();
|
||||||
|
params.put("password", DECRYPTED_PASSWORD);
|
||||||
|
|
||||||
|
// when
|
||||||
|
ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.post(URL + "/password/match")
|
||||||
|
.accept(MediaType.APPLICATION_JSON)
|
||||||
|
.contentType("application/json;charset=UTF-8")
|
||||||
|
.content(objectMapper.writeValueAsString(params)));
|
||||||
|
|
||||||
|
// then
|
||||||
|
resultActions
|
||||||
|
.andDo(MockMvcResultHandlers.print())
|
||||||
|
.andExpect(MockMvcResultMatchers.status().isOk())
|
||||||
|
.andExpect(MockMvcResultMatchers.content().string("true"));
|
||||||
|
|
||||||
|
deleteUser(entity.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 사용자 회원정보 변경 테스트
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
@WithMockUser(roles = "USER", username = "test-user")
|
||||||
|
void 사용자_회원정보_변경_테스트() throws Exception {
|
||||||
|
// given
|
||||||
|
final String userId = "test-user";
|
||||||
|
|
||||||
|
Map<String, Object> userData = new HashMap<>();
|
||||||
|
userData.put("userId", userId);
|
||||||
|
|
||||||
|
User entity = insertUser(userData);
|
||||||
|
|
||||||
|
final Long userNo = entity.getId();
|
||||||
|
final String userName = "TEST-USER";
|
||||||
|
final String email = "2" + TEST_COM;
|
||||||
|
|
||||||
|
Map<String, Object> params = new HashMap<>();
|
||||||
|
params.put("provider", "password");
|
||||||
|
params.put("password", DECRYPTED_PASSWORD);
|
||||||
|
params.put("userName", userName);
|
||||||
|
params.put("email", email);
|
||||||
|
|
||||||
|
// when
|
||||||
|
ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.put(URL + "/info/" + userId)
|
||||||
|
.accept(MediaType.APPLICATION_JSON)
|
||||||
|
.contentType("application/json;charset=UTF-8")
|
||||||
|
.content(objectMapper.writeValueAsString(params)));
|
||||||
|
|
||||||
|
// then
|
||||||
|
resultActions
|
||||||
|
.andDo(MockMvcResultHandlers.print())
|
||||||
|
.andExpect(MockMvcResultMatchers.status().isOk())
|
||||||
|
.andExpect(MockMvcResultMatchers.content().string(userId));
|
||||||
|
|
||||||
|
User user = selectUser(userNo).orElseThrow(() -> new UsernameNotFoundException(String.format("[%d]사용자가 없습니다.", userNo)));
|
||||||
|
assertThat(user.getUserName()).isEqualTo(userName);
|
||||||
|
assertThat(user.getEmail()).isEqualTo(email);
|
||||||
|
|
||||||
|
deleteUser(entity.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 사용자 회원 탈퇴 테스트
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
@WithMockUser(roles = "USER", username = "test-user")
|
||||||
|
void 사용자_회원_탈퇴_테스트() throws Exception {
|
||||||
|
// given
|
||||||
|
final String userId = "test-user";
|
||||||
|
|
||||||
|
Map<String, Object> userData = new HashMap<>();
|
||||||
|
userData.put("userId", userId);
|
||||||
|
|
||||||
|
User entity = insertUser(userData);
|
||||||
|
|
||||||
|
final Long userNo = entity.getId();
|
||||||
|
|
||||||
|
Map<String, Object> params = new HashMap<>();
|
||||||
|
params.put("provider", "password");
|
||||||
|
params.put("password", DECRYPTED_PASSWORD);
|
||||||
|
|
||||||
|
// when
|
||||||
|
ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.post(URL + "/leave")
|
||||||
|
.accept(MediaType.APPLICATION_JSON)
|
||||||
|
.contentType("application/json;charset=UTF-8")
|
||||||
|
.content(objectMapper.writeValueAsString(params)));
|
||||||
|
|
||||||
|
// then
|
||||||
|
resultActions
|
||||||
|
.andDo(MockMvcResultHandlers.print())
|
||||||
|
.andExpect(MockMvcResultMatchers.status().isOk())
|
||||||
|
.andExpect(MockMvcResultMatchers.content().string("true"));
|
||||||
|
|
||||||
|
User user = selectUser(userNo).orElseThrow(() -> new UsernameNotFoundException(String.format("[%d]사용자가 없습니다.", userNo)));
|
||||||
|
assertThat(user.getUserStateCode()).isEqualTo(UserStateCode.LEAVE.getKey());
|
||||||
|
|
||||||
|
deleteUser(entity.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 사용자 삭제 테스트
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
@WithMockUser(roles = "ADMIN")
|
||||||
|
void 사용자_삭제_테스트() throws Exception {
|
||||||
|
// given
|
||||||
|
final String userId = "test-user";
|
||||||
|
|
||||||
|
Map<String, Object> userData = new HashMap<>();
|
||||||
|
userData.put("userId", userId);
|
||||||
|
|
||||||
|
User entity = insertUser(userData);
|
||||||
|
|
||||||
|
final Long userNo = entity.getId();
|
||||||
|
|
||||||
|
// when
|
||||||
|
ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.delete(URL + "/delete/" + userId)
|
||||||
|
.accept(MediaType.APPLICATION_JSON)
|
||||||
|
.contentType("application/json;charset=UTF-8"));
|
||||||
|
|
||||||
|
// then
|
||||||
|
resultActions
|
||||||
|
.andDo(MockMvcResultHandlers.print())
|
||||||
|
.andExpect(MockMvcResultMatchers.status().isOk())
|
||||||
|
.andExpect(MockMvcResultMatchers.content().string("true"));
|
||||||
|
|
||||||
|
User user = selectUser(userNo).orElseThrow(() -> new UsernameNotFoundException(String.format("[%d]사용자가 없습니다.", userNo)));
|
||||||
|
assertThat(user.getUserStateCode()).isEqualTo(UserStateCode.DELETE.getKey());
|
||||||
|
|
||||||
|
deleteUser(entity.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 테스트 데이터 등록
|
||||||
|
*/
|
||||||
|
private void insertUsers() {
|
||||||
|
for (int i = 1; i <= GIVEN_DATA_COUNT; i++) {
|
||||||
|
datas.add(userRepository.save(User.builder()
|
||||||
|
.userId(UUID.randomUUID().toString())
|
||||||
|
.encryptedPassword(ENCRYPTED_PASSWORD)
|
||||||
|
.userName(USER_NAME_PREFIX + i)
|
||||||
|
.email(i + TEST_COM)
|
||||||
|
.role(Role.USER)
|
||||||
|
.userStateCode(UserStateCode.NORMAL.getKey())
|
||||||
|
.build()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 테스트 데이터 삭제
|
||||||
|
*/
|
||||||
|
private void deleteUsers() {
|
||||||
|
if (datas != null) {
|
||||||
|
if (!datas.isEmpty()) userRepository.deleteAll(datas);
|
||||||
|
|
||||||
|
datas.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 테스트 데이터 단건 등록
|
||||||
|
*
|
||||||
|
* @return User 사용자 엔티티
|
||||||
|
*/
|
||||||
|
private User insertUser() {
|
||||||
|
Map<String, Object> userData = new HashMap<>();
|
||||||
|
userData.put("email", "1" + TEST_COM);
|
||||||
|
|
||||||
|
return insertUser(userData);
|
||||||
|
}
|
||||||
|
private User insertUser(Map<String, Object> userData) {
|
||||||
|
return userRepository.save(User.builder()
|
||||||
|
.userId(userData.get("userId") != null ? (String) userData.get("userId") : UUID.randomUUID().toString())
|
||||||
|
.encryptedPassword(ENCRYPTED_PASSWORD)
|
||||||
|
.userName(USER_NAME_PREFIX + "1")
|
||||||
|
.email(userData.get("email") != null ? (String) userData.get("email") : "1" + TEST_COM)
|
||||||
|
.role(Role.USER)
|
||||||
|
.userStateCode(UserStateCode.NORMAL.getKey())
|
||||||
|
.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 테스트 데이터 단건 삭제
|
||||||
|
*/
|
||||||
|
private void deleteUser(Long userNo) {
|
||||||
|
userRepository.deleteById(userNo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 테스트 데이터 단건 조회
|
||||||
|
*
|
||||||
|
* @param userNo 사용자 번호
|
||||||
|
* @return Optional<User> 사용자
|
||||||
|
*/
|
||||||
|
private Optional<User> selectUser(Long userNo) {
|
||||||
|
return userRepository.findById(userNo);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -26,7 +26,9 @@ INSERT INTO `authorization` (authorization_name,url_pattern_value,http_method_co
|
|||||||
('예약지역 사용여부 토글','/reserve-item-service/api/v1/locations/?*/?*','PUT',125,'87638675-11fa-49e5-9bd1-d2524bf6fa45',now(),'87638675-11fa-49e5-9bd1-d2524bf6fa45',now()),
|
('예약지역 사용여부 토글','/reserve-item-service/api/v1/locations/?*/?*','PUT',125,'87638675-11fa-49e5-9bd1-d2524bf6fa45',now(),'87638675-11fa-49e5-9bd1-d2524bf6fa45',now()),
|
||||||
('사용자 정보 수정','/user-service/api/v1/users/info/?*','PUT',126,'65a00f65-8460-49af-98ec-042977e56f4b',now(),'65a00f65-8460-49af-98ec-042977e56f4b',now()),
|
('사용자 정보 수정','/user-service/api/v1/users/info/?*','PUT',126,'65a00f65-8460-49af-98ec-042977e56f4b',now(),'65a00f65-8460-49af-98ec-042977e56f4b',now()),
|
||||||
('사용자 회원탈퇴','/user-service/api/v1/users/leave','POST',127,'65a00f65-8460-49af-98ec-042977e56f4b',now(),'65a00f65-8460-49af-98ec-042977e56f4b',now()),
|
('사용자 회원탈퇴','/user-service/api/v1/users/leave','POST',127,'65a00f65-8460-49af-98ec-042977e56f4b',now(),'65a00f65-8460-49af-98ec-042977e56f4b',now()),
|
||||||
('사용자 삭제','/user-service/api/v1/users/delete/?*','DELETE',128,'65a00f65-8460-49af-98ec-042977e56f4b',now(),'65a00f65-8460-49af-98ec-042977e56f4b',now());
|
('사용자 삭제','/user-service/api/v1/users/delete/?*','DELETE',128,'65a00f65-8460-49af-98ec-042977e56f4b',now(),'65a00f65-8460-49af-98ec-042977e56f4b',now()),
|
||||||
|
('사용자 소셜 정보 조회,'/user-service/api/v1/users/social','POST',129,'65a00f65-8460-49af-98ec-042977e56f4b',now(),'65a00f65-8460-49af-98ec-042977e56f4b',now());
|
||||||
|
|
||||||
|
|
||||||
INSERT INTO `role` (role_id,role_name,role_content,sort_seq,created_date) VALUES
|
INSERT INTO `role` (role_id,role_name,role_content,sort_seq,created_date) VALUES
|
||||||
('ROLE_ADMIN','시스템 관리자','시스템 관리자 권한',101,'2021-10-20 13:39:15'),
|
('ROLE_ADMIN','시스템 관리자','시스템 관리자 권한',101,'2021-10-20 13:39:15'),
|
||||||
@@ -34,5 +36,58 @@ INSERT INTO `role` (role_id,role_name,role_content,sort_seq,created_date) VALUES
|
|||||||
('ROLE_EMPLOYEE','내부 사용자','내부 사용자 권한',102,'2021-10-20 13:39:15'),
|
('ROLE_EMPLOYEE','내부 사용자','내부 사용자 권한',102,'2021-10-20 13:39:15'),
|
||||||
('ROLE_USER','일반 사용자','일반 사용자 권한',103,'2021-10-20 13:39:15');
|
('ROLE_USER','일반 사용자','일반 사용자 권한',103,'2021-10-20 13:39:15');
|
||||||
|
|
||||||
INSERT INTO role_authorization (role_id,authorization_no,created_by,created_date)
|
INSERT INTO role_authorization (role_id,authorization_no,created_by,created_date)
|
||||||
select 'ROLE_ADMIN', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`;
|
select 'ROLE_ADMIN', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`
|
||||||
|
|
||||||
|
union all
|
||||||
|
select 'ROLE_USER', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`
|
||||||
|
where url_pattern_value = '/user-service/api/v1/users/?*' and http_method_code = 'GET'
|
||||||
|
union all
|
||||||
|
select 'ROLE_USER', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`
|
||||||
|
where url_pattern_value = '/user-service/api/v1/users/token/refresh' and http_method_code = 'GET'
|
||||||
|
union all
|
||||||
|
select 'ROLE_USER', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`
|
||||||
|
where url_pattern_value = '/user-service/api/v1/authorizations/check' and http_method_code = 'GET'
|
||||||
|
union all
|
||||||
|
select 'ROLE_USER', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`
|
||||||
|
where url_pattern_value = '/user-service/api/v1/users/exists' and http_method_code = 'POST'
|
||||||
|
union all
|
||||||
|
select 'ROLE_USER', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`
|
||||||
|
where url_pattern_value = '/user-service/api/v1/users/password/update' and http_method_code = 'PUT'
|
||||||
|
union all
|
||||||
|
select 'ROLE_USER', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`
|
||||||
|
where url_pattern_value = '/user-service/api/v1/users/password/match' and http_method_code = 'POST'
|
||||||
|
union all
|
||||||
|
select 'ROLE_USER', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`
|
||||||
|
where url_pattern_value = '/user-service/api/v1/users/info/?*' and http_method_code = 'PUT'
|
||||||
|
union all
|
||||||
|
select 'ROLE_USER', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`
|
||||||
|
where url_pattern_value = '/user-service/api/v1/users/leave' and http_method_code = 'POST'
|
||||||
|
|
||||||
|
union all
|
||||||
|
select 'ROLE_ANONYMOUS', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`
|
||||||
|
where url_pattern_value = '/user-service/api/v1/users/?*' and http_method_code = 'GET'
|
||||||
|
union all
|
||||||
|
select 'ROLE_ANONYMOUS', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`
|
||||||
|
where url_pattern_value = '/user-service/api/v1/users/token/refresh' and http_method_code = 'GET'
|
||||||
|
union all
|
||||||
|
select 'ROLE_ANONYMOUS', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`
|
||||||
|
where url_pattern_value = '/user-service/api/v1/authorizations/check' and http_method_code = 'GET'
|
||||||
|
union all
|
||||||
|
select 'ROLE_ANONYMOUS', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`
|
||||||
|
where url_pattern_value = '/user-service/api/v1/users/exists' and http_method_code = 'POST'
|
||||||
|
union all
|
||||||
|
select 'ROLE_ANONYMOUS', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`
|
||||||
|
where url_pattern_value = '/user-service/api/v1/users/join' and http_method_code = 'POST'
|
||||||
|
union all
|
||||||
|
select 'ROLE_ANONYMOUS', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`
|
||||||
|
where url_pattern_value = '/user-service/api/v1/users/password/find' and http_method_code = 'POST'
|
||||||
|
union all
|
||||||
|
select 'ROLE_ANONYMOUS', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`
|
||||||
|
where url_pattern_value = '/user-service/api/v1/users/password/valid/?*' and http_method_code = 'GET'
|
||||||
|
union all
|
||||||
|
select 'ROLE_ANONYMOUS', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`
|
||||||
|
where url_pattern_value = '/user-service/api/v1/users/password/change' and http_method_code = 'PUT'
|
||||||
|
union all
|
||||||
|
select 'ROLE_ANONYMOUS', authorization_no, '65a00f65-8460-49af-98ec-042977e56f4b', now() from `authorization`
|
||||||
|
where url_pattern_value = '/user-service/api/v1/users/social' and http_method_code = 'POST';
|
||||||
|
|||||||
@@ -3,14 +3,14 @@ spring:
|
|||||||
url: r2dbc:mysql://${mysql.hostname:localhost}:3306/msaportal?serverTimezone=Asia/Seoul
|
url: r2dbc:mysql://${mysql.hostname:localhost}:3306/msaportal?serverTimezone=Asia/Seoul
|
||||||
username: msaportal
|
username: msaportal
|
||||||
password: msaportal
|
password: msaportal
|
||||||
cloud:
|
cloud:
|
||||||
stream:
|
stream:
|
||||||
function:
|
function:
|
||||||
definition: reserveRequest # 예약 요청후 물품 재고업데이트 이벤트에 대한 consumer function
|
definition: reserveRequest # 예약 요청후 물품 재고업데이트 이벤트에 대한 consumer function
|
||||||
bindings:
|
bindings:
|
||||||
reserveRequest-in-0: # 예약 요청후 물품 재고업데이트 이벤트에 대한 consumer binding
|
reserveRequest-in-0: # 예약 요청후 물품 재고업데이트 이벤트에 대한 consumer binding
|
||||||
destination: reserve-request.topic # queue name
|
destination: reserve-request.topic # queue name
|
||||||
group: reserved
|
group: reserved
|
||||||
inventoryUpdated-out-0: # 예약 요청후 물품 재고업데이트 결과에 이벤트에 대한 supplier binding
|
inventoryUpdated-out-0: # 예약 요청후 물품 재고업데이트 결과에 이벤트에 대한 supplier binding
|
||||||
destination: inventory-updated.topic # queue name
|
destination: inventory-updated.topic # queue name
|
||||||
group: reserved
|
group: reserved
|
||||||
|
|||||||
@@ -3,14 +3,14 @@ spring:
|
|||||||
url: r2dbc:mysql://${mysql.hostname:localhost}:3306/reservation?serverTimezone=Asia/Seoul
|
url: r2dbc:mysql://${mysql.hostname:localhost}:3306/reservation?serverTimezone=Asia/Seoul
|
||||||
username: msaportal
|
username: msaportal
|
||||||
password: msaportal
|
password: msaportal
|
||||||
cloud:
|
cloud:
|
||||||
stream:
|
stream:
|
||||||
function:
|
function:
|
||||||
definition: inventoryUpdated # 예약 요청후 물품 재고업데이트 결과에 이벤트에 대한 consumer function
|
definition: inventoryUpdated # 예약 요청후 물품 재고업데이트 결과에 이벤트에 대한 consumer function
|
||||||
bindings:
|
bindings:
|
||||||
reserveRequest-out-0: # 예약 요청후 물품 재고업데이트 이벤트에 대한 supplier binding
|
reserveRequest-out-0: # 예약 요청후 물품 재고업데이트 이벤트에 대한 supplier binding
|
||||||
destination: reserve-request.topic # queue name
|
destination: reserve-request.topic # queue name
|
||||||
group: reserved
|
group: reserved
|
||||||
inventoryUpdated-in-0: # 예약 요청후 물품 재고업데이트 결과에 이벤트에 대한 consumer binding
|
inventoryUpdated-in-0: # 예약 요청후 물품 재고업데이트 결과에 이벤트에 대한 consumer binding
|
||||||
destination: inventory-updated.topic # queue name
|
destination: inventory-updated.topic # queue name
|
||||||
group: reserved
|
group: reserved
|
||||||
|
|||||||
@@ -8,8 +8,8 @@
|
|||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "ts-node --project tsconfig.server.json server/index.ts",
|
"dev": "ts-node --project tsconfig.server.json server/index.ts",
|
||||||
"dev:sm": "SITE_ID=3 npm run dev",
|
"dev:sm": "set SITE_ID=3&&npm run dev",
|
||||||
"dev:lg": "SITE_ID=2 npm run dev",
|
"dev:lg": "set SITE_ID=2&&npm run dev",
|
||||||
"build:server": "tsc --project tsconfig.server.json",
|
"build:server": "tsc --project tsconfig.server.json",
|
||||||
"build:next": "next build",
|
"build:next": "next build",
|
||||||
"prebuild": "rimraf ./build",
|
"prebuild": "rimraf ./build",
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ const App = ({ component: Component, ...pageProps }: AppProps) => {
|
|||||||
)
|
)
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (mounted && flatMenus) {
|
if (mounted && data?.length > 0 && flatMenus?.length > 0) {
|
||||||
let path =
|
let path =
|
||||||
router.asPath.indexOf('?') === -1
|
router.asPath.indexOf('?') === -1
|
||||||
? router.asPath
|
? router.asPath
|
||||||
@@ -110,7 +110,7 @@ const App = ({ component: Component, ...pageProps }: AppProps) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 권한 없는 페이지 대해 호출이 있으면 404로 redirect
|
// 권한 없는 페이지 대해 호출이 있으면 404로 redirect
|
||||||
if (!authPage && flatMenus.length > 0 && !current) {
|
if (!authPage && !current) {
|
||||||
if (!PUBLIC_PAGES.includes(router.asPath)) {
|
if (!PUBLIC_PAGES.includes(router.asPath)) {
|
||||||
router.push('/404')
|
router.push('/404')
|
||||||
}
|
}
|
||||||
@@ -118,7 +118,7 @@ const App = ({ component: Component, ...pageProps }: AppProps) => {
|
|||||||
|
|
||||||
setCurrentMenus(current)
|
setCurrentMenus(current)
|
||||||
}
|
}
|
||||||
}, [router, mounted, flatMenus])
|
}, [router, mounted, flatMenus, data])
|
||||||
|
|
||||||
if (loading) {
|
if (loading) {
|
||||||
return <Loader />
|
return <Loader />
|
||||||
@@ -128,6 +128,10 @@ const App = ({ component: Component, ...pageProps }: AppProps) => {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (data?.length <= 0 || flatMenus?.length <= 0) {
|
||||||
|
return <Loader />
|
||||||
|
}
|
||||||
|
|
||||||
return errorPage || naverLoginCallbackPage ? (
|
return errorPage || naverLoginCallbackPage ? (
|
||||||
<Wrapper>
|
<Wrapper>
|
||||||
<Component {...pageProps} />
|
<Component {...pageProps} />
|
||||||
|
|||||||
@@ -66,7 +66,9 @@ const ReserveEdit = (props: ReserveEditProps) => {
|
|||||||
reserveItem.inventoryQty || null,
|
reserveItem.inventoryQty || null,
|
||||||
)
|
)
|
||||||
|
|
||||||
const [reserve, setReserve] = useState<IReserve | undefined>(undefined)
|
const [reserve, setReserve] = useState<
|
||||||
|
{ reserve: IReserve; category: string } | undefined
|
||||||
|
>(undefined)
|
||||||
const [isEvent, setEvents] = useState<boolean>(false)
|
const [isEvent, setEvents] = useState<boolean>(false)
|
||||||
|
|
||||||
const methods = useForm<ReserveSavePayload>()
|
const methods = useForm<ReserveSavePayload>()
|
||||||
@@ -129,14 +131,20 @@ const ReserveEdit = (props: ReserveEditProps) => {
|
|||||||
const successCallback = useCallback(() => {
|
const successCallback = useCallback(() => {
|
||||||
setComplete({
|
setComplete({
|
||||||
done: true,
|
done: true,
|
||||||
reserveId: reserve.reserveId,
|
reserveId: reserve.reserve.reserveId,
|
||||||
})
|
})
|
||||||
setLoading(false)
|
setLoading(false)
|
||||||
}, [reserve])
|
}, [reserve])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (reserve && reserve.category !== 'education') {
|
||||||
|
successCallback()
|
||||||
|
}
|
||||||
|
}, [reserve])
|
||||||
|
|
||||||
const errorCallback = useCallback(
|
const errorCallback = useCallback(
|
||||||
(errors: any, attachmentCode: string) => {
|
(errors: any, attachmentCode: string) => {
|
||||||
setErrorState({ errors })
|
setErrorState(errors)
|
||||||
setLoading(false)
|
setLoading(false)
|
||||||
if (attachmentCode) {
|
if (attachmentCode) {
|
||||||
uploadRef.current.rollback(attachmentCode)
|
uploadRef.current.rollback(attachmentCode)
|
||||||
@@ -152,7 +160,10 @@ const ReserveEdit = (props: ReserveEditProps) => {
|
|||||||
try {
|
try {
|
||||||
const result = await reserveService.createAudit(formData)
|
const result = await reserveService.createAudit(formData)
|
||||||
if (result) {
|
if (result) {
|
||||||
successCallback()
|
setReserve({
|
||||||
|
reserve: result.data,
|
||||||
|
category: formData.categoryId,
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
errorCallback(
|
errorCallback(
|
||||||
{ message: DEFAULT_ERROR_MESSAGE },
|
{ message: DEFAULT_ERROR_MESSAGE },
|
||||||
@@ -160,7 +171,7 @@ const ReserveEdit = (props: ReserveEditProps) => {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
errorCallback(error, formData.attachmentCode)
|
errorCallback({ error }, formData.attachmentCode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,11 +182,12 @@ const ReserveEdit = (props: ReserveEditProps) => {
|
|||||||
try {
|
try {
|
||||||
const result = await reserveService.create(formData)
|
const result = await reserveService.create(formData)
|
||||||
if (result) {
|
if (result) {
|
||||||
setReserve(result.data)
|
setReserve({
|
||||||
|
reserve: result.data,
|
||||||
|
category: formData.categoryId,
|
||||||
|
})
|
||||||
if (formData.categoryId === 'education') {
|
if (formData.categoryId === 'education') {
|
||||||
setEvents(true)
|
setEvents(true)
|
||||||
} else {
|
|
||||||
successCallback()
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
errorCallback(
|
errorCallback(
|
||||||
@@ -184,7 +196,7 @@ const ReserveEdit = (props: ReserveEditProps) => {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
errorCallback(error, formData.attachmentCode)
|
errorCallback({ error }, formData.attachmentCode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,6 +233,14 @@ const ReserveEdit = (props: ReserveEditProps) => {
|
|||||||
draft.attachmentCode = attachmentCode
|
draft.attachmentCode = attachmentCode
|
||||||
draft.userId = user.userId
|
draft.userId = user.userId
|
||||||
draft.userEmail = user.email
|
draft.userEmail = user.email
|
||||||
|
draft.reserveStartDate = convertStringToDateFormat(
|
||||||
|
draft.reserveStartDate,
|
||||||
|
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
|
||||||
|
)
|
||||||
|
draft.reserveEndDate = convertStringToDateFormat(
|
||||||
|
draft.reserveEndDate,
|
||||||
|
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@@ -372,7 +392,7 @@ const ReserveEdit = (props: ReserveEditProps) => {
|
|||||||
</Backdrop>
|
</Backdrop>
|
||||||
{reserve && isEvent && (
|
{reserve && isEvent && (
|
||||||
<ReserveEventSource
|
<ReserveEventSource
|
||||||
data={reserve}
|
data={reserve.reserve}
|
||||||
successCallback={successCallback}
|
successCallback={successCallback}
|
||||||
errorCallback={errorCallback}
|
errorCallback={errorCallback}
|
||||||
/>
|
/>
|
||||||
|
|||||||
Reference in New Issue
Block a user