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/view/ConsoleApplication.java b/src/main/java/com/prgmrs/voucher/ConsoleApplication.java similarity index 92% rename from src/main/java/com/prgmrs/voucher/view/ConsoleApplication.java rename to src/main/java/com/prgmrs/voucher/ConsoleApplication.java index 06dde40d41..2913546343 100644 --- a/src/main/java/com/prgmrs/voucher/view/ConsoleApplication.java +++ b/src/main/java/com/prgmrs/voucher/ConsoleApplication.java @@ -1,12 +1,13 @@ -package com.prgmrs.voucher.view; +package com.prgmrs.voucher; -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.RequestBodyCreator; import com.prgmrs.voucher.view.io.ConsoleReader; import com.prgmrs.voucher.view.io.ConsoleWriter; import com.prgmrs.voucher.view.io.ManagementType; 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..7494ff4c8b --- /dev/null +++ b/src/main/java/com/prgmrs/voucher/dto/request/VoucherSearchRequest.java @@ -0,0 +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/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..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,19 +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 toShortValue(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 int getValue() { + return value; + } } diff --git a/src/main/java/com/prgmrs/voucher/global/GlobalExceptionHandler.java b/src/main/java/com/prgmrs/voucher/global/GlobalExceptionHandler.java new file mode 100644 index 0000000000..1902035c37 --- /dev/null +++ b/src/main/java/com/prgmrs/voucher/global/GlobalExceptionHandler.java @@ -0,0 +1,26 @@ +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; +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()); + } + + @ExceptionHandler(NumberFormatException.class) + public ResponseEntity handleNumberFormatException(NumberFormatException 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/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"); } } } diff --git a/src/main/java/com/prgmrs/voucher/repository/JdbcVoucherRepository.java b/src/main/java/com/prgmrs/voucher/repository/JdbcVoucherRepository.java index d766e92656..7f4c1771c6 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"); + 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.toShortValue("PERCENT_DISCOUNT"); + int discountType = DiscountType.fromEnumValueStringToValue("PERCENT_DISCOUNT"); paramMap.put("discountType", discountType); paramMap.put("discountValue", percentDiscountStrategy.percent().value()); } @@ -86,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<>(); @@ -126,16 +127,61 @@ 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 ) ) """; return jdbcTemplate.query(sql, toRowMapper()); } + + @Override + 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) + """; + + 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..ee9ef701d4 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, int discountType); + + int removeVoucher(UUID voucherUUID); + + Voucher findById(UUID voucherUUID); } 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 e220be247b..a78f4cb07b 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; @@ -14,19 +17,22 @@ 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; import java.util.UUID; @Service 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) { @@ -34,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) { @@ -72,4 +78,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.getValue())); + } + + 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/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/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/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(); } } 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..b2d61e6b1d 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 @@ -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..6e497a9bd2 100644 --- a/src/main/java/com/prgmrs/voucher/view/io/ManagementType.java +++ b/src/main/java/com/prgmrs/voucher/view/io/ManagementType.java @@ -14,25 +14,25 @@ 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) { - try { - int convertedValue = Integer.parseInt(value); - if (convertedValue >= 0 && convertedValue < ManagementType.values().length) { - return ManagementType.values()[convertedValue]; - } - throw new WrongRangeFormatException("no such option exists"); - } catch (NumberFormatException e) { - throw new WrongRangeFormatException("input must be number"); + public static ManagementType of(String orderNumberAsString) { + int orderNumber = Integer.parseInt(orderNumberAsString); + if (isWithinOrderNumberRange(orderNumber)) { + return ManagementType.values()[orderNumber]; } + throw new WrongRangeFormatException("no such option exists"); } - public String getValue() { - return value; + private static boolean isWithinOrderNumberRange(int orderNumber) { + return orderNumber >= 0 && orderNumber < ManagementType.values().length; + } + + public String getMessage() { + return message; } } 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..9c23c61e29 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; @@ -8,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; @@ -40,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)); } @@ -94,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/VoucherControllerTest.java b/src/test/java/com/prgmrs/voucher/controller/VoucherJsonControllerTest.java similarity index 93% rename from src/test/java/com/prgmrs/voucher/controller/VoucherControllerTest.java rename to src/test/java/com/prgmrs/voucher/controller/VoucherJsonControllerTest.java index 76393cde3a..4e94f45288 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; @@ -11,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; @@ -26,7 +26,7 @@ import static org.mockito.BDDMockito.given; @DisplayName("바우처 컨트롤러 레이어를 테스트한다.") -class VoucherControllerTest { +class VoucherJsonControllerTest { @InjectMocks VoucherController voucherController; @@ -43,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 fe4598aa2c..e5d9ea699e 100644 --- a/src/test/java/com/prgmrs/voucher/controller/WalletControllerTest.java +++ b/src/test/java/com/prgmrs/voucher/controller/WalletControllerTest.java @@ -1,11 +1,11 @@ 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; 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; @@ -37,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); } 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`),