From 6fd1b4a07db188730d7ce4f260a05c5b2b535f36 Mon Sep 17 00:00:00 2001 From: Jaeyoung Ahn Date: Thu, 20 Jul 2023 00:44:45 +0900 Subject: [PATCH 01/11] =?UTF-8?q?feat=20:=20@ControllerAdvice=EB=A5=BC=20?= =?UTF-8?q?=EC=9D=B4=EC=9A=A9=ED=95=9C=20=EA=B8=80=EB=A1=9C=EB=B2=8C=20?= =?UTF-8?q?=EC=9D=B5=EC=85=89=EC=85=98=20=ED=95=B8=EB=93=A4=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voucher/exception/GlobalExceptionHandler.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/com/prgmrs/voucher/exception/GlobalExceptionHandler.java diff --git a/src/main/java/com/prgmrs/voucher/exception/GlobalExceptionHandler.java b/src/main/java/com/prgmrs/voucher/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000000..940e4328c2 --- /dev/null +++ b/src/main/java/com/prgmrs/voucher/exception/GlobalExceptionHandler.java @@ -0,0 +1,14 @@ +package com.prgmrs.voucher.exception; + +import org.springframework.dao.DataAccessException; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +public class GlobalExceptionHandler { + @ExceptionHandler({WrongRangeFormatException.class, DataAccessException.class}) + public ResponseEntity handleException(Exception e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } +} From ef8a1c28edbb8b15dfe082fcd38e2162efa18b57 Mon Sep 17 00:00:00 2001 From: Jaeyoung Ahn Date: Thu, 20 Jul 2023 00:49:38 +0900 Subject: [PATCH 02/11] =?UTF-8?q?feat=20:=20=EB=B0=94=EC=9A=B0=EC=B2=98=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B4=80=EB=A0=A8=20json,=20xml,?= =?UTF-8?q?=20thymeleaf=20=EC=A7=80=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 19 ++++++ restrequest/json-request.http | 26 +++++++ restrequest/xml-request.http | 26 +++++++ .../{ => console}/BlacklistController.java | 4 +- .../{ => console}/UserController.java | 4 +- .../{ => console}/VoucherController.java | 4 +- .../{ => console}/WalletController.java | 4 +- .../console/wrapper}/ResponseDTO.java | 2 +- .../json/VoucherJsonController.java | 47 +++++++++++++ .../controller/mvc/VoucherMvcController.java | 67 +++++++++++++++++++ .../mvc/dto/VoucherMvcCreateRequest.java | 26 +++++++ .../mvc/dto/VoucherMvcRemoveRequest.java | 17 +++++ .../controller/xml/VoucherXmlController.java | 47 +++++++++++++ .../voucher/dto/request/VoucherRequest.java | 1 - .../dto/request/VoucherSearchRequest.java | 6 ++ .../voucher/dto/response/RemoveResponse.java | 4 ++ .../voucher/dto/response/VoucherResponse.java | 2 +- .../prgmrs/voucher/enums/DiscountType.java | 6 +- .../repository/JdbcVoucherRepository.java | 51 +++++++++++++- .../voucher/repository/VoucherRepository.java | 8 +++ .../voucher/service/VoucherService.java | 22 ++++++ .../voucher/view/ConsoleApplication.java | 10 +-- .../voucher/view/io/ConsoleMessage.java | 2 + .../prgmrs/voucher/view/io/ConsoleWriter.java | 2 +- src/main/resources/VoucherMgmtDDL.sql | 2 +- .../resources/templates/voucher-create.html | 22 ++++++ .../resources/templates/voucher-list.html | 30 +++++++++ .../resources/templates/voucher-main.html | 21 ++++++ .../resources/templates/voucher-remove.html | 32 +++++++++ .../templates/voucher-request-success.html | 12 ++++ .../voucher/VoucherApplicationTests.java | 3 +- .../controller/UserControllerTest.java | 3 +- ...st.java => VoucherJsonControllerTest.java} | 5 +- .../controller/WalletControllerTest.java | 3 +- src/test/resources/VoucherMgmtDDL-test.sql | 2 +- 35 files changed, 515 insertions(+), 27 deletions(-) create mode 100644 restrequest/json-request.http create mode 100644 restrequest/xml-request.http rename src/main/java/com/prgmrs/voucher/controller/{ => console}/BlacklistController.java (87%) rename src/main/java/com/prgmrs/voucher/controller/{ => console}/UserController.java (94%) rename src/main/java/com/prgmrs/voucher/controller/{ => console}/VoucherController.java (95%) rename src/main/java/com/prgmrs/voucher/controller/{ => console}/WalletController.java (92%) rename src/main/java/com/prgmrs/voucher/{dto => controller/console/wrapper}/ResponseDTO.java (85%) create mode 100644 src/main/java/com/prgmrs/voucher/controller/json/VoucherJsonController.java create mode 100644 src/main/java/com/prgmrs/voucher/controller/mvc/VoucherMvcController.java create mode 100644 src/main/java/com/prgmrs/voucher/controller/mvc/dto/VoucherMvcCreateRequest.java create mode 100644 src/main/java/com/prgmrs/voucher/controller/mvc/dto/VoucherMvcRemoveRequest.java create mode 100644 src/main/java/com/prgmrs/voucher/controller/xml/VoucherXmlController.java create mode 100644 src/main/java/com/prgmrs/voucher/dto/request/VoucherSearchRequest.java create mode 100644 src/main/java/com/prgmrs/voucher/dto/response/RemoveResponse.java create mode 100644 src/main/resources/templates/voucher-create.html create mode 100644 src/main/resources/templates/voucher-list.html create mode 100644 src/main/resources/templates/voucher-main.html create mode 100644 src/main/resources/templates/voucher-remove.html create mode 100644 src/main/resources/templates/voucher-request-success.html rename src/test/java/com/prgmrs/voucher/controller/{VoucherControllerTest.java => VoucherJsonControllerTest.java} (96%) diff --git a/pom.xml b/pom.xml index 39ce23fbe2..635b07c92c 100644 --- a/pom.xml +++ b/pom.xml @@ -57,6 +57,25 @@ h2 test + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + org.springframework.boot + spring-boot-starter-web + + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + jakarta.xml.bind + jakarta.xml.bind-api + diff --git a/restrequest/json-request.http b/restrequest/json-request.http new file mode 100644 index 0000000000..bd7a08e2fd --- /dev/null +++ b/restrequest/json-request.http @@ -0,0 +1,26 @@ +GET http://localhost:8080/api/json/v1/vouchers + +### + +GET http://localhost:8080/api/json/v1/vouchers/search?startDate=2023-07-16T00:00:00&endDate=2023-07-19T23:59:59& + discountType=fixed + +### + +POST http://localhost:8080/api/json/v1/vouchers +Content-Type: application/json + +{ + "discountType": "fixed", + "discountStringValue": "123" +} + +### + +DELETE http://localhost:8080/api/json/v1/vouchers/f3ac7182-4f80-470a-99e7-478c29c41b0f + +### + +GET http://localhost:8080/api/json/v1/vouchers/cc295caf-cdb1-4fe6-8360-a2149a74f1b9 + +### \ No newline at end of file diff --git a/restrequest/xml-request.http b/restrequest/xml-request.http new file mode 100644 index 0000000000..b16d78d922 --- /dev/null +++ b/restrequest/xml-request.http @@ -0,0 +1,26 @@ +GET http://localhost:8080/api/xml/v1/vouchers + +### + +GET http://localhost:8080/api/xml/v1/vouchers/search?startDate=2023-07-16T00:00:00&endDate=2023-07-19T23:59:59& + discountType=fixed + +### + +POST http://localhost:8080/api/xml/v1/vouchers +Content-Type: application/xml + + + fixed + 123 + + +### + +DELETE http://localhost:8080/api/xml/v1/vouchers/ea50d33d-d668-4dcd-b2b2-980b184ff003 + +### + +GET http://localhost:8080/api/xml/v1/vouchers/fef87c80-ee1c-4aca-bf14-375930aff54c + +### \ No newline at end of file diff --git a/src/main/java/com/prgmrs/voucher/controller/BlacklistController.java b/src/main/java/com/prgmrs/voucher/controller/console/BlacklistController.java similarity index 87% rename from src/main/java/com/prgmrs/voucher/controller/BlacklistController.java rename to src/main/java/com/prgmrs/voucher/controller/console/BlacklistController.java index b56670e8d2..4179201a16 100644 --- a/src/main/java/com/prgmrs/voucher/controller/BlacklistController.java +++ b/src/main/java/com/prgmrs/voucher/controller/console/BlacklistController.java @@ -1,6 +1,6 @@ -package com.prgmrs.voucher.controller; +package com.prgmrs.voucher.controller.console; -import com.prgmrs.voucher.dto.ResponseDTO; +import com.prgmrs.voucher.controller.console.wrapper.ResponseDTO; import com.prgmrs.voucher.enums.StatusCode; import com.prgmrs.voucher.exception.WrongRangeFormatException; import com.prgmrs.voucher.service.BlacklistService; diff --git a/src/main/java/com/prgmrs/voucher/controller/UserController.java b/src/main/java/com/prgmrs/voucher/controller/console/UserController.java similarity index 94% rename from src/main/java/com/prgmrs/voucher/controller/UserController.java rename to src/main/java/com/prgmrs/voucher/controller/console/UserController.java index 5edd129c2d..d7cecfd186 100644 --- a/src/main/java/com/prgmrs/voucher/controller/UserController.java +++ b/src/main/java/com/prgmrs/voucher/controller/console/UserController.java @@ -1,6 +1,6 @@ -package com.prgmrs.voucher.controller; +package com.prgmrs.voucher.controller.console; -import com.prgmrs.voucher.dto.ResponseDTO; +import com.prgmrs.voucher.controller.console.wrapper.ResponseDTO; import com.prgmrs.voucher.dto.request.UserRequest; import com.prgmrs.voucher.dto.request.VoucherIdRequest; import com.prgmrs.voucher.enums.StatusCode; diff --git a/src/main/java/com/prgmrs/voucher/controller/VoucherController.java b/src/main/java/com/prgmrs/voucher/controller/console/VoucherController.java similarity index 95% rename from src/main/java/com/prgmrs/voucher/controller/VoucherController.java rename to src/main/java/com/prgmrs/voucher/controller/console/VoucherController.java index 607b8e15c0..a9f7aaa3aa 100644 --- a/src/main/java/com/prgmrs/voucher/controller/VoucherController.java +++ b/src/main/java/com/prgmrs/voucher/controller/console/VoucherController.java @@ -1,6 +1,6 @@ -package com.prgmrs.voucher.controller; +package com.prgmrs.voucher.controller.console; -import com.prgmrs.voucher.dto.ResponseDTO; +import com.prgmrs.voucher.controller.console.wrapper.ResponseDTO; import com.prgmrs.voucher.dto.request.UsernameRequest; import com.prgmrs.voucher.dto.request.VoucherRequest; import com.prgmrs.voucher.enums.StatusCode; diff --git a/src/main/java/com/prgmrs/voucher/controller/WalletController.java b/src/main/java/com/prgmrs/voucher/controller/console/WalletController.java similarity index 92% rename from src/main/java/com/prgmrs/voucher/controller/WalletController.java rename to src/main/java/com/prgmrs/voucher/controller/console/WalletController.java index 728bc7b9e0..9572a3abf3 100644 --- a/src/main/java/com/prgmrs/voucher/controller/WalletController.java +++ b/src/main/java/com/prgmrs/voucher/controller/console/WalletController.java @@ -1,6 +1,6 @@ -package com.prgmrs.voucher.controller; +package com.prgmrs.voucher.controller.console; -import com.prgmrs.voucher.dto.ResponseDTO; +import com.prgmrs.voucher.controller.console.wrapper.ResponseDTO; import com.prgmrs.voucher.dto.request.AssignVoucherRequest; import com.prgmrs.voucher.dto.request.RemoveVoucherRequest; import com.prgmrs.voucher.enums.StatusCode; diff --git a/src/main/java/com/prgmrs/voucher/dto/ResponseDTO.java b/src/main/java/com/prgmrs/voucher/controller/console/wrapper/ResponseDTO.java similarity index 85% rename from src/main/java/com/prgmrs/voucher/dto/ResponseDTO.java rename to src/main/java/com/prgmrs/voucher/controller/console/wrapper/ResponseDTO.java index 101722c4d5..e4c6bc4ee7 100644 --- a/src/main/java/com/prgmrs/voucher/dto/ResponseDTO.java +++ b/src/main/java/com/prgmrs/voucher/controller/console/wrapper/ResponseDTO.java @@ -1,4 +1,4 @@ -package com.prgmrs.voucher.dto; +package com.prgmrs.voucher.controller.console.wrapper; import com.prgmrs.voucher.enums.StatusCode; diff --git a/src/main/java/com/prgmrs/voucher/controller/json/VoucherJsonController.java b/src/main/java/com/prgmrs/voucher/controller/json/VoucherJsonController.java new file mode 100644 index 0000000000..793425c970 --- /dev/null +++ b/src/main/java/com/prgmrs/voucher/controller/json/VoucherJsonController.java @@ -0,0 +1,47 @@ +package com.prgmrs.voucher.controller.json; + +import com.prgmrs.voucher.dto.request.VoucherIdRequest; +import com.prgmrs.voucher.dto.request.VoucherRequest; +import com.prgmrs.voucher.dto.request.VoucherSearchRequest; +import com.prgmrs.voucher.dto.response.RemoveResponse; +import com.prgmrs.voucher.dto.response.VoucherListResponse; +import com.prgmrs.voucher.dto.response.VoucherResponse; +import com.prgmrs.voucher.service.VoucherService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/json/v1") +public class VoucherJsonController { + + private final VoucherService voucherService; + + public VoucherJsonController(VoucherService voucherService) { + this.voucherService = voucherService; + } + + @GetMapping("/vouchers") + public ResponseEntity findAll() { + return ResponseEntity.ok(voucherService.findAll()); + } + + @GetMapping("/vouchers/search") + public ResponseEntity findByCreationTimeAndDiscountType(VoucherSearchRequest voucherSearchRequest) { + return ResponseEntity.ok(voucherService.findByCreationTimeAndDiscountType(voucherSearchRequest)); + } + + @PostMapping("/vouchers") + public ResponseEntity createVoucher(@RequestBody VoucherRequest voucherRequest) { + return ResponseEntity.ok(voucherService.createVoucher(voucherRequest)); + } + + @DeleteMapping("/vouchers/{voucherId}") + public ResponseEntity removeVoucher(@PathVariable("voucherId") VoucherIdRequest voucherIdRequest) { + return ResponseEntity.ok(voucherService.removeVoucher(voucherIdRequest)); + } + + @GetMapping("/vouchers/{voucherId}") + public ResponseEntity findById(@PathVariable("voucherId") VoucherIdRequest voucherIdRequest) { + return ResponseEntity.ok(voucherService.findById(voucherIdRequest)); + } +} diff --git a/src/main/java/com/prgmrs/voucher/controller/mvc/VoucherMvcController.java b/src/main/java/com/prgmrs/voucher/controller/mvc/VoucherMvcController.java new file mode 100644 index 0000000000..4bc3585688 --- /dev/null +++ b/src/main/java/com/prgmrs/voucher/controller/mvc/VoucherMvcController.java @@ -0,0 +1,67 @@ +package com.prgmrs.voucher.controller.mvc; + +import com.prgmrs.voucher.controller.mvc.dto.VoucherMvcCreateRequest; +import com.prgmrs.voucher.controller.mvc.dto.VoucherMvcRemoveRequest; +import com.prgmrs.voucher.dto.request.VoucherIdRequest; +import com.prgmrs.voucher.dto.request.VoucherRequest; +import com.prgmrs.voucher.dto.response.VoucherListResponse; +import com.prgmrs.voucher.model.Voucher; +import com.prgmrs.voucher.service.VoucherService; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.List; + +@Controller +@RequestMapping("/vouchers") +public class VoucherMvcController { + private final VoucherService voucherService; + + public VoucherMvcController(VoucherService voucherService) { + this.voucherService = voucherService; + } + + @GetMapping("/") + public String showMainPage() { + return "voucher-main"; + } + + @GetMapping("/list") + public String showListPage(Model model) { + VoucherListResponse voucherListResponse = voucherService.findAll(); + List voucherList = voucherListResponse.voucherList(); + model.addAttribute("voucherList", voucherList); + return "voucher-list"; + } + + @GetMapping("/create") + public String showCreatePage(Model model) { + model.addAttribute("voucherCreateRequest", new VoucherMvcCreateRequest()); + return "voucher-create"; + } + + @PostMapping("/create") + public String createVoucher(@ModelAttribute VoucherMvcCreateRequest voucherMvcCreateRequest) { + voucherService.createVoucher(new VoucherRequest(voucherMvcCreateRequest.getDiscountType(), voucherMvcCreateRequest.getDiscountStringValue())); + return "voucher-request-success"; + } + + @GetMapping("/remove") + public String showRemovePage(Model model) { + VoucherListResponse voucherListResponse = voucherService.findAll(); + List voucherList = voucherListResponse.voucherList(); + model.addAttribute("voucherList", voucherList); + model.addAttribute("voucherRemoveRequest", new VoucherMvcRemoveRequest()); + return "voucher-remove"; + } + + @PostMapping("/remove") + public String removeVoucher(@ModelAttribute VoucherMvcRemoveRequest voucherMvcRemoveRequest) { + voucherService.removeVoucher(new VoucherIdRequest(voucherMvcRemoveRequest.getVoucherId())); + return "voucher-request-success"; + } +} diff --git a/src/main/java/com/prgmrs/voucher/controller/mvc/dto/VoucherMvcCreateRequest.java b/src/main/java/com/prgmrs/voucher/controller/mvc/dto/VoucherMvcCreateRequest.java new file mode 100644 index 0000000000..835b3ec92d --- /dev/null +++ b/src/main/java/com/prgmrs/voucher/controller/mvc/dto/VoucherMvcCreateRequest.java @@ -0,0 +1,26 @@ +package com.prgmrs.voucher.controller.mvc.dto; + +public class VoucherMvcCreateRequest { + private String discountType; + private String discountStringValue; + + public VoucherMvcCreateRequest() { + // Do nothing for thymeleaf support purpose + } + + public String getDiscountType() { + return discountType; + } + + public void setDiscountType(String discountType) { + this.discountType = discountType; + } + + public String getDiscountStringValue() { + return discountStringValue; + } + + public void setDiscountStringValue(String discountStringValue) { + this.discountStringValue = discountStringValue; + } +} \ No newline at end of file diff --git a/src/main/java/com/prgmrs/voucher/controller/mvc/dto/VoucherMvcRemoveRequest.java b/src/main/java/com/prgmrs/voucher/controller/mvc/dto/VoucherMvcRemoveRequest.java new file mode 100644 index 0000000000..a68beca54c --- /dev/null +++ b/src/main/java/com/prgmrs/voucher/controller/mvc/dto/VoucherMvcRemoveRequest.java @@ -0,0 +1,17 @@ +package com.prgmrs.voucher.controller.mvc.dto; + +public class VoucherMvcRemoveRequest { + private String voucherId; + + public VoucherMvcRemoveRequest() { + // Do nothing for thymeleaf support purpose + } + + public String getVoucherId() { + return voucherId; + } + + public void setVoucherId(String voucherId) { + this.voucherId = voucherId; + } +} \ No newline at end of file diff --git a/src/main/java/com/prgmrs/voucher/controller/xml/VoucherXmlController.java b/src/main/java/com/prgmrs/voucher/controller/xml/VoucherXmlController.java new file mode 100644 index 0000000000..aa33cdb288 --- /dev/null +++ b/src/main/java/com/prgmrs/voucher/controller/xml/VoucherXmlController.java @@ -0,0 +1,47 @@ +package com.prgmrs.voucher.controller.xml; + +import com.prgmrs.voucher.dto.request.VoucherIdRequest; +import com.prgmrs.voucher.dto.request.VoucherRequest; +import com.prgmrs.voucher.dto.request.VoucherSearchRequest; +import com.prgmrs.voucher.dto.response.RemoveResponse; +import com.prgmrs.voucher.dto.response.VoucherListResponse; +import com.prgmrs.voucher.dto.response.VoucherResponse; +import com.prgmrs.voucher.service.VoucherService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/xml/v1") +public class VoucherXmlController { + private final VoucherService voucherService; + + public VoucherXmlController(VoucherService voucherService) { + this.voucherService = voucherService; + } + + @GetMapping(value = "/vouchers", produces = "application/xml") + public ResponseEntity findAll() { + return ResponseEntity.ok(voucherService.findAll()); + } + + @GetMapping(value = "/vouchers/search", produces = "application/xml") + public ResponseEntity findByCreationTimeAndDiscountType(VoucherSearchRequest voucherSearchRequest) { + return ResponseEntity.ok(voucherService.findByCreationTimeAndDiscountType(voucherSearchRequest)); + } + + @PostMapping(value = "/vouchers", consumes = "application/xml", produces = "application/xml") + public ResponseEntity createVoucher(@RequestBody VoucherRequest voucherRequest) { + System.out.println(voucherRequest); // or use a logger + return ResponseEntity.ok(voucherService.createVoucher(voucherRequest)); + } + + @DeleteMapping(value = "/vouchers/{voucherId}", produces = "application/xml") + public ResponseEntity removeVoucher(@PathVariable("voucherId") VoucherIdRequest voucherIdRequest) { + return ResponseEntity.ok(voucherService.removeVoucher(voucherIdRequest)); + } + + @GetMapping(value = "/vouchers/{voucherId}", produces = "application/xml") + public ResponseEntity findById(@PathVariable("voucherId") VoucherIdRequest voucherIdRequest) { + return ResponseEntity.ok(voucherService.findById(voucherIdRequest)); + } +} diff --git a/src/main/java/com/prgmrs/voucher/dto/request/VoucherRequest.java b/src/main/java/com/prgmrs/voucher/dto/request/VoucherRequest.java index 15441c7168..a0d6d236c6 100644 --- a/src/main/java/com/prgmrs/voucher/dto/request/VoucherRequest.java +++ b/src/main/java/com/prgmrs/voucher/dto/request/VoucherRequest.java @@ -1,5 +1,4 @@ package com.prgmrs.voucher.dto.request; public record VoucherRequest(String discountType, String discountStringValue) { - } \ No newline at end of file diff --git a/src/main/java/com/prgmrs/voucher/dto/request/VoucherSearchRequest.java b/src/main/java/com/prgmrs/voucher/dto/request/VoucherSearchRequest.java new file mode 100644 index 0000000000..1a09082c34 --- /dev/null +++ b/src/main/java/com/prgmrs/voucher/dto/request/VoucherSearchRequest.java @@ -0,0 +1,6 @@ +package com.prgmrs.voucher.dto.request; + +import java.time.LocalDateTime; + +public record VoucherSearchRequest(LocalDateTime startDate, LocalDateTime endDate, String discountType) { +} diff --git a/src/main/java/com/prgmrs/voucher/dto/response/RemoveResponse.java b/src/main/java/com/prgmrs/voucher/dto/response/RemoveResponse.java new file mode 100644 index 0000000000..d11003127e --- /dev/null +++ b/src/main/java/com/prgmrs/voucher/dto/response/RemoveResponse.java @@ -0,0 +1,4 @@ +package com.prgmrs.voucher.dto.response; + +public record RemoveResponse(int rowsDeleted) { +} diff --git a/src/main/java/com/prgmrs/voucher/dto/response/VoucherResponse.java b/src/main/java/com/prgmrs/voucher/dto/response/VoucherResponse.java index 9d64f2fcf9..6a59605129 100644 --- a/src/main/java/com/prgmrs/voucher/dto/response/VoucherResponse.java +++ b/src/main/java/com/prgmrs/voucher/dto/response/VoucherResponse.java @@ -5,4 +5,4 @@ import java.util.UUID; public record VoucherResponse(UUID voucherUuid, DiscountStrategy discountStrategy) { -} +} \ No newline at end of file diff --git a/src/main/java/com/prgmrs/voucher/enums/DiscountType.java b/src/main/java/com/prgmrs/voucher/enums/DiscountType.java index e60785ba80..4cf115edbe 100644 --- a/src/main/java/com/prgmrs/voucher/enums/DiscountType.java +++ b/src/main/java/com/prgmrs/voucher/enums/DiscountType.java @@ -32,7 +32,7 @@ public static DiscountType fromShort(short value) { throw new WrongRangeFormatException("no matching discount type from short"); } - public static short toShortValue(String value) { + public static short fromEnumValueStringToShortValue(String value) { for (DiscountType enumValue : DiscountType.values()) { if (enumValue.name().equalsIgnoreCase(value)) { return enumValue.shortValue; @@ -40,4 +40,8 @@ public static short toShortValue(String value) { } throw new WrongRangeFormatException("no matching discount type from enum"); } + + public short getShortValue() { + return shortValue; + } } diff --git a/src/main/java/com/prgmrs/voucher/repository/JdbcVoucherRepository.java b/src/main/java/com/prgmrs/voucher/repository/JdbcVoucherRepository.java index d766e92656..2d8537351b 100644 --- a/src/main/java/com/prgmrs/voucher/repository/JdbcVoucherRepository.java +++ b/src/main/java/com/prgmrs/voucher/repository/JdbcVoucherRepository.java @@ -14,6 +14,7 @@ import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -62,13 +63,13 @@ public void save(Voucher voucher) { paramMap.put("voucherId", voucher.voucherId().toString()); if (voucher.discountStrategy() instanceof FixedAmountDiscountStrategy fixedAmountDiscountStrategy) { - short discountType = DiscountType.toShortValue("FIXED_AMOUNT_DISCOUNT"); + short discountType = DiscountType.fromEnumValueStringToShortValue("FIXED_AMOUNT_DISCOUNT"); paramMap.put("discountType", discountType); paramMap.put("discountValue", fixedAmountDiscountStrategy.amount().value()); } if (voucher.discountStrategy() instanceof PercentDiscountStrategy percentDiscountStrategy) { - short discountType = DiscountType.toShortValue("PERCENT_DISCOUNT"); + short discountType = DiscountType.fromEnumValueStringToShortValue("PERCENT_DISCOUNT"); paramMap.put("discountType", discountType); paramMap.put("discountValue", percentDiscountStrategy.percent().value()); } @@ -138,4 +139,50 @@ AND MAX(CASE WHEN w.unassigned_time return jdbcTemplate.query(sql, toRowMapper()); } + + @Override + public List findByCreationTimeAndDiscountType(LocalDateTime startDate, LocalDateTime endDate, short discountType) { + String sql = """ + SELECT + v.voucher_id, v.discount_type, v.discount_value + FROM `voucher` v + WHERE (v.discount_type = :discountType) + AND (v.created_at BETWEEN :startDate AND :endDate) + """; + + Map paramMap = new HashMap<>(); + + paramMap.put("startDate", startDate); + paramMap.put("endDate", endDate); + paramMap.put("discountType", discountType); + + return jdbcTemplate.query(sql, paramMap, toRowMapper()); + } + + @Override + public int removeVoucher(UUID voucherUUID) { + String sql = "DELETE FROM `voucher` v WHERE v.voucher_id = :voucherId"; + + Map paramMap = new HashMap<>(); + + paramMap.put("voucherId", voucherUUID.toString()); + + return jdbcTemplate.update(sql, paramMap); + } + + @Override + public Voucher findById(UUID voucherUUID) { + String sql = """ + SELECT + v.voucher_id, v.discount_type, v.discount_value + FROM `voucher` v + WHERE v.voucher_id = :voucherId + """; + + Map paramMap = new HashMap<>(); + + paramMap.put("voucherId", voucherUUID.toString()); + + return jdbcTemplate.queryForObject(sql, paramMap, toRowMapper()); + } } diff --git a/src/main/java/com/prgmrs/voucher/repository/VoucherRepository.java b/src/main/java/com/prgmrs/voucher/repository/VoucherRepository.java index a0005f8b3e..eeee44f31c 100644 --- a/src/main/java/com/prgmrs/voucher/repository/VoucherRepository.java +++ b/src/main/java/com/prgmrs/voucher/repository/VoucherRepository.java @@ -3,7 +3,9 @@ import com.prgmrs.voucher.model.Voucher; import com.prgmrs.voucher.model.wrapper.Username; +import java.time.LocalDateTime; import java.util.List; +import java.util.UUID; public interface VoucherRepository { void save(Voucher voucher); @@ -15,4 +17,10 @@ public interface VoucherRepository { List getNotAssignedVoucherList(); List getAssignedVoucherList(); + + List findByCreationTimeAndDiscountType(LocalDateTime startDate, LocalDateTime endDate, short discountType); + + int removeVoucher(UUID voucherUUID); + + Voucher findById(UUID voucherUUID); } diff --git a/src/main/java/com/prgmrs/voucher/service/VoucherService.java b/src/main/java/com/prgmrs/voucher/service/VoucherService.java index e220be247b..2898d013ac 100644 --- a/src/main/java/com/prgmrs/voucher/service/VoucherService.java +++ b/src/main/java/com/prgmrs/voucher/service/VoucherService.java @@ -1,7 +1,10 @@ package com.prgmrs.voucher.service; import com.prgmrs.voucher.dto.request.UsernameRequest; +import com.prgmrs.voucher.dto.request.VoucherIdRequest; import com.prgmrs.voucher.dto.request.VoucherRequest; +import com.prgmrs.voucher.dto.request.VoucherSearchRequest; +import com.prgmrs.voucher.dto.response.RemoveResponse; import com.prgmrs.voucher.dto.response.VoucherListResponse; import com.prgmrs.voucher.dto.response.VoucherResponse; import com.prgmrs.voucher.enums.DiscountType; @@ -17,6 +20,7 @@ import com.prgmrs.voucher.util.UUIDGenerator; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.UUID; @Service @@ -72,4 +76,22 @@ public VoucherListResponse getNotAssignedVoucher() { public VoucherListResponse getAssignedVoucherList() { return new VoucherListResponse(voucherRepository.getAssignedVoucherList()); } + + public VoucherListResponse findByCreationTimeAndDiscountType(VoucherSearchRequest voucherSearchRequest) { + LocalDateTime startDate = voucherSearchRequest.startDate(); + LocalDateTime endDate = voucherSearchRequest.endDate(); + DiscountType discountType = DiscountType.fromString(voucherSearchRequest.discountType()); + return new VoucherListResponse(voucherRepository.findByCreationTimeAndDiscountType(startDate, endDate, discountType.getShortValue())); + } + + public RemoveResponse removeVoucher(VoucherIdRequest voucherIdRequest) { + UUID uuid = UUID.fromString(voucherIdRequest.voucherUuid()); + return new RemoveResponse(voucherRepository.removeVoucher(uuid)); + } + + public VoucherResponse findById(VoucherIdRequest voucherIdRequest) { + UUID uuid = UUID.fromString(voucherIdRequest.voucherUuid()); + Voucher voucher = voucherRepository.findById(uuid); + return new VoucherResponse(voucher.voucherId(), voucher.discountStrategy()); + } } diff --git a/src/main/java/com/prgmrs/voucher/view/ConsoleApplication.java b/src/main/java/com/prgmrs/voucher/view/ConsoleApplication.java index 06dde40d41..1ed33e04da 100644 --- a/src/main/java/com/prgmrs/voucher/view/ConsoleApplication.java +++ b/src/main/java/com/prgmrs/voucher/view/ConsoleApplication.java @@ -1,10 +1,10 @@ package com.prgmrs.voucher.view; -import com.prgmrs.voucher.controller.BlacklistController; -import com.prgmrs.voucher.controller.UserController; -import com.prgmrs.voucher.controller.VoucherController; -import com.prgmrs.voucher.controller.WalletController; -import com.prgmrs.voucher.dto.ResponseDTO; +import com.prgmrs.voucher.controller.console.BlacklistController; +import com.prgmrs.voucher.controller.console.UserController; +import com.prgmrs.voucher.controller.console.VoucherController; +import com.prgmrs.voucher.controller.console.WalletController; +import com.prgmrs.voucher.controller.console.wrapper.ResponseDTO; import com.prgmrs.voucher.exception.WrongRangeFormatException; import com.prgmrs.voucher.setting.BlacklistProperties; import com.prgmrs.voucher.view.io.ConsoleReader; diff --git a/src/main/java/com/prgmrs/voucher/view/io/ConsoleMessage.java b/src/main/java/com/prgmrs/voucher/view/io/ConsoleMessage.java index f12e632d37..bd0082b1aa 100644 --- a/src/main/java/com/prgmrs/voucher/view/io/ConsoleMessage.java +++ b/src/main/java/com/prgmrs/voucher/view/io/ConsoleMessage.java @@ -10,9 +10,11 @@ public enum ConsoleMessage { ConsoleMessage(String message) { this.message = message; } + public String getValue() { return message; } + @Override public String toString() { return this.message; diff --git a/src/main/java/com/prgmrs/voucher/view/io/ConsoleWriter.java b/src/main/java/com/prgmrs/voucher/view/io/ConsoleWriter.java index f4e4af79d8..dcc6723d4e 100644 --- a/src/main/java/com/prgmrs/voucher/view/io/ConsoleWriter.java +++ b/src/main/java/com/prgmrs/voucher/view/io/ConsoleWriter.java @@ -1,6 +1,6 @@ package com.prgmrs.voucher.view.io; -import com.prgmrs.voucher.dto.ResponseDTO; +import com.prgmrs.voucher.controller.console.wrapper.ResponseDTO; import org.springframework.stereotype.Component; @Component diff --git a/src/main/resources/VoucherMgmtDDL.sql b/src/main/resources/VoucherMgmtDDL.sql index 246de9fbb3..a2556b5390 100644 --- a/src/main/resources/VoucherMgmtDDL.sql +++ b/src/main/resources/VoucherMgmtDDL.sql @@ -23,7 +23,7 @@ CREATE TABLE `wallet` ( `voucher_id` CHAR(36) NOT NULL, `user_id` CHAR(36) NOT NULL, - `assigned_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + `assigned_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `unassigned_time` TIMESTAMP, `is_used` BOOLEAN NOT NULL DEFAULT 0, PRIMARY KEY (`voucher_id`, `user_id`, `assigned_time`), diff --git a/src/main/resources/templates/voucher-create.html b/src/main/resources/templates/voucher-create.html new file mode 100644 index 0000000000..0626f6aee0 --- /dev/null +++ b/src/main/resources/templates/voucher-create.html @@ -0,0 +1,22 @@ + + + + Create Voucher + + +

Create Voucher

+
+
+
+ +
+
+ + + +
+ + \ No newline at end of file diff --git a/src/main/resources/templates/voucher-list.html b/src/main/resources/templates/voucher-list.html new file mode 100644 index 0000000000..8474d4f4b8 --- /dev/null +++ b/src/main/resources/templates/voucher-list.html @@ -0,0 +1,30 @@ + + + + Voucher List + + + +

Voucher List

+ + + + + + + + + + +
No.voucher IDDiscountType and Value
+
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/voucher-main.html b/src/main/resources/templates/voucher-main.html new file mode 100644 index 0000000000..d66e752ffc --- /dev/null +++ b/src/main/resources/templates/voucher-main.html @@ -0,0 +1,21 @@ + + + + Main Page + + +

Voucher Management System

+ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/voucher-remove.html b/src/main/resources/templates/voucher-remove.html new file mode 100644 index 0000000000..d4fcaa7a99 --- /dev/null +++ b/src/main/resources/templates/voucher-remove.html @@ -0,0 +1,32 @@ + + + + + Delete Voucher + + + +

Delete Voucher

+ +
+ +
+ +
+ +
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/voucher-request-success.html b/src/main/resources/templates/voucher-request-success.html new file mode 100644 index 0000000000..262df20343 --- /dev/null +++ b/src/main/resources/templates/voucher-request-success.html @@ -0,0 +1,12 @@ + + + + Request Successful + + +

Success!

+ + + diff --git a/src/test/java/com/prgmrs/voucher/VoucherApplicationTests.java b/src/test/java/com/prgmrs/voucher/VoucherApplicationTests.java index d3297eefab..d238dd4355 100644 --- a/src/test/java/com/prgmrs/voucher/VoucherApplicationTests.java +++ b/src/test/java/com/prgmrs/voucher/VoucherApplicationTests.java @@ -6,5 +6,6 @@ @SpringBootTest class VoucherApplicationTests { @Autowired - VoucherApplicationTests() {} + VoucherApplicationTests() { + } } diff --git a/src/test/java/com/prgmrs/voucher/controller/UserControllerTest.java b/src/test/java/com/prgmrs/voucher/controller/UserControllerTest.java index 12a0bfc565..06cda59231 100644 --- a/src/test/java/com/prgmrs/voucher/controller/UserControllerTest.java +++ b/src/test/java/com/prgmrs/voucher/controller/UserControllerTest.java @@ -1,6 +1,7 @@ package com.prgmrs.voucher.controller; -import com.prgmrs.voucher.dto.ResponseDTO; +import com.prgmrs.voucher.controller.console.UserController; +import com.prgmrs.voucher.controller.console.wrapper.ResponseDTO; import com.prgmrs.voucher.dto.request.UserRequest; import com.prgmrs.voucher.dto.request.VoucherIdRequest; import com.prgmrs.voucher.dto.response.UserListResponse; diff --git a/src/test/java/com/prgmrs/voucher/controller/VoucherControllerTest.java b/src/test/java/com/prgmrs/voucher/controller/VoucherJsonControllerTest.java similarity index 96% rename from src/test/java/com/prgmrs/voucher/controller/VoucherControllerTest.java rename to src/test/java/com/prgmrs/voucher/controller/VoucherJsonControllerTest.java index 76393cde3a..aa25495743 100644 --- a/src/test/java/com/prgmrs/voucher/controller/VoucherControllerTest.java +++ b/src/test/java/com/prgmrs/voucher/controller/VoucherJsonControllerTest.java @@ -1,6 +1,7 @@ package com.prgmrs.voucher.controller; -import com.prgmrs.voucher.dto.ResponseDTO; +import com.prgmrs.voucher.controller.console.VoucherController; +import com.prgmrs.voucher.controller.console.wrapper.ResponseDTO; import com.prgmrs.voucher.dto.request.UsernameRequest; import com.prgmrs.voucher.dto.request.VoucherRequest; import com.prgmrs.voucher.dto.response.VoucherListResponse; @@ -26,7 +27,7 @@ import static org.mockito.BDDMockito.given; @DisplayName("바우처 컨트롤러 레이어를 테스트한다.") -class VoucherControllerTest { +class VoucherJsonControllerTest { @InjectMocks VoucherController voucherController; diff --git a/src/test/java/com/prgmrs/voucher/controller/WalletControllerTest.java b/src/test/java/com/prgmrs/voucher/controller/WalletControllerTest.java index fe4598aa2c..5ba21382d3 100644 --- a/src/test/java/com/prgmrs/voucher/controller/WalletControllerTest.java +++ b/src/test/java/com/prgmrs/voucher/controller/WalletControllerTest.java @@ -1,6 +1,7 @@ package com.prgmrs.voucher.controller; -import com.prgmrs.voucher.dto.ResponseDTO; +import com.prgmrs.voucher.controller.console.WalletController; +import com.prgmrs.voucher.controller.console.wrapper.ResponseDTO; import com.prgmrs.voucher.dto.request.AssignVoucherRequest; import com.prgmrs.voucher.dto.request.RemoveVoucherRequest; import com.prgmrs.voucher.dto.response.WalletResponse; diff --git a/src/test/resources/VoucherMgmtDDL-test.sql b/src/test/resources/VoucherMgmtDDL-test.sql index f08d67a52e..fa3bc55b9f 100644 --- a/src/test/resources/VoucherMgmtDDL-test.sql +++ b/src/test/resources/VoucherMgmtDDL-test.sql @@ -19,7 +19,7 @@ CREATE TABLE `wallet` ( `voucher_id` CHAR(36) NOT NULL, `user_id` CHAR(36) NOT NULL, - `assigned_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + `assigned_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `unassigned_time` TIMESTAMP, `is_used` TINYINT NOT NULL DEFAULT 0, PRIMARY KEY (`voucher_id`, `user_id`, `assigned_time`), From c7c9f98a2036b19743115357f7659001660ab319 Mon Sep 17 00:00:00 2001 From: Jaeyoung Ahn Date: Tue, 25 Jul 2023 02:40:22 +0900 Subject: [PATCH 03/11] =?UTF-8?q?refactor=20:=20=EC=BD=98=EC=86=94=20?= =?UTF-8?q?=EC=8B=A4=ED=96=89=20=EA=B4=80=EB=A0=A8=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=9C=84=EC=B9=98=20view=20=EB=B0=96=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/prgmrs/voucher/{view => }/ConsoleApplication.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) rename src/main/java/com/prgmrs/voucher/{view => }/ConsoleApplication.java (98%) diff --git a/src/main/java/com/prgmrs/voucher/view/ConsoleApplication.java b/src/main/java/com/prgmrs/voucher/ConsoleApplication.java similarity index 98% rename from src/main/java/com/prgmrs/voucher/view/ConsoleApplication.java rename to src/main/java/com/prgmrs/voucher/ConsoleApplication.java index 1ed33e04da..2913546343 100644 --- a/src/main/java/com/prgmrs/voucher/view/ConsoleApplication.java +++ b/src/main/java/com/prgmrs/voucher/ConsoleApplication.java @@ -1,4 +1,4 @@ -package com.prgmrs.voucher.view; +package com.prgmrs.voucher; import com.prgmrs.voucher.controller.console.BlacklistController; import com.prgmrs.voucher.controller.console.UserController; @@ -7,6 +7,7 @@ import com.prgmrs.voucher.controller.console.wrapper.ResponseDTO; import com.prgmrs.voucher.exception.WrongRangeFormatException; import com.prgmrs.voucher.setting.BlacklistProperties; +import com.prgmrs.voucher.view.RequestBodyCreator; import com.prgmrs.voucher.view.io.ConsoleReader; import com.prgmrs.voucher.view.io.ConsoleWriter; import com.prgmrs.voucher.view.io.ManagementType; From f43138314ecac1282e8babfcc28ba4c987441e55 Mon Sep 17 00:00:00 2001 From: Jaeyoung Ahn Date: Tue, 25 Jul 2023 02:43:46 +0900 Subject: [PATCH 04/11] =?UTF-8?q?refactor=20:=20GlobalExceptionHandler=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voucher/{exception => global}/GlobalExceptionHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) rename src/main/java/com/prgmrs/voucher/{exception => global}/GlobalExceptionHandler.java (83%) diff --git a/src/main/java/com/prgmrs/voucher/exception/GlobalExceptionHandler.java b/src/main/java/com/prgmrs/voucher/global/GlobalExceptionHandler.java similarity index 83% rename from src/main/java/com/prgmrs/voucher/exception/GlobalExceptionHandler.java rename to src/main/java/com/prgmrs/voucher/global/GlobalExceptionHandler.java index 940e4328c2..4a6877be7e 100644 --- a/src/main/java/com/prgmrs/voucher/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/prgmrs/voucher/global/GlobalExceptionHandler.java @@ -1,5 +1,6 @@ -package com.prgmrs.voucher.exception; +package com.prgmrs.voucher.global; +import com.prgmrs.voucher.exception.WrongRangeFormatException; import org.springframework.dao.DataAccessException; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; From ec7bdcd5ada6622ef991d7b35f6f97412bcb2f93 Mon Sep 17 00:00:00 2001 From: Jaeyoung Ahn Date: Tue, 25 Jul 2023 02:49:29 +0900 Subject: [PATCH 05/11] =?UTF-8?q?rename=20:=20=EA=B0=80=EB=8F=85=EC=84=B1?= =?UTF-8?q?=20=ED=96=A5=EC=83=81=EC=9D=84=20=EC=9C=84=ED=95=B4=20enum=20cl?= =?UTF-8?q?ass=20=EB=82=B4=20=EB=B3=80=EC=88=98=EB=AA=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prgmrs/voucher/view/io/ConsoleWriter.java | 2 +- .../voucher/view/io/ManagementType.java | 22 +++++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/prgmrs/voucher/view/io/ConsoleWriter.java b/src/main/java/com/prgmrs/voucher/view/io/ConsoleWriter.java index dcc6723d4e..b2d61e6b1d 100644 --- a/src/main/java/com/prgmrs/voucher/view/io/ConsoleWriter.java +++ b/src/main/java/com/prgmrs/voucher/view/io/ConsoleWriter.java @@ -11,7 +11,7 @@ public void write(T message) { public void showManagementType() { for (ManagementType type : ManagementType.values()) { - write(type.getValue()); + write(type.getMessage()); } } diff --git a/src/main/java/com/prgmrs/voucher/view/io/ManagementType.java b/src/main/java/com/prgmrs/voucher/view/io/ManagementType.java index 030acfa2b8..40dc1175cc 100644 --- a/src/main/java/com/prgmrs/voucher/view/io/ManagementType.java +++ b/src/main/java/com/prgmrs/voucher/view/io/ManagementType.java @@ -14,17 +14,17 @@ public enum ManagementType { SHOW_VOUCHER_OWNER("Type '8' to show the owner of specific voucher."), SHOW_BLACKLIST("Type '9' to print out the blacklist."); - private final String value; + private final String message; - ManagementType(String value) { - this.value = value; + ManagementType(String message) { + this.message = message; } - public static ManagementType of(String value) { + public static ManagementType of(String orderNumberAsString) { try { - int convertedValue = Integer.parseInt(value); - if (convertedValue >= 0 && convertedValue < ManagementType.values().length) { - return ManagementType.values()[convertedValue]; + int orderNumber = Integer.parseInt(orderNumberAsString); + if (isWithinOrderNumberRange(orderNumber)) { + return ManagementType.values()[orderNumber]; } throw new WrongRangeFormatException("no such option exists"); } catch (NumberFormatException e) { @@ -32,7 +32,11 @@ public static ManagementType of(String value) { } } - public String getValue() { - return value; + private static boolean isWithinOrderNumberRange(int orderNumber) { + return orderNumber >= 0 && orderNumber < ManagementType.values().length; + } + + public String getMessage() { + return message; } } From 3bd683aca1c8d4e32ed006383e289f957fb46c87 Mon Sep 17 00:00:00 2001 From: Jaeyoung Ahn Date: Tue, 25 Jul 2023 02:51:31 +0900 Subject: [PATCH 06/11] =?UTF-8?q?refactor=20:=20=EA=B0=80=EB=8F=85?= =?UTF-8?q?=EC=84=B1=EC=9D=84=20=EC=9C=84=ED=95=B4=20short=EC=9D=B4=20?= =?UTF-8?q?=EC=95=84=EB=8B=8C=20int=20=ED=83=80=EC=9E=85=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=A5=BC=20=EB=8B=A4=EB=A3=A8?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prgmrs/voucher/enums/DiscountType.java | 20 +++++------ .../repository/JdbcVoucherRepository.java | 33 +++++++++---------- .../voucher/repository/VoucherRepository.java | 2 +- .../voucher/service/VoucherService.java | 2 +- 4 files changed, 28 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/prgmrs/voucher/enums/DiscountType.java b/src/main/java/com/prgmrs/voucher/enums/DiscountType.java index 4cf115edbe..b1cba6c980 100644 --- a/src/main/java/com/prgmrs/voucher/enums/DiscountType.java +++ b/src/main/java/com/prgmrs/voucher/enums/DiscountType.java @@ -3,15 +3,15 @@ import com.prgmrs.voucher.exception.WrongRangeFormatException; public enum DiscountType { - FIXED_AMOUNT_DISCOUNT("fixed", (short) 1), - PERCENT_DISCOUNT("percent", (short) 2); + FIXED_AMOUNT_DISCOUNT("fixed", 1), + PERCENT_DISCOUNT("percent", 2); private final String stringValue; - private final short shortValue; + private final int value; - DiscountType(String stringValue, short shortValue) { + DiscountType(String stringValue, int value) { this.stringValue = stringValue; - this.shortValue = shortValue; + this.value = value; } public static DiscountType fromString(String value) { @@ -25,23 +25,23 @@ public static DiscountType fromString(String value) { public static DiscountType fromShort(short value) { for (DiscountType enumValue : DiscountType.values()) { - if (enumValue.shortValue == value) { + if (enumValue.value == value) { return enumValue; } } throw new WrongRangeFormatException("no matching discount type from short"); } - public static short fromEnumValueStringToShortValue(String value) { + public static int fromEnumValueStringToValue(String value) { for (DiscountType enumValue : DiscountType.values()) { if (enumValue.name().equalsIgnoreCase(value)) { - return enumValue.shortValue; + return enumValue.value; } } throw new WrongRangeFormatException("no matching discount type from enum"); } - public short getShortValue() { - return shortValue; + public int getValue() { + return value; } } diff --git a/src/main/java/com/prgmrs/voucher/repository/JdbcVoucherRepository.java b/src/main/java/com/prgmrs/voucher/repository/JdbcVoucherRepository.java index 2d8537351b..7f4c1771c6 100644 --- a/src/main/java/com/prgmrs/voucher/repository/JdbcVoucherRepository.java +++ b/src/main/java/com/prgmrs/voucher/repository/JdbcVoucherRepository.java @@ -63,13 +63,13 @@ public void save(Voucher voucher) { paramMap.put("voucherId", voucher.voucherId().toString()); if (voucher.discountStrategy() instanceof FixedAmountDiscountStrategy fixedAmountDiscountStrategy) { - short discountType = DiscountType.fromEnumValueStringToShortValue("FIXED_AMOUNT_DISCOUNT"); + int discountType = DiscountType.fromEnumValueStringToValue("FIXED_AMOUNT_DISCOUNT"); paramMap.put("discountType", discountType); paramMap.put("discountValue", fixedAmountDiscountStrategy.amount().value()); } if (voucher.discountStrategy() instanceof PercentDiscountStrategy percentDiscountStrategy) { - short discountType = DiscountType.fromEnumValueStringToShortValue("PERCENT_DISCOUNT"); + int discountType = DiscountType.fromEnumValueStringToValue("PERCENT_DISCOUNT"); paramMap.put("discountType", discountType); paramMap.put("discountValue", percentDiscountStrategy.percent().value()); } @@ -87,14 +87,14 @@ public List findAll() { @Override public List getAssignedVoucherListByUsername(Username username) { String sql = """ - SELECT - v.voucher_id, v.discount_type, v.discount_value - FROM `voucher` v - INNER JOIN `wallet` w ON v.voucher_id = w.voucher_id - INNER JOIN `user` u ON w.user_id = u.user_id - WHERE u.username = :username - AND w.unassigned_time IS NULL - ORDER BY v.created_at + SELECT + v.voucher_id, v.discount_type, v.discount_value + FROM `voucher` v + INNER JOIN `wallet` w ON v.voucher_id = w.voucher_id + INNER JOIN `user` u ON w.user_id = u.user_id + WHERE u.username = :username + AND w.unassigned_time IS NULL + ORDER BY v.created_at """; Map paramMap = new HashMap<>(); @@ -127,12 +127,11 @@ public List getNotAssignedVoucherList() { LEFT JOIN `wallet` w ON v.voucher_id = w.voucher_id WHERE w.voucher_id IS NULL OR (v.voucher_id IN (SELECT - w.voucher_id + w.voucher_id FROM `wallet` w - GROUP BY w.voucher_id - HAVING MAX(w.is_used) = 0 - AND MAX(CASE WHEN w.unassigned_time - IS NULL THEN 1 ELSE 0 END) = 0 + GROUP BY w.voucher_id + HAVING MAX(w.is_used) = 0 + AND MAX(CASE WHEN w.unassigned_time IS NULL THEN 1 ELSE 0 END) = 0 ) ) """; @@ -141,13 +140,13 @@ AND MAX(CASE WHEN w.unassigned_time } @Override - public List findByCreationTimeAndDiscountType(LocalDateTime startDate, LocalDateTime endDate, short discountType) { + public List findByCreationTimeAndDiscountType(LocalDateTime startDate, LocalDateTime endDate, int discountType) { String sql = """ SELECT v.voucher_id, v.discount_type, v.discount_value FROM `voucher` v WHERE (v.discount_type = :discountType) - AND (v.created_at BETWEEN :startDate AND :endDate) + AND (v.created_at BETWEEN :startDate AND :endDate) """; Map paramMap = new HashMap<>(); diff --git a/src/main/java/com/prgmrs/voucher/repository/VoucherRepository.java b/src/main/java/com/prgmrs/voucher/repository/VoucherRepository.java index eeee44f31c..ee9ef701d4 100644 --- a/src/main/java/com/prgmrs/voucher/repository/VoucherRepository.java +++ b/src/main/java/com/prgmrs/voucher/repository/VoucherRepository.java @@ -18,7 +18,7 @@ public interface VoucherRepository { List getAssignedVoucherList(); - List findByCreationTimeAndDiscountType(LocalDateTime startDate, LocalDateTime endDate, short discountType); + List findByCreationTimeAndDiscountType(LocalDateTime startDate, LocalDateTime endDate, int discountType); int removeVoucher(UUID voucherUUID); diff --git a/src/main/java/com/prgmrs/voucher/service/VoucherService.java b/src/main/java/com/prgmrs/voucher/service/VoucherService.java index 2898d013ac..47eee138f2 100644 --- a/src/main/java/com/prgmrs/voucher/service/VoucherService.java +++ b/src/main/java/com/prgmrs/voucher/service/VoucherService.java @@ -81,7 +81,7 @@ public VoucherListResponse findByCreationTimeAndDiscountType(VoucherSearchReques LocalDateTime startDate = voucherSearchRequest.startDate(); LocalDateTime endDate = voucherSearchRequest.endDate(); DiscountType discountType = DiscountType.fromString(voucherSearchRequest.discountType()); - return new VoucherListResponse(voucherRepository.findByCreationTimeAndDiscountType(startDate, endDate, discountType.getShortValue())); + return new VoucherListResponse(voucherRepository.findByCreationTimeAndDiscountType(startDate, endDate, discountType.getValue())); } public RemoveResponse removeVoucher(VoucherIdRequest voucherIdRequest) { From 717d7f5ae186e8608cc9cbc55f05220e2f4af793 Mon Sep 17 00:00:00 2001 From: Jaeyoung Ahn Date: Tue, 25 Jul 2023 04:10:53 +0900 Subject: [PATCH 07/11] =?UTF-8?q?refactor=20:=20null=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EA=B2=80=EC=A6=9D=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voucher/dto/request/VoucherSearchRequest.java | 13 +++++++++++++ .../voucher/model/validator/VoucherValidator.java | 7 +++++++ .../com/prgmrs/voucher/model/wrapper/Username.java | 8 ++++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/prgmrs/voucher/dto/request/VoucherSearchRequest.java b/src/main/java/com/prgmrs/voucher/dto/request/VoucherSearchRequest.java index 1a09082c34..7494ff4c8b 100644 --- a/src/main/java/com/prgmrs/voucher/dto/request/VoucherSearchRequest.java +++ b/src/main/java/com/prgmrs/voucher/dto/request/VoucherSearchRequest.java @@ -1,6 +1,19 @@ package com.prgmrs.voucher.dto.request; +import com.prgmrs.voucher.exception.WrongRangeFormatException; + import java.time.LocalDateTime; public record VoucherSearchRequest(LocalDateTime startDate, LocalDateTime endDate, String discountType) { + public VoucherSearchRequest { + if (startDate == null) { + throw new WrongRangeFormatException("startDate cannot be null"); + } + if (endDate == null) { + throw new WrongRangeFormatException("endDate cannot be null"); + } + if (discountType == null || discountType.isBlank()) { + throw new WrongRangeFormatException("discountType cannot be null or blank"); + } + } } diff --git a/src/main/java/com/prgmrs/voucher/model/validator/VoucherValidator.java b/src/main/java/com/prgmrs/voucher/model/validator/VoucherValidator.java index 5cc9a99b9a..da25ca53ff 100644 --- a/src/main/java/com/prgmrs/voucher/model/validator/VoucherValidator.java +++ b/src/main/java/com/prgmrs/voucher/model/validator/VoucherValidator.java @@ -23,6 +23,9 @@ public Long convertToLongWithValidation(String discountStringValue, DiscountType } private void isValidIntegerString(String discountStringValue) { + if (discountStringValue == null) { + throw new WrongRangeFormatException("discount value must be non-null value"); + } Pattern pattern = Pattern.compile("^[-+]?\\d+$"); if (!pattern.matcher(discountStringValue).matches()) { throw new WrongRangeFormatException("only digit are allowed"); @@ -30,6 +33,10 @@ private void isValidIntegerString(String discountStringValue) { } private void isAmountValid(long discountValue, DiscountType discountType) { + if (discountType == null) { + throw new WrongRangeFormatException("discountType should not be null"); + } + if (discountType == DiscountType.FIXED_AMOUNT_DISCOUNT && (0 >= discountValue || discountValue > voucherProperties.getMaximumFixedAmount())) { throw new WrongRangeFormatException("amount should be between 0 to defined limit"); diff --git a/src/main/java/com/prgmrs/voucher/model/wrapper/Username.java b/src/main/java/com/prgmrs/voucher/model/wrapper/Username.java index edbe596a94..2f9da61193 100644 --- a/src/main/java/com/prgmrs/voucher/model/wrapper/Username.java +++ b/src/main/java/com/prgmrs/voucher/model/wrapper/Username.java @@ -4,12 +4,16 @@ public record Username(String value) { public Username { + if (value == null) { + throw new WrongRangeFormatException("input value null"); + } + if (!value.matches("^[a-zA-Z]+$")) { // "\\d+" matches a sequence of one or more digits throw new WrongRangeFormatException("username must contain only alphabets"); } - if (value.length() > 255) { - throw new WrongRangeFormatException("length must be equal to or less than 255"); + if (value.length() < 1 || value.length() > 255) { + throw new WrongRangeFormatException("length must be between 1 to 255"); } } } From cea3204804a21f04353d3638ce7a33f70961d8fa Mon Sep 17 00:00:00 2001 From: Jaeyoung Ahn Date: Tue, 25 Jul 2023 04:25:15 +0900 Subject: [PATCH 08/11] =?UTF-8?q?refactor=20:=20=EC=B6=94=ED=9B=84=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8C=85=20=EC=9A=A9=EC=9D=B4=EC=84=B1?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=B4=20=EC=B6=94=EC=83=81=ED=99=94=20?= =?UTF-8?q?=EB=90=9C=20UUID=20=EC=83=9D=EC=84=B1=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=A5=BC=20=EC=A3=BC=EC=9E=85=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B2=83=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/prgmrs/voucher/service/UserService.java | 12 +++++++----- .../com/prgmrs/voucher/service/VoucherService.java | 8 +++++--- .../com/prgmrs/voucher/service/WalletService.java | 6 +++--- .../util/{UuidConverter.java => UUIDConverter.java} | 9 ++++++--- .../java/com/prgmrs/voucher/util/UUIDGenerator.java | 4 ++-- 5 files changed, 23 insertions(+), 16 deletions(-) rename src/main/java/com/prgmrs/voucher/util/{UuidConverter.java => UUIDConverter.java} (75%) diff --git a/src/main/java/com/prgmrs/voucher/service/UserService.java b/src/main/java/com/prgmrs/voucher/service/UserService.java index 3709191055..d67622fa5d 100644 --- a/src/main/java/com/prgmrs/voucher/service/UserService.java +++ b/src/main/java/com/prgmrs/voucher/service/UserService.java @@ -7,8 +7,8 @@ import com.prgmrs.voucher.model.User; import com.prgmrs.voucher.model.wrapper.Username; import com.prgmrs.voucher.repository.UserRepository; -import com.prgmrs.voucher.util.UUIDGenerator; -import com.prgmrs.voucher.util.UuidConverter; +import com.prgmrs.voucher.util.IdGenerator; +import com.prgmrs.voucher.util.UUIDConverter; import org.springframework.stereotype.Service; import java.util.List; @@ -17,13 +17,15 @@ @Service public class UserService { private final UserRepository userRepository; + private final IdGenerator idGenerator; - public UserService(UserRepository userRepository) { + public UserService(UserRepository userRepository, IdGenerator idGenerator) { this.userRepository = userRepository; + this.idGenerator = idGenerator; } public UserResponse createUser(UserRequest userRequest) { // 유저 생성 - UUID uuid = UUIDGenerator.generateUUID(); + UUID uuid = idGenerator.generate(); User user = new User(uuid, new Username(userRequest.username())); userRepository.save(user); @@ -41,7 +43,7 @@ public UserListResponse getUserListWithVoucherAssigned() { } public UserResponse getUserByVoucherId(VoucherIdRequest voucherIdRequest) { - UUID uuid = UuidConverter.fromString(voucherIdRequest.voucherUuid()); + UUID uuid = UUIDConverter.fromString(voucherIdRequest.voucherUuid()); User user = userRepository.getUserByVoucherId(uuid); return new UserResponse(user.userId(), user.username().value()); diff --git a/src/main/java/com/prgmrs/voucher/service/VoucherService.java b/src/main/java/com/prgmrs/voucher/service/VoucherService.java index 47eee138f2..a78f4cb07b 100644 --- a/src/main/java/com/prgmrs/voucher/service/VoucherService.java +++ b/src/main/java/com/prgmrs/voucher/service/VoucherService.java @@ -17,7 +17,7 @@ import com.prgmrs.voucher.model.wrapper.Percent; import com.prgmrs.voucher.model.wrapper.Username; import com.prgmrs.voucher.repository.VoucherRepository; -import com.prgmrs.voucher.util.UUIDGenerator; +import com.prgmrs.voucher.util.IdGenerator; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -27,10 +27,12 @@ public class VoucherService { private final VoucherRepository voucherRepository; private final VoucherValidator voucherValidator; + private final IdGenerator idGenerator; - public VoucherService(VoucherRepository voucherRepository, VoucherValidator voucherValidator) { + public VoucherService(VoucherRepository voucherRepository, VoucherValidator voucherValidator, IdGenerator idGenerator) { this.voucherRepository = voucherRepository; this.voucherValidator = voucherValidator; + this.idGenerator = idGenerator; } public VoucherResponse createVoucher(VoucherRequest voucherRequest) { @@ -38,7 +40,7 @@ public VoucherResponse createVoucher(VoucherRequest voucherRequest) { Long validatedLongValue = voucherValidator.convertToLongWithValidation(voucherRequest.discountStringValue(), discountType); - UUID uuid = UUIDGenerator.generateUUID(); + UUID uuid = idGenerator.generate(); Voucher voucher; switch (discountType) { diff --git a/src/main/java/com/prgmrs/voucher/service/WalletService.java b/src/main/java/com/prgmrs/voucher/service/WalletService.java index fb618d2c03..615c91b000 100644 --- a/src/main/java/com/prgmrs/voucher/service/WalletService.java +++ b/src/main/java/com/prgmrs/voucher/service/WalletService.java @@ -8,7 +8,7 @@ import com.prgmrs.voucher.model.wrapper.Username; import com.prgmrs.voucher.repository.UserRepository; import com.prgmrs.voucher.repository.WalletRepository; -import com.prgmrs.voucher.util.UuidConverter; +import com.prgmrs.voucher.util.UUIDConverter; import org.springframework.stereotype.Service; import java.util.UUID; @@ -25,14 +25,14 @@ public WalletService(UserRepository userRepository, WalletRepository walletRepos public WalletResponse assignVoucher(AssignVoucherRequest assignVoucherRequest) { User user = userRepository.findByUsername(new Username(assignVoucherRequest.username())); - Wallet wallet = new Wallet(user.userId(), UuidConverter.fromString(assignVoucherRequest.voucherUuid())); + Wallet wallet = new Wallet(user.userId(), UUIDConverter.fromString(assignVoucherRequest.voucherUuid())); walletRepository.save(wallet); return new WalletResponse(wallet.voucherId(), user.username().value()); } public WalletResponse removeVoucher(RemoveVoucherRequest removeVoucherRequest) { - UUID convertedUuid = UuidConverter.fromString(removeVoucherRequest.voucherUuid()); + UUID convertedUuid = UUIDConverter.fromString(removeVoucherRequest.voucherUuid()); User user = userRepository.getUserByVoucherId(convertedUuid); Wallet wallet = new Wallet(user.userId(), convertedUuid); walletRepository.remove(wallet); diff --git a/src/main/java/com/prgmrs/voucher/util/UuidConverter.java b/src/main/java/com/prgmrs/voucher/util/UUIDConverter.java similarity index 75% rename from src/main/java/com/prgmrs/voucher/util/UuidConverter.java rename to src/main/java/com/prgmrs/voucher/util/UUIDConverter.java index 8503499d43..fff7295bb0 100644 --- a/src/main/java/com/prgmrs/voucher/util/UuidConverter.java +++ b/src/main/java/com/prgmrs/voucher/util/UUIDConverter.java @@ -1,12 +1,15 @@ package com.prgmrs.voucher.util; import com.prgmrs.voucher.exception.WrongRangeFormatException; -import org.springframework.stereotype.Component; import java.util.UUID; -@Component -public class UuidConverter { +public class UUIDConverter { + + private UUIDConverter() { + throw new IllegalStateException("Util class"); + } + public static UUID fromString(String uuidString) { try { return UUID.fromString(uuidString); diff --git a/src/main/java/com/prgmrs/voucher/util/UUIDGenerator.java b/src/main/java/com/prgmrs/voucher/util/UUIDGenerator.java index 1517a46692..769d4561c8 100644 --- a/src/main/java/com/prgmrs/voucher/util/UUIDGenerator.java +++ b/src/main/java/com/prgmrs/voucher/util/UUIDGenerator.java @@ -5,8 +5,8 @@ import java.util.UUID; @Component -public class UUIDGenerator { - public static UUID generateUUID() { +public class UUIDGenerator implements IdGenerator { + public UUID generate() { return UUID.randomUUID(); } } From 84a32dbc2a50e563a4312ff2807c670db2f79eb7 Mon Sep 17 00:00:00 2001 From: Jaeyoung Ahn Date: Tue, 25 Jul 2023 04:36:14 +0900 Subject: [PATCH 09/11] =?UTF-8?q?refactor=20:=20NumberFormatException?= =?UTF-8?q?=EC=9D=84=20Global=20Exception=20Handler=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=20=EC=B2=98=EB=A6=AC=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voucher/global/GlobalExceptionHandler.java | 11 +++++++++++ .../java/com/prgmrs/voucher/util/IdGenerator.java | 8 ++++++++ .../com/prgmrs/voucher/view/io/ManagementType.java | 12 ++++-------- 3 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/prgmrs/voucher/util/IdGenerator.java diff --git a/src/main/java/com/prgmrs/voucher/global/GlobalExceptionHandler.java b/src/main/java/com/prgmrs/voucher/global/GlobalExceptionHandler.java index 4a6877be7e..96b39e627a 100644 --- a/src/main/java/com/prgmrs/voucher/global/GlobalExceptionHandler.java +++ b/src/main/java/com/prgmrs/voucher/global/GlobalExceptionHandler.java @@ -1,5 +1,6 @@ package com.prgmrs.voucher.global; +import com.prgmrs.voucher.exception.NoSuchVoucherTypeException; import com.prgmrs.voucher.exception.WrongRangeFormatException; import org.springframework.dao.DataAccessException; import org.springframework.http.ResponseEntity; @@ -12,4 +13,14 @@ public class GlobalExceptionHandler { public ResponseEntity handleException(Exception e) { return ResponseEntity.badRequest().body(e.getMessage()); } + + @ExceptionHandler(WrongRangeFormatException.class) + public ResponseEntity handleWrongRangeFormatException(WrongRangeFormatException e) { + return ResponseEntity.badRequest().body("invalid number was provided."); + } + + @ExceptionHandler(NoSuchVoucherTypeException.class) + public ResponseEntity handleNoSuchVoucherTypeException(NoSuchVoucherTypeException e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } } diff --git a/src/main/java/com/prgmrs/voucher/util/IdGenerator.java b/src/main/java/com/prgmrs/voucher/util/IdGenerator.java new file mode 100644 index 0000000000..eb38eb11b1 --- /dev/null +++ b/src/main/java/com/prgmrs/voucher/util/IdGenerator.java @@ -0,0 +1,8 @@ +package com.prgmrs.voucher.util; + +import java.util.UUID; + +public interface IdGenerator { + + UUID generate(); +} diff --git a/src/main/java/com/prgmrs/voucher/view/io/ManagementType.java b/src/main/java/com/prgmrs/voucher/view/io/ManagementType.java index 40dc1175cc..6e497a9bd2 100644 --- a/src/main/java/com/prgmrs/voucher/view/io/ManagementType.java +++ b/src/main/java/com/prgmrs/voucher/view/io/ManagementType.java @@ -21,15 +21,11 @@ public enum ManagementType { } public static ManagementType of(String orderNumberAsString) { - try { - int orderNumber = Integer.parseInt(orderNumberAsString); - if (isWithinOrderNumberRange(orderNumber)) { - return ManagementType.values()[orderNumber]; - } - throw new WrongRangeFormatException("no such option exists"); - } catch (NumberFormatException e) { - throw new WrongRangeFormatException("input must be number"); + int orderNumber = Integer.parseInt(orderNumberAsString); + if (isWithinOrderNumberRange(orderNumber)) { + return ManagementType.values()[orderNumber]; } + throw new WrongRangeFormatException("no such option exists"); } private static boolean isWithinOrderNumberRange(int orderNumber) { From 1a813a4c25e8eaf173a469ff37935acb4f01d2e3 Mon Sep 17 00:00:00 2001 From: Jaeyoung Ahn Date: Tue, 25 Jul 2023 04:52:50 +0900 Subject: [PATCH 10/11] =?UTF-8?q?fix=20:=20UUID=20Generator=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EC=A0=9C=EC=96=B4=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=EC=9D=B4=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=80=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/prgmrs/voucher/controller/UserControllerTest.java | 7 +++---- .../voucher/controller/VoucherJsonControllerTest.java | 5 ++--- .../prgmrs/voucher/controller/WalletControllerTest.java | 3 +-- .../com/prgmrs/voucher/model/FixedAmountVoucherTest.java | 3 +-- .../prgmrs/voucher/model/PercentDiscountVoucherTest.java | 3 +-- .../prgmrs/voucher/repository/JdbcUserRepositoryTest.java | 5 ++--- .../voucher/repository/JdbcVoucherRepositoryTest.java | 7 +++---- .../voucher/repository/JdbcWalletRepositoryTest.java | 5 ++--- .../java/com/prgmrs/voucher/service/UserServiceTest.java | 7 +++---- .../com/prgmrs/voucher/service/VoucherServiceTest.java | 5 ++--- .../java/com/prgmrs/voucher/service/WalletServiceTest.java | 5 ++--- 11 files changed, 22 insertions(+), 33 deletions(-) diff --git a/src/test/java/com/prgmrs/voucher/controller/UserControllerTest.java b/src/test/java/com/prgmrs/voucher/controller/UserControllerTest.java index 06cda59231..9c23c61e29 100644 --- a/src/test/java/com/prgmrs/voucher/controller/UserControllerTest.java +++ b/src/test/java/com/prgmrs/voucher/controller/UserControllerTest.java @@ -9,7 +9,6 @@ import com.prgmrs.voucher.model.User; import com.prgmrs.voucher.model.wrapper.Username; import com.prgmrs.voucher.service.UserService; -import com.prgmrs.voucher.util.UUIDGenerator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -41,13 +40,13 @@ class UserControllerTest { void setUp() { MockitoAnnotations.openMocks(this); - UUID uuidTyler = UUIDGenerator.generateUUID(); + UUID uuidTyler = UUID.randomUUID(); User userTyler = new User(uuidTyler, new Username("tyler")); userRequest = new UserRequest(userTyler.username().value()); userResponse = new UserResponse(uuidTyler, userTyler.username().value()); - UUID uuidJohn = UUIDGenerator.generateUUID(); + UUID uuidJohn = UUID.randomUUID(); User userJohn = new User(uuidJohn, new Username("john")); userListResponse = new UserListResponse(Arrays.asList(userTyler, userJohn)); } @@ -95,7 +94,7 @@ void GetUserListWithVoucherAssigned_NoParam_SameUserListResponse() { @DisplayName("바우처 아이디에 해당하는 유저를 불러온다.") void GetUserByVoucherId_userListRequest_SameUserResponse() { // Given - UUID voucherUuid = UUIDGenerator.generateUUID(); + UUID voucherUuid = UUID.randomUUID(); voucherIdRequest = new VoucherIdRequest(voucherUuid.toString()); given(userService.getUserByVoucherId(voucherIdRequest)).willReturn(userResponse); diff --git a/src/test/java/com/prgmrs/voucher/controller/VoucherJsonControllerTest.java b/src/test/java/com/prgmrs/voucher/controller/VoucherJsonControllerTest.java index aa25495743..4e94f45288 100644 --- a/src/test/java/com/prgmrs/voucher/controller/VoucherJsonControllerTest.java +++ b/src/test/java/com/prgmrs/voucher/controller/VoucherJsonControllerTest.java @@ -12,7 +12,6 @@ import com.prgmrs.voucher.model.wrapper.Amount; import com.prgmrs.voucher.model.wrapper.Percent; import com.prgmrs.voucher.service.VoucherService; -import com.prgmrs.voucher.util.UUIDGenerator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -44,13 +43,13 @@ void setUp() { MockitoAnnotations.openMocks(this); PercentDiscountStrategy percentDiscountStrategy = new PercentDiscountStrategy(new Percent(10)); - UUID voucherUuid1 = UUIDGenerator.generateUUID(); + UUID voucherUuid1 = UUID.randomUUID(); Voucher voucher1 = new Voucher(voucherUuid1, percentDiscountStrategy); voucherRequest = new VoucherRequest("percent", "10"); voucherResponse = new VoucherResponse(voucherUuid1, percentDiscountStrategy); FixedAmountDiscountStrategy fixedAmountDiscountStrategy = new FixedAmountDiscountStrategy(new Amount(300)); - UUID voucherUuid2 = UUIDGenerator.generateUUID(); + UUID voucherUuid2 = UUID.randomUUID(); Voucher voucher2 = new Voucher(voucherUuid2, fixedAmountDiscountStrategy); voucherListResponse = new VoucherListResponse(Arrays.asList(voucher1, voucher2)); } diff --git a/src/test/java/com/prgmrs/voucher/controller/WalletControllerTest.java b/src/test/java/com/prgmrs/voucher/controller/WalletControllerTest.java index 5ba21382d3..e5d9ea699e 100644 --- a/src/test/java/com/prgmrs/voucher/controller/WalletControllerTest.java +++ b/src/test/java/com/prgmrs/voucher/controller/WalletControllerTest.java @@ -6,7 +6,6 @@ import com.prgmrs.voucher.dto.request.RemoveVoucherRequest; import com.prgmrs.voucher.dto.response.WalletResponse; import com.prgmrs.voucher.service.WalletService; -import com.prgmrs.voucher.util.UUIDGenerator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -38,7 +37,7 @@ void setUp() { String username = "tyler"; - UUID voucherUuid = UUIDGenerator.generateUUID(); + UUID voucherUuid = UUID.randomUUID(); String voucherUuidString = voucherUuid.toString(); assignVoucherRequest = new AssignVoucherRequest(username, voucherUuidString); diff --git a/src/test/java/com/prgmrs/voucher/model/FixedAmountVoucherTest.java b/src/test/java/com/prgmrs/voucher/model/FixedAmountVoucherTest.java index 6b9f81d6bf..9ad7348cd1 100644 --- a/src/test/java/com/prgmrs/voucher/model/FixedAmountVoucherTest.java +++ b/src/test/java/com/prgmrs/voucher/model/FixedAmountVoucherTest.java @@ -3,7 +3,6 @@ import com.prgmrs.voucher.model.strategy.FixedAmountDiscountStrategy; import com.prgmrs.voucher.model.wrapper.Amount; import com.prgmrs.voucher.model.wrapper.DiscountValue; -import com.prgmrs.voucher.util.UUIDGenerator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -22,7 +21,7 @@ class FixedAmountVoucherTest { @BeforeEach void setUp() { - voucherId = UUIDGenerator.generateUUID(); + voucherId = UUID.randomUUID(); amount = new Amount(500); fixedAmountDiscountStrategy = new FixedAmountDiscountStrategy(amount); } diff --git a/src/test/java/com/prgmrs/voucher/model/PercentDiscountVoucherTest.java b/src/test/java/com/prgmrs/voucher/model/PercentDiscountVoucherTest.java index 2d04b9eefa..69352d0438 100644 --- a/src/test/java/com/prgmrs/voucher/model/PercentDiscountVoucherTest.java +++ b/src/test/java/com/prgmrs/voucher/model/PercentDiscountVoucherTest.java @@ -4,7 +4,6 @@ import com.prgmrs.voucher.model.strategy.PercentDiscountStrategy; import com.prgmrs.voucher.model.wrapper.DiscountValue; import com.prgmrs.voucher.model.wrapper.Percent; -import com.prgmrs.voucher.util.UUIDGenerator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -23,7 +22,7 @@ class PercentDiscountVoucherTest { @BeforeEach void setUp() { - voucherId = UUIDGenerator.generateUUID(); + voucherId = UUID.randomUUID(); percent = new Percent(50); percentDiscountStrategy = new PercentDiscountStrategy(percent); } diff --git a/src/test/java/com/prgmrs/voucher/repository/JdbcUserRepositoryTest.java b/src/test/java/com/prgmrs/voucher/repository/JdbcUserRepositoryTest.java index 712ae5d3fb..62197cd6c3 100644 --- a/src/test/java/com/prgmrs/voucher/repository/JdbcUserRepositoryTest.java +++ b/src/test/java/com/prgmrs/voucher/repository/JdbcUserRepositoryTest.java @@ -8,7 +8,6 @@ import com.prgmrs.voucher.model.wrapper.Amount; import com.prgmrs.voucher.model.wrapper.Percent; import com.prgmrs.voucher.model.wrapper.Username; -import com.prgmrs.voucher.util.UUIDGenerator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -51,10 +50,10 @@ class JdbcUserRepositoryTest { @BeforeEach void setUp() { - uuidTyler = UUIDGenerator.generateUUID(); + uuidTyler = UUID.randomUUID(); usernameTyler = new Username("tyler"); - uuidEmma = UUIDGenerator.generateUUID(); + uuidEmma = UUID.randomUUID(); usernameEmma = new Username("emma"); UUID voucherUuid1 = UUID.randomUUID(); diff --git a/src/test/java/com/prgmrs/voucher/repository/JdbcVoucherRepositoryTest.java b/src/test/java/com/prgmrs/voucher/repository/JdbcVoucherRepositoryTest.java index 43871f50bb..1b56767efb 100644 --- a/src/test/java/com/prgmrs/voucher/repository/JdbcVoucherRepositoryTest.java +++ b/src/test/java/com/prgmrs/voucher/repository/JdbcVoucherRepositoryTest.java @@ -8,7 +8,6 @@ import com.prgmrs.voucher.model.wrapper.Amount; import com.prgmrs.voucher.model.wrapper.Percent; import com.prgmrs.voucher.model.wrapper.Username; -import com.prgmrs.voucher.util.UUIDGenerator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -53,15 +52,15 @@ class JdbcVoucherRepositoryTest { @BeforeEach void setUp() { - voucherUuid1 = UUIDGenerator.generateUUID(); + voucherUuid1 = UUID.randomUUID(); Amount amount = new Amount(500); fixedAmountDiscountStrategy = new FixedAmountDiscountStrategy(amount); - voucherUuid2 = UUIDGenerator.generateUUID(); + voucherUuid2 = UUID.randomUUID(); Percent percent = new Percent(30); percentDiscountStrategy = new PercentDiscountStrategy(percent); - uuidTyler = UUIDGenerator.generateUUID(); + uuidTyler = UUID.randomUUID(); usernameTyler = new Username("tyler"); userTyler = new User(uuidTyler, usernameTyler); userRepository.save(userTyler); diff --git a/src/test/java/com/prgmrs/voucher/repository/JdbcWalletRepositoryTest.java b/src/test/java/com/prgmrs/voucher/repository/JdbcWalletRepositoryTest.java index e085ed6899..4bb5448545 100644 --- a/src/test/java/com/prgmrs/voucher/repository/JdbcWalletRepositoryTest.java +++ b/src/test/java/com/prgmrs/voucher/repository/JdbcWalletRepositoryTest.java @@ -6,7 +6,6 @@ import com.prgmrs.voucher.model.strategy.FixedAmountDiscountStrategy; import com.prgmrs.voucher.model.wrapper.Amount; import com.prgmrs.voucher.model.wrapper.Username; -import com.prgmrs.voucher.util.UUIDGenerator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -45,10 +44,10 @@ class JdbcWalletRepositoryTest { @BeforeEach void setUp() { - UUID uuidTyler = UUIDGenerator.generateUUID(); + UUID uuidTyler = UUID.randomUUID(); userTyler = new User(uuidTyler, new Username("tyler")); - UUID voucherUuid = UUIDGenerator.generateUUID(); + UUID voucherUuid = UUID.randomUUID(); Amount amount = new Amount(500); FixedAmountDiscountStrategy discountStrategy = new FixedAmountDiscountStrategy(amount); voucherWithFixedAmountOf500 = new Voucher(voucherUuid, discountStrategy); diff --git a/src/test/java/com/prgmrs/voucher/service/UserServiceTest.java b/src/test/java/com/prgmrs/voucher/service/UserServiceTest.java index 8eb7d03312..081b018939 100644 --- a/src/test/java/com/prgmrs/voucher/service/UserServiceTest.java +++ b/src/test/java/com/prgmrs/voucher/service/UserServiceTest.java @@ -7,7 +7,6 @@ import com.prgmrs.voucher.model.User; import com.prgmrs.voucher.model.wrapper.Username; import com.prgmrs.voucher.repository.UserRepository; -import com.prgmrs.voucher.util.UUIDGenerator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -41,11 +40,11 @@ class UserServiceTest { void setUp() { MockitoAnnotations.openMocks(this); - UUID userUuidTyler = UUIDGenerator.generateUUID(); + UUID userUuidTyler = UUID.randomUUID(); Username usernameTyler = new Username("tyler"); userTyler = new User(userUuidTyler, usernameTyler); - UUID userUuidEmma = UUIDGenerator.generateUUID(); + UUID userUuidEmma = UUID.randomUUID(); Username usernameEmma = new Username("emma"); userEmma = new User(userUuidEmma, usernameEmma); } @@ -107,7 +106,7 @@ void GetUserListWithVoucherAssigned_NoParam_UserListResponseSameAsGivenUsers() { @DisplayName("바우처 번호에 해당하는 유저를 조회한다.") void GetUserByVoucherId_UserListRequest_UserResponseSameAsGivenUser() { // Given - UUID voucherUUID = UUIDGenerator.generateUUID(); + UUID voucherUUID = UUID.randomUUID(); VoucherIdRequest voucherIdRequest = new VoucherIdRequest(voucherUUID.toString()); given(userRepository.getUserByVoucherId(voucherUUID)).willReturn(userTyler); diff --git a/src/test/java/com/prgmrs/voucher/service/VoucherServiceTest.java b/src/test/java/com/prgmrs/voucher/service/VoucherServiceTest.java index 9a4bff7a93..d416dd9cf8 100644 --- a/src/test/java/com/prgmrs/voucher/service/VoucherServiceTest.java +++ b/src/test/java/com/prgmrs/voucher/service/VoucherServiceTest.java @@ -12,7 +12,6 @@ import com.prgmrs.voucher.model.wrapper.Amount; import com.prgmrs.voucher.model.wrapper.Username; import com.prgmrs.voucher.repository.VoucherRepository; -import com.prgmrs.voucher.util.UUIDGenerator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -49,12 +48,12 @@ class VoucherServiceTest { void setUp() { MockitoAnnotations.openMocks(this); - UUID voucherUuid1 = UUIDGenerator.generateUUID(); + UUID voucherUuid1 = UUID.randomUUID(); Amount amount1 = new Amount(300); FixedAmountDiscountStrategy discountStrategy1 = new FixedAmountDiscountStrategy(amount1); voucherFixedAmountOf300 = new Voucher(voucherUuid1, discountStrategy1); - UUID voucherUuid2 = UUIDGenerator.generateUUID(); + UUID voucherUuid2 = UUID.randomUUID(); Amount amount2 = new Amount(200); FixedAmountDiscountStrategy discountStrategy2 = new FixedAmountDiscountStrategy(amount2); voucherFixedAmountOf200 = new Voucher(voucherUuid2, discountStrategy2); diff --git a/src/test/java/com/prgmrs/voucher/service/WalletServiceTest.java b/src/test/java/com/prgmrs/voucher/service/WalletServiceTest.java index 19f5c23abd..dd8da42b76 100644 --- a/src/test/java/com/prgmrs/voucher/service/WalletServiceTest.java +++ b/src/test/java/com/prgmrs/voucher/service/WalletServiceTest.java @@ -8,7 +8,6 @@ import com.prgmrs.voucher.model.wrapper.Username; import com.prgmrs.voucher.repository.UserRepository; import com.prgmrs.voucher.repository.WalletRepository; -import com.prgmrs.voucher.util.UUIDGenerator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -44,9 +43,9 @@ class WalletServiceTest { void setUp() { MockitoAnnotations.openMocks(this); - voucherUUID = UUIDGenerator.generateUUID(); + voucherUUID = UUID.randomUUID(); - UUID userUUID = UUIDGenerator.generateUUID(); + UUID userUUID = UUID.randomUUID(); username = new Username("tyler"); user = new User(userUUID, username); } From 9f70c61c02755c0183d0798f05c5e0a4d8f1e74d Mon Sep 17 00:00:00 2001 From: Jaeyoung Ahn Date: Tue, 25 Jul 2023 04:53:56 +0900 Subject: [PATCH 11/11] =?UTF-8?q?refactor=20:=20=EC=9D=BC=EB=B6=80=20?= =?UTF-8?q?=EC=9D=B5=EC=85=89=EC=85=98=EC=9D=84=20@ControllerAdvice?= =?UTF-8?q?=EB=A5=BC=20=ED=86=B5=ED=95=B4=20=EC=B2=98=EB=A6=AC=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/prgmrs/voucher/global/GlobalExceptionHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/prgmrs/voucher/global/GlobalExceptionHandler.java b/src/main/java/com/prgmrs/voucher/global/GlobalExceptionHandler.java index 96b39e627a..1902035c37 100644 --- a/src/main/java/com/prgmrs/voucher/global/GlobalExceptionHandler.java +++ b/src/main/java/com/prgmrs/voucher/global/GlobalExceptionHandler.java @@ -14,8 +14,8 @@ public ResponseEntity handleException(Exception e) { return ResponseEntity.badRequest().body(e.getMessage()); } - @ExceptionHandler(WrongRangeFormatException.class) - public ResponseEntity handleWrongRangeFormatException(WrongRangeFormatException e) { + @ExceptionHandler(NumberFormatException.class) + public ResponseEntity handleNumberFormatException(NumberFormatException e) { return ResponseEntity.badRequest().body("invalid number was provided."); }