From 33652f44d2aef82e08f34fe9a6824c95fc41e057 Mon Sep 17 00:00:00 2001 From: PHJ Date: Mon, 17 Jul 2023 12:28:17 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20REST=20API=20=EC=BB=A8=ED=8A=B8?= =?UTF-8?q?=EB=A1=A4=EB=9F=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/VoucherJsonApiController.java | 68 +++++++++++++++++++ .../web/VoucherXmlApiController.java | 68 +++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 src/main/java/com/dev/voucherproject/controller/web/VoucherJsonApiController.java create mode 100644 src/main/java/com/dev/voucherproject/controller/web/VoucherXmlApiController.java diff --git a/src/main/java/com/dev/voucherproject/controller/web/VoucherJsonApiController.java b/src/main/java/com/dev/voucherproject/controller/web/VoucherJsonApiController.java new file mode 100644 index 0000000000..eb351a3e39 --- /dev/null +++ b/src/main/java/com/dev/voucherproject/controller/web/VoucherJsonApiController.java @@ -0,0 +1,68 @@ +package com.dev.voucherproject.controller.web; + + +import com.dev.voucherproject.controller.web.request.VoucherCreateRequest; +import com.dev.voucherproject.controller.web.response.Response; +import com.dev.voucherproject.model.service.VoucherService; +import com.dev.voucherproject.model.voucher.VoucherDto; +import com.dev.voucherproject.model.voucher.VoucherPolicy; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; + +@RestController +@RequestMapping(value = "/api/v1/vouchers", produces = MediaType.APPLICATION_JSON_VALUE) +public class VoucherJsonApiController { + private final VoucherService voucherService; + + public VoucherJsonApiController(VoucherService voucherService) { + this.voucherService = voucherService; + } + + @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(HttpStatus.CREATED) + public Response create(@RequestBody VoucherCreateRequest voucherCreateRequest) { + voucherService.insert(voucherCreateRequest); + + return Response.success(null); + } + + @GetMapping + public Response> vouchers(@RequestParam("policy") Optional policy) { + List vouchers = policy + .map(voucherService::findAllVouchersByPolicy) + .orElse(voucherService.findAllVouchers()) + .stream().toList(); + + return Response.success(vouchers); + } + + @GetMapping("/date") + public Response> betweenDatesCreatedVouchers( + @RequestParam("startDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate, + @RequestParam("endDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate + ) { + List vouchers = voucherService.findAllBetweenDates(startDate, endDate); + + return Response.success(vouchers); + } + + @GetMapping("/{id}") + public Response voucher(@PathVariable String id) { + VoucherDto voucher = voucherService.findById(id); + + return Response.success(voucher); + } + + @DeleteMapping("/{id}") + public Response delete(@PathVariable String id) { + voucherService.deleteById(id); + + return Response.success(null); + } +} diff --git a/src/main/java/com/dev/voucherproject/controller/web/VoucherXmlApiController.java b/src/main/java/com/dev/voucherproject/controller/web/VoucherXmlApiController.java new file mode 100644 index 0000000000..fa3a57ef47 --- /dev/null +++ b/src/main/java/com/dev/voucherproject/controller/web/VoucherXmlApiController.java @@ -0,0 +1,68 @@ +package com.dev.voucherproject.controller.web; + + +import com.dev.voucherproject.controller.web.request.VoucherCreateRequest; +import com.dev.voucherproject.controller.web.response.Response; +import com.dev.voucherproject.model.service.VoucherService; +import com.dev.voucherproject.model.voucher.VoucherDto; +import com.dev.voucherproject.model.voucher.VoucherPolicy; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; + +@RestController +@RequestMapping(value = "/api/v1/vouchers", produces = MediaType.APPLICATION_ATOM_XML_VALUE) +public class VoucherXmlApiController { + private final VoucherService voucherService; + + public VoucherXmlApiController(VoucherService voucherService) { + this.voucherService = voucherService; + } + + @PostMapping(consumes = MediaType.APPLICATION_ATOM_XML_VALUE) + @ResponseStatus(HttpStatus.CREATED) + public Response create(@RequestBody VoucherCreateRequest voucherCreateRequest) { + voucherService.insert(voucherCreateRequest); + + return Response.success(null); + } + + @GetMapping + public Response> vouchers(@RequestParam("policy") Optional policy) { + List vouchers = policy + .map(voucherService::findAllVouchersByPolicy) + .orElse(voucherService.findAllVouchers()) + .stream().toList(); + + return Response.success(vouchers); + } + + @GetMapping("/date") + public Response> betweenDatesCreatedVouchers( + @RequestParam("startDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate, + @RequestParam("endDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate + ) { + List vouchers = voucherService.findAllBetweenDates(startDate, endDate); + + return Response.success(vouchers); + } + + @GetMapping("/{id}") + public Response voucher(@PathVariable String id) { + VoucherDto voucher = voucherService.findById(id); + + return Response.success(voucher); + } + + @DeleteMapping("/{id}") + public Response delete(@PathVariable String id) { + voucherService.deleteById(id); + + return Response.success(null); + } +} From a66bf7303bafef8a2760973c331a7464bdd1c0e3 Mon Sep 17 00:00:00 2001 From: PHJ Date: Mon, 17 Jul 2023 12:29:40 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20CORS=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voucherproject/controller/web/config/WebConfig.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/dev/voucherproject/controller/web/config/WebConfig.java b/src/main/java/com/dev/voucherproject/controller/web/config/WebConfig.java index 4ede5a6f04..7bb130a369 100644 --- a/src/main/java/com/dev/voucherproject/controller/web/config/WebConfig.java +++ b/src/main/java/com/dev/voucherproject/controller/web/config/WebConfig.java @@ -5,11 +5,19 @@ import org.springframework.context.annotation.Configuration; import org.springframework.web.filter.HiddenHttpMethodFilter; +import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry + .addMapping("/**") + .allowedOrigins("http://localhost:3000"); + } @Bean public HiddenHttpMethodFilter hiddenHttpMethodFilter(){ return new HiddenHttpMethodFilter(); From 0ea975187bffb55bec1c94f25b597dff76722d35 Mon Sep 17 00:00:00 2001 From: PHJ Date: Mon, 17 Jul 2023 12:38:05 +0900 Subject: [PATCH 3/4] =?UTF-8?q?style:=20=EC=BD=94=EB=93=9C=20=ED=8F=AC?= =?UTF-8?q?=EB=A7=A4=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/web/VoucherJsonApiController.java | 3 ++- .../voucherproject/controller/web/VoucherXmlApiController.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/dev/voucherproject/controller/web/VoucherJsonApiController.java b/src/main/java/com/dev/voucherproject/controller/web/VoucherJsonApiController.java index eb351a3e39..7492e14355 100644 --- a/src/main/java/com/dev/voucherproject/controller/web/VoucherJsonApiController.java +++ b/src/main/java/com/dev/voucherproject/controller/web/VoucherJsonApiController.java @@ -37,7 +37,8 @@ public Response> vouchers(@RequestParam("policy") Optional vouchers = policy .map(voucherService::findAllVouchersByPolicy) .orElse(voucherService.findAllVouchers()) - .stream().toList(); + .stream() + .toList(); return Response.success(vouchers); } diff --git a/src/main/java/com/dev/voucherproject/controller/web/VoucherXmlApiController.java b/src/main/java/com/dev/voucherproject/controller/web/VoucherXmlApiController.java index fa3a57ef47..d7b04f43f2 100644 --- a/src/main/java/com/dev/voucherproject/controller/web/VoucherXmlApiController.java +++ b/src/main/java/com/dev/voucherproject/controller/web/VoucherXmlApiController.java @@ -37,7 +37,8 @@ public Response> vouchers(@RequestParam("policy") Optional vouchers = policy .map(voucherService::findAllVouchersByPolicy) .orElse(voucherService.findAllVouchers()) - .stream().toList(); + .stream() + .toList(); return Response.success(vouchers); } From 4a8bed904a38e3772c827b0c12b3711c8c8b009b Mon Sep 17 00:00:00 2001 From: PHJ Date: Thu, 20 Jul 2023 14:06:50 +0900 Subject: [PATCH 4/4] =?UTF-8?q?refactor:=20=ED=94=BC=EB=93=9C=EB=B0=B1=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/VoucherJsonApiController.java | 42 ++++++++++--------- .../web/VoucherXmlApiController.java | 40 +++++++++--------- .../model/service/VoucherService.java | 17 +++++++- 3 files changed, 59 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/dev/voucherproject/controller/web/VoucherJsonApiController.java b/src/main/java/com/dev/voucherproject/controller/web/VoucherJsonApiController.java index 7492e14355..7ddf656b55 100644 --- a/src/main/java/com/dev/voucherproject/controller/web/VoucherJsonApiController.java +++ b/src/main/java/com/dev/voucherproject/controller/web/VoucherJsonApiController.java @@ -9,9 +9,13 @@ import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.net.URI; import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Optional; @@ -25,45 +29,45 @@ public VoucherJsonApiController(VoucherService voucherService) { } @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) - @ResponseStatus(HttpStatus.CREATED) - public Response create(@RequestBody VoucherCreateRequest voucherCreateRequest) { - voucherService.insert(voucherCreateRequest); + public ResponseEntity> create(@RequestBody VoucherCreateRequest voucherCreateRequest) { + String id = voucherService.insert(voucherCreateRequest); - return Response.success(null); + return ResponseEntity.created(URI.create("/api/v1/vouchers/"+id)) + .body(Response.success(id)); } @GetMapping - public Response> vouchers(@RequestParam("policy") Optional policy) { - List vouchers = policy - .map(voucherService::findAllVouchersByPolicy) - .orElse(voucherService.findAllVouchers()) - .stream() - .toList(); + public ResponseEntity>> vouchers(@RequestParam("voucherPolicy") Optional voucherPolicy) { + List voucherDtos = voucherService.findAllVouchersAppliedQueryString(voucherPolicy); - return Response.success(vouchers); + return ResponseEntity.ok() + .body(Response.success(voucherDtos)); } @GetMapping("/date") - public Response> betweenDatesCreatedVouchers( + public ResponseEntity>> betweenDatesCreatedVouchers( @RequestParam("startDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate, @RequestParam("endDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate ) { - List vouchers = voucherService.findAllBetweenDates(startDate, endDate); + List voucherDtos = voucherService.findAllBetweenDates(startDate, endDate); - return Response.success(vouchers); + return ResponseEntity.ok() + .body(Response.success(voucherDtos)); } @GetMapping("/{id}") - public Response voucher(@PathVariable String id) { - VoucherDto voucher = voucherService.findById(id); + public ResponseEntity> voucher(@PathVariable String id) { + VoucherDto voucherDtos = voucherService.findById(id); - return Response.success(voucher); + return ResponseEntity.ok() + .body(Response.success(voucherDtos)); } @DeleteMapping("/{id}") - public Response delete(@PathVariable String id) { + public ResponseEntity> delete(@PathVariable String id) { voucherService.deleteById(id); - return Response.success(null); + return ResponseEntity.ok() + .body(Response.success(id)); } } diff --git a/src/main/java/com/dev/voucherproject/controller/web/VoucherXmlApiController.java b/src/main/java/com/dev/voucherproject/controller/web/VoucherXmlApiController.java index d7b04f43f2..a854e9f514 100644 --- a/src/main/java/com/dev/voucherproject/controller/web/VoucherXmlApiController.java +++ b/src/main/java/com/dev/voucherproject/controller/web/VoucherXmlApiController.java @@ -9,8 +9,10 @@ import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.net.URI; import java.time.LocalDate; import java.util.List; import java.util.Optional; @@ -25,45 +27,45 @@ public VoucherXmlApiController(VoucherService voucherService) { } @PostMapping(consumes = MediaType.APPLICATION_ATOM_XML_VALUE) - @ResponseStatus(HttpStatus.CREATED) - public Response create(@RequestBody VoucherCreateRequest voucherCreateRequest) { - voucherService.insert(voucherCreateRequest); + public ResponseEntity> create(@RequestBody VoucherCreateRequest voucherCreateRequest) { + String id = voucherService.insert(voucherCreateRequest); - return Response.success(null); + return ResponseEntity.created(URI.create("/api/v1/vouchers/"+id)) + .body(Response.success(id)); } @GetMapping - public Response> vouchers(@RequestParam("policy") Optional policy) { - List vouchers = policy - .map(voucherService::findAllVouchersByPolicy) - .orElse(voucherService.findAllVouchers()) - .stream() - .toList(); + public ResponseEntity>> vouchers(@RequestParam("voucherPolicy") Optional voucherPolicy) { + List voucherDtos = voucherService.findAllVouchersAppliedQueryString(voucherPolicy); - return Response.success(vouchers); + return ResponseEntity.ok() + .body(Response.success(voucherDtos)); } @GetMapping("/date") - public Response> betweenDatesCreatedVouchers( + public ResponseEntity>> betweenDatesCreatedVouchers( @RequestParam("startDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate, @RequestParam("endDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate ) { - List vouchers = voucherService.findAllBetweenDates(startDate, endDate); + List voucherDtos = voucherService.findAllBetweenDates(startDate, endDate); - return Response.success(vouchers); + return ResponseEntity.ok() + .body(Response.success(voucherDtos)); } @GetMapping("/{id}") - public Response voucher(@PathVariable String id) { - VoucherDto voucher = voucherService.findById(id); + public ResponseEntity> voucher(@PathVariable String id) { + VoucherDto voucherDtos = voucherService.findById(id); - return Response.success(voucher); + return ResponseEntity.ok() + .body(Response.success(voucherDtos)); } @DeleteMapping("/{id}") - public Response delete(@PathVariable String id) { + public ResponseEntity> delete(@PathVariable String id) { voucherService.deleteById(id); - return Response.success(null); + return ResponseEntity.ok() + .body(Response.success(id)); } } diff --git a/src/main/java/com/dev/voucherproject/model/service/VoucherService.java b/src/main/java/com/dev/voucherproject/model/service/VoucherService.java index e4ff93d49a..b52b210f89 100644 --- a/src/main/java/com/dev/voucherproject/model/service/VoucherService.java +++ b/src/main/java/com/dev/voucherproject/model/service/VoucherService.java @@ -12,6 +12,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; import java.util.UUID; @Service @@ -24,14 +25,26 @@ public VoucherService(VoucherDao voucherDao) { } @Transactional - public void insert(VoucherCreateRequest voucherCreateRequest) { + public String insert(VoucherCreateRequest voucherCreateRequest) { + UUID uuid = UUID.randomUUID(); + Voucher voucher = Voucher.of( - UUID.randomUUID(), + uuid, LocalDateTime.now(), voucherCreateRequest.voucherPolicy(), voucherCreateRequest.discountFigure() ); voucherDao.insert(voucher); + + return uuid.toString(); + } + + public List findAllVouchersAppliedQueryString(Optional voucherPolicy) { + if (voucherPolicy.isEmpty()) { + return findAllVouchers(); + } + + return findAllVouchersByPolicy(voucherPolicy.get()); } public List findAllVouchers() {