Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/develop' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
dlrudgjs104 committed Jul 21, 2024
2 parents 2e87c36 + 61b5520 commit 94becbe
Show file tree
Hide file tree
Showing 33 changed files with 1,723 additions and 237 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/cd_workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,5 +64,5 @@ jobs:
script: |
echo "Starting new application..."
source ~/.bashrc
nohup java -jar ~/target/BOOK-STORE-COUPON.jar --spring.profiles.active=prod --server.port=${{ secrets.COUPON_PORT }} --spring.datasource.password=${{ secrets.MYSQL_PASSWORD }} --spring.redis.password=${{ secrets.REDIS_PASSWORD }} > coupon.log 2>&1 &
nohup java -Xmx256m -jar ~/target/BOOK-STORE-COUPON.jar --spring.profiles.active=prod --server.port=${{ secrets.COUPON_PORT }} --spring.datasource.password=${{ secrets.MYSQL_PASSWORD }} --spring.redis.password=${{ secrets.REDIS_PASSWORD }} > coupon.log 2>&1 &
echo "New application started. Check app.log for details."
30 changes: 20 additions & 10 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,6 @@
</dependencyManagement>

<dependencies>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-data-redis</artifactId>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-oauth2-client</artifactId>-->
<!-- </dependency>-->



<dependency>
Expand All @@ -61,6 +52,7 @@
<artifactId>spring-boot-starter-web</artifactId>
</dependency>


<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
Expand Down Expand Up @@ -88,7 +80,11 @@
<scope>runtime</scope>
</dependency>


<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
Expand Down Expand Up @@ -186,6 +182,20 @@
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.3.0</version>
</dependency>


<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<scope>test</scope>
</dependency>


</dependencies>

<build>
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,21 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.nhnacademy.bookstorecoupon.auth.annotation.AuthorizeRole;
import com.nhnacademy.bookstorecoupon.couponpolicy.domain.dto.request.CouponPolicyRequestDTO;
import com.nhnacademy.bookstorecoupon.couponpolicy.domain.dto.request.CouponPolicyUpdateRequestDTO;
import com.nhnacademy.bookstorecoupon.couponpolicy.domain.dto.response.CouponPolicyResponseDTO;
import com.nhnacademy.bookstorecoupon.couponpolicy.exception.CouponPolicyValidationException;
import com.nhnacademy.bookstorecoupon.couponpolicy.service.CouponPolicyService;
import com.nhnacademy.bookstorecoupon.global.exception.payload.ErrorStatus;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;

@Tag(name = "CouponPolicy", description = "쿠폰 정책관련 API")
@RestController
@RequestMapping("/coupons/policies")
public class CouponPolicyController {
Expand All @@ -33,61 +39,117 @@ public CouponPolicyController(CouponPolicyService couponPolicyService) {
this.couponPolicyService = couponPolicyService;
}

@Operation(
summary = "웰컴쿠폰 생성",
description = "웰컴쿠폰을 생성합니다"
)
@ApiResponses(value = {
@ApiResponse(responseCode = "201", description = "웰컴쿠폰이 성공적으로 발행되었습니다."),
@ApiResponse(responseCode = "400", description = "잘못된 요청입니다.")
})
@AuthorizeRole({"COUPON_ADMIN", "HEAD_ADMIN"})
@PostMapping("/welcome")
public ResponseEntity<Void> issueWelcomeCoupon(@Valid @RequestBody CouponPolicyRequestDTO couponPolicyRequestDTO) {
public ResponseEntity<Void> issueWelcomeCoupon(
@Parameter(description = "웰컴쿠폰정책 발행 요청 데이터", required = true) @Valid @RequestBody CouponPolicyRequestDTO couponPolicyRequestDTO) {
validateSaleFields(couponPolicyRequestDTO);
couponPolicyService.issueWelcomeCoupon(couponPolicyRequestDTO);
return ResponseEntity.status(HttpStatus.CREATED).build();
}

@Operation(
summary = "생일쿠폰 생성",
description = "웰컴쿠폰을 생성합니다"
)
@ApiResponses(value = {
@ApiResponse(responseCode = "201", description = "생일쿠폰이 성공적으로 발행되었습니다."),
@ApiResponse(responseCode = "400", description = "잘못된 요청입니다.")
})
@AuthorizeRole({"COUPON_ADMIN", "HEAD_ADMIN"})
@PostMapping("/birthday")
public ResponseEntity<Void> issueBirthdayCoupon(@Valid @RequestBody CouponPolicyRequestDTO couponPolicyRequestDTO) {
public ResponseEntity<Void> issueBirthdayCoupon(
@Parameter(description = "생일쿠폰정책 발행 요청 데이터", required = true) @Valid @RequestBody CouponPolicyRequestDTO couponPolicyRequestDTO) {
validateSaleFields(couponPolicyRequestDTO);
couponPolicyService.issueBirthdayCoupon(couponPolicyRequestDTO);
return ResponseEntity.status(HttpStatus.CREATED).build();
}


@Operation(summary = "도서 쿠폰 발행", description = "특정 도서에 대한 도서쿠폰을 발행합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "201", description = "도서쿠폰이 성공적으로 발행되었습니다."),
@ApiResponse(responseCode = "400", description = "잘못된 요청입니다.")
})
@AuthorizeRole({"COUPON_ADMIN", "HEAD_ADMIN"})
@PostMapping("/books")
public ResponseEntity<Void> issueSpecificBookCoupon(@Valid @RequestBody CouponPolicyRequestDTO couponPolicyRequestDTO) {
public ResponseEntity<Void> issueSpecificBookCoupon(
@Parameter(description = "도서쿠폰정책 발행 요청 데이터", required = true) @Valid @RequestBody CouponPolicyRequestDTO couponPolicyRequestDTO) {
validateSaleFields(couponPolicyRequestDTO);
if (couponPolicyRequestDTO.bookId()==null && couponPolicyRequestDTO.bookTitle() == null){
if (couponPolicyRequestDTO.bookId()==null || couponPolicyRequestDTO.bookTitle() == null){
ErrorStatus errorStatus = ErrorStatus.from("북 쿠폰 발행시 책 아이디와 책 제목이 필요합니다.", HttpStatus.BAD_REQUEST, LocalDateTime.now());
throw new CouponPolicyValidationException(errorStatus);
}
couponPolicyService.issueSpecificBookCoupon(couponPolicyRequestDTO);
return ResponseEntity.status(HttpStatus.CREATED).build();
}

@Operation(summary = "카테고리 쿠폰 발행", description = "특정 카테고리에 대한 카테고리쿠폰을 발행합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "201", description = "카테고리쿠폰이 성공적으로 발행되었습니다."),
@ApiResponse(responseCode = "400", description = "잘못된 요청입니다.")
})
@AuthorizeRole({"COUPON_ADMIN", "HEAD_ADMIN"})
@PostMapping("/categories")
public ResponseEntity<Void> issueSpecificCategoryCoupon(@Valid @RequestBody CouponPolicyRequestDTO couponPolicyRequestDTO) {
public ResponseEntity<Void> issueSpecificCategoryCoupon(
@Parameter(description = "카테고리쿠폰정책 발행 요청 데이터", required = true) @Valid @RequestBody CouponPolicyRequestDTO couponPolicyRequestDTO) {
validateSaleFields(couponPolicyRequestDTO);
if (couponPolicyRequestDTO.categoryId()==null && couponPolicyRequestDTO.categoryName() == null){
if (couponPolicyRequestDTO.categoryId()==null || couponPolicyRequestDTO.categoryName() == null){
ErrorStatus errorStatus = ErrorStatus.from("카테고리 쿠폰 발행시 카테고리 아이디와 카테고리 이름이 필요합니다.", HttpStatus.BAD_REQUEST, LocalDateTime.now());
throw new CouponPolicyValidationException(errorStatus);
}
couponPolicyService.issueSpecificCategoryCoupon(couponPolicyRequestDTO);
return ResponseEntity.status(HttpStatus.CREATED).build();
}


@Operation(summary = "할인 쿠폰 발행", description = "할인 쿠폰을 발행합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "201", description = "할인쿠폰이 성공적으로 발행되었습니다."),
@ApiResponse(responseCode = "400", description = "잘못된 요청입니다.")
})
@AuthorizeRole({"COUPON_ADMIN", "HEAD_ADMIN"})
@PostMapping("/sale")
public ResponseEntity<Void> issueDiscountCoupon(@Valid @RequestBody CouponPolicyRequestDTO couponPolicyRequestDTO) {
public ResponseEntity<Void> issueDiscountCoupon(
@Parameter(description = "할인쿠폰정책 발행 요청 데이터", required = true) @Valid @RequestBody CouponPolicyRequestDTO couponPolicyRequestDTO) {
validateSaleFields(couponPolicyRequestDTO);
couponPolicyService.issueDiscountCoupon(couponPolicyRequestDTO);
return ResponseEntity.status(HttpStatus.CREATED).build();
}

@Operation(summary = "모든 쿠폰 정책 조회", description = "페이징을 통해 모든 쿠폰 정책을 조회합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공적으로 조회되었습니다.")
})
@AuthorizeRole({"COUPON_ADMIN", "HEAD_ADMIN"})
@GetMapping
public ResponseEntity<Page<CouponPolicyResponseDTO>> getAllCouponPolicies(@PageableDefault(page = 1, size = 3) Pageable pageable) {
public ResponseEntity<Page<CouponPolicyResponseDTO>> getAllCouponPolicies(@Parameter(description = "페이지 수, 페이지 사이즈", required = false) @PageableDefault(page = 1, size = 3) Pageable pageable) {
Page<CouponPolicyResponseDTO> policies = couponPolicyService.getAllCouponPolicies(pageable);
return ResponseEntity.status(HttpStatus.OK).body(policies);
}



@Operation(summary = "쿠폰 정책 업데이트", description = "쿠폰 정책을 업데이트합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공적으로 업데이트되었습니다."),
@ApiResponse(responseCode = "400", description = "잘못된 요청입니다.")
})
@AuthorizeRole({"COUPON_ADMIN", "HEAD_ADMIN"})
@PatchMapping("/{couponPolicyId}")
public ResponseEntity<Void> updateCouponPolicy(@PathVariable Long couponPolicyId, @Valid @RequestBody CouponPolicyUpdateRequestDTO requestDTO) {
public ResponseEntity<Void> updateCouponPolicy(
@Parameter(description = "쿠폰 정책 아이디", required = true) @PathVariable Long couponPolicyId, @Parameter(description = "쿠폰정책 변경 요청 데이터", required = true) @Valid @RequestBody CouponPolicyUpdateRequestDTO requestDTO) {
if ((requestDTO.salePrice() == null && requestDTO.saleRate() == null && requestDTO.maxSalePrice() == null) ||
(requestDTO.salePrice() != null && requestDTO.saleRate() != null && requestDTO.maxSalePrice() != null)) {
(requestDTO.salePrice() != null && requestDTO.saleRate() != null && requestDTO.maxSalePrice() != null)||
(requestDTO.salePrice() != null && requestDTO.saleRate() != null && requestDTO.maxSalePrice() == null)||
(requestDTO.salePrice() != null && requestDTO.saleRate() == null && requestDTO.maxSalePrice() != null)) {
ErrorStatus errorStatus = ErrorStatus.from("해당 할인률, 최대가격과 할인가격은 동시에 작성할 수 없습니다", HttpStatus.BAD_REQUEST, LocalDateTime.now());
throw new CouponPolicyValidationException(errorStatus);

Expand All @@ -100,7 +162,9 @@ public ResponseEntity<Void> updateCouponPolicy(@PathVariable Long couponPolicyId
// SalePrice와 SaleRate 유효성 검사 메서드 추가
private void validateSaleFields(CouponPolicyRequestDTO requestDTO) {
if ((requestDTO.salePrice() == null && requestDTO.saleRate() == null && requestDTO.maxSalePrice() == null) ||
(requestDTO.salePrice() != null && requestDTO.saleRate() != null && requestDTO.maxSalePrice() != null)) {
(requestDTO.salePrice() != null && requestDTO.saleRate() != null && requestDTO.maxSalePrice() != null)||
(requestDTO.salePrice() != null && requestDTO.saleRate() != null && requestDTO.maxSalePrice() == null)||
(requestDTO.salePrice() != null && requestDTO.saleRate() == null && requestDTO.maxSalePrice() != null)) {
ErrorStatus errorStatus = ErrorStatus.from("해당 할인률, 최대가격과 할인가격은 동시에 작성할 수 없습니다", HttpStatus.BAD_REQUEST, LocalDateTime.now());
throw new CouponPolicyValidationException(errorStatus);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,16 @@

import java.math.BigDecimal;

import jakarta.annotation.Nullable;
import jakarta.validation.constraints.Digits;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;

public record CouponPolicyRequestDTO(@NotNull BigDecimal minOrderPrice,
BigDecimal salePrice,
BigDecimal saleRate,
BigDecimal maxSalePrice,
@NotBlank String type, Long bookId, String bookTitle, Long categoryId, String categoryName) {
}

public record CouponPolicyRequestDTO(@NotNull @Positive @Digits(integer = 8, fraction = 2) BigDecimal minOrderPrice,
@Nullable @Positive @Digits(integer = 8, fraction = 2) BigDecimal salePrice,
@Nullable @Positive @Digits(integer = 0, fraction = 2) BigDecimal saleRate,
@Nullable @Positive @Digits(integer = 8, fraction = 2) BigDecimal maxSalePrice,
@NotBlank String type, @Nullable Long bookId, @Nullable String bookTitle, @Nullable Long categoryId, @Nullable String categoryName) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@

import java.math.BigDecimal;

import jakarta.annotation.Nullable;
import jakarta.validation.constraints.Digits;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;

public record CouponPolicyUpdateRequestDTO(@NotNull BigDecimal minOrderPrice, BigDecimal salePrice, BigDecimal saleRate,
BigDecimal maxSalePrice, @NotNull Boolean isUsed) {
public record CouponPolicyUpdateRequestDTO(@NotNull @Positive @Digits(integer = 8, fraction = 2) BigDecimal minOrderPrice, @Nullable @Positive @Digits(integer = 8, fraction = 2) BigDecimal salePrice,
@Nullable @Positive @Digits(integer = 0, fraction = 2) BigDecimal saleRate,
@Nullable @Positive @Digits(integer = 8, fraction = 2) BigDecimal maxSalePrice, @NotNull Boolean isUsed) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import com.nhnacademy.bookstorecoupon.couponpolicy.domain.dto.request.CouponPolicyUpdateRequestDTO;
import com.nhnacademy.bookstorecoupon.couponpolicy.domain.dto.response.CouponPolicyResponseDTO;
import com.nhnacademy.bookstorecoupon.couponpolicy.domain.entity.CouponPolicy;
import com.nhnacademy.bookstorecoupon.couponpolicy.exception.CouponPolicyBanUpdateException;
import com.nhnacademy.bookstorecoupon.couponpolicy.exception.CouponPolicyNotFoundException;
import com.nhnacademy.bookstorecoupon.couponpolicy.repository.CouponPolicyRepository;
import com.nhnacademy.bookstorecoupon.couponpolicy.service.CouponPolicyService;
Expand Down Expand Up @@ -108,10 +107,6 @@ public Page<CouponPolicyResponseDTO> getAllCouponPolicies(Pageable pageable) {
public void updateCouponPolicy(Long id, CouponPolicyUpdateRequestDTO requestDTO) {
Optional<CouponPolicy> optionalPolicy = couponPolicyRepository.findById(id);

if (Boolean.TRUE.equals(requestDTO.isUsed())) {
ErrorStatus errorStatus = ErrorStatus.from("이미 폐기된 쿠폰정책은 변경할 수 없습니다", HttpStatus.BAD_REQUEST, LocalDateTime.now());
throw new CouponPolicyBanUpdateException(errorStatus);
}

if (optionalPolicy.isPresent()) {
CouponPolicy policy = optionalPolicy.get();
Expand All @@ -137,6 +132,7 @@ public void updateCouponPolicy(Long id, CouponPolicyUpdateRequestDTO requestDTO)
}

}

}


Expand Down
Loading

0 comments on commit 94becbe

Please sign in to comment.