From fa111b9477eabc0aedde2d4fe36e0915e1f611ed Mon Sep 17 00:00:00 2001 From: devdaeun Date: Fri, 14 Mar 2025 17:02:59 +0900 Subject: [PATCH 001/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#2]=20:=20eureka=20?= =?UTF-8?q?server=20init=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eureka/build.gradle | 14 ++++++++++++++ .../java/com/sparta/eureka/EurekaApplication.java | 15 +++++++++++++++ eureka/src/main/resources/application.yml | 11 +++++++++++ .../com/sparta/eureka/EurekaApplicationTests.java | 13 +++++++++++++ 4 files changed, 53 insertions(+) create mode 100644 eureka/build.gradle create mode 100644 eureka/src/main/java/com/sparta/eureka/EurekaApplication.java create mode 100644 eureka/src/main/resources/application.yml create mode 100644 eureka/src/test/java/com/sparta/eureka/EurekaApplicationTests.java diff --git a/eureka/build.gradle b/eureka/build.gradle new file mode 100644 index 0000000..818a8bc --- /dev/null +++ b/eureka/build.gradle @@ -0,0 +1,14 @@ +ext { + set('springCloudVersion', "2024.0.0") +} + +dependencies { + implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server' +} + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" + } +} + diff --git a/eureka/src/main/java/com/sparta/eureka/EurekaApplication.java b/eureka/src/main/java/com/sparta/eureka/EurekaApplication.java new file mode 100644 index 0000000..40c26fc --- /dev/null +++ b/eureka/src/main/java/com/sparta/eureka/EurekaApplication.java @@ -0,0 +1,15 @@ +package com.sparta.eureka; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; + +@EnableEurekaServer +@SpringBootApplication +public class EurekaApplication { + + public static void main(String[] args) { + SpringApplication.run(EurekaApplication.class, args); + } + +} diff --git a/eureka/src/main/resources/application.yml b/eureka/src/main/resources/application.yml new file mode 100644 index 0000000..bb6cc50 --- /dev/null +++ b/eureka/src/main/resources/application.yml @@ -0,0 +1,11 @@ +spring: + application: + name: eureka + +server: + port: 8761 + +eureka: + client: + register-with-eureka: false + fetch-registry: false diff --git a/eureka/src/test/java/com/sparta/eureka/EurekaApplicationTests.java b/eureka/src/test/java/com/sparta/eureka/EurekaApplicationTests.java new file mode 100644 index 0000000..0905de5 --- /dev/null +++ b/eureka/src/test/java/com/sparta/eureka/EurekaApplicationTests.java @@ -0,0 +1,13 @@ +package com.sparta.eureka; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class EurekaApplicationTests { + + @Test + void contextLoads() { + } + +} From d7fe4eeff83a69ec0b98a3ae9a38c828fb1885ce Mon Sep 17 00:00:00 2001 From: devdaeun Date: Fri, 14 Mar 2025 17:52:24 +0900 Subject: [PATCH 002/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#8]=20:=20user-serv?= =?UTF-8?q?ice=20init=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- settings.gradle | 2 +- user-service/build.gradle | 13 +++++++++++++ .../com/sparta/user/UserServiceApplication.java | 13 +++++++++++++ .../sparta/user/presentation/UserController.java | 15 +++++++++++++++ user-service/src/main/resources/application.yml | 13 +++++++++++++ .../sparta/user/UserServiceApplicationTests.java | 13 +++++++++++++ 6 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 user-service/build.gradle create mode 100644 user-service/src/main/java/com/sparta/user/UserServiceApplication.java create mode 100644 user-service/src/main/java/com/sparta/user/presentation/UserController.java create mode 100644 user-service/src/main/resources/application.yml create mode 100644 user-service/src/test/java/com/sparta/user/UserServiceApplicationTests.java diff --git a/settings.gradle b/settings.gradle index cf68ea9..2bd4627 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,4 +2,4 @@ rootProject.name = 'logistics-delivery' include('eureka') include('gateway') -include('user') +include('user-service') diff --git a/user-service/build.gradle b/user-service/build.gradle new file mode 100644 index 0000000..1786f75 --- /dev/null +++ b/user-service/build.gradle @@ -0,0 +1,13 @@ +ext { + set('springCloudVersion', "2024.0.0") +} + +dependencies { + implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' +} + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" + } +} diff --git a/user-service/src/main/java/com/sparta/user/UserServiceApplication.java b/user-service/src/main/java/com/sparta/user/UserServiceApplication.java new file mode 100644 index 0000000..7272457 --- /dev/null +++ b/user-service/src/main/java/com/sparta/user/UserServiceApplication.java @@ -0,0 +1,13 @@ +package com.sparta.user; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class UserServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(UserServiceApplication.class, args); + } + +} diff --git a/user-service/src/main/java/com/sparta/user/presentation/UserController.java b/user-service/src/main/java/com/sparta/user/presentation/UserController.java new file mode 100644 index 0000000..8a933c7 --- /dev/null +++ b/user-service/src/main/java/com/sparta/user/presentation/UserController.java @@ -0,0 +1,15 @@ +package com.sparta.user.presentation; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/v1/users") +public class UserController { + + @GetMapping("/test") + public String getUser() { + return "Hello World"; + } +} diff --git a/user-service/src/main/resources/application.yml b/user-service/src/main/resources/application.yml new file mode 100644 index 0000000..4d0be27 --- /dev/null +++ b/user-service/src/main/resources/application.yml @@ -0,0 +1,13 @@ +spring: + application: + name: user-service + +server: + port: 8081 + +eureka: + client: + register-with-eureka: true # Eureka? ??? ?? + fetch-registry: true # Eureka?? ??? ?? ???? + service-url: + defaultZone: http://localhost:8761/eureka/ diff --git a/user-service/src/test/java/com/sparta/user/UserServiceApplicationTests.java b/user-service/src/test/java/com/sparta/user/UserServiceApplicationTests.java new file mode 100644 index 0000000..11a417b --- /dev/null +++ b/user-service/src/test/java/com/sparta/user/UserServiceApplicationTests.java @@ -0,0 +1,13 @@ +package com.sparta.user; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class UserServiceApplicationTests { + + @Test + void contextLoads() { + } + +} From c91066c52202702dfbbc89c87d7749daaf34d468 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=EC=9D=80=E2=98=98?= <138298079+devdaeun@users.noreply.github.com> Date: Fri, 14 Mar 2025 18:37:03 +0900 Subject: [PATCH 003/389] Create pull_request_templat.md --- .github/pull_request_templat.md | 34 +++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/pull_request_templat.md diff --git a/.github/pull_request_templat.md b/.github/pull_request_templat.md new file mode 100644 index 0000000..80f1f9e --- /dev/null +++ b/.github/pull_request_templat.md @@ -0,0 +1,34 @@ +--- +(확인 후 지워주세요) +--- +제목 양식 - 이모지 작업타입 [#이슈번호] : 제목 +--- + +## ✨ 변경 타입 +* [ ] 신규 기능 추가/수정 +* [ ] 버그 수정 +* [ ] 리팩토링 +* [ ] 설정 +* [ ] 비기능 (주석 등 기능에 영향을 주지 않음) + +## ✅ 체크리스트 + +* [ ] 코드 작성 가이드라인을 준수했는가? +* [ ] 변경 사항에 대한 테스트를 완료했는가? +* [ ] 문서 변경이 필요한 경우, 해당 내용을 반영했는가? + +## 🚀 변경 내용 +* **as-is** + * (변경 전 설명을 여기에 작성) + +* **to-be** + * (변경 후 설명을 여기에 작성) + +## 💡 추가 설명 + +* 코드 리뷰 시 특별히 참고해야 할 부분이 있다면 언급해주세요. +* 궁금한 점이나 논의하고 싶은 내용이 있다면 작성해주세요. + +## 📚 참고 자료 (선택 사항) + +* 관련 자료 링크 From 0451d85d09fff0a3a8ed478e2caae92f59edfe75 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Fri, 14 Mar 2025 18:38:33 +0900 Subject: [PATCH 004/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20order=20init=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 --- order-service/build.gradle | 14 ++++++++++++++ .../orderservice/OrderServiceApplication.java | 13 +++++++++++++ order-service/src/main/resources/application.yml | 11 +++++++++++ .../orderservice/OrderServiceApplicationTests.java | 13 +++++++++++++ settings.gradle | 2 +- 5 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 order-service/build.gradle create mode 100644 order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java create mode 100644 order-service/src/main/resources/application.yml create mode 100644 order-service/src/test/java/com/sparta/orderservice/OrderServiceApplicationTests.java diff --git a/order-service/build.gradle b/order-service/build.gradle new file mode 100644 index 0000000..34cdd32 --- /dev/null +++ b/order-service/build.gradle @@ -0,0 +1,14 @@ +ext { + set('springCloudVersion', "2024.0.0") +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' +} + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" + } +} diff --git a/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java b/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java new file mode 100644 index 0000000..2521a0c --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java @@ -0,0 +1,13 @@ +package com.sparta.orderservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class OrderServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(OrderServiceApplication.class, args); + } + +} diff --git a/order-service/src/main/resources/application.yml b/order-service/src/main/resources/application.yml new file mode 100644 index 0000000..09e6bb4 --- /dev/null +++ b/order-service/src/main/resources/application.yml @@ -0,0 +1,11 @@ +spring: + application: + name: order-service + +eureka: + client: + service-url: + defaultZone: http://localhost:8761/eureka/ + +server: + port: 8084 diff --git a/order-service/src/test/java/com/sparta/orderservice/OrderServiceApplicationTests.java b/order-service/src/test/java/com/sparta/orderservice/OrderServiceApplicationTests.java new file mode 100644 index 0000000..8f75959 --- /dev/null +++ b/order-service/src/test/java/com/sparta/orderservice/OrderServiceApplicationTests.java @@ -0,0 +1,13 @@ +package com.sparta.orderservice; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class OrderServiceApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/settings.gradle b/settings.gradle index cf68ea9..ed72e0f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,4 +2,4 @@ rootProject.name = 'logistics-delivery' include('eureka') include('gateway') -include('user') +include('order-service') From 8b5c504877142d4c92509a976a935102ed7f89b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=EC=9D=80=E2=98=98?= <138298079+devdaeun@users.noreply.github.com> Date: Fri, 14 Mar 2025 18:40:19 +0900 Subject: [PATCH 005/389] Delete .github/pull_request_templat.md --- .github/pull_request_templat.md | 34 --------------------------------- 1 file changed, 34 deletions(-) delete mode 100644 .github/pull_request_templat.md diff --git a/.github/pull_request_templat.md b/.github/pull_request_templat.md deleted file mode 100644 index 80f1f9e..0000000 --- a/.github/pull_request_templat.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -(확인 후 지워주세요) ---- -제목 양식 - 이모지 작업타입 [#이슈번호] : 제목 ---- - -## ✨ 변경 타입 -* [ ] 신규 기능 추가/수정 -* [ ] 버그 수정 -* [ ] 리팩토링 -* [ ] 설정 -* [ ] 비기능 (주석 등 기능에 영향을 주지 않음) - -## ✅ 체크리스트 - -* [ ] 코드 작성 가이드라인을 준수했는가? -* [ ] 변경 사항에 대한 테스트를 완료했는가? -* [ ] 문서 변경이 필요한 경우, 해당 내용을 반영했는가? - -## 🚀 변경 내용 -* **as-is** - * (변경 전 설명을 여기에 작성) - -* **to-be** - * (변경 후 설명을 여기에 작성) - -## 💡 추가 설명 - -* 코드 리뷰 시 특별히 참고해야 할 부분이 있다면 언급해주세요. -* 궁금한 점이나 논의하고 싶은 내용이 있다면 작성해주세요. - -## 📚 참고 자료 (선택 사항) - -* 관련 자료 링크 From 16927554bcac57c14e0f5cfac4f413df6c0fe70d Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Fri, 14 Mar 2025 19:10:20 +0900 Subject: [PATCH 006/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20order-service=20?= =?UTF-8?q?controller=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gateway/src/main/resources/application.yml | 8 ++++---- .../com/sparta/orderservice/Ordercontroller.java | 16 ++++++++++++++++ order-service/src/main/resources/application.yml | 2 ++ 3 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 order-service/src/main/java/com/sparta/orderservice/Ordercontroller.java diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index cb42934..da5cd91 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -13,10 +13,10 @@ spring: uri: lb://user-service # 'user-service'?? ???? ?? ???? ???? ??? predicates: - Path=/api/v1/users/** # /api/v1/users/** ??? ???? ??? ? ???? ?? -# - id: product-service -# uri: lb://product-service -# predicates: -# - Path=/api/v1/products/** + - id: order-service + uri: lb://order-service + predicates: + - Path=/api/v1/orders/** # - id: auth-service # uri: lb://auth-service # predicates: diff --git a/order-service/src/main/java/com/sparta/orderservice/Ordercontroller.java b/order-service/src/main/java/com/sparta/orderservice/Ordercontroller.java new file mode 100644 index 0000000..006689e --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/Ordercontroller.java @@ -0,0 +1,16 @@ +package com.sparta.orderservice; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/v1/orders") +public class Ordercontroller { + + @GetMapping("/test") + public String getOrder(){ + return "Hello world"; + } + +} diff --git a/order-service/src/main/resources/application.yml b/order-service/src/main/resources/application.yml index 09e6bb4..cfcb4aa 100644 --- a/order-service/src/main/resources/application.yml +++ b/order-service/src/main/resources/application.yml @@ -6,6 +6,8 @@ eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ + register-with-eureka: true + fetch-registry: ture server: port: 8084 From e7dd4a7bb8781fd2a195929a9a7654cbace7e522 Mon Sep 17 00:00:00 2001 From: jiyun Date: Fri, 14 Mar 2025 20:22:03 +0900 Subject: [PATCH 007/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#7]=20:=20company-s?= =?UTF-8?q?ervice=20init?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- company-service/build.gradle | 14 ++++++++++++++ .../sparta/companyservice/CompanyController.java | 14 ++++++++++++++ .../companyservice/CompanyServiceApplication.java | 13 +++++++++++++ company-service/src/main/resources/application.yml | 13 +++++++++++++ .../CompanyServiceApplicationTests.java | 13 +++++++++++++ gateway/src/main/resources/application.yml | 4 ++++ settings.gradle | 1 + 7 files changed, 72 insertions(+) create mode 100644 company-service/build.gradle create mode 100644 company-service/src/main/java/com/sparta/companyservice/CompanyController.java create mode 100644 company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java create mode 100644 company-service/src/main/resources/application.yml create mode 100644 company-service/src/test/java/com/sparta/companyservice/CompanyServiceApplicationTests.java diff --git a/company-service/build.gradle b/company-service/build.gradle new file mode 100644 index 0000000..2918e71 --- /dev/null +++ b/company-service/build.gradle @@ -0,0 +1,14 @@ +ext { + set('springCloudVersion', "2024.0.0") +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' +} + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" + } +} \ No newline at end of file diff --git a/company-service/src/main/java/com/sparta/companyservice/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/CompanyController.java new file mode 100644 index 0000000..06f703e --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/CompanyController.java @@ -0,0 +1,14 @@ +package com.sparta.companyservice; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/v1/companies") +public class CompanyController { + @GetMapping("/test") + public String getOrder(){ + return "Hello world"; + } +} diff --git a/company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java b/company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java new file mode 100644 index 0000000..b16a202 --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java @@ -0,0 +1,13 @@ +package com.sparta.companyservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CompanyServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(CompanyServiceApplication.class, args); + } + +} diff --git a/company-service/src/main/resources/application.yml b/company-service/src/main/resources/application.yml new file mode 100644 index 0000000..25a0a1d --- /dev/null +++ b/company-service/src/main/resources/application.yml @@ -0,0 +1,13 @@ +spring: + application: + name: company-service + +eureka: + client: + service-url: + defaultZone: http://localhost:8761/eureka/ + register-with-eureka: true + fetch-registry: ture + +server: + port: 8085 diff --git a/company-service/src/test/java/com/sparta/companyservice/CompanyServiceApplicationTests.java b/company-service/src/test/java/com/sparta/companyservice/CompanyServiceApplicationTests.java new file mode 100644 index 0000000..f00e15a --- /dev/null +++ b/company-service/src/test/java/com/sparta/companyservice/CompanyServiceApplicationTests.java @@ -0,0 +1,13 @@ +package com.sparta.companyservice; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class CompanyServiceApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index da5cd91..c7eb8e6 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -17,6 +17,10 @@ spring: uri: lb://order-service predicates: - Path=/api/v1/orders/** + - id: company-service + uri: lb://company-service + predicates: + - Path=/api/v1/companies/** # - id: auth-service # uri: lb://auth-service # predicates: diff --git a/settings.gradle b/settings.gradle index 35d4e04..4dc1388 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,3 +4,4 @@ include('eureka') include('gateway') include('user-service') include('order-service') +include('company-service') From 2da96677aeb9b1e713361711399fbeea65f17ae9 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Fri, 14 Mar 2025 21:28:58 +0900 Subject: [PATCH 008/389] =?UTF-8?q?=E2=9C=A8feat=20[#10]=20:=20product-ser?= =?UTF-8?q?vice=20init=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.name | 1 + .idea/compiler.xml | 4 +++- .idea/jarRepositories.xml | 20 +++++++++++++++++++ .idea/modules.xml | 9 --------- .../eureka/logistics-delivery.eureka.main.iml | 8 -------- .../logistics-delivery.gateway.main.iml | 8 -------- gateway/src/main/resources/application.yml | 4 ++++ product-service/build.gradle | 13 ++++++++++++ .../com/sparta/product/ProductController.java | 15 ++++++++++++++ .../product/ProductServiceApplication.java | 13 ++++++++++++ .../src/main/resources/application.yml | 13 ++++++++++++ .../ProductServiceApplicationTests.java | 13 ++++++++++++ settings.gradle | 1 + 13 files changed, 96 insertions(+), 26 deletions(-) create mode 100644 .idea/.name create mode 100644 .idea/jarRepositories.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/modules/eureka/logistics-delivery.eureka.main.iml delete mode 100644 .idea/modules/gateway/logistics-delivery.gateway.main.iml create mode 100644 product-service/build.gradle create mode 100644 product-service/src/main/java/com/sparta/product/ProductController.java create mode 100644 product-service/src/main/java/com/sparta/product/ProductServiceApplication.java create mode 100644 product-service/src/main/resources/application.yml create mode 100644 product-service/src/test/java/com/sparta/product/ProductServiceApplicationTests.java diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..5397ff5 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +logistics-delivery \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 4099c43..901ffbd 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -7,9 +7,11 @@ + + - + diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..fdc392f --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 5ab07c0..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/eureka/logistics-delivery.eureka.main.iml b/.idea/modules/eureka/logistics-delivery.eureka.main.iml deleted file mode 100644 index 421c373..0000000 --- a/.idea/modules/eureka/logistics-delivery.eureka.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/gateway/logistics-delivery.gateway.main.iml b/.idea/modules/gateway/logistics-delivery.gateway.main.iml deleted file mode 100644 index f96a052..0000000 --- a/.idea/modules/gateway/logistics-delivery.gateway.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index da5cd91..4eb38a7 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -17,6 +17,10 @@ spring: uri: lb://order-service predicates: - Path=/api/v1/orders/** + - id: product-service + uri: lb://product-service + predicates: + - Path=/api/v1/products/** # - id: auth-service # uri: lb://auth-service # predicates: diff --git a/product-service/build.gradle b/product-service/build.gradle new file mode 100644 index 0000000..6a60b29 --- /dev/null +++ b/product-service/build.gradle @@ -0,0 +1,13 @@ +ext { + set('springCloudVersion', "2024.0.0") +} + +dependencies { + implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' +} + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" + } +} \ No newline at end of file diff --git a/product-service/src/main/java/com/sparta/product/ProductController.java b/product-service/src/main/java/com/sparta/product/ProductController.java new file mode 100644 index 0000000..7ccebb9 --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/ProductController.java @@ -0,0 +1,15 @@ +package com.sparta.product; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/v1/products") +public class ProductController { + + @GetMapping("/test") + public String getProduct() { + return "Hello World"; + } +} diff --git a/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java b/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java new file mode 100644 index 0000000..647e151 --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java @@ -0,0 +1,13 @@ +package com.sparta.product; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ProductServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(ProductServiceApplication.class, args); + } + +} diff --git a/product-service/src/main/resources/application.yml b/product-service/src/main/resources/application.yml new file mode 100644 index 0000000..e1fa1b3 --- /dev/null +++ b/product-service/src/main/resources/application.yml @@ -0,0 +1,13 @@ +spring: + application: + name: product-service + +server: + port: 8083 + +eureka: + client: + register-with-eureka: true + fetch-registry: true + service-url: + defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/product-service/src/test/java/com/sparta/product/ProductServiceApplicationTests.java b/product-service/src/test/java/com/sparta/product/ProductServiceApplicationTests.java new file mode 100644 index 0000000..27576f1 --- /dev/null +++ b/product-service/src/test/java/com/sparta/product/ProductServiceApplicationTests.java @@ -0,0 +1,13 @@ +package com.sparta.product; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ProductServiceApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/settings.gradle b/settings.gradle index 35d4e04..5533b73 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,3 +4,4 @@ include('eureka') include('gateway') include('user-service') include('order-service') +include('product-service') From 57a74630d84197ba7da1c1e3b3b768d9a1d14aaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=EC=9D=80=E2=98=98?= <138298079+devdaeun@users.noreply.github.com> Date: Fri, 14 Mar 2025 21:44:23 +0900 Subject: [PATCH 009/389] Update issue templates --- .github/ISSUE_TEMPLATE/bug.md | 18 ++++++++++++++++++ .github/ISSUE_TEMPLATE/feature.md | 20 ++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug.md create mode 100644 .github/ISSUE_TEMPLATE/feature.md diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md new file mode 100644 index 0000000..043551d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -0,0 +1,18 @@ +--- +name: Bug +about: BUG 발생 시 작성해주세요 +title: '' +labels: '' +assignees: '' + +--- + +## 버그설명 +버그 발생 상황을 적어주세요 + +## 발생한 위치 +버그가 발생한 위치를 알려주세요 + +## 참고 사항 +공유할 내용, 레퍼런스, 추가로 발생할 것으로 예상되는 이슈, 스크린샷 등을 넣어 주세요. +- 추가적으로 필요한 내용은 comment로 남겨주세요. diff --git a/.github/ISSUE_TEMPLATE/feature.md b/.github/ISSUE_TEMPLATE/feature.md new file mode 100644 index 0000000..071cea4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature.md @@ -0,0 +1,20 @@ +--- +name: Feature +about: 프로젝트에 관한 아이디어, 기능추가 +title: '' +labels: "✨ feat" +assignees: '' + +--- + +## 기능 설명 +개발할 기능에 대해서 말씀해주세요. + +## 세부 기능 +어떤 세부 기능을 구현할지 말씀해주세요. +- [ ] feature_detail 1 +- [ ] feature_detail 2 + +## 참고 사항 +공유할 내용, 레퍼런스, 추가로 발생할 것으로 예상되는 이슈, 스크린샷 등을 넣어 주세요. +- 추가적으로 필요한 내용은 comment로 남겨주세요. From f8ae429232e721a752351a2caac56b4f7bae0e58 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Fri, 14 Mar 2025 22:39:10 +0900 Subject: [PATCH 010/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#16]=20:=20slack-se?= =?UTF-8?q?rvice=20init=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/compiler.xml | 5 ++++- .idea/modules.xml | 1 + .../logistics-delivery.user-service.main.iml | 8 ++++++++ gateway/src/main/resources/application.yml | 4 ++++ settings.gradle | 1 + slack-service/build.gradle | 15 +++++++++++++++ .../slackservice/SlackServiceApplication.java | 13 +++++++++++++ .../presentation/SlackController.java | 14 ++++++++++++++ slack-service/src/main/resources/application.yml | 13 +++++++++++++ .../SlackServiceApplicationTests.java | 13 +++++++++++++ 10 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 .idea/modules/user-service/logistics-delivery.user-service.main.iml create mode 100644 slack-service/build.gradle create mode 100644 slack-service/src/main/java/com/sparta/slackservice/SlackServiceApplication.java create mode 100644 slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java create mode 100644 slack-service/src/main/resources/application.yml create mode 100644 slack-service/src/test/java/com/sparta/slackservice/SlackServiceApplicationTests.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 4099c43..04b1c08 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -7,9 +7,12 @@ + + - + + diff --git a/.idea/modules.xml b/.idea/modules.xml index 5ab07c0..d165188 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -4,6 +4,7 @@ + \ No newline at end of file diff --git a/.idea/modules/user-service/logistics-delivery.user-service.main.iml b/.idea/modules/user-service/logistics-delivery.user-service.main.iml new file mode 100644 index 0000000..5a00956 --- /dev/null +++ b/.idea/modules/user-service/logistics-delivery.user-service.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index c7eb8e6..3dc2b78 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -21,6 +21,10 @@ spring: uri: lb://company-service predicates: - Path=/api/v1/companies/** + - id: slack-service + uri: lb://slack-service + predicates: + - Path=/api/v1/slacks/** # - id: auth-service # uri: lb://auth-service # predicates: diff --git a/settings.gradle b/settings.gradle index 4dc1388..43e51d3 100644 --- a/settings.gradle +++ b/settings.gradle @@ -5,3 +5,4 @@ include('gateway') include('user-service') include('order-service') include('company-service') +include('slack-service') diff --git a/slack-service/build.gradle b/slack-service/build.gradle new file mode 100644 index 0000000..cedd907 --- /dev/null +++ b/slack-service/build.gradle @@ -0,0 +1,15 @@ + +ext { + set('springCloudVersion', "2024.0.0") +} + +dependencies { + implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' + +} + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" + } +} \ No newline at end of file diff --git a/slack-service/src/main/java/com/sparta/slackservice/SlackServiceApplication.java b/slack-service/src/main/java/com/sparta/slackservice/SlackServiceApplication.java new file mode 100644 index 0000000..6011911 --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/SlackServiceApplication.java @@ -0,0 +1,13 @@ +package com.sparta.slackservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SlackServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(SlackServiceApplication.class, args); + } + +} diff --git a/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java b/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java new file mode 100644 index 0000000..51ed0fe --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java @@ -0,0 +1,14 @@ +package com.sparta.slackservice.presentation; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/v1/slacks") +public class SlackController { + @GetMapping("/test") + public String getSlack() { + return "Hello World"; + } +} diff --git a/slack-service/src/main/resources/application.yml b/slack-service/src/main/resources/application.yml new file mode 100644 index 0000000..0cb97cd --- /dev/null +++ b/slack-service/src/main/resources/application.yml @@ -0,0 +1,13 @@ +spring: + application: + name: slack-service + +server: + port: 8087 + +eureka: + client: + register-with-eureka: true # Eureka? ??? ?? + fetch-registry: true # Eureka?? ??? ?? ???? + service-url: + defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/slack-service/src/test/java/com/sparta/slackservice/SlackServiceApplicationTests.java b/slack-service/src/test/java/com/sparta/slackservice/SlackServiceApplicationTests.java new file mode 100644 index 0000000..5351bf2 --- /dev/null +++ b/slack-service/src/test/java/com/sparta/slackservice/SlackServiceApplicationTests.java @@ -0,0 +1,13 @@ +package com.sparta.slackservice; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class SlackServiceApplicationTests { + + @Test + void contextLoads() { + } + +} From 92d1053f2eec5796c23113d18a98ca8743d8d8b7 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Fri, 14 Mar 2025 22:43:25 +0900 Subject: [PATCH 011/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20hub-service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.name | 1 + .idea/compiler.xml | 5 ++++- .idea/modules.xml | 9 --------- gateway/src/main/resources/application.yml | 4 ++++ hub-service/build.gradle | 14 ++++++++++++++ .../hubservice/HubServiceApplication.java | 13 +++++++++++++ .../hubservice/presentation/HubController.java | 17 +++++++++++++++++ hub-service/src/main/resources/application.yml | 13 +++++++++++++ .../hubservice/HubServiceApplicationTests.java | 13 +++++++++++++ settings.gradle | 1 + 10 files changed, 80 insertions(+), 10 deletions(-) create mode 100644 .idea/.name delete mode 100644 .idea/modules.xml create mode 100644 hub-service/build.gradle create mode 100644 hub-service/src/main/java/com/sparta/hubservice/HubServiceApplication.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/presentation/HubController.java create mode 100644 hub-service/src/main/resources/application.yml create mode 100644 hub-service/src/test/java/com/sparta/hubservice/HubServiceApplicationTests.java diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..5397ff5 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +logistics-delivery \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 4099c43..ac8ba9b 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -7,9 +7,12 @@ + - + + + diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 5ab07c0..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index c7eb8e6..f496071 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -21,6 +21,10 @@ spring: uri: lb://company-service predicates: - Path=/api/v1/companies/** + - id: hub-service + uri: lb://hub-service + predicates: + - Path=/api/v1/hubs/** # - id: auth-service # uri: lb://auth-service # predicates: diff --git a/hub-service/build.gradle b/hub-service/build.gradle new file mode 100644 index 0000000..8adac4d --- /dev/null +++ b/hub-service/build.gradle @@ -0,0 +1,14 @@ + +ext { + set('springCloudVersion', "2024.0.0") +} + +dependencies { + implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' +} + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" + } +} \ No newline at end of file diff --git a/hub-service/src/main/java/com/sparta/hubservice/HubServiceApplication.java b/hub-service/src/main/java/com/sparta/hubservice/HubServiceApplication.java new file mode 100644 index 0000000..ff177f7 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/HubServiceApplication.java @@ -0,0 +1,13 @@ +package com.sparta.hubservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class HubServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(HubServiceApplication.class, args); + } + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/presentation/HubController.java b/hub-service/src/main/java/com/sparta/hubservice/presentation/HubController.java new file mode 100644 index 0000000..80e5784 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/presentation/HubController.java @@ -0,0 +1,17 @@ +package com.sparta.hubservice.presentation; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/v1/hubs") +public class HubController { + + @GetMapping + public ResponseEntity hubTest(){ + return ResponseEntity.ok("connect hub-service"); + } + +} diff --git a/hub-service/src/main/resources/application.yml b/hub-service/src/main/resources/application.yml new file mode 100644 index 0000000..cfb080d --- /dev/null +++ b/hub-service/src/main/resources/application.yml @@ -0,0 +1,13 @@ +spring: + application: + name: hub-service + +server: + port: 8082 + +eureka: + client: + register-with-eureka: true + fetch-registry: true + service-url: + defaultZone: http://localhost:8761/eureka/ diff --git a/hub-service/src/test/java/com/sparta/hubservice/HubServiceApplicationTests.java b/hub-service/src/test/java/com/sparta/hubservice/HubServiceApplicationTests.java new file mode 100644 index 0000000..e8f52df --- /dev/null +++ b/hub-service/src/test/java/com/sparta/hubservice/HubServiceApplicationTests.java @@ -0,0 +1,13 @@ +package com.sparta.hubservice; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class HubServiceApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/settings.gradle b/settings.gradle index 4dc1388..5cfadb0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -5,3 +5,4 @@ include('gateway') include('user-service') include('order-service') include('company-service') +include('hub-service') From c4c0da383367f17766933a281c837d3dcf8fea01 Mon Sep 17 00:00:00 2001 From: Sohyun Lee <81453908+sohyun119@users.noreply.github.com> Date: Fri, 14 Mar 2025 22:46:54 +0900 Subject: [PATCH 012/389] Create pull_request_template.md --- .github/pull_request_template.md | 48 ++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..4831d94 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,48 @@ +--- +(확인 후 지워주세요) +--- +제목 양식 - 이모지 작업타입 [#이슈번호] : 제목 + +|작업 타입|작업내용 | +| --- | --- | +| ✨ feat | 새로운 기능을 추가 | +| 🐛 bugfix | 버그 수정 | +| ♻️ refactor | 코드 리팩토링 | +| 🩹 fix | 코드 수정 | +| 🚚 move | 파일 옮김/정리 | +| 🔥 del | 기능/파일을 삭제 | +| 🍻 test | 테스트 코드를 작성 | +| 🎨 readme | readme 수정 | +| 🙈 gitfix | gitignore 수정 | +| 🔨script | package.json 변경(npm 설치 등) | + +--- + +## ✨ 변경 타입 +* [ ] 신규 기능 추가/수정 +* [ ] 버그 수정 +* [ ] 리팩토링 +* [ ] 설정 +* [ ] 비기능 (주석 등 기능에 영향을 주지 않음) + +## ✅ 체크리스트 + +* [ ] 코드 작성 가이드라인을 준수했는가? +* [ ] 변경 사항에 대한 테스트를 완료했는가? +* [ ] 문서 변경이 필요한 경우, 해당 내용을 반영했는가? + +## 🚀 변경 내용 +* **as-is** + * (변경 전 설명을 여기에 작성) + +* **to-be** + * (변경 후 설명을 여기에 작성) + +## 💡 추가 설명 + +* 코드 리뷰 시 특별히 참고해야 할 부분이 있다면 언급해주세요. +* 궁금한 점이나 논의하고 싶은 내용이 있다면 작성해주세요. + +## 📚 참고 자료 (선택 사항) + +* 관련 자료 링크 From 2b1ff816a987aafc18fc772a67708831701b1b92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=EC=9D=80=E2=98=98?= <138298079+devdaeun@users.noreply.github.com> Date: Fri, 14 Mar 2025 23:38:42 +0900 Subject: [PATCH 013/389] Update compiler.xml --- .idea/compiler.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 5954fbf..050626c 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -10,14 +10,12 @@ - - - \ No newline at end of file + From 92ecfa49512e73e202b05b65a10399b15aee1025 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Fri, 14 Mar 2025 23:46:33 +0900 Subject: [PATCH 014/389] merge --- .idea/compiler.xml | 8 +++++++- .idea/modules.xml | 3 +++ .../logistics-delivery.company-service.main.iml | 8 ++++++++ .../logistics-delivery.order-service.main.iml | 8 ++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 .idea/modules/company-service/logistics-delivery.company-service.main.iml create mode 100644 .idea/modules/order-service/logistics-delivery.order-service.main.iml diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 4099c43..5954fbf 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -7,9 +7,15 @@ + + + + - + + + diff --git a/.idea/modules.xml b/.idea/modules.xml index 5ab07c0..6ff8915 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,8 +2,11 @@ + + + \ No newline at end of file diff --git a/.idea/modules/company-service/logistics-delivery.company-service.main.iml b/.idea/modules/company-service/logistics-delivery.company-service.main.iml new file mode 100644 index 0000000..f924b0e --- /dev/null +++ b/.idea/modules/company-service/logistics-delivery.company-service.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/order-service/logistics-delivery.order-service.main.iml b/.idea/modules/order-service/logistics-delivery.order-service.main.iml new file mode 100644 index 0000000..4eb426c --- /dev/null +++ b/.idea/modules/order-service/logistics-delivery.order-service.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file From 52e444301166bc110947764ac44e792f30e7f211 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sat, 15 Mar 2025 00:00:02 +0900 Subject: [PATCH 015/389] . --- .idea/modules.xml | 13 +++++++++++++ .../logistics-delivery.hub-service.main.iml | 8 ++++++++ 2 files changed, 21 insertions(+) create mode 100644 .idea/modules.xml create mode 100644 .idea/modules/hub-service/logistics-delivery.hub-service.main.iml diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..22d07c0 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/hub-service/logistics-delivery.hub-service.main.iml b/.idea/modules/hub-service/logistics-delivery.hub-service.main.iml new file mode 100644 index 0000000..caddfa3 --- /dev/null +++ b/.idea/modules/hub-service/logistics-delivery.hub-service.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file From 5dac52f9110db2353e5bafbe4404d25f0b3a7e87 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Sat, 15 Mar 2025 09:01:59 +0900 Subject: [PATCH 016/389] =?UTF-8?q?=E2=9C=A8feat=20[#15]:=20payment-servic?= =?UTF-8?q?e=20init=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/compiler.xml | 7 +++---- .idea/modules.xml | 15 +++++++++++++++ .../logistics-delivery.company-service.main.iml | 8 ++++++++ .../eureka/logistics-delivery.eureka.main.iml | 8 ++++++++ .../gateway/logistics-delivery.gateway.main.iml | 8 ++++++++ .../logistics-delivery.order-service.main.iml | 8 ++++++++ .../logistics-delivery.payment-service.main.iml | 8 ++++++++ .../logistics-delivery.product-service.main.iml | 8 ++++++++ .../logistics-delivery.slack-service.main.iml | 8 ++++++++ gateway/src/main/resources/application.yml | 4 ++++ payment-service/build.gradle | 13 +++++++++++++ .../paymentservice/PaymentServiceApplication.java | 13 +++++++++++++ .../presentation/PaymentController.java | 15 +++++++++++++++ .../src/main/resources/application.yml | 13 +++++++++++++ .../PaymentServiceApplicationTests.java | 13 +++++++++++++ settings.gradle | 1 + 16 files changed, 146 insertions(+), 4 deletions(-) create mode 100644 .idea/modules/company-service/logistics-delivery.company-service.main.iml create mode 100644 .idea/modules/eureka/logistics-delivery.eureka.main.iml create mode 100644 .idea/modules/gateway/logistics-delivery.gateway.main.iml create mode 100644 .idea/modules/order-service/logistics-delivery.order-service.main.iml create mode 100644 .idea/modules/payment-service/logistics-delivery.payment-service.main.iml create mode 100644 .idea/modules/product-service/logistics-delivery.product-service.main.iml create mode 100644 .idea/modules/slack-service/logistics-delivery.slack-service.main.iml create mode 100644 payment-service/build.gradle create mode 100644 payment-service/src/main/java/com/sparta/paymentservice/PaymentServiceApplication.java create mode 100644 payment-service/src/main/java/com/sparta/paymentservice/presentation/PaymentController.java create mode 100644 payment-service/src/main/resources/application.yml create mode 100644 payment-service/src/test/java/com/sparta/paymentservice/PaymentServiceApplicationTests.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 5954fbf..1de9e88 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -7,15 +7,14 @@ - - - + + + - diff --git a/.idea/modules.xml b/.idea/modules.xml index e69de29..981e03f 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/company-service/logistics-delivery.company-service.main.iml b/.idea/modules/company-service/logistics-delivery.company-service.main.iml new file mode 100644 index 0000000..f924b0e --- /dev/null +++ b/.idea/modules/company-service/logistics-delivery.company-service.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/eureka/logistics-delivery.eureka.main.iml b/.idea/modules/eureka/logistics-delivery.eureka.main.iml new file mode 100644 index 0000000..421c373 --- /dev/null +++ b/.idea/modules/eureka/logistics-delivery.eureka.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/gateway/logistics-delivery.gateway.main.iml b/.idea/modules/gateway/logistics-delivery.gateway.main.iml new file mode 100644 index 0000000..f96a052 --- /dev/null +++ b/.idea/modules/gateway/logistics-delivery.gateway.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/order-service/logistics-delivery.order-service.main.iml b/.idea/modules/order-service/logistics-delivery.order-service.main.iml new file mode 100644 index 0000000..4eb426c --- /dev/null +++ b/.idea/modules/order-service/logistics-delivery.order-service.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/payment-service/logistics-delivery.payment-service.main.iml b/.idea/modules/payment-service/logistics-delivery.payment-service.main.iml new file mode 100644 index 0000000..09e97c0 --- /dev/null +++ b/.idea/modules/payment-service/logistics-delivery.payment-service.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/product-service/logistics-delivery.product-service.main.iml b/.idea/modules/product-service/logistics-delivery.product-service.main.iml new file mode 100644 index 0000000..3250472 --- /dev/null +++ b/.idea/modules/product-service/logistics-delivery.product-service.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/slack-service/logistics-delivery.slack-service.main.iml b/.idea/modules/slack-service/logistics-delivery.slack-service.main.iml new file mode 100644 index 0000000..d30f1d8 --- /dev/null +++ b/.idea/modules/slack-service/logistics-delivery.slack-service.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index 0aef450..072b71e 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -29,6 +29,10 @@ spring: uri: lb://slack-service predicates: - Path=/api/v1/slacks/** + - id: payment-service + uri: lb://payment-service + predicates: + - Path=/api/v1/payments/** # - id: auth-service # uri: lb://auth-service # predicates: diff --git a/payment-service/build.gradle b/payment-service/build.gradle new file mode 100644 index 0000000..1786f75 --- /dev/null +++ b/payment-service/build.gradle @@ -0,0 +1,13 @@ +ext { + set('springCloudVersion', "2024.0.0") +} + +dependencies { + implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' +} + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" + } +} diff --git a/payment-service/src/main/java/com/sparta/paymentservice/PaymentServiceApplication.java b/payment-service/src/main/java/com/sparta/paymentservice/PaymentServiceApplication.java new file mode 100644 index 0000000..9e7875d --- /dev/null +++ b/payment-service/src/main/java/com/sparta/paymentservice/PaymentServiceApplication.java @@ -0,0 +1,13 @@ +package com.sparta.paymentservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class PaymentServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(PaymentServiceApplication.class, args); + } + +} diff --git a/payment-service/src/main/java/com/sparta/paymentservice/presentation/PaymentController.java b/payment-service/src/main/java/com/sparta/paymentservice/presentation/PaymentController.java new file mode 100644 index 0000000..ddc8216 --- /dev/null +++ b/payment-service/src/main/java/com/sparta/paymentservice/presentation/PaymentController.java @@ -0,0 +1,15 @@ +package com.sparta.paymentservice.presentation; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/v1/payments") +public class PaymentController { + + @GetMapping("/test") + public String getPayment() { + return "Hello World"; + } +} diff --git a/payment-service/src/main/resources/application.yml b/payment-service/src/main/resources/application.yml new file mode 100644 index 0000000..52b6652 --- /dev/null +++ b/payment-service/src/main/resources/application.yml @@ -0,0 +1,13 @@ +spring: + application: + name: payment-service + +server: + port: 8086 + +eureka: + client: + register-with-eureka: true + fetch-registry: true + service-url: + defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/payment-service/src/test/java/com/sparta/paymentservice/PaymentServiceApplicationTests.java b/payment-service/src/test/java/com/sparta/paymentservice/PaymentServiceApplicationTests.java new file mode 100644 index 0000000..48c7c5c --- /dev/null +++ b/payment-service/src/test/java/com/sparta/paymentservice/PaymentServiceApplicationTests.java @@ -0,0 +1,13 @@ +package com.sparta.paymentservice; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class PaymentServiceApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/settings.gradle b/settings.gradle index 8a4e108..610b61c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,3 +7,4 @@ include('order-service') include('company-service') include('product-service') include('slack-service') +include('payment-service') From d4f408c24f39454d912a5f91b5c48c871379ccce Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Sat, 15 Mar 2025 18:17:52 +0900 Subject: [PATCH 017/389] =?UTF-8?q?=F0=9F=92=A1init[#22]:=20shipping-servi?= =?UTF-8?q?ce=20init?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gateway/src/main/resources/application.yml | 4 ++++ settings.gradle | 1 + shipping-service | 1 + 3 files changed, 6 insertions(+) create mode 160000 shipping-service diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index eb97574..db38a1d 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -33,6 +33,10 @@ spring: uri: lb://slack-service predicates: - Path=/api/v1/slacks/** + - id: shipping-service + uri: lb://shipping-service + predicates: + - Path=/api/v1/shippings/** # - id: auth-service # uri: lb://auth-service # predicates: diff --git a/settings.gradle b/settings.gradle index 38f3ba1..5a7e86b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -8,3 +8,4 @@ include('company-service') include('hub-service') include('product-service') include('slack-service') +include('shipping-service') diff --git a/shipping-service b/shipping-service new file mode 160000 index 0000000..a8ef2fb --- /dev/null +++ b/shipping-service @@ -0,0 +1 @@ +Subproject commit a8ef2fbc33ab00f7f72bac8a0f07cc14519670d6 From 9f863d2bb64575db691d10653de68edcc44b52b1 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Sat, 15 Mar 2025 09:01:59 +0900 Subject: [PATCH 018/389] =?UTF-8?q?=E2=9C=A8feat=20[#15]:=20payment-servic?= =?UTF-8?q?e=20init=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/compiler.xml | 12 ++++++++++-- .idea/modules.xml | 7 +++++++ .../eureka/logistics-delivery.eureka.main.iml | 8 ++++++++ .../gateway/logistics-delivery.gateway.main.iml | 8 ++++++++ .../logistics-delivery.payment-service.main.iml | 8 ++++++++ .../logistics-delivery.product-service.main.iml | 8 ++++++++ .../logistics-delivery.slack-service.main.iml | 8 ++++++++ gateway/src/main/resources/application.yml | 5 +++++ payment-service/build.gradle | 13 +++++++++++++ .../paymentservice/PaymentServiceApplication.java | 13 +++++++++++++ .../presentation/PaymentController.java | 15 +++++++++++++++ .../src/main/resources/application.yml | 13 +++++++++++++ .../PaymentServiceApplicationTests.java | 13 +++++++++++++ settings.gradle | 3 +++ shipping-service | 2 +- 15 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 .idea/modules/eureka/logistics-delivery.eureka.main.iml create mode 100644 .idea/modules/gateway/logistics-delivery.gateway.main.iml create mode 100644 .idea/modules/payment-service/logistics-delivery.payment-service.main.iml create mode 100644 .idea/modules/product-service/logistics-delivery.product-service.main.iml create mode 100644 .idea/modules/slack-service/logistics-delivery.slack-service.main.iml create mode 100644 payment-service/build.gradle create mode 100644 payment-service/src/main/java/com/sparta/paymentservice/PaymentServiceApplication.java create mode 100644 payment-service/src/main/java/com/sparta/paymentservice/presentation/PaymentController.java create mode 100644 payment-service/src/main/resources/application.yml create mode 100644 payment-service/src/test/java/com/sparta/paymentservice/PaymentServiceApplicationTests.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 25907a8..e1c1c7a 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -7,13 +7,21 @@ - - +<<<<<<< HEAD +======= + + +>>>>>>> 5dac52f (✨feat [#15]: payment-service init 추가) + + +<<<<<<< HEAD +======= +>>>>>>> 5dac52f (✨feat [#15]: payment-service init 추가) diff --git a/.idea/modules.xml b/.idea/modules.xml index 22d07c0..c7509b7 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -5,8 +5,15 @@ +<<<<<<< HEAD +======= + + + + +>>>>>>> 5dac52f (✨feat [#15]: payment-service init 추가) diff --git a/.idea/modules/eureka/logistics-delivery.eureka.main.iml b/.idea/modules/eureka/logistics-delivery.eureka.main.iml new file mode 100644 index 0000000..421c373 --- /dev/null +++ b/.idea/modules/eureka/logistics-delivery.eureka.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/gateway/logistics-delivery.gateway.main.iml b/.idea/modules/gateway/logistics-delivery.gateway.main.iml new file mode 100644 index 0000000..f96a052 --- /dev/null +++ b/.idea/modules/gateway/logistics-delivery.gateway.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/payment-service/logistics-delivery.payment-service.main.iml b/.idea/modules/payment-service/logistics-delivery.payment-service.main.iml new file mode 100644 index 0000000..09e97c0 --- /dev/null +++ b/.idea/modules/payment-service/logistics-delivery.payment-service.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/product-service/logistics-delivery.product-service.main.iml b/.idea/modules/product-service/logistics-delivery.product-service.main.iml new file mode 100644 index 0000000..3250472 --- /dev/null +++ b/.idea/modules/product-service/logistics-delivery.product-service.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/slack-service/logistics-delivery.slack-service.main.iml b/.idea/modules/slack-service/logistics-delivery.slack-service.main.iml new file mode 100644 index 0000000..d30f1d8 --- /dev/null +++ b/.idea/modules/slack-service/logistics-delivery.slack-service.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index db38a1d..36227d3 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -33,10 +33,15 @@ spring: uri: lb://slack-service predicates: - Path=/api/v1/slacks/** + - id: shipping-service uri: lb://shipping-service predicates: - Path=/api/v1/shippings/** + - id: payment-service + uri: lb://payment-service + predicates: + - Path=/api/v1/payments/** # - id: auth-service # uri: lb://auth-service # predicates: diff --git a/payment-service/build.gradle b/payment-service/build.gradle new file mode 100644 index 0000000..1786f75 --- /dev/null +++ b/payment-service/build.gradle @@ -0,0 +1,13 @@ +ext { + set('springCloudVersion', "2024.0.0") +} + +dependencies { + implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' +} + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" + } +} diff --git a/payment-service/src/main/java/com/sparta/paymentservice/PaymentServiceApplication.java b/payment-service/src/main/java/com/sparta/paymentservice/PaymentServiceApplication.java new file mode 100644 index 0000000..9e7875d --- /dev/null +++ b/payment-service/src/main/java/com/sparta/paymentservice/PaymentServiceApplication.java @@ -0,0 +1,13 @@ +package com.sparta.paymentservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class PaymentServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(PaymentServiceApplication.class, args); + } + +} diff --git a/payment-service/src/main/java/com/sparta/paymentservice/presentation/PaymentController.java b/payment-service/src/main/java/com/sparta/paymentservice/presentation/PaymentController.java new file mode 100644 index 0000000..ddc8216 --- /dev/null +++ b/payment-service/src/main/java/com/sparta/paymentservice/presentation/PaymentController.java @@ -0,0 +1,15 @@ +package com.sparta.paymentservice.presentation; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/v1/payments") +public class PaymentController { + + @GetMapping("/test") + public String getPayment() { + return "Hello World"; + } +} diff --git a/payment-service/src/main/resources/application.yml b/payment-service/src/main/resources/application.yml new file mode 100644 index 0000000..52b6652 --- /dev/null +++ b/payment-service/src/main/resources/application.yml @@ -0,0 +1,13 @@ +spring: + application: + name: payment-service + +server: + port: 8086 + +eureka: + client: + register-with-eureka: true + fetch-registry: true + service-url: + defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/payment-service/src/test/java/com/sparta/paymentservice/PaymentServiceApplicationTests.java b/payment-service/src/test/java/com/sparta/paymentservice/PaymentServiceApplicationTests.java new file mode 100644 index 0000000..48c7c5c --- /dev/null +++ b/payment-service/src/test/java/com/sparta/paymentservice/PaymentServiceApplicationTests.java @@ -0,0 +1,13 @@ +package com.sparta.paymentservice; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class PaymentServiceApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/settings.gradle b/settings.gradle index 5a7e86b..5383e65 100644 --- a/settings.gradle +++ b/settings.gradle @@ -8,4 +8,7 @@ include('company-service') include('hub-service') include('product-service') include('slack-service') + include('shipping-service') + +include('payment-service') diff --git a/shipping-service b/shipping-service index a8ef2fb..1437e9c 160000 --- a/shipping-service +++ b/shipping-service @@ -1 +1 @@ -Subproject commit a8ef2fbc33ab00f7f72bac8a0f07cc14519670d6 +Subproject commit 1437e9cf666322f0c80c764d7860420ac13b48ad From 1e1d2e30a77408613d736fbdedaf5e5eb57e4007 Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Sat, 15 Mar 2025 21:40:22 +0900 Subject: [PATCH 019/389] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=A1=9C=EC=BB=AC?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=EC=82=AC=ED=95=AD=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/compiler.xml | 10 ++-------- .idea/misc.xml | 1 - .idea/modules.xml | 20 ------------------- ...gistics-delivery.shipping-service.main.iml | 8 ++++++++ settings.gradle | 1 + 5 files changed, 11 insertions(+), 29 deletions(-) delete mode 100644 .idea/modules.xml create mode 100644 .idea/modules/shipping-service/logistics-delivery.shipping-service.main.iml diff --git a/.idea/compiler.xml b/.idea/compiler.xml index e1c1c7a..1786b47 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -8,23 +8,17 @@ -<<<<<<< HEAD - -======= ->>>>>>> 5dac52f (✨feat [#15]: payment-service init 추가) + -<<<<<<< HEAD -======= ->>>>>>> 5dac52f (✨feat [#15]: payment-service init 추가) - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index fe0b0da..f937d01 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index c7509b7..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - -<<<<<<< HEAD - - -======= - - - - ->>>>>>> 5dac52f (✨feat [#15]: payment-service init 추가) - - - - \ No newline at end of file diff --git a/.idea/modules/shipping-service/logistics-delivery.shipping-service.main.iml b/.idea/modules/shipping-service/logistics-delivery.shipping-service.main.iml new file mode 100644 index 0000000..3d45724 --- /dev/null +++ b/.idea/modules/shipping-service/logistics-delivery.shipping-service.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 5383e65..15c9da5 100644 --- a/settings.gradle +++ b/settings.gradle @@ -12,3 +12,4 @@ include('slack-service') include('shipping-service') include('payment-service') +include('shipping-service') From 24e35895c560d6bae503f38f4868f488e004af68 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Sun, 16 Mar 2025 14:08:08 +0900 Subject: [PATCH 020/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#16]=20:=20slack-se?= =?UTF-8?q?rvice=20init=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/modules/eureka/logistics-delivery.eureka.main.iml | 8 ++++++++ .idea/modules/gateway/logistics-delivery.gateway.main.iml | 8 ++++++++ .../logistics-delivery.slack-service.main.iml | 8 ++++++++ 3 files changed, 24 insertions(+) create mode 100644 .idea/modules/eureka/logistics-delivery.eureka.main.iml create mode 100644 .idea/modules/gateway/logistics-delivery.gateway.main.iml create mode 100644 .idea/modules/slack-service/logistics-delivery.slack-service.main.iml diff --git a/.idea/modules/eureka/logistics-delivery.eureka.main.iml b/.idea/modules/eureka/logistics-delivery.eureka.main.iml new file mode 100644 index 0000000..421c373 --- /dev/null +++ b/.idea/modules/eureka/logistics-delivery.eureka.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/gateway/logistics-delivery.gateway.main.iml b/.idea/modules/gateway/logistics-delivery.gateway.main.iml new file mode 100644 index 0000000..f96a052 --- /dev/null +++ b/.idea/modules/gateway/logistics-delivery.gateway.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/slack-service/logistics-delivery.slack-service.main.iml b/.idea/modules/slack-service/logistics-delivery.slack-service.main.iml new file mode 100644 index 0000000..d30f1d8 --- /dev/null +++ b/.idea/modules/slack-service/logistics-delivery.slack-service.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file From 16e9014efc920a74866b8313f0f6c327632434b4 Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Sun, 16 Mar 2025 20:17:00 +0900 Subject: [PATCH 021/389] =?UTF-8?q?=F0=9F=90=9B=20bugfix=20[#22]=20:=20shi?= =?UTF-8?q?pping-serivce=20=EC=B6=A9=EB=8F=8C=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 2 +- .idea/modules.xml | 10 ++++++++++ .../logistics-delivery.company-service.main.iml | 8 -------- .../logistics-delivery.hub-service.main.iml | 8 -------- .../logistics-delivery.order-service.main.iml | 8 -------- .../logistics-delivery.payment-service.main.iml | 8 -------- .../logistics-delivery.product-service.main.iml | 8 -------- .../logistics-delivery.slack-service.main.iml | 8 -------- .../logistics-delivery.user-service.main.iml | 8 -------- settings.gradle | 3 --- 10 files changed, 11 insertions(+), 60 deletions(-) create mode 100644 .idea/modules.xml delete mode 100644 .idea/modules/company-service/logistics-delivery.company-service.main.iml delete mode 100644 .idea/modules/hub-service/logistics-delivery.hub-service.main.iml delete mode 100644 .idea/modules/order-service/logistics-delivery.order-service.main.iml delete mode 100644 .idea/modules/payment-service/logistics-delivery.payment-service.main.iml delete mode 100644 .idea/modules/product-service/logistics-delivery.product-service.main.iml delete mode 100644 .idea/modules/slack-service/logistics-delivery.slack-service.main.iml delete mode 100644 .idea/modules/user-service/logistics-delivery.user-service.main.iml diff --git a/.idea/misc.xml b/.idea/misc.xml index f937d01..5a6a28d 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,5 @@ - + diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..92c1ba0 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/company-service/logistics-delivery.company-service.main.iml b/.idea/modules/company-service/logistics-delivery.company-service.main.iml deleted file mode 100644 index f924b0e..0000000 --- a/.idea/modules/company-service/logistics-delivery.company-service.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/hub-service/logistics-delivery.hub-service.main.iml b/.idea/modules/hub-service/logistics-delivery.hub-service.main.iml deleted file mode 100644 index caddfa3..0000000 --- a/.idea/modules/hub-service/logistics-delivery.hub-service.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/order-service/logistics-delivery.order-service.main.iml b/.idea/modules/order-service/logistics-delivery.order-service.main.iml deleted file mode 100644 index 4eb426c..0000000 --- a/.idea/modules/order-service/logistics-delivery.order-service.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/payment-service/logistics-delivery.payment-service.main.iml b/.idea/modules/payment-service/logistics-delivery.payment-service.main.iml deleted file mode 100644 index 09e97c0..0000000 --- a/.idea/modules/payment-service/logistics-delivery.payment-service.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/product-service/logistics-delivery.product-service.main.iml b/.idea/modules/product-service/logistics-delivery.product-service.main.iml deleted file mode 100644 index 3250472..0000000 --- a/.idea/modules/product-service/logistics-delivery.product-service.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/slack-service/logistics-delivery.slack-service.main.iml b/.idea/modules/slack-service/logistics-delivery.slack-service.main.iml deleted file mode 100644 index d30f1d8..0000000 --- a/.idea/modules/slack-service/logistics-delivery.slack-service.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/user-service/logistics-delivery.user-service.main.iml b/.idea/modules/user-service/logistics-delivery.user-service.main.iml deleted file mode 100644 index 5a00956..0000000 --- a/.idea/modules/user-service/logistics-delivery.user-service.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 15c9da5..1447aaf 100644 --- a/settings.gradle +++ b/settings.gradle @@ -8,8 +8,5 @@ include('company-service') include('hub-service') include('product-service') include('slack-service') - -include('shipping-service') - include('payment-service') include('shipping-service') From c37309ec11d24f12ea2bb8d8ef6a1ee46966a1fd Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Mon, 17 Mar 2025 01:55:06 +0900 Subject: [PATCH 022/389] =?UTF-8?q?=F0=9F=90=9B=20bugfix=20[#29]=20:=20?= =?UTF-8?q?=EA=B0=81=20=EC=84=9C=EB=B9=84=EC=8A=A4=20application.yml=20dep?= =?UTF-8?q?th=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eureka/Dockerfile.dev | 19 +++++++++++++++++++ .../src/main/resources/application.yml | 4 ++-- .../src/main/resources/application.yml | 4 ++-- .../src/main/resources/application.yml | 4 ++-- .../src/main/resources/application.yml | 4 ++-- .../src/main/resources/application.yml | 4 ++-- 6 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 eureka/Dockerfile.dev diff --git a/eureka/Dockerfile.dev b/eureka/Dockerfile.dev new file mode 100644 index 0000000..85af58c --- /dev/null +++ b/eureka/Dockerfile.dev @@ -0,0 +1,19 @@ +FROM eclipse-temurin:17-jdk + +WORKDIR /app + +# 루트 프로젝트에서 Gradle 관련 파일 복사 +COPY ../gradlew ../build.gradle ../settings.gradle ./ +COPY ../gradle gradle/ + +# 실행 권한 추가 +RUN chmod +x gradlew + +# Gradle 의존성 다운로드 +RUN ./gradlew dependencies --no-daemon + +# Eureka 서버 코드 복사 +COPY . . + +# Eureka 서버 실행 +ENTRYPOINT ["./gradlew", ":eureka:bootRun"] diff --git a/hub-service/src/main/resources/application.yml b/hub-service/src/main/resources/application.yml index cfb080d..ec35b6f 100644 --- a/hub-service/src/main/resources/application.yml +++ b/hub-service/src/main/resources/application.yml @@ -9,5 +9,5 @@ eureka: client: register-with-eureka: true fetch-registry: true - service-url: - defaultZone: http://localhost:8761/eureka/ + service-url: + defaultZone: http://localhost:8761/eureka/ diff --git a/payment-service/src/main/resources/application.yml b/payment-service/src/main/resources/application.yml index 52b6652..a66fae6 100644 --- a/payment-service/src/main/resources/application.yml +++ b/payment-service/src/main/resources/application.yml @@ -9,5 +9,5 @@ eureka: client: register-with-eureka: true fetch-registry: true - service-url: - defaultZone: http://localhost:8761/eureka/ \ No newline at end of file + service-url: + defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/product-service/src/main/resources/application.yml b/product-service/src/main/resources/application.yml index e1fa1b3..60cebcd 100644 --- a/product-service/src/main/resources/application.yml +++ b/product-service/src/main/resources/application.yml @@ -9,5 +9,5 @@ eureka: client: register-with-eureka: true fetch-registry: true - service-url: - defaultZone: http://localhost:8761/eureka/ \ No newline at end of file + service-url: + defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/slack-service/src/main/resources/application.yml b/slack-service/src/main/resources/application.yml index 0cb97cd..ecfb44b 100644 --- a/slack-service/src/main/resources/application.yml +++ b/slack-service/src/main/resources/application.yml @@ -9,5 +9,5 @@ eureka: client: register-with-eureka: true # Eureka? ??? ?? fetch-registry: true # Eureka?? ??? ?? ???? - service-url: - defaultZone: http://localhost:8761/eureka/ \ No newline at end of file + service-url: + defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/user-service/src/main/resources/application.yml b/user-service/src/main/resources/application.yml index 4d0be27..34de803 100644 --- a/user-service/src/main/resources/application.yml +++ b/user-service/src/main/resources/application.yml @@ -9,5 +9,5 @@ eureka: client: register-with-eureka: true # Eureka? ??? ?? fetch-registry: true # Eureka?? ??? ?? ???? - service-url: - defaultZone: http://localhost:8761/eureka/ + service-url: + defaultZone: http://localhost:8761/eureka/ From 7b75dd6104e8ca821def6293a21c66ce4ca2a513 Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Mon, 17 Mar 2025 01:57:51 +0900 Subject: [PATCH 023/389] =?UTF-8?q?=F0=9F=90=9B=20bugfix=20[#22]=20:=20shi?= =?UTF-8?q?pping-service=20=EB=AA=A8=EB=93=88=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shipping-service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shipping-service b/shipping-service index 1437e9c..4dc6e9e 160000 --- a/shipping-service +++ b/shipping-service @@ -1 +1 @@ -Subproject commit 1437e9cf666322f0c80c764d7860420ac13b48ad +Subproject commit 4dc6e9ed64e959cfb4881ae531e076e05342bc8b From 7e4a31fea6b03ac915ea2004b933e67578889d97 Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Mon, 17 Mar 2025 02:00:33 +0900 Subject: [PATCH 024/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#29]=20:=20docker-c?= =?UTF-8?q?ompose=20=ED=99=98=EA=B2=BD=20=EC=84=B8=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- company-service/Dockerfile.dev | 15 ++++ docker-compose.yml | 137 +++++++++++++++++++++++++++++++++ eureka/Dockerfile | 16 ++++ gateway/Dockerfile | 15 ++++ gateway/Dockerfile.dev | 15 ++++ hub-service/Dockerfile.dev | 15 ++++ order-service/Dockerfile.dev | 15 ++++ payment-service/Dockerfile.dev | 15 ++++ product-service/Dockerfile.dev | 15 ++++ slack-service/Dockerfile.dev | 15 ++++ user-service/Dockerfile.dev | 15 ++++ 11 files changed, 288 insertions(+) create mode 100644 company-service/Dockerfile.dev create mode 100644 docker-compose.yml create mode 100644 eureka/Dockerfile create mode 100644 gateway/Dockerfile create mode 100644 gateway/Dockerfile.dev create mode 100644 hub-service/Dockerfile.dev create mode 100644 order-service/Dockerfile.dev create mode 100644 payment-service/Dockerfile.dev create mode 100644 product-service/Dockerfile.dev create mode 100644 slack-service/Dockerfile.dev create mode 100644 user-service/Dockerfile.dev diff --git a/company-service/Dockerfile.dev b/company-service/Dockerfile.dev new file mode 100644 index 0000000..ac4cbee --- /dev/null +++ b/company-service/Dockerfile.dev @@ -0,0 +1,15 @@ +FROM eclipse-temurin:17-jdk + +WORKDIR /app + +# Gradle 캐시 최적화 +COPY gradle gradle +COPY gradlew build.gradle settings.gradle ./ +RUN chmod +x gradlew +RUN ./gradlew dependencies --no-daemon + +# 전체 프로젝트 복사 +COPY . . + +# 개발 모드에서 실행 (빌드 없이 바로 실행) +ENTRYPOINT ["./gradlew", ":company-service:bootRun"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..2a4a7d7 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,137 @@ +services: + eureka-server: + build: + context: . # 루트에서 빌드 (Gradle 파일 접근 가능) + dockerfile: eureka/Dockerfile.dev + container_name: eureka-server + ports: + - "8761:8761" + networks: + - msa-network + + gateway-service: + build: + context: . # 루트에서 빌드 + dockerfile: gateway/Dockerfile.dev + container_name: gateway-service + ports: + - "8080:8080" + depends_on: + - eureka-server + environment: + - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka + networks: + - msa-network + + company-service: + build: + context: . # 루트에서 빌드 + dockerfile: company-service/Dockerfile.dev + container_name: company-service + ports: + - "8085:8080" + depends_on: + - eureka-server + environment: + - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka + networks: + - msa-network + + hub-service: + build: + context: . # 루트에서 빌드 + dockerfile: hub-service/Dockerfile.dev + container_name: hub-service + ports: + - "8082:8080" + depends_on: + - eureka-server + environment: + - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka + networks: + - msa-network + + order-service: + build: + context: . # 루트에서 빌드 + dockerfile: order-service/Dockerfile.dev + container_name: order-service + ports: + - "8084:8080" + depends_on: + - eureka-server + environment: + - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka + networks: + - msa-network + + payment-service: + build: + context: . # 루트에서 빌드 + dockerfile: payment-service/Dockerfile.dev + container_name: payment-service + ports: + - "8086:8080" + depends_on: + - eureka-server + environment: + - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka + networks: + - msa-network + product-service: + build: + context: . # 루트에서 빌드 + dockerfile: product-service/Dockerfile.dev + container_name: product-service + ports: + - "8083:8080" + depends_on: + - eureka-server + environment: + - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka + networks: + - msa-network + shipping-service: + build: + context: . # 루트에서 빌드 + dockerfile: shipping-service/Dockerfile.dev + container_name: shipping-service + ports: + - "8088:8080" + depends_on: + - eureka-server + environment: + - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka + networks: + - msa-network + + slack-service: + build: + context: . # 루트에서 빌드 + dockerfile: slack-service/Dockerfile.dev + container_name: slack-service + ports: + - "8087:8080" + depends_on: + - eureka-server + environment: + - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka + networks: + - msa-network + user-service: + build: + context: . # 루트에서 빌드 + dockerfile: user-service/Dockerfile.dev + container_name: user-service + ports: + - "8081:8080" + depends_on: + - eureka-server + environment: + - EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-server:8761/eureka + networks: + - msa-network + +networks: + msa-network: + driver: bridge diff --git a/eureka/Dockerfile b/eureka/Dockerfile new file mode 100644 index 0000000..c3126ff --- /dev/null +++ b/eureka/Dockerfile @@ -0,0 +1,16 @@ +FROM eclipse-temurin:17-jdk + +WORKDIR /app + +# Gradle 캐시 최적화 +COPY gradle gradle +COPY gradlew build.gradle settings.gradle ./ +RUN chmod +x gradlew +RUN ./gradlew dependencies --no-daemon + +# 전체 프로젝트 복사 +COPY . . + +# 개발 모드에서 실행 (빌드 없이 바로 실행) +ENTRYPOINT ["./gradlew", "bootRun"] + diff --git a/gateway/Dockerfile b/gateway/Dockerfile new file mode 100644 index 0000000..3e8680f --- /dev/null +++ b/gateway/Dockerfile @@ -0,0 +1,15 @@ +FROM eclipse-temurin:17-jdk + +WORKDIR /app + +# Gradle 캐시 최적화 (빠른 빌드를 위해 종속성 미리 다운로드) +COPY gradle gradle +COPY gradlew build.gradle settings.gradle ./ +RUN chmod +x gradlew +RUN ./gradlew dependencies --no-daemon + +# 전체 프로젝트 복사 +COPY . . + +# 개발 모드에서 Gateway 실행 (소스 코드 변경 즉시 반영) +ENTRYPOINT ["./gradlew", ":gateway:bootRun"] diff --git a/gateway/Dockerfile.dev b/gateway/Dockerfile.dev new file mode 100644 index 0000000..6d75ec7 --- /dev/null +++ b/gateway/Dockerfile.dev @@ -0,0 +1,15 @@ +FROM eclipse-temurin:17-jdk + +WORKDIR /app + +# Gradle 캐시 최적화 +COPY gradle gradle +COPY gradlew build.gradle settings.gradle ./ +RUN chmod +x gradlew +RUN ./gradlew dependencies --no-daemon + +# 전체 프로젝트 복사 +COPY . . + +# 개발 모드에서 실행 (빌드 없이 바로 실행) +ENTRYPOINT ["./gradlew", ":gateway:bootRun"] diff --git a/hub-service/Dockerfile.dev b/hub-service/Dockerfile.dev new file mode 100644 index 0000000..d116b20 --- /dev/null +++ b/hub-service/Dockerfile.dev @@ -0,0 +1,15 @@ +FROM eclipse-temurin:17-jdk + +WORKDIR /app + +# Gradle 캐시 최적화 +COPY gradle gradle +COPY gradlew build.gradle settings.gradle ./ +RUN chmod +x gradlew +RUN ./gradlew dependencies --no-daemon + +# 전체 프로젝트 복사 +COPY . . + +# 개발 모드에서 실행 (빌드 없이 바로 실행) +ENTRYPOINT ["./gradlew", ":hub-service:bootRun"] diff --git a/order-service/Dockerfile.dev b/order-service/Dockerfile.dev new file mode 100644 index 0000000..ad0907e --- /dev/null +++ b/order-service/Dockerfile.dev @@ -0,0 +1,15 @@ +FROM eclipse-temurin:17-jdk + +WORKDIR /app + +# Gradle 캐시 최적화 +COPY gradle gradle +COPY gradlew build.gradle settings.gradle ./ +RUN chmod +x gradlew +RUN ./gradlew dependencies --no-daemon + +# 전체 프로젝트 복사 +COPY . . + +# 개발 모드에서 실행 (빌드 없이 바로 실행) +ENTRYPOINT ["./gradlew", ":order-service:bootRun"] diff --git a/payment-service/Dockerfile.dev b/payment-service/Dockerfile.dev new file mode 100644 index 0000000..96d10d4 --- /dev/null +++ b/payment-service/Dockerfile.dev @@ -0,0 +1,15 @@ +FROM eclipse-temurin:17-jdk + +WORKDIR /app + +# Gradle 캐시 최적화 +COPY gradle gradle +COPY gradlew build.gradle settings.gradle ./ +RUN chmod +x gradlew +RUN ./gradlew dependencies --no-daemon + +# 전체 프로젝트 복사 +COPY . . + +# 개발 모드에서 실행 (빌드 없이 바로 실행) +ENTRYPOINT ["./gradlew", ":payment-service:bootRun"] diff --git a/product-service/Dockerfile.dev b/product-service/Dockerfile.dev new file mode 100644 index 0000000..eb04bfb --- /dev/null +++ b/product-service/Dockerfile.dev @@ -0,0 +1,15 @@ +FROM eclipse-temurin:17-jdk + +WORKDIR /app + +# Gradle 캐시 최적화 +COPY gradle gradle +COPY gradlew build.gradle settings.gradle ./ +RUN chmod +x gradlew +RUN ./gradlew dependencies --no-daemon + +# 전체 프로젝트 복사 +COPY . . + +# 개발 모드에서 실행 (빌드 없이 바로 실행) +ENTRYPOINT ["./gradlew", ":product-service:bootRun"] diff --git a/slack-service/Dockerfile.dev b/slack-service/Dockerfile.dev new file mode 100644 index 0000000..55b33b3 --- /dev/null +++ b/slack-service/Dockerfile.dev @@ -0,0 +1,15 @@ +FROM eclipse-temurin:17-jdk + +WORKDIR /app + +# Gradle 캐시 최적화 +COPY gradle gradle +COPY gradlew build.gradle settings.gradle ./ +RUN chmod +x gradlew +RUN ./gradlew dependencies --no-daemon + +# 전체 프로젝트 복사 +COPY . . + +# 개발 모드에서 실행 (빌드 없이 바로 실행) +ENTRYPOINT ["./gradlew", ":slack-service:bootRun"] diff --git a/user-service/Dockerfile.dev b/user-service/Dockerfile.dev new file mode 100644 index 0000000..a33494a --- /dev/null +++ b/user-service/Dockerfile.dev @@ -0,0 +1,15 @@ +FROM eclipse-temurin:17-jdk + +WORKDIR /app + +# Gradle 캐시 최적화 +COPY gradle gradle +COPY gradlew build.gradle settings.gradle ./ +RUN chmod +x gradlew +RUN ./gradlew dependencies --no-daemon + +# 전체 프로젝트 복사 +COPY . . + +# 개발 모드에서 실행 (빌드 없이 바로 실행) +ENTRYPOINT ["./gradlew", ":user-service:bootRun"] From c7796417383e3dd3daddafaae9429467d951bf0b Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 17 Mar 2025 16:00:44 +0900 Subject: [PATCH 025/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20common=20?= =?UTF-8?q?=EB=AA=A8=EB=93=88=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/compiler.xml | 2 +- .idea/modules.xml | 10 ++++------ common-module/build.gradle | 0 settings.gradle | 1 + 4 files changed, 6 insertions(+), 7 deletions(-) create mode 100644 common-module/build.gradle diff --git a/.idea/compiler.xml b/.idea/compiler.xml index f7a9568..9f8185a 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -12,7 +12,7 @@ - + diff --git a/.idea/modules.xml b/.idea/modules.xml index 006c956..f4828af 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,15 +2,13 @@ + + - + - - - - - + \ No newline at end of file diff --git a/common-module/build.gradle b/common-module/build.gradle new file mode 100644 index 0000000..e69de29 diff --git a/settings.gradle b/settings.gradle index 1447aaf..ffdbb10 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,6 +2,7 @@ rootProject.name = 'logistics-delivery' include('eureka') include('gateway') +include('common-module') include('user-service') include('order-service') include('company-service') From 1b508c3a152660ff44f2896ff6e16ac4a0208a9d Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 17 Mar 2025 16:01:19 +0900 Subject: [PATCH 026/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20BaseEntity=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commonmodule/entity/BaseEntity.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java b/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java new file mode 100644 index 0000000..6e4537b --- /dev/null +++ b/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java @@ -0,0 +1,69 @@ +package com.sparta.commonmodule.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.MappedSuperclass; +import java.time.LocalDateTime; +import lombok.Data; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.hibernate.annotations.ColumnDefault; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +@Data +@Getter +@RequiredArgsConstructor +@EntityListeners(AuditingEntityListener.class) +@MappedSuperclass +public class BaseEntity { + + @CreatedDate + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; + + @CreatedBy + @JoinColumn(name = "created_by") + private long createdBy; + + @LastModifiedDate + @Column(name = "updated_at") + private LocalDateTime updatedAt; + + @LastModifiedBy + @JoinColumn(name = "updated_by") + private long updatedBy; + + @Column(name = "is_deleted") + @ColumnDefault("FALSE") + private Boolean isDeleted; + + @Column(name = "deleted_at") + private LocalDateTime deletedAt; + + @JoinColumn(name = "deleted_by") + private long deletedBy; + + // 생성을 위한 method + public BaseEntity(long userId) { + this.createdBy = userId; + this.updatedBy = userId; + this.isDeleted = false; + } + + // update를 위한 method + public void update(long userId) { + this.updatedBy = userId; + } + + // 소프트 delete를 위한 method + public void delete(long userId) { + this.isDeleted = true; + this.deletedAt = LocalDateTime.now(); + this.deletedBy = userId; + } +} From 1f093a933e9469dc3c39fb0be9515fc758972c79 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 17 Mar 2025 16:04:22 +0900 Subject: [PATCH 027/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EC=B2=98=EB=A6=AC=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/DeletedDataAccessException.java | 21 +++++++ .../exception/DuplicateResourceException.java | 22 +++++++ .../exception/GlobalExceptionHandler.java | 59 +++++++++++++++++++ .../exception/InternalServerException.java | 16 +++++ .../exception/InvalidParameterException.java | 23 ++++++++ .../OperationNotAllowedException.java | 16 +++++ .../exception/OwnershipMismatchException.java | 23 ++++++++ .../exception/ResourceNotFoundException.java | 21 +++++++ .../UnauthorizedAccessException.java | 23 ++++++++ 9 files changed, 224 insertions(+) create mode 100644 common-module/src/main/java/com/sparta/commonmodule/entity/exception/DeletedDataAccessException.java create mode 100644 common-module/src/main/java/com/sparta/commonmodule/entity/exception/DuplicateResourceException.java create mode 100644 common-module/src/main/java/com/sparta/commonmodule/entity/exception/GlobalExceptionHandler.java create mode 100644 common-module/src/main/java/com/sparta/commonmodule/entity/exception/InternalServerException.java create mode 100644 common-module/src/main/java/com/sparta/commonmodule/entity/exception/InvalidParameterException.java create mode 100644 common-module/src/main/java/com/sparta/commonmodule/entity/exception/OperationNotAllowedException.java create mode 100644 common-module/src/main/java/com/sparta/commonmodule/entity/exception/OwnershipMismatchException.java create mode 100644 common-module/src/main/java/com/sparta/commonmodule/entity/exception/ResourceNotFoundException.java create mode 100644 common-module/src/main/java/com/sparta/commonmodule/entity/exception/UnauthorizedAccessException.java diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/DeletedDataAccessException.java b/common-module/src/main/java/com/sparta/commonmodule/entity/exception/DeletedDataAccessException.java new file mode 100644 index 0000000..3e491dc --- /dev/null +++ b/common-module/src/main/java/com/sparta/commonmodule/entity/exception/DeletedDataAccessException.java @@ -0,0 +1,21 @@ +package com.sparta.commonmodule.entity.exception; + +import org.springframework.dao.DataAccessException; + +/** + * 삭제된 데이터에 접근할 때 발생하는 예외입니다. 보안상 상세 정보를 노출하지 않고, "삭제된 리소스" 혹은 "잘못된 요청"으로 처리할 수 있습니다. + */ +public class DeletedDataAccessException extends DataAccessException { + + public DeletedDataAccessException() { + super("삭제된 리소스에 접근했습니다."); + } + + public DeletedDataAccessException(String msg) { + super(msg); + } + + public DeletedDataAccessException(String msg, Throwable cause) { + super(msg, cause); + } +} \ No newline at end of file diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/DuplicateResourceException.java b/common-module/src/main/java/com/sparta/commonmodule/entity/exception/DuplicateResourceException.java new file mode 100644 index 0000000..163b46f --- /dev/null +++ b/common-module/src/main/java/com/sparta/commonmodule/entity/exception/DuplicateResourceException.java @@ -0,0 +1,22 @@ +package com.sparta.commonmodule.entity.exception; + +import org.springframework.dao.DataAccessException; + +/** + * 이미 존재하는 데이터를 생성하려 할 때 발생하는 예외입니다. 주로 HTTP 409 (Conflict) 응답과 매핑하여 처리합니다. + */ +public class DuplicateResourceException extends DataAccessException { + + public DuplicateResourceException() { + super("이미 존재하는 리소스입니다."); + } + + public DuplicateResourceException(String message) { + super(message); + } + + public DuplicateResourceException(String message, Throwable cause) { + super(message, cause); + } + +} diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/GlobalExceptionHandler.java b/common-module/src/main/java/com/sparta/commonmodule/entity/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..29823c3 --- /dev/null +++ b/common-module/src/main/java/com/sparta/commonmodule/entity/exception/GlobalExceptionHandler.java @@ -0,0 +1,59 @@ +package com.sparta.commonmodule.entity.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class GlobalExceptionHandler { + + // ❌ 삭제된 데이터 접근 + @ExceptionHandler(DeletedDataAccessException.class) + public ResponseEntity handleDeletedDataAccess(DeletedDataAccessException ex) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage()); + } + + // ❌ 존재하지 않는 데이터 접근 + @ExceptionHandler(ResourceNotFoundException.class) + public ResponseEntity handleResourceNotFound(ResourceNotFoundException ex) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage()); + } + + // ❌ 이미 존재하는 데이터 생성 (409) + @ExceptionHandler(DuplicateResourceException.class) + public ResponseEntity handleDuplicateResource(DuplicateResourceException ex) { + return ResponseEntity.status(HttpStatus.CONFLICT).body(ex.getMessage()); + } + + // ❌ 권한 없음 (401) + @ExceptionHandler(UnauthorizedAccessException.class) + public ResponseEntity handleUnauthorizedAccess(UnauthorizedAccessException ex) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(ex.getMessage()); + } + + // ❌ 소유자가 아닌 사용자의 접근 (403) + @ExceptionHandler(OwnershipMismatchException.class) + public ResponseEntity handleOwnershipMismatch(OwnershipMismatchException ex) { + return ResponseEntity.status(HttpStatus.FORBIDDEN).body(ex.getMessage()); + } + + // ❌ 잘못된 요청 파라미터 (400) + @ExceptionHandler(InvalidParameterException.class) + public ResponseEntity handleInvalidParameter(InvalidParameterException ex) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage()); + } + + // ❌ 수행할 수 없는 작업 요청 (400 또는 403) + @ExceptionHandler(OperationNotAllowedException.class) + public ResponseEntity handleOperationNotAllowed(OperationNotAllowedException ex) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage()); + } + + // ❌ 서버 내부 오류 (500) + @ExceptionHandler(InternalServerException.class) + public ResponseEntity handleInternalServerError(InternalServerException ex) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ex.getMessage()); + } +} + diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/InternalServerException.java b/common-module/src/main/java/com/sparta/commonmodule/entity/exception/InternalServerException.java new file mode 100644 index 0000000..e65df49 --- /dev/null +++ b/common-module/src/main/java/com/sparta/commonmodule/entity/exception/InternalServerException.java @@ -0,0 +1,16 @@ +package com.sparta.commonmodule.entity.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) // HTTP 500 +public class InternalServerException extends RuntimeException { + + public InternalServerException() { + super("서버 내부 오류가 발생했습니다."); + } + + public InternalServerException(String message) { + super(message); + } +} diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/InvalidParameterException.java b/common-module/src/main/java/com/sparta/commonmodule/entity/exception/InvalidParameterException.java new file mode 100644 index 0000000..5cd5cf6 --- /dev/null +++ b/common-module/src/main/java/com/sparta/commonmodule/entity/exception/InvalidParameterException.java @@ -0,0 +1,23 @@ +package com.sparta.commonmodule.entity.exception; + +/** + * 메서드나 API 호출 시 잘못된 파라미터가 전달되었을 때 발생하는 예외입니다. 주로 HTTP 400 (Bad Request) 응답과 매핑하여 처리합니다. + */ +public class InvalidParameterException extends RuntimeException { + + public InvalidParameterException() { + super("잘못된 파라미터가 전달되었습니다."); + } + + public InvalidParameterException(String message) { + super(message); + } + + public InvalidParameterException(String message, Throwable cause) { + super(message, cause); + } + + public InvalidParameterException(Throwable cause) { + super(cause); + } +} \ No newline at end of file diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/OperationNotAllowedException.java b/common-module/src/main/java/com/sparta/commonmodule/entity/exception/OperationNotAllowedException.java new file mode 100644 index 0000000..6777740 --- /dev/null +++ b/common-module/src/main/java/com/sparta/commonmodule/entity/exception/OperationNotAllowedException.java @@ -0,0 +1,16 @@ +package com.sparta.commonmodule.entity.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.BAD_REQUEST) // 또는 상황에 따라 FORBIDDEN (403) +public class OperationNotAllowedException extends RuntimeException { + + public OperationNotAllowedException() { + super("현재 상태에서 수행할 수 없는 작업입니다."); + } + + public OperationNotAllowedException(String message) { + super(message); + } +} diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/OwnershipMismatchException.java b/common-module/src/main/java/com/sparta/commonmodule/entity/exception/OwnershipMismatchException.java new file mode 100644 index 0000000..b49654d --- /dev/null +++ b/common-module/src/main/java/com/sparta/commonmodule/entity/exception/OwnershipMismatchException.java @@ -0,0 +1,23 @@ +package com.sparta.commonmodule.entity.exception; + +/** + * 리소스의 소유자와 다른 ID로 접근하려 할 때 발생하는 예외입니다. 주로 HTTP 403 (Forbidden) 응답과 매핑하여 처리합니다. + */ +public class OwnershipMismatchException extends RuntimeException { + + public OwnershipMismatchException() { + super("소유자와 일치하지 않는 사용자입니다."); + } + + public OwnershipMismatchException(String message) { + super(message); + } + + public OwnershipMismatchException(String message, Throwable cause) { + super(message, cause); + } + + public OwnershipMismatchException(Throwable cause) { + super(cause); + } +} \ No newline at end of file diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/ResourceNotFoundException.java b/common-module/src/main/java/com/sparta/commonmodule/entity/exception/ResourceNotFoundException.java new file mode 100644 index 0000000..61a418a --- /dev/null +++ b/common-module/src/main/java/com/sparta/commonmodule/entity/exception/ResourceNotFoundException.java @@ -0,0 +1,21 @@ +package com.sparta.commonmodule.entity.exception; + +import org.springframework.dao.DataAccessException; + +/** + * 존재하지 않는 ID에 접근할 때 발생하는 예외입니다. 주로 HTTP 404 (Not Found) 응답과 매핑하여 처리합니다. + */ +public class ResourceNotFoundException extends DataAccessException { + + public ResourceNotFoundException() { + super("요청한 리소스를 찾을 수 없습니다."); + } + + public ResourceNotFoundException(String message) { + super(message); + } + + public ResourceNotFoundException(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/UnauthorizedAccessException.java b/common-module/src/main/java/com/sparta/commonmodule/entity/exception/UnauthorizedAccessException.java new file mode 100644 index 0000000..f6d472f --- /dev/null +++ b/common-module/src/main/java/com/sparta/commonmodule/entity/exception/UnauthorizedAccessException.java @@ -0,0 +1,23 @@ +package com.sparta.commonmodule.entity.exception; + +/** + * 사용자가 필요한 권한을 보유하지 않은 경우 발생하는 예외입니다. HTTP 401 (Unauthorized) 또는 403 (Forbidden)으로 매핑할 수 있습니다. + */ +public class UnauthorizedAccessException extends RuntimeException { + + public UnauthorizedAccessException() { + super("권한이 없습니다."); + } + + public UnauthorizedAccessException(String message) { + super(message); + } + + public UnauthorizedAccessException(String message, Throwable cause) { + super(message, cause); + } + + public UnauthorizedAccessException(Throwable cause) { + super(cause); + } +} \ No newline at end of file From 11cfb74ef9e78f051a2118da1471e4a6798db3b5 Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Mon, 17 Mar 2025 16:10:45 +0900 Subject: [PATCH 028/389] Removed shipping-service submodule --- .idea/modules.xml | 9 +-------- shipping-service | 1 - 2 files changed, 1 insertion(+), 9 deletions(-) delete mode 160000 shipping-service diff --git a/.idea/modules.xml b/.idea/modules.xml index 006c956..5ab07c0 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -4,13 +4,6 @@ - - - - - - - - + \ No newline at end of file diff --git a/shipping-service b/shipping-service deleted file mode 160000 index 4dc6e9e..0000000 --- a/shipping-service +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4dc6e9ed64e959cfb4881ae531e076e05342bc8b From 3cf3b0060202d69e40e67cef80d6772c604dfe7e Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Mon, 17 Mar 2025 16:35:46 +0900 Subject: [PATCH 029/389] =?UTF-8?q?feat[#40]=20:=20shipping-service=20?= =?UTF-8?q?=EB=8B=A4=EC=8B=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shipping-service/build.gradle | 12 ++++++++++++ .../shippingservice/ShippingController.java | 15 +++++++++++++++ .../ShippingServiceApplication.java | 12 ++++++++++++ .../src/main/resources/application.yaml | 13 +++++++++++++ .../ShippingServiceApplicationTests.java | 12 ++++++++++++ 5 files changed, 64 insertions(+) create mode 100644 shipping-service/build.gradle create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/ShippingController.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java create mode 100644 shipping-service/src/main/resources/application.yaml create mode 100644 shipping-service/src/test/java/com/sparta/shippingservice/ShippingServiceApplicationTests.java diff --git a/shipping-service/build.gradle b/shipping-service/build.gradle new file mode 100644 index 0000000..e2c6e5b --- /dev/null +++ b/shipping-service/build.gradle @@ -0,0 +1,12 @@ +ext { + set('springCloudVersion', "2024.0.0") +} +dependencies { + implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' +} + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" + } +} \ No newline at end of file diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/ShippingController.java new file mode 100644 index 0000000..1905853 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/ShippingController.java @@ -0,0 +1,15 @@ +package com.sparta.shippingservice; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/v1/shippings") +public class ShippingController { + + @GetMapping("/test") + public String getShipping() { + return "Hello World"; + } +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java b/shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java new file mode 100644 index 0000000..1146de6 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java @@ -0,0 +1,12 @@ +package com.sparta.shippingservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ShippingServiceApplication { + public static void main(String[] args) { + SpringApplication.run(ShippingServiceApplication.class, args); + } + +} diff --git a/shipping-service/src/main/resources/application.yaml b/shipping-service/src/main/resources/application.yaml new file mode 100644 index 0000000..3f4ff97 --- /dev/null +++ b/shipping-service/src/main/resources/application.yaml @@ -0,0 +1,13 @@ +spring: + application: + name: shipping-service + +server: + port: 8088 + +eureka: + client: + register-with-eureka: true # Eureka? ??? ?? + fetch-registry: true # Eureka?? ??? ?? ???? + service-url: + defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/shipping-service/src/test/java/com/sparta/shippingservice/ShippingServiceApplicationTests.java b/shipping-service/src/test/java/com/sparta/shippingservice/ShippingServiceApplicationTests.java new file mode 100644 index 0000000..03437d3 --- /dev/null +++ b/shipping-service/src/test/java/com/sparta/shippingservice/ShippingServiceApplicationTests.java @@ -0,0 +1,12 @@ +package com.sparta.shippingservice; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ShippingServiceApplicationTests { + @Test + void contextLoads() { + } + +} From 6e6fbe6ed1ce45875b233fe634773924c63b1733 Mon Sep 17 00:00:00 2001 From: jiyun Date: Mon, 17 Mar 2025 15:28:29 +0900 Subject: [PATCH 030/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#27]=20:=20?= =?UTF-8?q?=EB=AA=A8=EB=93=88=EA=B4=80=EB=A0=A8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=EC=82=AC=ED=95=AD=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../logistics-delivery.company-service.main.iml | 8 ++++++++ company-service/build.gradle | 1 + gradlew | 0 3 files changed, 9 insertions(+) create mode 100644 .idea/modules/company-service/logistics-delivery.company-service.main.iml mode change 100644 => 100755 gradlew diff --git a/.idea/modules/company-service/logistics-delivery.company-service.main.iml b/.idea/modules/company-service/logistics-delivery.company-service.main.iml new file mode 100644 index 0000000..f924b0e --- /dev/null +++ b/.idea/modules/company-service/logistics-delivery.company-service.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/company-service/build.gradle b/company-service/build.gradle index 2918e71..454548c 100644 --- a/company-service/build.gradle +++ b/company-service/build.gradle @@ -5,6 +5,7 @@ ext { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' } dependencyManagement { diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 From 7afe6dbdbdeb341b838911bd6d045d531f56579e Mon Sep 17 00:00:00 2001 From: jiyun Date: Mon, 17 Mar 2025 15:29:21 +0900 Subject: [PATCH 031/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#27]=20:=20Company?= =?UTF-8?q?=20-=20Domain=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80(model,=20repository)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../companyservice/domain/model/Company.java | 54 +++++++++++++++++++ .../domain/model/CompanyType.java | 6 +++ .../domain/repository/CompanyRepository.java | 12 +++++ 3 files changed, 72 insertions(+) create mode 100644 company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java create mode 100644 company-service/src/main/java/com/sparta/companyservice/domain/model/CompanyType.java create mode 100644 company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java new file mode 100644 index 0000000..536afdb --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java @@ -0,0 +1,54 @@ +package com.sparta.companyservice.domain.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +public class Company { + @Id + @Column(name = "company_id") + private UUID id; + + @Column(nullable = false, length = 100, unique = true) + private String name; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private CompanyType type; + + @Column(name = "hub_id", nullable = false) + private UUID hubId; + + @Column(nullable = false, columnDefinition = "TEXT") + private String address; + + // 나중에 BaseEntity 상속 + @Column(nullable = false, updatable = false) + private Long createdBy; + + @Column(nullable = false, updatable = false) + private LocalDateTime createdAt; + + private Long updatedBy; + + private LocalDateTime updatedAt; + + @Column(nullable = false) + private Boolean isDeleted; + + private Long deletedBy; + + private LocalDateTime deletedAt; +} + diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/model/CompanyType.java b/company-service/src/main/java/com/sparta/companyservice/domain/model/CompanyType.java new file mode 100644 index 0000000..bb8a963 --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/domain/model/CompanyType.java @@ -0,0 +1,6 @@ +package com.sparta.companyservice.domain.model; + +public enum CompanyType { + PRODUCER, + RECEIVER +} diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java new file mode 100644 index 0000000..2cbaac3 --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java @@ -0,0 +1,12 @@ +package com.sparta.companyservice.domain.repository; + +import com.sparta.companyservice.domain.model.Company; + +import java.util.Optional; +import java.util.UUID; + +public interface CompanyRepository { + Optional findById(UUID id); + Company save(Company company); +} + From eb35f361caeec01e4808367b7e90f6616840feb3 Mon Sep 17 00:00:00 2001 From: jiyun Date: Mon, 17 Mar 2025 17:39:33 +0900 Subject: [PATCH 032/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#27]=20:=20BaseEnti?= =?UTF-8?q?ty=20=EC=83=81=EC=86=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- company-service/build.gradle | 1 + .../companyservice/CompanyController.java | 14 ------ .../application/dto/CompanyDto.java | 21 ++++++++ .../application/service/CompanyService.java | 49 +++++++++++++++++++ .../companyservice/domain/model/Company.java | 29 +++++------ .../domain/service/CompanyDomainService.java | 14 ++++++ .../infrastructure/client/HubClient.java | 4 ++ .../repository/CompanyRepositoryImpl.java | 4 ++ .../repository/JpaCompanyRepository.java | 4 ++ .../controller/CompanyController.java | 25 ++++++++++ .../presentation/request/CompanyRequest.java | 11 +++++ 11 files changed, 144 insertions(+), 32 deletions(-) delete mode 100644 company-service/src/main/java/com/sparta/companyservice/CompanyController.java create mode 100644 company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyDto.java create mode 100644 company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java create mode 100644 company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java create mode 100644 company-service/src/main/java/com/sparta/companyservice/infrastructure/client/HubClient.java create mode 100644 company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java create mode 100644 company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java create mode 100644 company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java create mode 100644 company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyRequest.java diff --git a/company-service/build.gradle b/company-service/build.gradle index 454548c..d62967f 100644 --- a/company-service/build.gradle +++ b/company-service/build.gradle @@ -6,6 +6,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation project(':common-module') } dependencyManagement { diff --git a/company-service/src/main/java/com/sparta/companyservice/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/CompanyController.java deleted file mode 100644 index 06f703e..0000000 --- a/company-service/src/main/java/com/sparta/companyservice/CompanyController.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sparta.companyservice; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/v1/companies") -public class CompanyController { - @GetMapping("/test") - public String getOrder(){ - return "Hello world"; - } -} diff --git a/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyDto.java b/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyDto.java new file mode 100644 index 0000000..2949540 --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyDto.java @@ -0,0 +1,21 @@ +package com.sparta.companyservice.application.dto; + +import java.util.UUID; + +import lombok.Builder; +import lombok.Getter; + +import java.time.LocalDateTime; + +@Getter +@Builder +public class CompanyDto { + private UUID id; + private String name; + private String type; + private UUID hubId; + private String address; + private LocalDateTime createdAt; + private String createdBy; +} + diff --git a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java new file mode 100644 index 0000000..c947e69 --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java @@ -0,0 +1,49 @@ +package com.sparta.companyservice.application.service; + +import com.sparta.companyservice.application.dto.CompanyDto; +import com.sparta.companyservice.domain.model.Company; +import com.sparta.companyservice.domain.model.CompanyType; +import com.sparta.companyservice.domain.repository.CompanyRepository; +import com.sparta.companyservice.domain.service.CompanyDomainService; +import com.sparta.companyservice.presentation.request.CompanyRequest; +import com.sparta.companyservice.infrastructure.client.HubClient; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.UUID; + +@Service +@RequiredArgsConstructor +public class CompanyService { + + private final HubClient hubClient; + private final CompanyRepository companyRepository; + private final CompanyDomainService domainService; + + public CompanyDto createCompany(CompanyRequest request) { + if (!hubClient.existsById(request.getHubId())) { + throw new IllegalArgumentException("유효하지 않은 허브 ID입니다."); + } + + Company company = Company.create( + UUID.randomUUID(), + request.getName(), + CompanyType.fromKor(request.getType()), + request.getHubId(), + request.getAddress() + ); + + domainService.validate(company); + Company saved = companyRepository.save(company); + + return CompanyDto.builder() + .id(saved.getId()) + .name(saved.getName()) + .type(saved.getType().getKor()) + .hubId(saved.getHubId()) + .address(saved.getAddress()) + .createdAt(saved.getCreatedAt()) + .createdBy("admin_user") // 임시로 해둠 + .build(); + } +} diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java index 536afdb..a50c5c9 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java @@ -1,5 +1,6 @@ package com.sparta.companyservice.domain.model; +import com.sparta.commonmodule.entity.BaseEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; @@ -15,7 +16,7 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor @Builder -public class Company { +public class Company extends BaseEntity { @Id @Column(name = "company_id") private UUID id; @@ -33,22 +34,14 @@ public class Company { @Column(nullable = false, columnDefinition = "TEXT") private String address; - // 나중에 BaseEntity 상속 - @Column(nullable = false, updatable = false) - private Long createdBy; - - @Column(nullable = false, updatable = false) - private LocalDateTime createdAt; - - private Long updatedBy; - - private LocalDateTime updatedAt; - - @Column(nullable = false) - private Boolean isDeleted; - - private Long deletedBy; - - private LocalDateTime deletedAt; + public static Company create(UUID id, String name, CompanyType type, UUID hubId, String address) { + return Company.builder() + .id(id) + .name(name) + .type(type) + .hubId(hubId) + .address(address) + .build(); + } } diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java b/company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java new file mode 100644 index 0000000..b84d1ea --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java @@ -0,0 +1,14 @@ +package com.sparta.companyservice.domain.service; + +import com.sparta.companyservice.domain.model.Company; +import org.springframework.stereotype.Service; + +@Service +public class CompanyDomainService { + + public void validate(Company company) { + if (company.getName().length() < 2) { + throw new IllegalArgumentException("회사명은 2자 이상이어야 합니다."); + } + } +} diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/client/HubClient.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/client/HubClient.java new file mode 100644 index 0000000..a991a67 --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/infrastructure/client/HubClient.java @@ -0,0 +1,4 @@ +package com.sparta.companyservice.infrastructure.client; + +public class HubClient { +} diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java new file mode 100644 index 0000000..03afdcf --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java @@ -0,0 +1,4 @@ +package com.sparta.companyservice.infrastructure.repository; + +public class CompanyRepositoryImpl { +} diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java new file mode 100644 index 0000000..c902183 --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java @@ -0,0 +1,4 @@ +package com.sparta.companyservice.infrastructure.repository; + +public class JpaCompanyRepository { +} diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java new file mode 100644 index 0000000..459e19a --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -0,0 +1,25 @@ +package com.sparta.companyservice.presentation.controller; + +import com.sparta.companyservice.application.dto.CompanyDto; +import com.sparta.companyservice.presentation.request.CompanyRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.UUID; + +@RestController +@RequestMapping("/api/v1/companies") +@RequiredArgsConstructor +public class CompanyController { + + private final CompanyService companyService; + + @PostMapping + public ResponseEntity createCompany(@RequestBody CompanyRequest request) { + CompanyDto created = companyService.createCompany(request); + return ResponseEntity.ok(created); + } +} + diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyRequest.java b/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyRequest.java new file mode 100644 index 0000000..10f73bb --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyRequest.java @@ -0,0 +1,11 @@ +package com.sparta.companyservice.presentation.request; + +import java.util.UUID; + +public class CompanyRequest { + private String name; + private String type; + private UUID hubId; + private String address; +} + From 9ddac30cc6de293d9d22f2be022d07b1f80dc804 Mon Sep 17 00:00:00 2001 From: jiyun Date: Mon, 17 Mar 2025 18:21:14 +0900 Subject: [PATCH 033/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#27]=20:=20Company?= =?UTF-8?q?=20-=20Create=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- company-service/build.gradle | 1 + .../application/service/CompanyService.java | 4 ++-- .../domain/service/CompanyDomainService.java | 2 +- .../infrastructure/client/HubClient.java | 12 +++++++++- .../repository/CompanyRepositoryImpl.java | 23 ++++++++++++++++++- .../repository/JpaCompanyRepository.java | 7 +++++- .../presentation/request/CompanyRequest.java | 3 +++ 7 files changed, 46 insertions(+), 6 deletions(-) diff --git a/company-service/build.gradle b/company-service/build.gradle index d62967f..b294214 100644 --- a/company-service/build.gradle +++ b/company-service/build.gradle @@ -7,6 +7,7 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation project(':common-module') + implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' } dependencyManagement { diff --git a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java index c947e69..4e972ab 100644 --- a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java +++ b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java @@ -28,7 +28,7 @@ public CompanyDto createCompany(CompanyRequest request) { Company company = Company.create( UUID.randomUUID(), request.getName(), - CompanyType.fromKor(request.getType()), + CompanyType.valueOf(request.getType()), request.getHubId(), request.getAddress() ); @@ -39,7 +39,7 @@ public CompanyDto createCompany(CompanyRequest request) { return CompanyDto.builder() .id(saved.getId()) .name(saved.getName()) - .type(saved.getType().getKor()) + .type(saved.getType().name()) .hubId(saved.getHubId()) .address(saved.getAddress()) .createdAt(saved.getCreatedAt()) diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java b/company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java index b84d1ea..d7a23bb 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java @@ -8,7 +8,7 @@ public class CompanyDomainService { public void validate(Company company) { if (company.getName().length() < 2) { - throw new IllegalArgumentException("회사명은 2자 이상이어야 합니다."); + throw new IllegalArgumentException("업체명은 2자 이상이어야 합니다."); } } } diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/client/HubClient.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/client/HubClient.java index a991a67..9e3ba31 100644 --- a/company-service/src/main/java/com/sparta/companyservice/infrastructure/client/HubClient.java +++ b/company-service/src/main/java/com/sparta/companyservice/infrastructure/client/HubClient.java @@ -1,4 +1,14 @@ package com.sparta.companyservice.infrastructure.client; -public class HubClient { +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.UUID; + +@FeignClient(name = "hub-service") +public interface HubClient { + + @GetMapping("api/v1/hubs/{id}/exists") + boolean existsById(@PathVariable("id") UUID id); } diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java index 03afdcf..15465e8 100644 --- a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java +++ b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java @@ -1,4 +1,25 @@ package com.sparta.companyservice.infrastructure.repository; -public class CompanyRepositoryImpl { +import com.sparta.companyservice.domain.model.Company; +import com.sparta.companyservice.domain.repository.CompanyRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.Optional; +import java.util.UUID; + +@Repository +@RequiredArgsConstructor +public class CompanyRepositoryImpl implements CompanyRepository { + private final JpaCompanyRepository jpaCompanyRepository; + + @Override + public Company save(Company company) { + return jpaCompanyRepository.save(company); + } + + @Override + public Optional findById(UUID id) { + return jpaCompanyRepository.findById(id); + } } diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java index c902183..60c3f9e 100644 --- a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java +++ b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java @@ -1,4 +1,9 @@ package com.sparta.companyservice.infrastructure.repository; -public class JpaCompanyRepository { +import com.sparta.companyservice.domain.model.Company; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface JpaCompanyRepository extends JpaRepository { } diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyRequest.java b/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyRequest.java index 10f73bb..1727d2a 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyRequest.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyRequest.java @@ -1,7 +1,10 @@ package com.sparta.companyservice.presentation.request; +import lombok.Getter; + import java.util.UUID; +@Getter public class CompanyRequest { private String name; private String type; From af8964867cc8ea4aa6544fe0fadcf60e32357f1b Mon Sep 17 00:00:00 2001 From: jiyun Date: Mon, 17 Mar 2025 18:28:44 +0900 Subject: [PATCH 034/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#27]=20:=20@EnableF?= =?UTF-8?q?eignClients=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sparta/companyservice/CompanyServiceApplication.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java b/company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java index b16a202..eed2ee2 100644 --- a/company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java +++ b/company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication +@EnableFeignClients(basePackages = "com.sparta") public class CompanyServiceApplication { public static void main(String[] args) { From f144e22614b90f8e045c376e9710e2c5c300ccb3 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Mon, 17 Mar 2025 19:07:29 +0900 Subject: [PATCH 035/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#31]=20:=20?= =?UTF-8?q?=EC=9D=B8=EC=A6=9D,=20=EC=9D=B8=EA=B0=80=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20user-service,gateway=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/modules.xml | 5 - ...ogistics-delivery.company-service.main.iml | 8 -- .../logistics-delivery.hub-service.main.iml | 8 -- .../logistics-delivery.order-service.main.iml | 8 -- ...ogistics-delivery.payment-service.main.iml | 8 -- ...ogistics-delivery.product-service.main.iml | 8 -- build.gradle | 1 + gateway/build.gradle | 2 + .../gateway/JwtAuthenticationFilter.java | 91 +++++++++++++++++++ gateway/src/main/resources/application.yml | 6 +- user-service/build.gradle | 8 ++ .../user/application/service/AuthService.java | 58 ++++++++++++ .../configuration/AuthConfig.java | 16 ++++ .../configuration/JwtConfig.java | 44 +++++++++ .../src/main/resources/application.yml | 24 ++++- 15 files changed, 246 insertions(+), 49 deletions(-) delete mode 100644 .idea/modules/company-service/logistics-delivery.company-service.main.iml delete mode 100644 .idea/modules/hub-service/logistics-delivery.hub-service.main.iml delete mode 100644 .idea/modules/order-service/logistics-delivery.order-service.main.iml delete mode 100644 .idea/modules/payment-service/logistics-delivery.payment-service.main.iml delete mode 100644 .idea/modules/product-service/logistics-delivery.product-service.main.iml create mode 100644 gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java create mode 100644 user-service/src/main/java/com/sparta/user/application/service/AuthService.java create mode 100644 user-service/src/main/java/com/sparta/user/infastructure/configuration/AuthConfig.java create mode 100644 user-service/src/main/java/com/sparta/user/infastructure/configuration/JwtConfig.java diff --git a/.idea/modules.xml b/.idea/modules.xml index 0f46e55..48e5558 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,15 +2,10 @@ - - - - - \ No newline at end of file diff --git a/.idea/modules/company-service/logistics-delivery.company-service.main.iml b/.idea/modules/company-service/logistics-delivery.company-service.main.iml deleted file mode 100644 index f924b0e..0000000 --- a/.idea/modules/company-service/logistics-delivery.company-service.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/hub-service/logistics-delivery.hub-service.main.iml b/.idea/modules/hub-service/logistics-delivery.hub-service.main.iml deleted file mode 100644 index caddfa3..0000000 --- a/.idea/modules/hub-service/logistics-delivery.hub-service.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/order-service/logistics-delivery.order-service.main.iml b/.idea/modules/order-service/logistics-delivery.order-service.main.iml deleted file mode 100644 index 4eb426c..0000000 --- a/.idea/modules/order-service/logistics-delivery.order-service.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/payment-service/logistics-delivery.payment-service.main.iml b/.idea/modules/payment-service/logistics-delivery.payment-service.main.iml deleted file mode 100644 index 09e97c0..0000000 --- a/.idea/modules/payment-service/logistics-delivery.payment-service.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/product-service/logistics-delivery.product-service.main.iml b/.idea/modules/product-service/logistics-delivery.product-service.main.iml deleted file mode 100644 index 3250472..0000000 --- a/.idea/modules/product-service/logistics-delivery.product-service.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/build.gradle b/build.gradle index c89de2c..faed030 100644 --- a/build.gradle +++ b/build.gradle @@ -42,6 +42,7 @@ subprojects { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + implementation 'com.h2database:h2' } tasks.named('test') { diff --git a/gateway/build.gradle b/gateway/build.gradle index 9550d4f..6b55c02 100644 --- a/gateway/build.gradle +++ b/gateway/build.gradle @@ -3,6 +3,8 @@ ext { } dependencies { + implementation 'io.jsonwebtoken:jjwt:0.12.6' + implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.cloud:spring-cloud-starter-gateway' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' } diff --git a/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java b/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java new file mode 100644 index 0000000..fd8ed0e --- /dev/null +++ b/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java @@ -0,0 +1,91 @@ +package com.sparta.gateway; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jws; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.io.Decoders; +import io.jsonwebtoken.security.Keys; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.http.HttpStatus; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +import javax.crypto.SecretKey; + +@Slf4j +@Component +public class JwtAuthenticationFilter implements GlobalFilter { + @Value("${service.jwt.secret-key}") + private String secretKey; + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + String path = exchange.getRequest().getURI().getPath(); + log.debug("Request Path: {}", path); + if (path.equals("/api/v1/users/sign-up") || path.equals("/api/v1/users/sign-in")) { + return chain.filter(exchange); //회원가입, 로그인은 JWT 토큰인증 x + } + + String token = extractToken(exchange); + + if (token == null || !validateToken(token)) { + exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); + return exchange.getResponse().setComplete(); + } + + Claims claims = extractClaims(token); //Payload 부분 추출 + log.info("Extracted user_id from token: {}", claims.get("user_id")); + log.info("Extracted role from token: {}", claims.get("role")); + + // 추출한 정보(header로 전달) + ServerHttpRequest modifiedRequest =exchange.getRequest().mutate() + .header("user_id",claims.get("user_id", String.class)) + .header("role", claims.get("role",String.class)) + .header("slack_id",claims.get("slack_id",String.class)) + .build(); + log.info(String.valueOf(exchange.getRequest().getHeaders())); + + // 수정된 요청을 포함하여 필터 체인으로 이동 + return chain.filter(exchange.mutate().request(modifiedRequest).build()); + } + + private Claims extractClaims(String token) { + SecretKey key = Keys.hmacShaKeyFor(Decoders.BASE64URL.decode(secretKey)); + //SecretKey 형태로 변환 + + return Jwts.parser() + .verifyWith(key) + .build() + .parseSignedClaims(token) + .getPayload(); + } + + + private String extractToken(ServerWebExchange exchange) { + String authHeader = exchange.getRequest().getHeaders().getFirst("Authorization"); + if (authHeader != null && authHeader.startsWith("Bearer ")) { + return authHeader.substring(7); + } + return null; + } + + private boolean validateToken(String token) { + try { + SecretKey key = Keys.hmacShaKeyFor(Decoders.BASE64URL.decode(secretKey)); + Jws claimsJws = Jwts.parser() + .verifyWith(key) + .build().parseSignedClaims(token); + log.info("#####payload :: " + claimsJws.getPayload().toString()); + + // 추가적인 검증 로직 (예: 토큰 만료 여부 확인 등)을 여기에 추가할 수 있습니다. + return true; + } catch (Exception e) { + return false; + } + } +} diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index b742919..efeb3de 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -51,6 +51,6 @@ eureka: defaultZone: http://localhost:8761/eureka/ -#service: -# jwt: -# secret-key: "401b09eab3c013d4ca54922bb802bec8fd5318192b0a75f201d8b3727429080fb337591abd3e44453b954555b7a0812e1081c39b740293f765eae731f5a65ed1" +service: + jwt: + secret-key: "50OsBNAaYDd8KJkGL8DCy8l8GFeJY--lzgxXrQJA-vUl1ZfivKtLNuwR_qNn2LJ6NkXpg8AAa2fe2CVUtN4UcQ" \ No newline at end of file diff --git a/user-service/build.gradle b/user-service/build.gradle index 1786f75..9706d29 100644 --- a/user-service/build.gradle +++ b/user-service/build.gradle @@ -3,7 +3,15 @@ ext { } dependencies { + implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' + implementation 'io.jsonwebtoken:jjwt:0.12.6' + implementation 'org.springframework.boot:spring-boot-starter-actuator' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-security' + testImplementation 'org.springframework.security:spring-security-test' + testImplementation 'io.projectreactor:reactor-test' + runtimeOnly 'org.postgresql:postgresql' } dependencyManagement { diff --git a/user-service/src/main/java/com/sparta/user/application/service/AuthService.java b/user-service/src/main/java/com/sparta/user/application/service/AuthService.java new file mode 100644 index 0000000..3c2a333 --- /dev/null +++ b/user-service/src/main/java/com/sparta/user/application/service/AuthService.java @@ -0,0 +1,58 @@ +package com.sparta.user.application.service; + +import com.sparta.user.application.dto.UserSigninResponseDto; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.io.Decoders; +import io.jsonwebtoken.security.Keys; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.crypto.SecretKey; +import java.sql.Date; + +@Service +public class AuthService { + @Value("${spring.application.name}") + private String issuer; + + @Value("${service.jwt.access-expiration}") + private Long accessExpiration; + + private final SecretKey secretKey; + + /** + * AuthService 생성자. + * Base64 URL 인코딩된 비밀 키를 디코딩하여 HMAC-SHA 알고리즘에 적합한 SecretKey 객체를 생성합니다. + * + * @param secretKey Base64 URL 인코딩된 비밀 키 + */ + public AuthService(@Value("${service.jwt.secret-key}") String secretKey) { + this.secretKey = Keys.hmacShaKeyFor(Decoders.BASE64URL.decode(secretKey)); + } + + /** + * 사용자 UserSigninResponseDto 받아 JWT 액세스 토큰을 생성합니다. + * + * responseDto 사용자 정보Dto + * @return 생성된 JWT 액세스 토큰 + */ + public String createAccessToken(UserSigninResponseDto responseDto) { + return Jwts.builder() + // 사용자 ID를 클레임으로 설정 + .claim("user_id", responseDto.getId().toString()) + .claim("role", responseDto.getRole().toString()) + .claim("slack_name", responseDto.getSlackName()) + // JWT 발행자를 설정(모듈명) + .issuer(issuer) + // JWT 발행 시간을 현재 시간으로 설정 + .issuedAt(new Date(System.currentTimeMillis())) + // JWT 만료 시간을 설정 + .expiration(new Date(System.currentTimeMillis() + accessExpiration)) + // SecretKey를 사용하여 HMAC-SHA512 알고리즘으로 서명 + .signWith(secretKey, io.jsonwebtoken.SignatureAlgorithm.HS512) + // JWT 문자열로 컴팩트하게 변환 + .compact(); + } + + +} diff --git a/user-service/src/main/java/com/sparta/user/infastructure/configuration/AuthConfig.java b/user-service/src/main/java/com/sparta/user/infastructure/configuration/AuthConfig.java new file mode 100644 index 0000000..e0797fe --- /dev/null +++ b/user-service/src/main/java/com/sparta/user/infastructure/configuration/AuthConfig.java @@ -0,0 +1,16 @@ +package com.sparta.user.infastructure.configuration; + +import lombok.Getter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Getter +@Component +public class AuthConfig { + @Value("${service.master.signup-key}") + private String MasterKey; + @Value("${service.hub.signup-key}") + private String HubKey; + @Value("${service.shipping.signup-key}") + private String ShippingKey; +} diff --git a/user-service/src/main/java/com/sparta/user/infastructure/configuration/JwtConfig.java b/user-service/src/main/java/com/sparta/user/infastructure/configuration/JwtConfig.java new file mode 100644 index 0000000..31f8c4f --- /dev/null +++ b/user-service/src/main/java/com/sparta/user/infastructure/configuration/JwtConfig.java @@ -0,0 +1,44 @@ +package com.sparta.user.infastructure.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration +@EnableWebSecurity +public class JwtConfig { + // SecurityFilterChain 빈을 정의합니다. 이 메서드는 Spring Security의 보안 필터 체인을 구성합니다. + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http + // CSRF 보호를 비활성화합니다. CSRF 보호는 주로 브라우저 클라이언트를 대상으로 하는 공격을 방지하기 위해 사용됩니다. + .csrf(csrf -> csrf.disable()) + // 요청에 대한 접근 권한을 설정합니다. + .authorizeRequests(authorize -> authorize + // /auth/signIn 경로에 대한 접근을 허용합니다. 이 경로는 인증 없이 접근할 수 있습니다. + .requestMatchers("/api/v1/users/sign-up").permitAll() + .requestMatchers("/api/v1/users/sign-in").permitAll() + // 그 외의 모든 요청은 인증이 필요합니다. + .anyRequest().authenticated() + ) + // 세션 관리 정책을 정의합니다. 여기서는 세션을 사용하지 않도록 STATELESS로 설정합니다. + .sessionManagement(session -> session + .sessionCreationPolicy(SessionCreationPolicy.STATELESS) + ); + + // 설정된 보안 필터 체인을 반환합니다. + return http.build(); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + +} diff --git a/user-service/src/main/resources/application.yml b/user-service/src/main/resources/application.yml index 4d0be27..6296fa4 100644 --- a/user-service/src/main/resources/application.yml +++ b/user-service/src/main/resources/application.yml @@ -1,7 +1,18 @@ spring: application: name: user-service - + datasource: + url: jdbc:postgresql://localhost:5001/user_db # Docker의 PostgreSQL 컨테이너의 IP 또는 호스트와 포트를 사용 + username: postgres_user # PostgreSQL 사용자 이름 + password: 12345 # PostgreSQL 비밀번호 + driver-class-name: org.postgresql.Driver + jpa: + hibernate: + ddl-auto: update + database-platform: org.hibernate.dialect.PostgreSQLDialect # PostgreSQL에 맞는 Hibernate Dialect 설정 + h2: + console: + enabled: false # H2 콘솔 비활성화 (PostgreSQL 사용 시) server: port: 8081 @@ -11,3 +22,14 @@ eureka: fetch-registry: true # Eureka?? ??? ?? ???? service-url: defaultZone: http://localhost:8761/eureka/ + +service: + jwt: + access-expiration: 3600000 # 1시간 뒤 만료 + secret-key: "50OsBNAaYDd8KJkGL8DCy8l8GFeJY--lzgxXrQJA-vUl1ZfivKtLNuwR_qNn2LJ6NkXpg8AAa2fe2CVUtN4UcQ" + master: + signup-key: "mgbE4vogtrMGufz6PXkQNTV-KZtU4-Mz7_wcKf7r40kKTu8z4BD9l_kacdd4MzU3pQV6y3LB-yrmMvvXFKep2Q" + hub: + signup-key: "WS4LLkUhglcrzhFaqWhGXMX70V-ntoQrJdsbT8997aR32veCI2Y35-yyjdHzUzVc4TybaGSdRJ6WYVVcY9K6Uw" + shipping: + signup-key: "QqjxcIpIisVqc2evLWPRyjMya8nCyWiheO5L8SbxwKbJFRjlIkxFaX1l8ShI8GlE1hxw_oOoyrfefEE7ZrUkMQ" \ No newline at end of file From cdb393c3e82f6a9a25d1c8aed5d44747426882c0 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Mon, 17 Mar 2025 19:08:44 +0900 Subject: [PATCH 036/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#34]=20:=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85,=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- user-service/docker-compose.yml | 41 +++++++++ .../application/dto/UserSigninReqeustDto.java | 24 ++++++ .../dto/UserSigninResponseDto.java | 13 +++ .../application/dto/UserSignupRequestDto.java | 38 +++++++++ .../user/application/service/UserService.java | 85 +++++++++++++++++++ .../com/sparta/user/domain/model/User.java | 48 +++++++++++ .../user/domain/model/UserRoleEnum.java | 16 ++++ .../repository/JpaUserRepository.java | 18 ++++ .../user/presentation/UserController.java | 57 +++++++++++-- 9 files changed, 333 insertions(+), 7 deletions(-) create mode 100644 user-service/docker-compose.yml create mode 100644 user-service/src/main/java/com/sparta/user/application/dto/UserSigninReqeustDto.java create mode 100644 user-service/src/main/java/com/sparta/user/application/dto/UserSigninResponseDto.java create mode 100644 user-service/src/main/java/com/sparta/user/application/dto/UserSignupRequestDto.java create mode 100644 user-service/src/main/java/com/sparta/user/application/service/UserService.java create mode 100644 user-service/src/main/java/com/sparta/user/domain/model/User.java create mode 100644 user-service/src/main/java/com/sparta/user/domain/model/UserRoleEnum.java create mode 100644 user-service/src/main/java/com/sparta/user/infastructure/repository/JpaUserRepository.java diff --git a/user-service/docker-compose.yml b/user-service/docker-compose.yml new file mode 100644 index 0000000..b54d313 --- /dev/null +++ b/user-service/docker-compose.yml @@ -0,0 +1,41 @@ +version: '3.8' + +services: + # PostgreSQL 데이터베이스 설정 + postgres: + image: postgres:latest + container_name: postgres_user + ports: + - "5001:5432" # 외부에서 접속할 수 있는 포트 + environment: + POSTGRES_USER: postgres_user + POSTGRES_PASSWORD: 12345 + POSTGRES_DB: user_db # 생성할 데이터베이스 이름 + volumes: + - postgres_data:/var/lib/postgresql/data # 데이터가 유지될 경로 + networks: + - user-network # user 서비스와만 연결될 네트워크 + + # User 서비스 + user: + build: + context: . # user 서브모듈의 디렉토리 + dockerfile: Dockerfile # Dockerfile 경로 + container_name: user-service + ports: + - "8001:8001" # 외부에서 접속할 포트 + environment: + - SPRING_DATASOURCE_URL=jdbc:postgresql://postgres_user:5001/user_db # PostgreSQL DB 연결 + - SPRING_DATASOURCE_USERNAME=postgres_user # DB 사용자명 + - SPRING_DATASOURCE_PASSWORD=12345 # DB 비밀번호 + networks: + - user-network # user 서비스가 PostgreSQL과 연결될 네트워크 + depends_on: + - postgres # PostgreSQL이 먼저 실행되어야 함 + +networks: + user-network: + driver: bridge # user 서비스와 PostgreSQL만 연결될 네트워크 + +volumes: + postgres_data: # PostgreSQL 데이터 저장을 위한 볼륨 diff --git a/user-service/src/main/java/com/sparta/user/application/dto/UserSigninReqeustDto.java b/user-service/src/main/java/com/sparta/user/application/dto/UserSigninReqeustDto.java new file mode 100644 index 0000000..5967598 --- /dev/null +++ b/user-service/src/main/java/com/sparta/user/application/dto/UserSigninReqeustDto.java @@ -0,0 +1,24 @@ +package com.sparta.user.application.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UserSigninReqeustDto { + + //최소 4자 이상, 10자 이하이며 알파벳 소문자(a~z), 숫자(0~9) + @NotBlank + @Pattern(regexp = "^(?=.*[a-z])(?=.*[0-9])[a-z0-9^\\s]{4,10}$", + message = "회원이름은 알파벳 소문자와 숫자로 이루어진 4자 이상 10자 이하로 입력해주세요.") + private String username; + + //최소 8자 이상, 15자 이하이며 알파벳 대소문자(a~z, A~Z), 숫자(0~9), 특수문자 + @NotBlank + @Pattern(regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[^A-Za-z\\d\\s])[^\\s]{8,15}$", + message = "비밀번호는 알파벳 대소문자, 숫자, 특수문자를 포함한 8자 이상 15자 이하입니다.") + private String password; + +} diff --git a/user-service/src/main/java/com/sparta/user/application/dto/UserSigninResponseDto.java b/user-service/src/main/java/com/sparta/user/application/dto/UserSigninResponseDto.java new file mode 100644 index 0000000..bc463db --- /dev/null +++ b/user-service/src/main/java/com/sparta/user/application/dto/UserSigninResponseDto.java @@ -0,0 +1,13 @@ +package com.sparta.user.application.dto; + +import com.sparta.user.domain.model.UserRoleEnum; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UserSigninResponseDto { + private Long id; + private UserRoleEnum role; + private String slackName; +} diff --git a/user-service/src/main/java/com/sparta/user/application/dto/UserSignupRequestDto.java b/user-service/src/main/java/com/sparta/user/application/dto/UserSignupRequestDto.java new file mode 100644 index 0000000..6f74b61 --- /dev/null +++ b/user-service/src/main/java/com/sparta/user/application/dto/UserSignupRequestDto.java @@ -0,0 +1,38 @@ +package com.sparta.user.application.dto; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import lombok.*; + +@Getter +@Setter +@EqualsAndHashCode +@Builder +@AllArgsConstructor +public class UserSignupRequestDto { + + //최소 4자 이상, 10자 이하이며 알파벳 소문자(a~z), 숫자(0~9) + @NotBlank + @Pattern(regexp = "^(?=.*[a-z])(?=.*[0-9])[a-z0-9^\\s]{4,10}$", + message = "회원이름은 알파벳 소문자와 숫자로 이루어진 4자 이상 10자 이하로 입력해주세요.") + private String username; + + //최소 8자 이상, 15자 이하이며 알파벳 대소문자(a~z, A~Z), 숫자(0~9), 특수문자 + @NotBlank + @Pattern(regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[^A-Za-z\\d\\s])[^\\s]{8,15}$", + message = "비밀번호는 알파벳 대소문자, 숫자, 특수문자를 포함한 8자 이상 15자 이하입니다.") + private String password; + + @Email(message = "유효한 이메일 주소를 입력하세요.") + @NotBlank(message = "이메일은 필수 입력값입니다.") + @Pattern(regexp = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,25}$", message = "유효한 이메일 주소를 입력하세요.") + private String email; + + @NotBlank(message = "슬랙이름은 필수 입력값입니다.") + private String slackName; + + private String tokenValue; + +} + diff --git a/user-service/src/main/java/com/sparta/user/application/service/UserService.java b/user-service/src/main/java/com/sparta/user/application/service/UserService.java new file mode 100644 index 0000000..c127a23 --- /dev/null +++ b/user-service/src/main/java/com/sparta/user/application/service/UserService.java @@ -0,0 +1,85 @@ +package com.sparta.user.application.service; + +import com.sparta.user.application.dto.UserSigninReqeustDto; +import com.sparta.user.application.dto.UserSigninResponseDto; +import com.sparta.user.application.dto.UserSignupRequestDto; +import com.sparta.user.domain.model.User; +import com.sparta.user.domain.model.UserRoleEnum; +import com.sparta.user.infastructure.configuration.AuthConfig; +import com.sparta.user.infastructure.repository.JpaUserRepository; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +import javax.naming.AuthenticationException; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class UserService { + + private final JpaUserRepository userRepository; + + private final PasswordEncoder passwordEncoder; + + private final AuthConfig authConfig; + + public ResponseEntity signUp(UserSignupRequestDto requestDto) { + //중복 확인 + Optional duplicate = userRepository.findDulicate(requestDto.getUsername(), + requestDto.getEmail(), requestDto.getSlackName()); + if(duplicate.isPresent()){ + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Username or Email is already taken."); + } + //권한 설정 + UserRoleEnum role = checkUserRole(requestDto.getTokenValue()); + + User user = userRepository.save( + User.builder() + .username(requestDto.getUsername()) + .password(passwordEncoder.encode(requestDto.getPassword())) + .email(requestDto.getEmail()) + .slackName(requestDto.getSlackName()) + .role(role) + .build() + ); + return ResponseEntity.ok("sign-up success"); + } + + public UserSigninResponseDto signIn(@Valid UserSigninReqeustDto reqeustDto) throws AuthenticationException { + //아이디 비밀번호 일치여부 확인. + Optional userinfo = userRepository.findByUsername(reqeustDto.getUsername()); + + User user = userinfo.orElseThrow(()-> new AuthenticationException("아이디가 존재하지않습니다.")); + boolean pwcheck = passwordEncoder.matches(reqeustDto.getPassword(), user.getPassword()); //비밀번호 일치여부 판단 + + if(!pwcheck){ + throw new AuthenticationException("아이디나 비밀번호가 일치하지않습니다.");// 일치하지않는 부분 특정방지 + } + + //비밀번호 일치 (토큰 생성을 위한 dto 전달.) + UserSigninResponseDto responseDto = new UserSigninResponseDto(); + responseDto.setId(user.getId()); + responseDto.setRole(user.getRole()); + responseDto.setSlackName(user.getSlackName()); + + return responseDto; + } + + private UserRoleEnum checkUserRole(String tokenValue) { + if (authConfig.getMasterKey().equals(tokenValue)) { + return UserRoleEnum.MASTER; + } else if (authConfig.getHubKey().equals(tokenValue)) { + return UserRoleEnum.HUB; + } else if (authConfig.getShippingKey().equals(tokenValue)) { + return UserRoleEnum.SHIPPING; + } else { + return UserRoleEnum.COMPANY; + } + } + + +} diff --git a/user-service/src/main/java/com/sparta/user/domain/model/User.java b/user-service/src/main/java/com/sparta/user/domain/model/User.java new file mode 100644 index 0000000..e1482ab --- /dev/null +++ b/user-service/src/main/java/com/sparta/user/domain/model/User.java @@ -0,0 +1,48 @@ +package com.sparta.user.domain.model; + +import jakarta.persistence.*; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@Builder +@Table(name = "p_users") +@Entity +public class User{ + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "user_id", nullable = false) + private Long id; + + @Column(length = 10, nullable = false) + private String username; + + @Column(nullable = false) + private String password; + + @Column(length = 30, nullable = false) + private String email; + + @Column(name = "slack_name", length = 30, nullable = false) + private String slackName; + + @Column(nullable = false) + @Enumerated(value = EnumType.STRING) + private UserRoleEnum role; + + + + public User(Long id, String username, String password, String email, String slackName, UserRoleEnum role) { + this.id = id; + this.username = username; + this.password = password; + this.email = email; + this.slackName = slackName; + this.role = role; + } +} diff --git a/user-service/src/main/java/com/sparta/user/domain/model/UserRoleEnum.java b/user-service/src/main/java/com/sparta/user/domain/model/UserRoleEnum.java new file mode 100644 index 0000000..93eb235 --- /dev/null +++ b/user-service/src/main/java/com/sparta/user/domain/model/UserRoleEnum.java @@ -0,0 +1,16 @@ +package com.sparta.user.domain.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum UserRoleEnum { + MASTER("ROLE_MASTER"), // 마스터 권한 + HUB("ROLE_HUB"), // 허브 권한 + SHIPPING("ROLE_SHIPPING"), // 배송 권한 + COMPANY("ROLE_COMPANY"); // 업체 권한(디폴트) + + + private final String authority; +} diff --git a/user-service/src/main/java/com/sparta/user/infastructure/repository/JpaUserRepository.java b/user-service/src/main/java/com/sparta/user/infastructure/repository/JpaUserRepository.java new file mode 100644 index 0000000..0b33898 --- /dev/null +++ b/user-service/src/main/java/com/sparta/user/infastructure/repository/JpaUserRepository.java @@ -0,0 +1,18 @@ +package com.sparta.user.infastructure.repository; + +import com.sparta.user.domain.model.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.Optional; + + +public interface JpaUserRepository extends JpaRepository { + @Query("select u from User u where (u.username = :username or u.email = :email or u.slackName = :slackName)") + Optional findDulicate(@Param("username") String username, + @Param("email") String email, + @Param("slackName") String slackName); + + Optional findByUsername(@Param("username") String username); +} diff --git a/user-service/src/main/java/com/sparta/user/presentation/UserController.java b/user-service/src/main/java/com/sparta/user/presentation/UserController.java index 8a933c7..d2421d0 100644 --- a/user-service/src/main/java/com/sparta/user/presentation/UserController.java +++ b/user-service/src/main/java/com/sparta/user/presentation/UserController.java @@ -1,15 +1,58 @@ package com.sparta.user.presentation; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; + +import com.sparta.user.application.dto.UserSigninReqeustDto; +import com.sparta.user.application.dto.UserSigninResponseDto; +import com.sparta.user.application.dto.UserSignupRequestDto; +import com.sparta.user.application.service.AuthService; +import com.sparta.user.application.service.UserService; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.naming.AuthenticationException; @RestController @RequestMapping("/api/v1/users") +@RequiredArgsConstructor public class UserController { - @GetMapping("/test") - public String getUser() { - return "Hello World"; + private final AuthService authService; + private final UserService userService; + + @PostMapping("/sign-up") + public ResponseEntity signUp(@Valid @RequestBody UserSignupRequestDto requestDto, BindingResult bindingResult) { + if (bindingResult.hasErrors()) { //회원가입 요구사항 검증 + return ResponseEntity.badRequest().body(bindingResult.getFieldError().getDefaultMessage()); //에러코드 + } + return userService.signUp(requestDto); + } + + @PostMapping("/sign-in") + public ResponseEntity signIn(@Valid @RequestBody UserSigninReqeustDto reqeustDto) throws AuthenticationException { + + //토큰 생성을 위한 user 정보 추출 + UserSigninResponseDto responseDto + = userService.signIn(reqeustDto); + + //토큰생성은 auth Service에서 진행(추출한 user 정보로 토큰생성 후 엑세스 토큰값 전달.) + return ResponseEntity.ok(new AuthResponse(authService.createAccessToken(responseDto))); + + } + + /** + * JWT 액세스 토큰을 포함하는 응답 객체입니다. + */ + @Data + @AllArgsConstructor + @NoArgsConstructor + static class AuthResponse { + private String access_token; + } -} +} \ No newline at end of file From 50bb7ccaa4072224b1cd5c2c09a75e1f37f0e98e Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 17 Mar 2025 22:38:24 +0900 Subject: [PATCH 037/389] =?UTF-8?q?jpa=20dependenciy=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index c89de2c..c7b2aea 100644 --- a/build.gradle +++ b/build.gradle @@ -38,6 +38,7 @@ subprojects { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' //jpa 추가 compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' From 8293efc25c2aabd783c844dd1ba8fbf9d276744e Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 17 Mar 2025 22:39:18 +0900 Subject: [PATCH 038/389] =?UTF-8?q?Domain=20-=20model=20-=20Order,=20Order?= =?UTF-8?q?Item=20entity=20OrderStatus=20enum=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orderservice/domain/model/Order.java | 73 +++++++++++++++++++ .../orderservice/domain/model/OrderItem.java | 34 +++++++++ .../domain/model/OrderStatus.java | 6 ++ 3 files changed, 113 insertions(+) create mode 100644 order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java create mode 100644 order-service/src/main/java/com/sparta/orderservice/domain/model/OrderItem.java create mode 100644 order-service/src/main/java/com/sparta/orderservice/domain/model/OrderStatus.java diff --git a/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java b/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java new file mode 100644 index 0000000..b9db6bf --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java @@ -0,0 +1,73 @@ +package com.sparta.orderservice.domain.model; + +import jakarta.persistence.*; +import lombok.*; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Entity +@Table(name = "orders") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +public class Order { + + @Id + @GeneratedValue + private UUID orderId; // 주문 ID + + @Column(nullable = false, length = 100) + private String name; // 주문명 + + @Column(nullable = false) + private UUID supplierId; // 공급업체 ID + + @Column(nullable = false) + private UUID receiverId; // 수령업체 ID + + @Column(nullable = false) + private UUID productId; // 상품 ID + + + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal totalPrice; // 주문 총 금액 + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private OrderStatus status = OrderStatus.CREATED; // 주문 상태 + + @Lob + private String requestDetail; // 요청 사항 + + @CreationTimestamp + @Column(nullable = false, updatable = false) + private LocalDateTime createdAt; // 주문 생성 시간 + + @Column(nullable = false) + private UUID createdBy; // 주문자 ID + + @UpdateTimestamp + private LocalDateTime updatedAt; // 수정 시간 + + private UUID updatedBy; // 수정자 ID + + private LocalDateTime deletedAt; // 삭제 시간 + + private UUID deletedBy; // 삭제자 ID + + @Lob + private String cancelReason; // 주문 취소 사유 + + + @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true) + private List orderItems = new ArrayList<>(); // 주문 아이템 1:N 관계 설정 + +} + diff --git a/order-service/src/main/java/com/sparta/orderservice/domain/model/OrderItem.java b/order-service/src/main/java/com/sparta/orderservice/domain/model/OrderItem.java new file mode 100644 index 0000000..fde15c3 --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/domain/model/OrderItem.java @@ -0,0 +1,34 @@ +package com.sparta.orderservice.domain.model; + +import jakarta.persistence.*; +import lombok.*; + +import java.math.BigDecimal; +import java.util.UUID; + +@Entity +@Table(name = "order_items") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +public class OrderItem { + + @Id + @GeneratedValue + private UUID orderItemId; // 주문 상세 ID + + @ManyToOne + @JoinColumn(name = "order_id", nullable = false) + private Order order; // 주문 ID + + @Column(nullable = false) + private UUID productId; // 상품 ID + + @Column(nullable = false) + private int quantity; // 주문 수량 + + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal productPrice; // 삼품 금액 +} + diff --git a/order-service/src/main/java/com/sparta/orderservice/domain/model/OrderStatus.java b/order-service/src/main/java/com/sparta/orderservice/domain/model/OrderStatus.java new file mode 100644 index 0000000..cf55d61 --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/domain/model/OrderStatus.java @@ -0,0 +1,6 @@ +package com.sparta.orderservice.domain.model; + +public enum OrderStatus { + CREATED, // 주문 생성됨 + CANCELED // 주문 취소됨 +} From ff57c2f8df0eb28fa5df1fe59627c0b9db0473e9 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 17 Mar 2025 22:39:30 +0900 Subject: [PATCH 039/389] =?UTF-8?q?Create=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sparta/orderservice/Ordercontroller.java | 16 ---------- .../controller/Ordercontroller.java | 29 +++++++++++++++++++ 2 files changed, 29 insertions(+), 16 deletions(-) delete mode 100644 order-service/src/main/java/com/sparta/orderservice/Ordercontroller.java create mode 100644 order-service/src/main/java/com/sparta/orderservice/presentation/controller/Ordercontroller.java diff --git a/order-service/src/main/java/com/sparta/orderservice/Ordercontroller.java b/order-service/src/main/java/com/sparta/orderservice/Ordercontroller.java deleted file mode 100644 index 006689e..0000000 --- a/order-service/src/main/java/com/sparta/orderservice/Ordercontroller.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.sparta.orderservice; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/v1/orders") -public class Ordercontroller { - - @GetMapping("/test") - public String getOrder(){ - return "Hello world"; - } - -} diff --git a/order-service/src/main/java/com/sparta/orderservice/presentation/controller/Ordercontroller.java b/order-service/src/main/java/com/sparta/orderservice/presentation/controller/Ordercontroller.java new file mode 100644 index 0000000..82b7ea3 --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/presentation/controller/Ordercontroller.java @@ -0,0 +1,29 @@ +package com.sparta.orderservice.presentation.controller; + +import com.sparta.orderservice.application.dto.OrderRequestDto; +import com.sparta.orderservice.application.service.OrderService; +import com.sparta.orderservice.domain.model.Order; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/v1/orders") +public class Ordercontroller { + + private final OrderService orderService; + + public Ordercontroller(OrderService orderService) { + this.orderService = orderService; + } + + @GetMapping("/test") + public String getOrder(){ + return "Hello world"; + } + + @PostMapping + public ResponseEntity createOrder(@RequestBody OrderRequestDto requestDto){ + return ResponseEntity.ok(orderService.createOrder(requestDto)); + } + +} From fe2524b71b9571b06bed3b8d4aa87e05b9903ecd Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 17 Mar 2025 22:39:47 +0900 Subject: [PATCH 040/389] =?UTF-8?q?OrderRepository=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/repository/OrderRepository.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 order-service/src/main/java/com/sparta/orderservice/domain/repository/OrderRepository.java diff --git a/order-service/src/main/java/com/sparta/orderservice/domain/repository/OrderRepository.java b/order-service/src/main/java/com/sparta/orderservice/domain/repository/OrderRepository.java new file mode 100644 index 0000000..1a0e4e4 --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/domain/repository/OrderRepository.java @@ -0,0 +1,10 @@ +package com.sparta.orderservice.domain.repository; + +import com.sparta.orderservice.domain.model.Order; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface OrderRepository extends JpaRepository { + +} From 99063642bf4906b0e6deb476c2d06f4958a3e5a3 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 17 Mar 2025 22:40:18 +0900 Subject: [PATCH 041/389] =?UTF-8?q?application=20-=20service=20-=20OrderSe?= =?UTF-8?q?rvice=20create=20=EA=B8=B0=EB=8A=A5=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/OrderService.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java diff --git a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java new file mode 100644 index 0000000..0670428 --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java @@ -0,0 +1,30 @@ +package com.sparta.orderservice.application.service; + +import com.sparta.orderservice.application.dto.OrderRequestDto; +import com.sparta.orderservice.domain.model.Order; +import com.sparta.orderservice.domain.repository.OrderRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class OrderService { + private final OrderRepository orderRepository; + + @Transactional + public Order createOrder(OrderRequestDto requestDto){ + Order order = Order.builder() + .name(requestDto.getName()) + .supplierId(requestDto.getSupplierId()) + .receiverId(requestDto.getReceiverId()) + .productId(requestDto.getProductId()) + .totalPrice(requestDto.getTotalPrice()) + .requestDetail(requestDto.getRequestDetail()) + .createdBy(requestDto.getCreateBy()) + .build(); + return orderRepository.save(order); + } + + +} From 849aedda2bc4520cb0908d5b139f0558bc282974 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 17 Mar 2025 22:40:41 +0900 Subject: [PATCH 042/389] =?UTF-8?q?application=20-=20dto=20-=20OrderReques?= =?UTF-8?q?tDto=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/OrderRequestDto.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 order-service/src/main/java/com/sparta/orderservice/application/dto/OrderRequestDto.java diff --git a/order-service/src/main/java/com/sparta/orderservice/application/dto/OrderRequestDto.java b/order-service/src/main/java/com/sparta/orderservice/application/dto/OrderRequestDto.java new file mode 100644 index 0000000..3fff48d --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/application/dto/OrderRequestDto.java @@ -0,0 +1,19 @@ +package com.sparta.orderservice.application.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.UUID; + +@Getter +@NoArgsConstructor +public class OrderRequestDto { + private String name; + private UUID supplierId; + private UUID receiverId; + private UUID productId; + private BigDecimal totalPrice; + private String requestDetail; + private UUID createBy; +} From e1b119e0023cb407a784aad2250804b85ebb8130 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Tue, 18 Mar 2025 03:12:16 +0900 Subject: [PATCH 043/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#34]=20:=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85,=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EA=B5=AC=ED=98=84=20-=20postgres=20db=20=EC=97=B0?= =?UTF-8?q?=EB=8F=99=20-=20user-service=20http=20client=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/dataSources.xml | 17 ++++++++++ .../logistics-delivery.common-module.main.iml | 8 +++++ ...ogistics-delivery.product-service.main.iml | 8 +++++ .../logistics-delivery.user-service.main.iml | 8 +++++ api-http/user/user-service.http | 19 +++++++++++ user-service/docker-compose.yml | 34 +++++++++---------- 6 files changed, 76 insertions(+), 18 deletions(-) create mode 100644 .idea/dataSources.xml create mode 100644 .idea/modules/common-module/logistics-delivery.common-module.main.iml create mode 100644 .idea/modules/product-service/logistics-delivery.product-service.main.iml create mode 100644 .idea/modules/user-service/logistics-delivery.user-service.main.iml create mode 100644 api-http/user/user-service.http diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..a0e2742 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,17 @@ + + + + + postgresql + true + org.postgresql.Driver + jdbc:postgresql://localhost:5001/user_db + + + + + + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/modules/common-module/logistics-delivery.common-module.main.iml b/.idea/modules/common-module/logistics-delivery.common-module.main.iml new file mode 100644 index 0000000..c9a4af1 --- /dev/null +++ b/.idea/modules/common-module/logistics-delivery.common-module.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/product-service/logistics-delivery.product-service.main.iml b/.idea/modules/product-service/logistics-delivery.product-service.main.iml new file mode 100644 index 0000000..3250472 --- /dev/null +++ b/.idea/modules/product-service/logistics-delivery.product-service.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/user-service/logistics-delivery.user-service.main.iml b/.idea/modules/user-service/logistics-delivery.user-service.main.iml new file mode 100644 index 0000000..5a00956 --- /dev/null +++ b/.idea/modules/user-service/logistics-delivery.user-service.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/api-http/user/user-service.http b/api-http/user/user-service.http new file mode 100644 index 0000000..c805997 --- /dev/null +++ b/api-http/user/user-service.http @@ -0,0 +1,19 @@ +POST http://localhost:8080/api/v1/users/sign-up +Content-Type: application/json + +{ + "username":"asdf123", + "password":"asdfgA12@", + "email":"asdf@naver.com", + "slackName": "asdggg" +} + +### + +POST http://localhost:8080/api/v1/users/sign-in +Content-Type: application/json + +{ + "username": "asdf123", + "password": "asdfgA12@" +} diff --git a/user-service/docker-compose.yml b/user-service/docker-compose.yml index b54d313..7b8cd98 100644 --- a/user-service/docker-compose.yml +++ b/user-service/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: # PostgreSQL 데이터베이스 설정 postgres: @@ -16,22 +14,22 @@ services: networks: - user-network # user 서비스와만 연결될 네트워크 - # User 서비스 - user: - build: - context: . # user 서브모듈의 디렉토리 - dockerfile: Dockerfile # Dockerfile 경로 - container_name: user-service - ports: - - "8001:8001" # 외부에서 접속할 포트 - environment: - - SPRING_DATASOURCE_URL=jdbc:postgresql://postgres_user:5001/user_db # PostgreSQL DB 연결 - - SPRING_DATASOURCE_USERNAME=postgres_user # DB 사용자명 - - SPRING_DATASOURCE_PASSWORD=12345 # DB 비밀번호 - networks: - - user-network # user 서비스가 PostgreSQL과 연결될 네트워크 - depends_on: - - postgres # PostgreSQL이 먼저 실행되어야 함 +# # User 서비스 +# user-service: +# build: +# context: . # user 서브모듈의 디렉토리 +# dockerfile: Dockerfile # Dockerfile 경로 +# container_name: user-service-submodule +# ports: +# - "8001:8080" # 외부에서 접속할 포트 +# environment: +# - SPRING_DATASOURCE_URL=jdbc:postgresql://postgres_user:5001/user_db # PostgreSQL DB 연결 +# - SPRING_DATASOURCE_USERNAME=postgres_user # DB 사용자명 +# - SPRING_DATASOURCE_PASSWORD=12345 # DB 비밀번호 +# networks: +# - user-network # user 서비스가 PostgreSQL과 연결될 네트워크 +# depends_on: +# - postgres # PostgreSQL이 먼저 실행되어야 함 networks: user-network: From fd4463d7801851bc06fc956719cfb8a7368907a1 Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Tue, 18 Mar 2025 09:38:57 +0900 Subject: [PATCH 044/389] =?UTF-8?q?=F0=9F=90=9B=20bugfix[#33]=20:=20?= =?UTF-8?q?=EA=B3=B5=ED=86=B5=20=EB=AA=A8=EB=93=88,Shipping-service=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=A3=BC=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 ++- common-module/build.gradle | 17 +++++++++++++++++ shipping-service/build.gradle | 6 ++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c7b2aea..14ba74e 100644 --- a/build.gradle +++ b/build.gradle @@ -38,11 +38,12 @@ subprojects { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' //jpa 추가 + //implementation 'org.springframework.boot:spring-boot-starter-data-jpa' //jpa 추가 compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + } tasks.named('test') { diff --git a/common-module/build.gradle b/common-module/build.gradle index e69de29..4d2befc 100644 --- a/common-module/build.gradle +++ b/common-module/build.gradle @@ -0,0 +1,17 @@ +dependencies { + // Hibernate Validator + implementation 'org.hibernate:hibernate-core:6.3.1.Final' + +// Jakarta Persistence API + implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' + + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + +// Spring Boot Validation + implementation 'org.springframework.boot:spring-boot-starter-validation' + +// Lombok (선택 사항) + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' +} + diff --git a/shipping-service/build.gradle b/shipping-service/build.gradle index e2c6e5b..c5d113a 100644 --- a/shipping-service/build.gradle +++ b/shipping-service/build.gradle @@ -3,6 +3,12 @@ ext { } dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' + implementation 'org.hibernate:hibernate-core:6.3.1.Final' + implementation project(':common-module') + runtimeOnly 'com.h2database:h2' } dependencyManagement { From ec276fb94ffc7f60af4cf5e9db25577a7b65fe35 Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Tue, 18 Mar 2025 09:41:15 +0900 Subject: [PATCH 045/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#33]=20:=20shipping?= =?UTF-8?q?-service=20Create=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/CreateShippingRequestDto.java | 42 +++++++++++ .../response/CreateShippingResponseDto.java | 15 ++++ .../application/service/ShippingService.java | 27 +++++++ .../domain/model/Shipping.java | 71 +++++++++++++++++++ .../domain/model/ShippingSelf.java | 20 ++++++ .../domain/model/ShippingStatus.java | 6 ++ .../domain/repository/ShippingRepository.java | 14 ++++ .../infrastructure/JpaShippingRepository.java | 12 ++++ .../presentation/ShippingController.java | 23 ++++++ .../src/main/resources/application.yaml | 19 ++++- 10 files changed, 246 insertions(+), 3 deletions(-) create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/CreateShippingResponseDto.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingSelf.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingStatus.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRepository.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/JpaShippingRepository.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java new file mode 100644 index 0000000..0f02d4a --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java @@ -0,0 +1,42 @@ +package com.sparta.shippingservice.application.dto.request; + +import com.sparta.shippingservice.domain.model.ShippingSelf; +import com.sparta.shippingservice.domain.model.ShippingStatus; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + + +import java.util.UUID; + +public record CreateShippingRequestDto( + // TODO CREATE 요청은 언제 발생 ? 주문이 등록될떄 ? ORDER - SERVICE 에게 해당 정보 요청 + @NotNull(message = "주문 ID는 필수입니다.") + UUID orderId, + + @NotNull(message = "배송 주소는 필수입니다.") + @Size(min = 5, max = 255, message = "배송 주소는 5~255자 사이여야 합니다.") + String shippingAddress, + + @NotNull(message = "수령인 이름은 필수입니다.") + @Size(min = 2, max = 100, message = "수령인 이름은 2~100자 사이여야 합니다.") + String receiverName, + + UUID shippingManagerId, + + @NotNull(message = "배송 상태는 필수입니다.") + //@Size(min = 2, max = 50, message = "배송 상태는 2~50자 사이여야 합니다.") + ShippingStatus status + +) { + public ShippingSelf tobe(){ + return new ShippingSelf( + this.orderId(), + this.shippingAddress(), + this.receiverName(), + this.shippingManagerId(), + this.status() + + ); + } + +} \ No newline at end of file diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/CreateShippingResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/CreateShippingResponseDto.java new file mode 100644 index 0000000..35f9adb --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/CreateShippingResponseDto.java @@ -0,0 +1,15 @@ +package com.sparta.shippingservice.application.dto.response; + +import com.sparta.shippingservice.domain.model.Shipping; + +import java.util.UUID; + +public record CreateShippingResponseDto( + UUID shippingId +){ + public static CreateShippingResponseDto send (Shipping shipping) { + return new CreateShippingResponseDto(shipping.getId()); + } + + +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java new file mode 100644 index 0000000..eb4074e --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -0,0 +1,27 @@ +package com.sparta.shippingservice.application.service; + +import com.sparta.shippingservice.application.dto.request.CreateShippingRequestDto; +import com.sparta.shippingservice.application.dto.response.CreateShippingResponseDto; +import com.sparta.shippingservice.domain.model.Shipping; +import com.sparta.shippingservice.domain.repository.ShippingRepository; + +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + + +@Service +@RequiredArgsConstructor +public class ShippingService { + private final ShippingRepository shippingRepository; + + public CreateShippingResponseDto create(@Valid CreateShippingRequestDto request){ + + Shipping shipping = request.tobe().toShipping(); + shippingRepository.save(shipping); + + return CreateShippingResponseDto.send(shipping); + + } + +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java new file mode 100644 index 0000000..b4e458b --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java @@ -0,0 +1,71 @@ +package com.sparta.shippingservice.domain.model; + +import com.sparta.commonmodule.entity.BaseEntity; +import jakarta.persistence.*; +import lombok.*; + +import java.util.UUID; + +@Entity +@Getter +@Setter +@NoArgsConstructor +@Table(name = "p_shipping") // 테이블 명 지정 +public class Shipping extends BaseEntity { + + @Id + @Column(name = "shipping_id", updatable = false, nullable = false) + private UUID id; + + @Column(name = "order_id", nullable = false) + private UUID orderId; + + @Column(name = "shipping_address", nullable = false, length = 255) + private String shippingAddress; + + @Column(name = "receiver_name", nullable = false, length = 100) + private String receiverName; + + @Column(name = "shipping_manager_id", nullable = false) + private UUID shippingManagerId; + + @Enumerated(EnumType.STRING) + @Column(name = "status", nullable = false, length = 50) + private ShippingStatus status = ShippingStatus.PENDING; // 기본값 설정 + + public Shipping( UUID orderId, String shippingAddress, String receiverName, UUID shippingManagerId, ShippingStatus status) { + this.orderId = orderId; + this.shippingAddress = shippingAddress; + this.receiverName = receiverName; + this.shippingManagerId = shippingManagerId; + this.status = status; + } + + @PrePersist + public void prePersist(){ + if(this.id == null){ + this.id = UUID.randomUUID(); + } + // this.getCreatedAt() =LocalDateTime.now(); + } + + + + public void updateShippingAddress(String newAddress) { + if (this.status == ShippingStatus.DELIVERED) { + throw new IllegalStateException("배송이 완료된 후에는 주소를 변경할 수 없습니다."); + } + this.shippingAddress = newAddress; + } + + public void updateReceiverName(String newReceiverName) { + if (this.status == ShippingStatus.DELIVERED) { + throw new IllegalStateException("배송이 완료된 후에는 수령인 정보를 변경할 수 없습니다."); + } + this.receiverName = newReceiverName; + } + + public void markAsDelivered() { + this.status = ShippingStatus.DELIVERED; + } +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingSelf.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingSelf.java new file mode 100644 index 0000000..2331606 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingSelf.java @@ -0,0 +1,20 @@ +package com.sparta.shippingservice.domain.model; + +import java.util.UUID; + +public record ShippingSelf(UUID orderId, + String shippingAddress, + String receiverName, + UUID shippingManagerId, + ShippingStatus status) { + public Shipping toShipping(){ + return new Shipping( + this.orderId, + this.shippingAddress, + this.receiverName, + this.shippingManagerId, + this.status + ); + } + +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingStatus.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingStatus.java new file mode 100644 index 0000000..f72152a --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingStatus.java @@ -0,0 +1,6 @@ +package com.sparta.shippingservice.domain.model; + +public enum ShippingStatus { + PENDING, // 배송 대기중 + DELIVERED // 배송 완료 +} \ No newline at end of file diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRepository.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRepository.java new file mode 100644 index 0000000..773ff34 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRepository.java @@ -0,0 +1,14 @@ +package com.sparta.shippingservice.domain.repository; + + +import com.sparta.shippingservice.domain.model.Shipping; +import org.springframework.stereotype.Repository; + +import java.util.Optional; +import java.util.UUID; + +@Repository +public interface ShippingRepository { + Shipping save(Shipping shipping); + Optional findById(UUID id); +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/JpaShippingRepository.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/JpaShippingRepository.java new file mode 100644 index 0000000..83abf90 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/JpaShippingRepository.java @@ -0,0 +1,12 @@ +package com.sparta.shippingservice.infrastructure; + +import com.sparta.shippingservice.domain.model.Shipping; +import com.sparta.shippingservice.domain.repository.ShippingRepository; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + +@Repository +public interface JpaShippingRepository extends JpaRepository, ShippingRepository { +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java new file mode 100644 index 0000000..d8ef3d0 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -0,0 +1,23 @@ +package com.sparta.shippingservice.presentation; + +import com.sparta.shippingservice.application.dto.request.CreateShippingRequestDto; +import com.sparta.shippingservice.application.dto.response.CreateShippingResponseDto; +import com.sparta.shippingservice.application.service.ShippingService; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/v1/shippings") +@RequiredArgsConstructor +public class ShippingController { + private final ShippingService shippingService; + @PostMapping() + public ResponseEntityShipping(@Valid @RequestBody CreateShippingRequestDto requestDto) { + CreateShippingResponseDto responseDto = shippingService.create(requestDto); + + return ResponseEntity.status(HttpStatus.CREATED).body(responseDto); + } +} diff --git a/shipping-service/src/main/resources/application.yaml b/shipping-service/src/main/resources/application.yaml index 3f4ff97..754efb8 100644 --- a/shipping-service/src/main/resources/application.yaml +++ b/shipping-service/src/main/resources/application.yaml @@ -1,13 +1,26 @@ spring: application: name: shipping-service + datasource: + url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS TEST + username: sa + password: + jpa: + database-platform: org.hibernate.dialect.H2Dialect + hibernate: + ddl-auto: update # 또는 create + h2: + console: + enabled: true + path: /h2-console server: port: 8088 eureka: client: - register-with-eureka: true # Eureka? ??? ?? - fetch-registry: true # Eureka?? ??? ?? ???? + register-with-eureka: true + fetch-registry: true service-url: - defaultZone: http://localhost:8761/eureka/ \ No newline at end of file + defaultZone: http://localhost:8761/eureka/ + From c3932cf8f6f9474eb1a8a58736df283820300adf Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Tue, 18 Mar 2025 11:07:33 +0900 Subject: [PATCH 046/389] Save local untracked file before merging --- .../logistics-delivery.common-module.main.iml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .idea/modules/common-module/logistics-delivery.common-module.main.iml diff --git a/.idea/modules/common-module/logistics-delivery.common-module.main.iml b/.idea/modules/common-module/logistics-delivery.common-module.main.iml new file mode 100644 index 0000000..c9a4af1 --- /dev/null +++ b/.idea/modules/common-module/logistics-delivery.common-module.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file From c1d6bddb1647f31856b8491b90ad625ce63df61c Mon Sep 17 00:00:00 2001 From: devdaeun Date: Tue, 18 Mar 2025 12:40:25 +0900 Subject: [PATCH 047/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#48]=20:=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=9D=B8=EC=A6=9D=20=EB=A6=AC?= =?UTF-8?q?=ED=8E=99=ED=86=A0=EB=A7=81=20=EC=88=98=ED=96=89=20-=20modules.?= =?UTF-8?q?xml=20=EC=88=98=EC=A0=95=20-=20bulid.gradle=20jpa=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/modules.xml | 3 +++ api-http/user/user-service.http | 1 + user-service/build.gradle | 1 + 3 files changed, 5 insertions(+) diff --git a/.idea/modules.xml b/.idea/modules.xml index 3e222c9..7a9034d 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -4,8 +4,11 @@ + + + diff --git a/api-http/user/user-service.http b/api-http/user/user-service.http index c805997..516efac 100644 --- a/api-http/user/user-service.http +++ b/api-http/user/user-service.http @@ -17,3 +17,4 @@ Content-Type: application/json "username": "asdf123", "password": "asdfgA12@" } + diff --git a/user-service/build.gradle b/user-service/build.gradle index b68d183..9706d29 100644 --- a/user-service/build.gradle +++ b/user-service/build.gradle @@ -7,6 +7,7 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'io.jsonwebtoken:jjwt:0.12.6' implementation 'org.springframework.boot:spring-boot-starter-actuator' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-security' testImplementation 'org.springframework.security:spring-security-test' testImplementation 'io.projectreactor:reactor-test' From bfa766f244d835bc431c3b909330ee0dc5ff2974 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Tue, 18 Mar 2025 12:46:17 +0900 Subject: [PATCH 048/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=A3=BC?= =?UTF-8?q?=EB=AC=B8=20update=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sparta/orderservice/domain/model/Order.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java b/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java index b9db6bf..a24e0fb 100644 --- a/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java +++ b/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java @@ -69,5 +69,16 @@ public class Order { @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true) private List orderItems = new ArrayList<>(); // 주문 아이템 1:N 관계 설정 + + // 주문 update 메서드 + public void updateOrderDetails(String name, UUID supplierId, UUID receiverId, UUID productId, BigDecimal totalPrice, String requestDetail) { + this.name = name; + this.supplierId = supplierId; + this.receiverId = receiverId; + this.productId = productId; + this.totalPrice = totalPrice; + this.requestDetail = requestDetail; + } + } From 4f0d8ddfa42cda96e08f367104983ab315c81947 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Tue, 18 Mar 2025 12:47:09 +0900 Subject: [PATCH 049/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=A3=BC?= =?UTF-8?q?=EB=AC=B8=20=EC=A1=B0=ED=9A=8C,=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/OrderService.java | 66 +++++++++++++++++++ .../controller/Ordercontroller.java | 25 +++++-- 2 files changed, 87 insertions(+), 4 deletions(-) diff --git a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java index 0670428..d0949bc 100644 --- a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java +++ b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java @@ -1,17 +1,24 @@ package com.sparta.orderservice.application.service; import com.sparta.orderservice.application.dto.OrderRequestDto; +import com.sparta.orderservice.application.dto.OrderResponseDto; import com.sparta.orderservice.domain.model.Order; +import com.sparta.orderservice.domain.model.OrderStatus; import com.sparta.orderservice.domain.repository.OrderRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + @Service @RequiredArgsConstructor public class OrderService { private final OrderRepository orderRepository; + // 주문 생성 @Transactional public Order createOrder(OrderRequestDto requestDto){ Order order = Order.builder() @@ -26,5 +33,64 @@ public Order createOrder(OrderRequestDto requestDto){ return orderRepository.save(order); } + // 주문 전체 조회 + @Transactional(readOnly = true) + public List getALlOrders(){ + List orders = orderRepository.findAll(); + return orders.stream() + .map(order -> new OrderResponseDto( + order.getOrderId(), + order.getName(), + order.getSupplierId(), + order.getReceiverId(), + order.getProductId(), + order.getTotalPrice(), + order.getStatus(), + order.getRequestDetail(), + order.getCreatedAt(), + order.getCreatedBy() + )) + .collect(Collectors.toList()); + } + + // 주문 개별 조회 (id) + @Transactional(readOnly = true) + public OrderResponseDto getOrderById(UUID orderId){ + Order order = orderRepository.findById(orderId) + .orElseThrow(() -> new RuntimeException("order Not found" + orderId)); + return new OrderResponseDto( + order.getOrderId(), + order.getName(), + order.getSupplierId(), + order.getReceiverId(), + order.getProductId(), + order.getTotalPrice(), + order.getStatus(), + order.getRequestDetail(), + order.getCreatedAt(), + order.getCreatedBy() + ); + } + + @Transactional + public OrderResponseDto updateOrder(UUID orderId, OrderRequestDto requestDto){ + Order order = orderRepository.findById(orderId) + .orElseThrow(() -> new RuntimeException("Not found id" + orderId)); + + if(order.getStatus() != OrderStatus.CREATED){ + throw new RuntimeException("CREATED Status에서만 Update 가능"); + } + order.updateOrderDetails( + requestDto.getName(), + requestDto.getSupplierId(), + requestDto.getReceiverId(), + requestDto.getProductId(), + requestDto.getTotalPrice(), + requestDto.getRequestDetail() + ); + return new OrderResponseDto(order); + + } + } diff --git a/order-service/src/main/java/com/sparta/orderservice/presentation/controller/Ordercontroller.java b/order-service/src/main/java/com/sparta/orderservice/presentation/controller/Ordercontroller.java index 82b7ea3..5bceab8 100644 --- a/order-service/src/main/java/com/sparta/orderservice/presentation/controller/Ordercontroller.java +++ b/order-service/src/main/java/com/sparta/orderservice/presentation/controller/Ordercontroller.java @@ -1,11 +1,16 @@ package com.sparta.orderservice.presentation.controller; import com.sparta.orderservice.application.dto.OrderRequestDto; +import com.sparta.orderservice.application.dto.OrderResponseDto; +import com.sparta.orderservice.application.dto.UpdateOrderRequestDto; import com.sparta.orderservice.application.service.OrderService; import com.sparta.orderservice.domain.model.Order; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; +import java.util.UUID; + @RestController @RequestMapping("/api/v1/orders") public class Ordercontroller { @@ -16,14 +21,26 @@ public Ordercontroller(OrderService orderService) { this.orderService = orderService; } - @GetMapping("/test") - public String getOrder(){ - return "Hello world"; - } @PostMapping public ResponseEntity createOrder(@RequestBody OrderRequestDto requestDto){ return ResponseEntity.ok(orderService.createOrder(requestDto)); } + @GetMapping + public ResponseEntity> getAllOrders(){ + return ResponseEntity.ok(orderService.getALlOrders()); + } + + @GetMapping("/{id}") + public ResponseEntity getOrderById(@PathVariable UUID id){ + return ResponseEntity.ok(orderService.getOrderById(id)); + } + + @PutMapping("{id}") + public ResponseEntity updateOrder( + @PathVariable UUID id, + @RequestBody OrderRequestDto orderRequestDto){ + return ResponseEntity.ok(orderService.updateOrder(id,orderRequestDto)); + } } From 3319400afb197c7e6030ce5766f94288f096c3db Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Tue, 18 Mar 2025 12:47:27 +0900 Subject: [PATCH 050/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20OrderResponseDto?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/OrderResponseDto.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 order-service/src/main/java/com/sparta/orderservice/application/dto/OrderResponseDto.java diff --git a/order-service/src/main/java/com/sparta/orderservice/application/dto/OrderResponseDto.java b/order-service/src/main/java/com/sparta/orderservice/application/dto/OrderResponseDto.java new file mode 100644 index 0000000..7e02394 --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/application/dto/OrderResponseDto.java @@ -0,0 +1,44 @@ +package com.sparta.orderservice.application.dto; + +import com.sparta.orderservice.domain.model.Order; +import com.sparta.orderservice.domain.model.OrderStatus; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.UUID; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class OrderResponseDto { + private UUID orderId; + private String name; + private UUID supplierId; + private UUID receiverId; + private UUID productId; + private BigDecimal totolPrice; + private OrderStatus status; + private String requestDetail; + private LocalDateTime createdAt; + private UUID createdBy; + + public OrderResponseDto(Order order) { + this.orderId = order.getOrderId(); + this.name = order.getName(); + this.supplierId = order.getSupplierId(); + this.receiverId = order.getReceiverId(); + this.productId = order.getProductId(); + this.totolPrice = order.getTotalPrice(); + this.status = order.getStatus(); + this.requestDetail = order.getRequestDetail(); + this.createdAt = order.getCreatedAt(); + this.createdBy = order.getCreatedBy(); + } +} + + From ea23577e8e39a1f5a02f1a3b9aa2d75397d6224d Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Tue, 18 Mar 2025 12:47:43 +0900 Subject: [PATCH 051/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20UpdateOrderReque?= =?UTF-8?q?stDto=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/UpdateOrderRequestDto.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 order-service/src/main/java/com/sparta/orderservice/application/dto/UpdateOrderRequestDto.java diff --git a/order-service/src/main/java/com/sparta/orderservice/application/dto/UpdateOrderRequestDto.java b/order-service/src/main/java/com/sparta/orderservice/application/dto/UpdateOrderRequestDto.java new file mode 100644 index 0000000..f37898a --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/application/dto/UpdateOrderRequestDto.java @@ -0,0 +1,18 @@ +package com.sparta.orderservice.application.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.UUID; + +@Getter +@NoArgsConstructor +public class UpdateOrderRequestDto { + private String name; + private UUID supplierId; + private UUID receiverID; + private UUID productId; + private BigDecimal totalPrice; + private String requestDetail; +} From ceaca293d50ad75af14ddec1e9dbc3e1ea5db596 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Tue, 18 Mar 2025 12:48:13 +0900 Subject: [PATCH 052/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20jpa=20dependenci?= =?UTF-8?q?es=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- order-service/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/order-service/build.gradle b/order-service/build.gradle index 34cdd32..f7fb11c 100644 --- a/order-service/build.gradle +++ b/order-service/build.gradle @@ -3,6 +3,7 @@ ext { } dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' } From da53a576779c162e4577591f45ff7a0f8be3ab74 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Tue, 18 Mar 2025 14:06:10 +0900 Subject: [PATCH 053/389] =?UTF-8?q?=F0=9F=9A=9A=20move=20:=20exception=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=20=EA=B2=BD=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{entity => }/exception/DeletedDataAccessException.java | 2 +- .../{entity => }/exception/DuplicateResourceException.java | 2 +- .../{entity => }/exception/GlobalExceptionHandler.java | 2 +- .../{entity => }/exception/InternalServerException.java | 2 +- .../{entity => }/exception/InvalidParameterException.java | 2 +- .../{entity => }/exception/OperationNotAllowedException.java | 2 +- .../{entity => }/exception/OwnershipMismatchException.java | 2 +- .../{entity => }/exception/ResourceNotFoundException.java | 2 +- .../{entity => }/exception/UnauthorizedAccessException.java | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) rename common-module/src/main/java/com/sparta/commonmodule/{entity => }/exception/DeletedDataAccessException.java (92%) rename common-module/src/main/java/com/sparta/commonmodule/{entity => }/exception/DuplicateResourceException.java (92%) rename common-module/src/main/java/com/sparta/commonmodule/{entity => }/exception/GlobalExceptionHandler.java (98%) rename common-module/src/main/java/com/sparta/commonmodule/{entity => }/exception/InternalServerException.java (89%) rename common-module/src/main/java/com/sparta/commonmodule/{entity => }/exception/InvalidParameterException.java (92%) rename common-module/src/main/java/com/sparta/commonmodule/{entity => }/exception/OperationNotAllowedException.java (90%) rename common-module/src/main/java/com/sparta/commonmodule/{entity => }/exception/OwnershipMismatchException.java (92%) rename common-module/src/main/java/com/sparta/commonmodule/{entity => }/exception/ResourceNotFoundException.java (92%) rename common-module/src/main/java/com/sparta/commonmodule/{entity => }/exception/UnauthorizedAccessException.java (92%) diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/DeletedDataAccessException.java b/common-module/src/main/java/com/sparta/commonmodule/exception/DeletedDataAccessException.java similarity index 92% rename from common-module/src/main/java/com/sparta/commonmodule/entity/exception/DeletedDataAccessException.java rename to common-module/src/main/java/com/sparta/commonmodule/exception/DeletedDataAccessException.java index 3e491dc..00caf67 100644 --- a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/DeletedDataAccessException.java +++ b/common-module/src/main/java/com/sparta/commonmodule/exception/DeletedDataAccessException.java @@ -1,4 +1,4 @@ -package com.sparta.commonmodule.entity.exception; +package com.sparta.commonmodule.exception; import org.springframework.dao.DataAccessException; diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/DuplicateResourceException.java b/common-module/src/main/java/com/sparta/commonmodule/exception/DuplicateResourceException.java similarity index 92% rename from common-module/src/main/java/com/sparta/commonmodule/entity/exception/DuplicateResourceException.java rename to common-module/src/main/java/com/sparta/commonmodule/exception/DuplicateResourceException.java index 163b46f..45bd769 100644 --- a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/DuplicateResourceException.java +++ b/common-module/src/main/java/com/sparta/commonmodule/exception/DuplicateResourceException.java @@ -1,4 +1,4 @@ -package com.sparta.commonmodule.entity.exception; +package com.sparta.commonmodule.exception; import org.springframework.dao.DataAccessException; diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/GlobalExceptionHandler.java b/common-module/src/main/java/com/sparta/commonmodule/exception/GlobalExceptionHandler.java similarity index 98% rename from common-module/src/main/java/com/sparta/commonmodule/entity/exception/GlobalExceptionHandler.java rename to common-module/src/main/java/com/sparta/commonmodule/exception/GlobalExceptionHandler.java index 29823c3..ff0e073 100644 --- a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/GlobalExceptionHandler.java +++ b/common-module/src/main/java/com/sparta/commonmodule/exception/GlobalExceptionHandler.java @@ -1,4 +1,4 @@ -package com.sparta.commonmodule.entity.exception; +package com.sparta.commonmodule.exception; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/InternalServerException.java b/common-module/src/main/java/com/sparta/commonmodule/exception/InternalServerException.java similarity index 89% rename from common-module/src/main/java/com/sparta/commonmodule/entity/exception/InternalServerException.java rename to common-module/src/main/java/com/sparta/commonmodule/exception/InternalServerException.java index e65df49..1f74247 100644 --- a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/InternalServerException.java +++ b/common-module/src/main/java/com/sparta/commonmodule/exception/InternalServerException.java @@ -1,4 +1,4 @@ -package com.sparta.commonmodule.entity.exception; +package com.sparta.commonmodule.exception; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/InvalidParameterException.java b/common-module/src/main/java/com/sparta/commonmodule/exception/InvalidParameterException.java similarity index 92% rename from common-module/src/main/java/com/sparta/commonmodule/entity/exception/InvalidParameterException.java rename to common-module/src/main/java/com/sparta/commonmodule/exception/InvalidParameterException.java index 5cd5cf6..97ffeae 100644 --- a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/InvalidParameterException.java +++ b/common-module/src/main/java/com/sparta/commonmodule/exception/InvalidParameterException.java @@ -1,4 +1,4 @@ -package com.sparta.commonmodule.entity.exception; +package com.sparta.commonmodule.exception; /** * 메서드나 API 호출 시 잘못된 파라미터가 전달되었을 때 발생하는 예외입니다. 주로 HTTP 400 (Bad Request) 응답과 매핑하여 처리합니다. diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/OperationNotAllowedException.java b/common-module/src/main/java/com/sparta/commonmodule/exception/OperationNotAllowedException.java similarity index 90% rename from common-module/src/main/java/com/sparta/commonmodule/entity/exception/OperationNotAllowedException.java rename to common-module/src/main/java/com/sparta/commonmodule/exception/OperationNotAllowedException.java index 6777740..73ff6bd 100644 --- a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/OperationNotAllowedException.java +++ b/common-module/src/main/java/com/sparta/commonmodule/exception/OperationNotAllowedException.java @@ -1,4 +1,4 @@ -package com.sparta.commonmodule.entity.exception; +package com.sparta.commonmodule.exception; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/OwnershipMismatchException.java b/common-module/src/main/java/com/sparta/commonmodule/exception/OwnershipMismatchException.java similarity index 92% rename from common-module/src/main/java/com/sparta/commonmodule/entity/exception/OwnershipMismatchException.java rename to common-module/src/main/java/com/sparta/commonmodule/exception/OwnershipMismatchException.java index b49654d..ffe1182 100644 --- a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/OwnershipMismatchException.java +++ b/common-module/src/main/java/com/sparta/commonmodule/exception/OwnershipMismatchException.java @@ -1,4 +1,4 @@ -package com.sparta.commonmodule.entity.exception; +package com.sparta.commonmodule.exception; /** * 리소스의 소유자와 다른 ID로 접근하려 할 때 발생하는 예외입니다. 주로 HTTP 403 (Forbidden) 응답과 매핑하여 처리합니다. diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/ResourceNotFoundException.java b/common-module/src/main/java/com/sparta/commonmodule/exception/ResourceNotFoundException.java similarity index 92% rename from common-module/src/main/java/com/sparta/commonmodule/entity/exception/ResourceNotFoundException.java rename to common-module/src/main/java/com/sparta/commonmodule/exception/ResourceNotFoundException.java index 61a418a..6249ad8 100644 --- a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/ResourceNotFoundException.java +++ b/common-module/src/main/java/com/sparta/commonmodule/exception/ResourceNotFoundException.java @@ -1,4 +1,4 @@ -package com.sparta.commonmodule.entity.exception; +package com.sparta.commonmodule.exception; import org.springframework.dao.DataAccessException; diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/UnauthorizedAccessException.java b/common-module/src/main/java/com/sparta/commonmodule/exception/UnauthorizedAccessException.java similarity index 92% rename from common-module/src/main/java/com/sparta/commonmodule/entity/exception/UnauthorizedAccessException.java rename to common-module/src/main/java/com/sparta/commonmodule/exception/UnauthorizedAccessException.java index f6d472f..bb1c8a1 100644 --- a/common-module/src/main/java/com/sparta/commonmodule/entity/exception/UnauthorizedAccessException.java +++ b/common-module/src/main/java/com/sparta/commonmodule/exception/UnauthorizedAccessException.java @@ -1,4 +1,4 @@ -package com.sparta.commonmodule.entity.exception; +package com.sparta.commonmodule.exception; /** * 사용자가 필요한 권한을 보유하지 않은 경우 발생하는 예외입니다. HTTP 401 (Unauthorized) 또는 403 (Forbidden)으로 매핑할 수 있습니다. From 5fa6cd1c0acc320374b367e367d392e67a4f771e Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Tue, 18 Mar 2025 14:06:40 +0900 Subject: [PATCH 054/389] =?UTF-8?q?=F0=9F=99=88=20gitfix=20:=20gitignore?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.gitignore b/.gitignore index 870b44e..052376e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,12 +5,36 @@ # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 +# 보안 관련 키 및 인증 파일 +*.pem +*.key +*.crt +*.pfx + +# DB 및 로그 파일 +*.db +*.sqlite +*.h2.db +*.mv.db +*.pgdata/ +logs/ +*.log +log/ + + +# Docker 빌드 중 생기는 파일 +.dockerignore +docker/data/ +docker/db-data/ + # User-specific stuff .idea/**/workspace.xml .idea/**/tasks.xml .idea/**/usage.statistics.xml .idea/**/dictionaries .idea/**/shelf +.idea/modules/** +.idea/compiler.xml # AWS User-specific .idea/**/aws.xml From 12c58003c0b13f16db9741562c9137461716a1c2 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Tue, 18 Mar 2025 14:08:43 +0900 Subject: [PATCH 055/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20common-module?= =?UTF-8?q?=20=EC=9D=98=20build.gradle=20=EC=88=98=EC=A0=95=20-=20?= =?UTF-8?q?=EA=BC=AD=20=ED=95=84=EC=9A=94=ED=95=9C=20dependencies=20?= =?UTF-8?q?=EB=A7=8C=20=EB=84=A3=EB=8A=94=20=EA=B2=83=EC=9D=B4=20=EC=A2=8B?= =?UTF-8?q?=EB=8B=A4=EA=B3=A0=20=ED=8C=90=EB=8B=A8=20-=20Exception?= =?UTF-8?q?=EC=9D=84=20=EA=B0=80=EC=A7=80=EA=B3=A0=20=EC=98=AC=20=EC=88=98?= =?UTF-8?q?=20=EC=9E=88=EA=B2=8C=20spring-tx=EB=A7=8C=20implementation=20?= =?UTF-8?q?=ED=95=98=EC=98=80=EC=8A=B5=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common-module/build.gradle | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/common-module/build.gradle b/common-module/build.gradle index 4d2befc..872f37d 100644 --- a/common-module/build.gradle +++ b/common-module/build.gradle @@ -1,17 +1,3 @@ dependencies { - // Hibernate Validator - implementation 'org.hibernate:hibernate-core:6.3.1.Final' - -// Jakarta Persistence API - implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' - - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - -// Spring Boot Validation - implementation 'org.springframework.boot:spring-boot-starter-validation' - -// Lombok (선택 사항) - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' -} - + compileOnly 'org.springframework:spring-tx:5.3.30' +} \ No newline at end of file From 89ba4b097c9aece298a242085d37afe701ec3e81 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Tue, 18 Mar 2025 14:14:55 +0900 Subject: [PATCH 056/389] Remove .idea/modules and .idea/compiler.xml from Git tracking --- .idea/compiler.xml | 25 ------------------- .../logistics-delivery.common-module.main.iml | 8 ------ .../eureka/logistics-delivery.eureka.main.iml | 8 ------ .../logistics-delivery.gateway.main.iml | 8 ------ .../logistics-delivery.user-service.main.iml | 8 ------ 5 files changed, 57 deletions(-) delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/modules/common-module/logistics-delivery.common-module.main.iml delete mode 100644 .idea/modules/eureka/logistics-delivery.eureka.main.iml delete mode 100644 .idea/modules/gateway/logistics-delivery.gateway.main.iml delete mode 100644 .idea/modules/user-service/logistics-delivery.user-service.main.iml diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 9f8185a..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/common-module/logistics-delivery.common-module.main.iml b/.idea/modules/common-module/logistics-delivery.common-module.main.iml deleted file mode 100644 index c9a4af1..0000000 --- a/.idea/modules/common-module/logistics-delivery.common-module.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/eureka/logistics-delivery.eureka.main.iml b/.idea/modules/eureka/logistics-delivery.eureka.main.iml deleted file mode 100644 index 421c373..0000000 --- a/.idea/modules/eureka/logistics-delivery.eureka.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/gateway/logistics-delivery.gateway.main.iml b/.idea/modules/gateway/logistics-delivery.gateway.main.iml deleted file mode 100644 index f96a052..0000000 --- a/.idea/modules/gateway/logistics-delivery.gateway.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/user-service/logistics-delivery.user-service.main.iml b/.idea/modules/user-service/logistics-delivery.user-service.main.iml deleted file mode 100644 index 5a00956..0000000 --- a/.idea/modules/user-service/logistics-delivery.user-service.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file From 99dacd79371e80428ca10ab506e343606032fcf8 Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Tue, 18 Mar 2025 11:07:33 +0900 Subject: [PATCH 057/389] Save local untracked file before merging --- .../logistics-delivery.common-module.main.iml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .idea/modules/common-module/logistics-delivery.common-module.main.iml diff --git a/.idea/modules/common-module/logistics-delivery.common-module.main.iml b/.idea/modules/common-module/logistics-delivery.common-module.main.iml new file mode 100644 index 0000000..c9a4af1 --- /dev/null +++ b/.idea/modules/common-module/logistics-delivery.common-module.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file From 672cf2fdb23670857ea91a0f5faa63b6f377a4c3 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Tue, 18 Mar 2025 16:09:36 +0900 Subject: [PATCH 058/389] =?UTF-8?q?=F0=9F=99=88=20gitfix=20:=20gitignore?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20-=20.idea/compiler.xml=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20-=20.idea/misc.xml=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 052376e..c6083c0 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,9 @@ log/ docker/data/ docker/db-data/ +.idea/compiler.xml +.idea/misc.xml + # User-specific stuff .idea/**/workspace.xml .idea/**/tasks.xml @@ -34,7 +37,6 @@ docker/db-data/ .idea/**/dictionaries .idea/**/shelf .idea/modules/** -.idea/compiler.xml # AWS User-specific .idea/**/aws.xml From 4b43733a38b7b49e0ce6c06aa4b13fd251cdb6b1 Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Tue, 18 Mar 2025 16:10:00 +0900 Subject: [PATCH 059/389] Resolve merge conflict --- .../logistics-delivery.common-module.main.iml | 8 -------- build.gradle | 4 ++++ 2 files changed, 4 insertions(+), 8 deletions(-) delete mode 100644 .idea/modules/common-module/logistics-delivery.common-module.main.iml diff --git a/.idea/modules/common-module/logistics-delivery.common-module.main.iml b/.idea/modules/common-module/logistics-delivery.common-module.main.iml deleted file mode 100644 index c9a4af1..0000000 --- a/.idea/modules/common-module/logistics-delivery.common-module.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/build.gradle b/build.gradle index 69131bc..5f5026f 100644 --- a/build.gradle +++ b/build.gradle @@ -38,7 +38,11 @@ subprojects { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' + //implementation 'org.springframework.boot:spring-boot-starter-data-jpa' //jpa 추가 + + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' //jpa 추가 + compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' From 2c0a95b08c640ae3159c97001c34f43e1010081a Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 17 Mar 2025 22:39:18 +0900 Subject: [PATCH 060/389] =?UTF-8?q?Domain=20-=20model=20-=20Order,=20Order?= =?UTF-8?q?Item=20entity=20OrderStatus=20enum=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/modules.xml | 5 +---- .../java/com/sparta/orderservice/domain/model/Order.java | 1 + 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.idea/modules.xml b/.idea/modules.xml index 7a9034d..500bef4 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -4,12 +4,9 @@ - - - - + \ No newline at end of file diff --git a/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java b/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java index a24e0fb..cf5f9d5 100644 --- a/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java +++ b/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java @@ -80,5 +80,6 @@ public void updateOrderDetails(String name, UUID supplierId, UUID receiverId, UU this.requestDetail = requestDetail; } + } From 9b070ad02e96dcd50f8aae7188cd4579eed741d7 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 17 Mar 2025 22:40:18 +0900 Subject: [PATCH 061/389] =?UTF-8?q?application=20-=20service=20-=20OrderSe?= =?UTF-8?q?rvice=20create=20=EA=B8=B0=EB=8A=A5=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/OrderService.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java index d0949bc..14d3bf8 100644 --- a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java +++ b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java @@ -1,24 +1,30 @@ package com.sparta.orderservice.application.service; import com.sparta.orderservice.application.dto.OrderRequestDto; +<<<<<<< HEAD import com.sparta.orderservice.application.dto.OrderResponseDto; import com.sparta.orderservice.domain.model.Order; import com.sparta.orderservice.domain.model.OrderStatus; +======= +import com.sparta.orderservice.domain.model.Order; +>>>>>>> 7deb867 (application - service - OrderService create 기능구현) import com.sparta.orderservice.domain.repository.OrderRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +<<<<<<< HEAD import java.util.List; import java.util.UUID; import java.util.stream.Collectors; + @Service @RequiredArgsConstructor public class OrderService { private final OrderRepository orderRepository; - // 주문 생성 + @Transactional public Order createOrder(OrderRequestDto requestDto){ Order order = Order.builder() @@ -33,7 +39,7 @@ public Order createOrder(OrderRequestDto requestDto){ return orderRepository.save(order); } - // 주문 전체 조회 + @Transactional(readOnly = true) public List getALlOrders(){ List orders = orderRepository.findAll(); @@ -53,7 +59,6 @@ public List getALlOrders(){ .collect(Collectors.toList()); } - // 주문 개별 조회 (id) @Transactional(readOnly = true) public OrderResponseDto getOrderById(UUID orderId){ Order order = orderRepository.findById(orderId) @@ -93,4 +98,5 @@ public OrderResponseDto updateOrder(UUID orderId, OrderRequestDto requestDto){ } + } From 36a0a9ba7a80472562acca7a479901f099323789 Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Tue, 18 Mar 2025 09:38:57 +0900 Subject: [PATCH 062/389] =?UTF-8?q?=F0=9F=90=9B=20bugfix[#33]=20:=20?= =?UTF-8?q?=EA=B3=B5=ED=86=B5=20=EB=AA=A8=EB=93=88,Shipping-service=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=A3=BC=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 ++- common-module/build.gradle | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 5f5026f..5410641 100644 --- a/build.gradle +++ b/build.gradle @@ -39,15 +39,16 @@ subprojects { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' + //implementation 'org.springframework.boot:spring-boot-starter-data-jpa' //jpa 추가 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' //jpa 추가 + compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - implementation 'com.h2database:h2' } diff --git a/common-module/build.gradle b/common-module/build.gradle index 872f37d..6608849 100644 --- a/common-module/build.gradle +++ b/common-module/build.gradle @@ -1,3 +1,4 @@ dependencies { + compileOnly 'org.springframework:spring-tx:5.3.30' -} \ No newline at end of file +} From 61953c08bbe781127cc22be7d0fd4b2dc2bd0f3a Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Tue, 18 Mar 2025 16:40:02 +0900 Subject: [PATCH 063/389] =?UTF-8?q?=F0=9F=99=88=20gitfix=20:=20gitignore?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20=20IntelliJ=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EC=A0=9D=ED=8A=B8=20=EC=84=A4=EC=A0=95=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=A0=9C=EC=99=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index c6083c0..f3a40c6 100644 --- a/.gitignore +++ b/.gitignore @@ -21,14 +21,23 @@ logs/ *.log log/ +# IntelliJ 프로젝트 설정 파일 제외 +.idea/misc.xml +.idea/modules.xml +.idea/workspace.xml +.idea/compiler.xml +.idea/shelf/ +.idea/libraries/ +.idea/inspectionProfiles/ +.idea/artifacts/ +.idea/deployment.xml +.idea/httpRequests/ # Docker 빌드 중 생기는 파일 .dockerignore docker/data/ docker/db-data/ -.idea/compiler.xml -.idea/misc.xml # User-specific stuff .idea/**/workspace.xml @@ -37,6 +46,7 @@ docker/db-data/ .idea/**/dictionaries .idea/**/shelf .idea/modules/** +.idea/compiler.xml # AWS User-specific .idea/**/aws.xml From 8dd26f0c4571c38110476e1b9a8b35134b8230bc Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Tue, 18 Mar 2025 16:45:06 +0900 Subject: [PATCH 064/389] =?UTF-8?q?=EC=82=AD=EC=A0=9C:=20.idea=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=ED=8C=8C=EC=9D=BC=EC=9D=84=20Git=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 9 --------- .idea/modules.xml | 15 --------------- 2 files changed, 24 deletions(-) delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 5a6a28d..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 7a9034d..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file From f9f0ebed0b0ed53045be565625f9c0e8e3008810 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Tue, 18 Mar 2025 18:55:47 +0900 Subject: [PATCH 065/389] =?UTF-8?q?=E2=9C=A8feat=20[#30]:=20jpa=20?= =?UTF-8?q?=EB=B0=8F=20postgresql=20=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80,=20application.yml=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- product-service/build.gradle | 2 ++ .../src/main/resources/application.yml | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/product-service/build.gradle b/product-service/build.gradle index 6a60b29..f97509f 100644 --- a/product-service/build.gradle +++ b/product-service/build.gradle @@ -4,6 +4,8 @@ ext { dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + runtimeOnly 'org.postgresql:postgresql' } dependencyManagement { diff --git a/product-service/src/main/resources/application.yml b/product-service/src/main/resources/application.yml index e1fa1b3..232d7fe 100644 --- a/product-service/src/main/resources/application.yml +++ b/product-service/src/main/resources/application.yml @@ -1,6 +1,21 @@ spring: application: name: product-service + datasource: + driver-class-name: org.postgresql.Driver + url: jdbc:postgresql://localhost:5432/msa-product + username: test + password: 1234 + jpa: + database: postgresql + show-sql: true + hibernate: + ddl-auto: create + properties: + hibernate: + spring.jpa.open-in-view: false + format_sql: true + default_batch_fetch_size: 10 server: port: 8083 From a6282c6a21a4bd9f79a1a74bf662166af96f5ed9 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Tue, 18 Mar 2025 19:03:41 +0900 Subject: [PATCH 066/389] =?UTF-8?q?=E2=9C=A8feat=20[#30]:=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sparta/product/domain/model/Product.java | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 product-service/src/main/java/com/sparta/product/domain/model/Product.java diff --git a/product-service/src/main/java/com/sparta/product/domain/model/Product.java b/product-service/src/main/java/com/sparta/product/domain/model/Product.java new file mode 100644 index 0000000..6d335ba --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/domain/model/Product.java @@ -0,0 +1,79 @@ +package com.sparta.product.domain.model; + +/*import com.spring_cloud.eureka.client.product.presentation.dto.ProductRequestDto; +import com.spring_cloud.eureka.client.product.presentation.dto.ProductResponseDto;*/ +import com.sparta.product.presentation.dto.request.CreateProductRequestDto; +import com.sparta.product.presentation.dto.response.CreateProductResponseDto; +import jakarta.persistence.*; +import lombok.*; + +import java.math.BigDecimal; +import java.util.UUID; + + +@Entity +@Table(name = "p_product") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Builder(access = AccessLevel.PRIVATE) +public class Product { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(name = "product_id", updatable = false, nullable = false) + private UUID id; + + @Column(name = "product_name", nullable = false, length = 100) + private String name; + + @Column(name = "product_description", nullable = false, length = 255) + private String description; + + @Column(name = "product_price", nullable = false) + private BigDecimal price; + + @Column(name = "product_quantity", nullable = false) + private Integer quantity; + + @Column(name = "is_display", nullable = false) + private boolean isDisplay; + + @Column(name = "company_id", nullable = false) + private UUID companyId; + + @Column(name = "hub_id", nullable = false) + private UUID hubId; + + + + /** + * 상품 생성 + */ + public static Product createProduct(CreateProductRequestDto requestDto, Long userId) { + return Product.builder() + .name(requestDto.name()) + .description(requestDto.description()) + .price(requestDto.price()) + .quantity(requestDto.quantity()) + .isDisplay(requestDto.isDisplay()) + .companyId(requestDto.companyId()) + .hubId(requestDto.hubId()) + .build(); + } + + + + // DTO -> Entity 변환 메서드 + public static Product of(CreateProductResponseDto responseDto) { + return Product.builder() + .name(responseDto.name()) + .description(responseDto.description()) + .quantity(responseDto.quantity()) + .price(responseDto.price()) + .isDisplay(responseDto.isDisplay()) + .companyId(responseDto.companyId()) + .hubId(responseDto.hubId()) + .build(); + } +} \ No newline at end of file From 3e2bdd76aec9b621f9bccda12908a68cdb457593 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Tue, 18 Mar 2025 19:04:28 +0900 Subject: [PATCH 067/389] =?UTF-8?q?=E2=9C=A8feat=20[#30]:=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EB=B0=8F=20?= =?UTF-8?q?DTO=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sparta/product/ProductController.java | 15 --------- .../presentation/ProductController.java | 25 ++++++++++++++ .../dto/request/CreateProductRequestDto.java | 15 +++++++++ .../response/CreateProductResponseDto.java | 33 +++++++++++++++++++ 4 files changed, 73 insertions(+), 15 deletions(-) delete mode 100644 product-service/src/main/java/com/sparta/product/ProductController.java create mode 100644 product-service/src/main/java/com/sparta/product/presentation/ProductController.java create mode 100644 product-service/src/main/java/com/sparta/product/presentation/dto/request/CreateProductRequestDto.java create mode 100644 product-service/src/main/java/com/sparta/product/presentation/dto/response/CreateProductResponseDto.java diff --git a/product-service/src/main/java/com/sparta/product/ProductController.java b/product-service/src/main/java/com/sparta/product/ProductController.java deleted file mode 100644 index 7ccebb9..0000000 --- a/product-service/src/main/java/com/sparta/product/ProductController.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.sparta.product; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/v1/products") -public class ProductController { - - @GetMapping("/test") - public String getProduct() { - return "Hello World"; - } -} diff --git a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java new file mode 100644 index 0000000..c91d644 --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java @@ -0,0 +1,25 @@ +package com.sparta.product.presentation; + +import com.sparta.product.application.service.ProductServiceImpl; +import com.sparta.product.presentation.dto.request.CreateProductRequestDto; +import com.sparta.product.presentation.dto.response.CreateProductResponseDto; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/v1/products") +@RequiredArgsConstructor +public class ProductController { + + private final ProductServiceImpl productServiceImpl; + + /** + * 상품 생성 + */ + @PostMapping + public ResponseEntity createProduct(@RequestBody CreateProductRequestDto requestDto, + @RequestHeader(value = "X-User-Id", required = true) Long userId) { + return ResponseEntity.ok(productServiceImpl.createProduct(requestDto, userId)); + } +} diff --git a/product-service/src/main/java/com/sparta/product/presentation/dto/request/CreateProductRequestDto.java b/product-service/src/main/java/com/sparta/product/presentation/dto/request/CreateProductRequestDto.java new file mode 100644 index 0000000..0ef7c6c --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/presentation/dto/request/CreateProductRequestDto.java @@ -0,0 +1,15 @@ +package com.sparta.product.presentation.dto.request; + +import java.math.BigDecimal; +import java.util.UUID; + + +public record CreateProductRequestDto(String name, + String description, + BigDecimal price, + Integer quantity, + boolean isDisplay, + UUID companyId, + UUID hubId) { + +} diff --git a/product-service/src/main/java/com/sparta/product/presentation/dto/response/CreateProductResponseDto.java b/product-service/src/main/java/com/sparta/product/presentation/dto/response/CreateProductResponseDto.java new file mode 100644 index 0000000..f1e0500 --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/presentation/dto/response/CreateProductResponseDto.java @@ -0,0 +1,33 @@ +package com.sparta.product.presentation.dto.response; + + +import com.sparta.product.domain.model.Product; +import lombok.Builder; + +import java.math.BigDecimal; +import java.util.UUID; + +@Builder +public record CreateProductResponseDto(UUID id, + String name, + String description, + BigDecimal price, + Integer quantity, + boolean isDisplay, + UUID companyId, + UUID hubId) { + + // Entity -> DTO 변환 메서드 + public static CreateProductResponseDto from(Product product) { + return CreateProductResponseDto.builder() + .id(product.getId()) + .name(product.getName()) + .description(product.getDescription()) + .price(product.getPrice()) + .quantity(product.getQuantity()) + .isDisplay(product.isDisplay()) + .companyId(product.getCompanyId()) + .hubId(product.getHubId()) + .build(); + } +} From 67ac94f0a115000011b75d58bf5a81d925d66b8d Mon Sep 17 00:00:00 2001 From: jin2304 Date: Tue, 18 Mar 2025 19:05:13 +0900 Subject: [PATCH 068/389] =?UTF-8?q?=E2=9C=A8feat=20[#30]:=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/ProductService.java | 11 ++++++++ .../service/ProductServiceImpl.java | 27 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 product-service/src/main/java/com/sparta/product/application/service/ProductService.java create mode 100644 product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductService.java b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java new file mode 100644 index 0000000..4532ccc --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java @@ -0,0 +1,11 @@ +package com.sparta.product.application.service; + +import com.sparta.product.presentation.dto.request.CreateProductRequestDto; +import com.sparta.product.presentation.dto.response.CreateProductResponseDto; + + +public interface ProductService { + + CreateProductResponseDto createProduct(CreateProductRequestDto requestDto, Long userId); + +} diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java new file mode 100644 index 0000000..20c0ef2 --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java @@ -0,0 +1,27 @@ +package com.sparta.product.application.service; + +import com.sparta.product.domain.model.Product; +import com.sparta.product.domain.repository.ProductRepository; +import com.sparta.product.presentation.dto.request.CreateProductRequestDto; +import com.sparta.product.presentation.dto.response.CreateProductResponseDto; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional +public class ProductServiceImpl implements ProductService { + + private final ProductRepository productRepository; + + + /** + * 상품 생성 + */ + @Override + public CreateProductResponseDto createProduct(CreateProductRequestDto requestDto, Long userId) { + Product product = productRepository.save(Product.createProduct(requestDto, userId)); + return CreateProductResponseDto.from(product); + } +} From 7a5f8c23ebed5abc06fa83fd0f04d28a282a4817 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Tue, 18 Mar 2025 19:20:04 +0900 Subject: [PATCH 069/389] =?UTF-8?q?=E2=9C=A8feat=20[#30]:=20Repository?= =?UTF-8?q?=EB=A5=BC=20=EA=B3=84=EC=B8=B5=EB=B3=84=EB=A1=9C=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=ED=95=98=EC=97=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - domain 계층에서 사용할 ProductRepository 인터페이스 추가 - infrastructure 계층에서 JpaProductRepository를 구현하여 JPA와 연결 - domain 계층이 JPA 구현체에 직접 의존하지 않도록 하기 위해 분리 - DDD 4계층 원칙을 준수하여 인프라 의존성을 도메인에서 제거 --- .../product/domain/repository/ProductRepository.java | 8 ++++++++ .../repository/JpaProductRepository.java | 11 +++++++++++ 2 files changed, 19 insertions(+) create mode 100644 product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java create mode 100644 product-service/src/main/java/com/sparta/product/infrastructure/repository/JpaProductRepository.java diff --git a/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java b/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java new file mode 100644 index 0000000..93bf12d --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java @@ -0,0 +1,8 @@ +package com.sparta.product.domain.repository; + +import com.sparta.product.domain.model.Product; + +public interface ProductRepository { + + Product save(Product product); +} diff --git a/product-service/src/main/java/com/sparta/product/infrastructure/repository/JpaProductRepository.java b/product-service/src/main/java/com/sparta/product/infrastructure/repository/JpaProductRepository.java new file mode 100644 index 0000000..f11e744 --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/infrastructure/repository/JpaProductRepository.java @@ -0,0 +1,11 @@ +package com.sparta.product.infrastructure.repository; + +import com.sparta.product.domain.model.Product; +import com.sparta.product.domain.repository.ProductRepository; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface JpaProductRepository extends ProductRepository, JpaRepository { + +} From 1b9cf7de811485920e478350759f763dc3b228bc Mon Sep 17 00:00:00 2001 From: jin2304 Date: Tue, 18 Mar 2025 19:20:37 +0900 Subject: [PATCH 070/389] =?UTF-8?q?=E2=9C=A8feat=20[#30]:=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20=EC=83=9D=EC=84=B1=20http=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- product-service/src/test/http/product.http | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 product-service/src/test/http/product.http diff --git a/product-service/src/test/http/product.http b/product-service/src/test/http/product.http new file mode 100644 index 0000000..ac4aad7 --- /dev/null +++ b/product-service/src/test/http/product.http @@ -0,0 +1,15 @@ +### 상품 생성 +POST http://localhost:8080/api/v1/products +Content-Type: application/json +X-User-Id: 12345 # 사용자 ID (Long 타입) + +{ + "name": "마른오징어", + "description": "마른오징어 입니다.", + "price": 1000, + "quantity": 50, + "isDisplay": true, + "companyId": "550e8400-e29b-41d4-a716-446655440000", + "hubId": "123e4567-e89b-12d3-a456-426614174000" +} + From 95d3e64bdfe35a166065f4d730c3799b945f84c1 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Tue, 18 Mar 2025 19:45:21 +0900 Subject: [PATCH 071/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20Hub=20=EA=B8=B0?= =?UTF-8?q?=EB=B3=B8=20CRUD=20=EA=B5=AC=ED=98=84=20-=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81=20=EC=98=88=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/HubCreateResponseDto.java | 25 ++++++ .../application/dto/HubDeleteResponseDto.java | 19 ++++ .../application/dto/HubRequestDto.java | 21 +++++ .../application/dto/HubResponseDto.java | 36 ++++++++ .../application/dto/HubUpdateRequestDto.java | 22 +++++ .../application/dto/HubUpdateResponseDto.java | 32 +++++++ .../application/service/HubService.java | 87 +++++++++++++++++++ .../hubservice/controller/HubController.java | 65 ++++++++++++++ .../sparta/hubservice/domain/model/Hub.java | 60 +++++++++++++ .../hubservice/domain/model/HubRoute.java | 57 ++++++++++++ .../domain/model/HubRouteCheckpoint.java | 48 ++++++++++ .../domain/repository/HubRepository.java | 16 ++++ 12 files changed, 488 insertions(+) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/application/dto/HubCreateResponseDto.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/application/dto/HubDeleteResponseDto.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/application/dto/HubRequestDto.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/application/dto/HubResponseDto.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/application/dto/HubUpdateRequestDto.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/application/dto/HubUpdateResponseDto.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/application/service/HubService.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/controller/HubController.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/domain/model/Hub.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/domain/model/HubRoute.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/domain/model/HubRouteCheckpoint.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/domain/repository/HubRepository.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubCreateResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubCreateResponseDto.java new file mode 100644 index 0000000..3b19a99 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubCreateResponseDto.java @@ -0,0 +1,25 @@ +package com.sparta.hubservice.application.dto; + +import com.sparta.hubservice.domain.model.Hub; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class HubCreateResponseDto { + + private final UUID hubId; + private final String message; + private final LocalDateTime createdAt; + private final long createdBy; + + public HubCreateResponseDto(Hub hub, String message) { + this.hubId = getHubId(); + this.message = message; + this.createdAt = LocalDateTime.now(); + this.createdBy = hub.getCreatedBy(); + } + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubDeleteResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubDeleteResponseDto.java new file mode 100644 index 0000000..5d3f098 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubDeleteResponseDto.java @@ -0,0 +1,19 @@ +package com.sparta.hubservice.application.dto; + +import java.util.UUID; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class HubDeleteResponseDto { + + private final UUID hubId; + private final String message; + + public HubDeleteResponseDto(UUID hubId, String message) { + this.hubId = hubId; + this.message = message; + } + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubRequestDto.java b/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubRequestDto.java new file mode 100644 index 0000000..e6315a0 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubRequestDto.java @@ -0,0 +1,21 @@ +package com.sparta.hubservice.application.dto; + +import java.math.BigDecimal; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class HubRequestDto { + + private String name; + private String address; + private BigDecimal latitude; + private BigDecimal longitude; + + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubResponseDto.java new file mode 100644 index 0000000..a550150 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubResponseDto.java @@ -0,0 +1,36 @@ +package com.sparta.hubservice.application.dto; + +import com.sparta.hubservice.domain.model.Hub; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class HubResponseDto { + + private final UUID hubId; + private final String name; + private final String address; + private final BigDecimal latitude; + private final BigDecimal longitude; + private final LocalDateTime createdAt; + private final long createdBy; + private final LocalDateTime updatedAt; + private final long updatedBy; + + public HubResponseDto(Hub hub) { + this.hubId = hub.getHubId(); + this.name = hub.getName(); + this.address = hub.getAddress(); + this.latitude = hub.getLatitude(); + this.longitude = hub.getLongitude(); + this.createdAt = hub.getCreatedAt(); + this.createdBy = hub.getCreatedBy(); + this.updatedAt = hub.getUpdatedAt(); + this.updatedBy = hub.getUpdatedBy(); + } + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubUpdateRequestDto.java b/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubUpdateRequestDto.java new file mode 100644 index 0000000..e6b129a --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubUpdateRequestDto.java @@ -0,0 +1,22 @@ +package com.sparta.hubservice.application.dto; + +import java.math.BigDecimal; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class HubUpdateRequestDto { + + private UUID hubId; + private String address; + private BigDecimal latitude; + private BigDecimal longitude; + + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubUpdateResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubUpdateResponseDto.java new file mode 100644 index 0000000..a2cbfe2 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubUpdateResponseDto.java @@ -0,0 +1,32 @@ +package com.sparta.hubservice.application.dto; + +import com.sparta.hubservice.domain.model.Hub; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class HubUpdateResponseDto { + + private final UUID hubId; + private final String message; + private final String location; + private final BigDecimal latitude; + private final BigDecimal longitude; + private final LocalDateTime updatedAt; + private final long updatedBy; + + public HubUpdateResponseDto(Hub hub, String message) { + this.hubId = getHubId(); + this.message = message; + this.location = getLocation(); + this.latitude = getLatitude(); + this.longitude = getLongitude(); + this.updatedAt = LocalDateTime.now(); + this.updatedBy = hub.getCreatedBy(); + } + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/application/service/HubService.java b/hub-service/src/main/java/com/sparta/hubservice/application/service/HubService.java new file mode 100644 index 0000000..b71c836 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/application/service/HubService.java @@ -0,0 +1,87 @@ +package com.sparta.hubservice.application.service; + +import com.sparta.commonmodule.exception.DuplicateResourceException; +import com.sparta.commonmodule.exception.ResourceNotFoundException; +import com.sparta.hubservice.application.dto.HubCreateResponseDto; +import com.sparta.hubservice.application.dto.HubDeleteResponseDto; +import com.sparta.hubservice.application.dto.HubRequestDto; +import com.sparta.hubservice.application.dto.HubResponseDto; +import com.sparta.hubservice.application.dto.HubUpdateRequestDto; +import com.sparta.hubservice.application.dto.HubUpdateResponseDto; +import com.sparta.hubservice.domain.model.Hub; +import com.sparta.hubservice.domain.repository.HubRepository; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Slf4j +public class HubService { + + private final HubRepository hubRepository; + + // 허브 목록 조회 + @Transactional(readOnly = true) + public ResponseEntity> getHubs(Pageable pageable) { + Page hubResponseDtos = hubRepository.findAllAndIsDeletedFalse(pageable); + if (hubResponseDtos.isEmpty()) { + log.error("not found hubs"); + throw new ResourceNotFoundException(); + } + return new ResponseEntity<>(hubResponseDtos, HttpStatus.OK); + } + + // 특정 허브 조회 + @Transactional(readOnly = true) + public ResponseEntity getHub(UUID hubId) { + Hub hubDetail = hubRepository.findById(hubId) + .orElseThrow(ResourceNotFoundException::new); + + return ResponseEntity.ok(new HubResponseDto(hubDetail)); + } + + // 허브 생성 + @Transactional + public ResponseEntity createHub(HubRequestDto hubRequestDto, long userId) { + if(hubRepository.existsByName(hubRequestDto.getName())){ + throw new DuplicateResourceException(); + } + Hub hub = Hub.builder() + .name(hubRequestDto.getName()) + .address(hubRequestDto.getAddress()) + .latitude(hubRequestDto.getLatitude()) + .longitude(hubRequestDto.getLongitude()) + .userId(userId) + .build(); + + Hub savedHub = hubRepository.save(hub); + return ResponseEntity.ok(new HubCreateResponseDto(savedHub, "Hub successfully created.")); + } + + // 허브 수정 + @Transactional + public ResponseEntity updateHub(HubUpdateRequestDto requestDto, long userId) { + Hub hub = hubRepository.findById(requestDto.getHubId()) + .orElseThrow(ResourceNotFoundException::new); + + hub.updateHub(requestDto.getAddress(), requestDto.getLatitude(), requestDto.getLongitude(), userId); + return ResponseEntity.ok(new HubUpdateResponseDto(hub, "Hub successfully updated.")); + } + + // 허브삭제 (Soft Delete) + @Transactional + public ResponseEntity deleteHub(UUID hubId, long userId) { + Hub hub = hubRepository.findById(hubId) + .orElseThrow(ResourceNotFoundException::new); + + hub.delete(userId); + return ResponseEntity.ok(new HubDeleteResponseDto(hubId, "Hub successfully deleted.")); + } +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/controller/HubController.java b/hub-service/src/main/java/com/sparta/hubservice/controller/HubController.java new file mode 100644 index 0000000..bc39661 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/controller/HubController.java @@ -0,0 +1,65 @@ +package com.sparta.hubservice.controller; + +import com.sparta.hubservice.application.dto.HubCreateResponseDto; +import com.sparta.hubservice.application.dto.HubDeleteResponseDto; +import com.sparta.hubservice.application.dto.HubRequestDto; +import com.sparta.hubservice.application.dto.HubResponseDto; +import com.sparta.hubservice.application.dto.HubUpdateRequestDto; +import com.sparta.hubservice.application.dto.HubUpdateResponseDto; +import com.sparta.hubservice.application.service.HubService; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/v1/hubs") +@RequiredArgsConstructor +public class HubController { + + private final HubService hubService; + + @GetMapping + public ResponseEntity hubTest(){ + return ResponseEntity.ok("connect hub-service"); + } + + @GetMapping + public ResponseEntity> getHubs( + @PageableDefault(page = 0, size = 10, sort = "createdAt") Pageable pageable) { + return hubService.getHubs(pageable); + } + + @GetMapping("/{hub_id}") + public ResponseEntity getHubById(@PathVariable("hub_id") UUID hubId) { + return hubService.getHub(hubId); + } + + @PostMapping + public ResponseEntity createHub(@RequestBody HubRequestDto requestDto, @RequestParam long userId) { + return hubService.createHub(requestDto, userId); + } + + @PutMapping + public ResponseEntity updateHub(@RequestBody HubUpdateRequestDto requestDto, @RequestParam long userId) { + return hubService.updateHub(requestDto, userId); + } + + @DeleteMapping("{hub_id}") + public ResponseEntity deleteHub(@PathVariable("hub_id") UUID hubId, @RequestParam long userId) { + return hubService.deleteHub(hubId, userId); + } + + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/domain/model/Hub.java b/hub-service/src/main/java/com/sparta/hubservice/domain/model/Hub.java new file mode 100644 index 0000000..52e055a --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/domain/model/Hub.java @@ -0,0 +1,60 @@ +package com.sparta.hubservice.domain.model; + +import com.sparta.commonmodule.entity.BaseEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.Digits; +import java.math.BigDecimal; +import java.util.UUID; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.UuidGenerator; + +@Entity +@Getter +@NoArgsConstructor +@Table(name = "p_hub") +public class Hub extends BaseEntity { + @Id + @Column(name = "hub_id", nullable = false) + @GeneratedValue(strategy = GenerationType.IDENTITY) + @UuidGenerator + private UUID hubId; + + @Column(unique = true, nullable = false, length = 255) + private String name; + + @Column(nullable = false, length = 255) + private String address; + + @Column(nullable = false) + @Digits(integer = 10, fraction = 6) + private BigDecimal latitude; + + @Column(nullable = false) + @Digits(integer = 10, fraction = 6) + private BigDecimal longitude; + + @Builder + public Hub(String name, String address, BigDecimal latitude, BigDecimal longitude, long userId) { + super(userId); + this.name = name; + this.address = address; + this.latitude = latitude; + this.longitude = longitude; + } + + public void updateHub(String address, BigDecimal latitude, BigDecimal longitude, long userId){ + super.update(userId); + this.address = address; + this.latitude = latitude; + this.longitude = longitude; + } + + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/domain/model/HubRoute.java b/hub-service/src/main/java/com/sparta/hubservice/domain/model/HubRoute.java new file mode 100644 index 0000000..78bd650 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/domain/model/HubRoute.java @@ -0,0 +1,57 @@ +package com.sparta.hubservice.domain.model; + +import com.sparta.commonmodule.entity.BaseEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.validation.constraints.Digits; +import java.math.BigDecimal; +import java.util.UUID; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.UuidGenerator; + +@Entity +@Getter +@NoArgsConstructor +@Table(name = "p_hub_route") +public class HubRoute extends BaseEntity { + + @Id + @Column(name = "hub_route_id", nullable = false) + @GeneratedValue(strategy = GenerationType.IDENTITY) + @UuidGenerator + private UUID hubRouteId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name ="from_hub", nullable = false) + private Hub fromHub; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name ="to_hub", nullable = false) + private Hub toHub; + + @Column(nullable = false) + private int duration; + + @Column(nullable = false) + @Digits(integer = 10, fraction = 2) + private BigDecimal distance; + + public HubRoute(Hub fromHub, Hub toHub, int duration, BigDecimal distance, long userId) { + super(userId); + this.fromHub = fromHub; + this.toHub = toHub; + this.duration = duration; + this.distance = distance; + } + + + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/domain/model/HubRouteCheckpoint.java b/hub-service/src/main/java/com/sparta/hubservice/domain/model/HubRouteCheckpoint.java new file mode 100644 index 0000000..681f65a --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/domain/model/HubRouteCheckpoint.java @@ -0,0 +1,48 @@ +package com.sparta.hubservice.domain.model; + +import com.sparta.commonmodule.entity.BaseEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import java.util.UUID; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.UuidGenerator; + +@Entity +@Getter +@NoArgsConstructor +@Table(name = "p_hub_route_checkpoint") +public class HubRouteCheckpoint extends BaseEntity { + + @Id + @Column(name = "hub_route_checkpoint_id", nullable = false) + @GeneratedValue(strategy = GenerationType.IDENTITY) + @UuidGenerator + private UUID hubRouteCheckpointId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name ="hub_route_id", nullable = false) + private HubRoute hubRouteId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name ="checkpoint_hub_id", nullable = false) + private Hub checkpointHubId; + + @Column(nullable = false) + private int sequence; + + public HubRouteCheckpoint(HubRoute hubRoute, Hub checkpointHub, int sequence, long userId) { + super(userId); + this.hubRouteId = hubRoute; + this.checkpointHubId = checkpointHub; + this.sequence = sequence; + } + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/domain/repository/HubRepository.java b/hub-service/src/main/java/com/sparta/hubservice/domain/repository/HubRepository.java new file mode 100644 index 0000000..63529c1 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/domain/repository/HubRepository.java @@ -0,0 +1,16 @@ +package com.sparta.hubservice.domain.repository; + +import com.sparta.hubservice.application.dto.HubResponseDto; +import com.sparta.hubservice.domain.model.Hub; +import java.util.UUID; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface HubRepository extends JpaRepository { + Page findAllAndIsDeletedFalse(Pageable pageable); + + boolean existsByName(String name); +} From 80d81c3caf5776872215355f7e2c7b2907be9129 Mon Sep 17 00:00:00 2001 From: jiyun Date: Tue, 18 Mar 2025 19:52:01 +0900 Subject: [PATCH 072/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#49]=20:=20Company?= =?UTF-8?q?=EC=9D=98=20create=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/CompanyDto.java | 39 +++++++++------ .../application/service/CompanyService.java | 49 +++++-------------- .../companyservice/domain/model/Company.java | 25 ++++------ .../domain/repository/CompanyRepository.java | 7 +-- .../domain/service/CompanyDomainService.java | 30 ++++++++++-- .../infrastructure/client/HubClient.java | 2 +- .../repository/CompanyRepositoryImpl.java | 25 ---------- .../repository/JpaCompanyRepository.java | 9 ---- .../controller/CompanyController.java | 16 +++--- .../request/CompanyCreateRequest.java | 31 ++++++++++++ .../presentation/request/CompanyRequest.java | 14 ------ .../response/CompanyResponse.java | 29 +++++++++++ 12 files changed, 146 insertions(+), 130 deletions(-) delete mode 100644 company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java delete mode 100644 company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java create mode 100644 company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyCreateRequest.java delete mode 100644 company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyRequest.java create mode 100644 company-service/src/main/java/com/sparta/companyservice/presentation/response/CompanyResponse.java diff --git a/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyDto.java b/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyDto.java index 2949540..5203326 100644 --- a/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyDto.java +++ b/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyDto.java @@ -1,21 +1,32 @@ package com.sparta.companyservice.application.dto; -import java.util.UUID; - -import lombok.Builder; -import lombok.Getter; +import com.sparta.companyservice.domain.model.Company; +import com.sparta.companyservice.domain.model.CompanyType; import java.time.LocalDateTime; +import java.util.UUID; + +// 서비스 <-> 도메인 간 내부 데이터 전달용 DTO -@Getter -@Builder -public class CompanyDto { - private UUID id; - private String name; - private String type; - private UUID hubId; - private String address; - private LocalDateTime createdAt; - private String createdBy; +public record CompanyDto( + UUID id, + String name, + CompanyType type, + UUID hubId, + String address, + LocalDateTime createdAt, + long createdBy +) { + public static CompanyDto fromEntity(Company company) { + return new CompanyDto( + company.getId(), + company.getName(), + company.getType(), + company.getHubId(), + company.getAddress(), + company.getCreatedAt(), + company.getCreatedBy() + ); + } } diff --git a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java index 4e972ab..e862d35 100644 --- a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java +++ b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java @@ -2,48 +2,25 @@ import com.sparta.companyservice.application.dto.CompanyDto; import com.sparta.companyservice.domain.model.Company; -import com.sparta.companyservice.domain.model.CompanyType; -import com.sparta.companyservice.domain.repository.CompanyRepository; import com.sparta.companyservice.domain.service.CompanyDomainService; -import com.sparta.companyservice.presentation.request.CompanyRequest; -import com.sparta.companyservice.infrastructure.client.HubClient; +import com.sparta.companyservice.presentation.request.CompanyCreateRequest; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import java.util.UUID; - @Service @RequiredArgsConstructor public class CompanyService { - - private final HubClient hubClient; - private final CompanyRepository companyRepository; - private final CompanyDomainService domainService; - - public CompanyDto createCompany(CompanyRequest request) { - if (!hubClient.existsById(request.getHubId())) { - throw new IllegalArgumentException("유효하지 않은 허브 ID입니다."); - } - - Company company = Company.create( - UUID.randomUUID(), - request.getName(), - CompanyType.valueOf(request.getType()), - request.getHubId(), - request.getAddress() + private final CompanyDomainService companyDomainService; + + public CompanyDto createCompany(CompanyCreateRequest request) { + long userId = 1L; // 실제로는 인증된 사용자 ID 가져와야 함 + Company company = companyDomainService.create( + request.name(), + request.type(), + request.hub_id(), + request.address(), + userId ); - - domainService.validate(company); - Company saved = companyRepository.save(company); - - return CompanyDto.builder() - .id(saved.getId()) - .name(saved.getName()) - .type(saved.getType().name()) - .hubId(saved.getHubId()) - .address(saved.getAddress()) - .createdAt(saved.getCreatedAt()) - .createdBy("admin_user") // 임시로 해둠 - .build(); + return CompanyDto.fromEntity(company); } -} +} \ No newline at end of file diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java index a50c5c9..ba23297 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java @@ -1,21 +1,14 @@ package com.sparta.companyservice.domain.model; import com.sparta.commonmodule.entity.BaseEntity; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; +import jakarta.persistence.*; import lombok.*; -import java.time.LocalDateTime; import java.util.UUID; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor -@Builder public class Company extends BaseEntity { @Id @Column(name = "company_id") @@ -34,14 +27,14 @@ public class Company extends BaseEntity { @Column(nullable = false, columnDefinition = "TEXT") private String address; - public static Company create(UUID id, String name, CompanyType type, UUID hubId, String address) { - return Company.builder() - .id(id) - .name(name) - .type(type) - .hubId(hubId) - .address(address) - .build(); + @Builder + public Company(UUID id, String name, CompanyType type, UUID hubId, String address, long userId) { + super(userId); + this.id = id; + this.name = name; + this.type = type; + this.hubId = hubId; + this.address = address; } } diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java index 2cbaac3..99a985f 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java @@ -1,12 +1,9 @@ package com.sparta.companyservice.domain.repository; import com.sparta.companyservice.domain.model.Company; +import org.springframework.data.jpa.repository.JpaRepository; -import java.util.Optional; import java.util.UUID; -public interface CompanyRepository { - Optional findById(UUID id); - Company save(Company company); +public interface CompanyRepository extends JpaRepository { } - diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java b/company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java index d7a23bb..b45ddfd 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java @@ -1,14 +1,38 @@ package com.sparta.companyservice.domain.service; +import com.sparta.commonmodule.exception.ResourceNotFoundException; import com.sparta.companyservice.domain.model.Company; +import com.sparta.companyservice.domain.model.CompanyType; +import com.sparta.companyservice.domain.repository.CompanyRepository; +import com.sparta.companyservice.infrastructure.client.HubClient; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.UUID; + +// 도메인 계층: 오직 순수한 값만 받아서 도메인 로직을 수행해야 함 (순수 비즈니스 규칙 실행, 객체 생성/검증/저장 책임) + @Service +@RequiredArgsConstructor public class CompanyDomainService { + private final CompanyRepository companyRepository; + private final HubClient hubClient; - public void validate(Company company) { - if (company.getName().length() < 2) { - throw new IllegalArgumentException("업체명은 2자 이상이어야 합니다."); + public Company create(String name, CompanyType type, UUID hubId, String address, long userId) { + if (!hubClient.existsById(hubId)) { + throw new ResourceNotFoundException("해당 허브가 존재하지 않습니다. 허브 ID: " + hubId); } + + Company company = Company.builder() + .id(UUID.randomUUID()) + .name(name) + .type(type) + .hubId(hubId) + .address(address) + .userId(userId) + .build(); + return companyRepository.save(company); } + + } diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/client/HubClient.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/client/HubClient.java index 9e3ba31..7d03a47 100644 --- a/company-service/src/main/java/com/sparta/companyservice/infrastructure/client/HubClient.java +++ b/company-service/src/main/java/com/sparta/companyservice/infrastructure/client/HubClient.java @@ -9,6 +9,6 @@ @FeignClient(name = "hub-service") public interface HubClient { - @GetMapping("api/v1/hubs/{id}/exists") + @GetMapping("/api/v1/hubs/{id}/exists") boolean existsById(@PathVariable("id") UUID id); } diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java deleted file mode 100644 index 15465e8..0000000 --- a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.sparta.companyservice.infrastructure.repository; - -import com.sparta.companyservice.domain.model.Company; -import com.sparta.companyservice.domain.repository.CompanyRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -import java.util.Optional; -import java.util.UUID; - -@Repository -@RequiredArgsConstructor -public class CompanyRepositoryImpl implements CompanyRepository { - private final JpaCompanyRepository jpaCompanyRepository; - - @Override - public Company save(Company company) { - return jpaCompanyRepository.save(company); - } - - @Override - public Optional findById(UUID id) { - return jpaCompanyRepository.findById(id); - } -} diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java deleted file mode 100644 index 60c3f9e..0000000 --- a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.sparta.companyservice.infrastructure.repository; - -import com.sparta.companyservice.domain.model.Company; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.UUID; - -public interface JpaCompanyRepository extends JpaRepository { -} diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java index 459e19a..0fa5982 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -1,13 +1,15 @@ package com.sparta.companyservice.presentation.controller; import com.sparta.companyservice.application.dto.CompanyDto; -import com.sparta.companyservice.presentation.request.CompanyRequest; +import com.sparta.companyservice.presentation.request.CompanyCreateRequest; +import com.sparta.companyservice.application.service.CompanyService; +import com.sparta.companyservice.presentation.response.CompanyResponse; import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.UUID; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/v1/companies") @@ -17,9 +19,9 @@ public class CompanyController { private final CompanyService companyService; @PostMapping - public ResponseEntity createCompany(@RequestBody CompanyRequest request) { + public ResponseEntity createCompany(@RequestBody CompanyCreateRequest request) { CompanyDto created = companyService.createCompany(request); - return ResponseEntity.ok(created); + return ResponseEntity.ok(CompanyResponse.fromDto(created)); } } diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyCreateRequest.java b/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyCreateRequest.java new file mode 100644 index 0000000..1f1e742 --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyCreateRequest.java @@ -0,0 +1,31 @@ +package com.sparta.companyservice.presentation.request; + +import com.sparta.companyservice.domain.model.CompanyType; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +import java.util.UUID; + +public record CompanyCreateRequest( + @NotBlank @Size(min = 3) String name, + @NotNull CompanyType type, + @NotNull UUID hub_id, + @NotBlank String address +) {} + +// 레이어드 아키텍처 설계 헷갈리는 부분: CompanyCreateRequest가 application 계층의 dto가 아니라 왜 presentation 계층? +// ㄴ CompanyCreateRequest는 클라이언트에서 컨트롤러로 들어오는 HTTP 요청을 담는 객체이기 때문에 presentation 계층에 있어야 한다. +// ㄴ Controller 외부와 맞닿은 영역이라 presentation 계층에 두는 게 맞다고 함 + + +/// 표: 계층 / 역할 / DTO 예시 +/// presentation / HTTP 요청,응답 처리 (Request/Response) / CompanyCreateRequest +/// application / 서비스 로직, UseCase 정의 / CompanyDto (비즈니스 응답 DTO) +/// domain / 비즈니스 도메인 모델, Entity / 여긴 DTO 없음 + + +// application 계층의 dto는: +// ㄴ Service 계층이 처리 결과를 반환할 때 사용하는 응답 DTO +// ㄴ 내부 도메인 객체(Company)를 변환해서 API 응답 포맷에 맞게 구성 +// ㄴ 클라이언트에게 전달할 구조로 정제된 정보 diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyRequest.java b/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyRequest.java deleted file mode 100644 index 1727d2a..0000000 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sparta.companyservice.presentation.request; - -import lombok.Getter; - -import java.util.UUID; - -@Getter -public class CompanyRequest { - private String name; - private String type; - private UUID hubId; - private String address; -} - diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/response/CompanyResponse.java b/company-service/src/main/java/com/sparta/companyservice/presentation/response/CompanyResponse.java new file mode 100644 index 0000000..67d7d55 --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/response/CompanyResponse.java @@ -0,0 +1,29 @@ +package com.sparta.companyservice.presentation.response; + +import com.sparta.companyservice.application.dto.CompanyDto; +import com.sparta.companyservice.domain.model.CompanyType; + +import java.time.LocalDateTime; +import java.util.UUID; + +public record CompanyResponse( + UUID id, + String name, + CompanyType type, + UUID hub_id, + String address, + LocalDateTime created_at, + long created_by +) { + public static CompanyResponse fromDto(CompanyDto dto) { + return new CompanyResponse( + dto.id(), + dto.name(), + dto.type(), + dto.hubId(), + dto.address(), + dto.createdAt(), + dto.createdBy() + ); + } +} From d271fb0d5011f33a69fac52276876fc36bb6924b Mon Sep 17 00:00:00 2001 From: jin2304 Date: Tue, 18 Mar 2025 21:42:56 +0900 Subject: [PATCH 073/389] =?UTF-8?q?=E2=9C=A8feat=20[#30]:=20=EA=B3=B5?= =?UTF-8?q?=ED=86=B5=20=EB=AA=A8=EB=93=88=20=EC=84=A4=EC=A0=95=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common-module/build.gradle | 3 ++- product-service/build.gradle | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/common-module/build.gradle b/common-module/build.gradle index 872f37d..b5fc99c 100644 --- a/common-module/build.gradle +++ b/common-module/build.gradle @@ -1,3 +1,4 @@ dependencies { - compileOnly 'org.springframework:spring-tx:5.3.30' + implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' } \ No newline at end of file diff --git a/product-service/build.gradle b/product-service/build.gradle index f97509f..fe552d9 100644 --- a/product-service/build.gradle +++ b/product-service/build.gradle @@ -5,6 +5,7 @@ ext { dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation project(':common-module') runtimeOnly 'org.postgresql:postgresql' } From 7589055685b6b61bd11f0962eee95a393632eb4b Mon Sep 17 00:00:00 2001 From: jin2304 Date: Tue, 18 Mar 2025 21:43:19 +0900 Subject: [PATCH 074/389] =?UTF-8?q?=E2=9C=A8feat=20[#30]:=20=EC=83=81?= =?UTF-8?q?=ED=92=88=EC=97=90=20BaseEntity=20=EC=83=81=EC=86=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/sparta/product/domain/model/Product.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/product-service/src/main/java/com/sparta/product/domain/model/Product.java b/product-service/src/main/java/com/sparta/product/domain/model/Product.java index 6d335ba..4f01a18 100644 --- a/product-service/src/main/java/com/sparta/product/domain/model/Product.java +++ b/product-service/src/main/java/com/sparta/product/domain/model/Product.java @@ -1,7 +1,7 @@ package com.sparta.product.domain.model; -/*import com.spring_cloud.eureka.client.product.presentation.dto.ProductRequestDto; -import com.spring_cloud.eureka.client.product.presentation.dto.ProductResponseDto;*/ + +import com.sparta.commonmodule.entity.BaseEntity; import com.sparta.product.presentation.dto.request.CreateProductRequestDto; import com.sparta.product.presentation.dto.response.CreateProductResponseDto; import jakarta.persistence.*; @@ -17,7 +17,7 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PRIVATE) @Builder(access = AccessLevel.PRIVATE) -public class Product { +public class Product extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.UUID) From 9f6650fa2a8185b9acb5fc955dc8d4677028377c Mon Sep 17 00:00:00 2001 From: devdaeun Date: Tue, 18 Mar 2025 23:50:48 +0900 Subject: [PATCH 075/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#60]=20:=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81=20-=20role=20=EA=B0=92=EC=9D=B4=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=EB=90=A0=20=EB=96=84=20ROLE=5F=EA=B6=8C=ED=95=9C=20?= =?UTF-8?q?=ED=98=95=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=EB=90=98=EB=8F=84=EB=A1=9D=20=EA=B5=AC=ED=98=84=20-=20GATEWAY?= =?UTF-8?q?=EC=97=90=EC=84=9C=EC=9D=98=20=20=EA=B6=8C=ED=95=9C=20=EC=9D=B8?= =?UTF-8?q?=EA=B0=80=EC=B2=98=EB=A6=AC=EB=A5=BC=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- user-service/build.gradle | 1 - .../sparta/user/application/dto/UserSigninResponseDto.java | 2 +- .../com/sparta/user/application/service/UserService.java | 2 +- .../src/main/java/com/sparta/user/domain/model/User.java | 5 ++--- .../java/com/sparta/user/presentation/UserController.java | 3 --- 6 files changed, 5 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index 69131bc..bef1fc7 100644 --- a/build.gradle +++ b/build.gradle @@ -38,7 +38,7 @@ subprojects { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' - //implementation 'org.springframework.boot:spring-boot-starter-data-jpa' //jpa 추가 + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' //jpa 추가 compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' diff --git a/user-service/build.gradle b/user-service/build.gradle index 9706d29..b68d183 100644 --- a/user-service/build.gradle +++ b/user-service/build.gradle @@ -7,7 +7,6 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'io.jsonwebtoken:jjwt:0.12.6' implementation 'org.springframework.boot:spring-boot-starter-actuator' - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-security' testImplementation 'org.springframework.security:spring-security-test' testImplementation 'io.projectreactor:reactor-test' diff --git a/user-service/src/main/java/com/sparta/user/application/dto/UserSigninResponseDto.java b/user-service/src/main/java/com/sparta/user/application/dto/UserSigninResponseDto.java index bc463db..fc833c3 100644 --- a/user-service/src/main/java/com/sparta/user/application/dto/UserSigninResponseDto.java +++ b/user-service/src/main/java/com/sparta/user/application/dto/UserSigninResponseDto.java @@ -8,6 +8,6 @@ @Setter public class UserSigninResponseDto { private Long id; - private UserRoleEnum role; + private String role; private String slackName; } diff --git a/user-service/src/main/java/com/sparta/user/application/service/UserService.java b/user-service/src/main/java/com/sparta/user/application/service/UserService.java index c127a23..d16c8c4 100644 --- a/user-service/src/main/java/com/sparta/user/application/service/UserService.java +++ b/user-service/src/main/java/com/sparta/user/application/service/UserService.java @@ -43,7 +43,7 @@ public ResponseEntity signUp(UserSignupRequestDto requestDto) { .password(passwordEncoder.encode(requestDto.getPassword())) .email(requestDto.getEmail()) .slackName(requestDto.getSlackName()) - .role(role) + .role(role.getAuthority()) .build() ); return ResponseEntity.ok("sign-up success"); diff --git a/user-service/src/main/java/com/sparta/user/domain/model/User.java b/user-service/src/main/java/com/sparta/user/domain/model/User.java index e1482ab..6073f4d 100644 --- a/user-service/src/main/java/com/sparta/user/domain/model/User.java +++ b/user-service/src/main/java/com/sparta/user/domain/model/User.java @@ -32,12 +32,11 @@ public class User{ private String slackName; @Column(nullable = false) - @Enumerated(value = EnumType.STRING) - private UserRoleEnum role; + private String role; - public User(Long id, String username, String password, String email, String slackName, UserRoleEnum role) { + public User(Long id, String username, String password, String email, String slackName, String role) { this.id = id; this.username = username; this.password = password; diff --git a/user-service/src/main/java/com/sparta/user/presentation/UserController.java b/user-service/src/main/java/com/sparta/user/presentation/UserController.java index 1985975..08cfacf 100644 --- a/user-service/src/main/java/com/sparta/user/presentation/UserController.java +++ b/user-service/src/main/java/com/sparta/user/presentation/UserController.java @@ -41,9 +41,6 @@ public ResponseEntity signIn(@Valid @RequestBody UserSigninReqeustDto reqeust UserSigninResponseDto responseDto = userService.signIn(reqeustDto); -// //토큰생성은 auth Service에서 진행(추출한 user 정보로 토큰생성 후 엑세스 토큰값 전달.) -// return ResponseEntity.ok(new AuthResponse(authService.createAccessToken(responseDto))); - // 토큰 생성하여 추출 String accessToken = authService.createAccessToken(responseDto); From ca45e0ec77512bc654c7b27ddb99365f3636903d Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Wed, 19 Mar 2025 00:29:28 +0900 Subject: [PATCH 076/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor[#33]=20:?= =?UTF-8?q?=20shipping-service=20Create=20responseDto=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/CreateShippingRequestDto.java | 1 - .../dto/response/CreateShippingResponseDto.java | 14 ++++++++++++-- .../domain/repository/ShippingRepository.java | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java index 0f02d4a..039d798 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java @@ -24,7 +24,6 @@ public record CreateShippingRequestDto( UUID shippingManagerId, @NotNull(message = "배송 상태는 필수입니다.") - //@Size(min = 2, max = 50, message = "배송 상태는 2~50자 사이여야 합니다.") ShippingStatus status ) { diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/CreateShippingResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/CreateShippingResponseDto.java index 35f9adb..0379ae0 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/CreateShippingResponseDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/CreateShippingResponseDto.java @@ -1,14 +1,24 @@ package com.sparta.shippingservice.application.dto.response; import com.sparta.shippingservice.domain.model.Shipping; +import com.sparta.shippingservice.domain.model.ShippingStatus; import java.util.UUID; public record CreateShippingResponseDto( - UUID shippingId + UUID shippingId, + String shippingAddress, + String receiverName, + UUID shippingManagerId, + ShippingStatus status ){ public static CreateShippingResponseDto send (Shipping shipping) { - return new CreateShippingResponseDto(shipping.getId()); + return new CreateShippingResponseDto( + shipping.getId(), + shipping.getShippingAddress(), + shipping.getReceiverName(), + shipping.getShippingManagerId(), + shipping.getStatus()); } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRepository.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRepository.java index 773ff34..0533c5d 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRepository.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRepository.java @@ -7,7 +7,7 @@ import java.util.Optional; import java.util.UUID; -@Repository + public interface ShippingRepository { Shipping save(Shipping shipping); Optional findById(UUID id); From b5835e48c853b780b5d0cfe1af5184141a3da56f Mon Sep 17 00:00:00 2001 From: jiyun Date: Wed, 19 Mar 2025 01:39:24 +0900 Subject: [PATCH 077/389] =?UTF-8?q?=E2=9C=A8=20Refactor=20[#57]=20:=20Repo?= =?UTF-8?q?sitory=20=EC=BD=94=EB=93=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/repository/CompanyRepository.java | 8 ++++---- .../repository/JpaCompanyRepository.java | 12 ++++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java index 99a985f..d36f2df 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java @@ -1,9 +1,9 @@ package com.sparta.companyservice.domain.repository; import com.sparta.companyservice.domain.model.Company; -import org.springframework.data.jpa.repository.JpaRepository; - +import java.util.Optional; import java.util.UUID; -public interface CompanyRepository extends JpaRepository { -} +public interface CompanyRepository { + Company save(Company company); +} \ No newline at end of file diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java new file mode 100644 index 0000000..4cad4d5 --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java @@ -0,0 +1,12 @@ +package com.sparta.companyservice.infrastructure.repository; + +import com.sparta.companyservice.domain.model.Company; +import com.sparta.companyservice.domain.repository.CompanyRepository; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + +@Repository +public interface JpaCompanyRepository extends JpaRepository, CompanyRepository { +} \ No newline at end of file From 9fd5c6cdd4e291d0524cca661c4efcc7e0458282 Mon Sep 17 00:00:00 2001 From: jiyun Date: Wed, 19 Mar 2025 01:39:41 +0900 Subject: [PATCH 078/389] =?UTF-8?q?=E2=9C=A8=20Refactor=20[#57]=20:=20Repo?= =?UTF-8?q?sitory=20=EC=BD=94=EB=93=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../companyservice/domain/repository/CompanyRepository.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java index d36f2df..796f592 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java @@ -1,8 +1,6 @@ package com.sparta.companyservice.domain.repository; import com.sparta.companyservice.domain.model.Company; -import java.util.Optional; -import java.util.UUID; public interface CompanyRepository { Company save(Company company); From 785a617d3dd8cb7b07e28d4b15711bae1b92b644 Mon Sep 17 00:00:00 2001 From: jiyun Date: Wed, 19 Mar 2025 02:22:57 +0900 Subject: [PATCH 079/389] =?UTF-8?q?=E2=9C=A8=20feature=20[#57]=20:=20Compa?= =?UTF-8?q?ny=20-=20Read=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/CompanyService.java | 16 ++++++++++ .../domain/repository/CompanyRepository.java | 12 +++++++ .../domain/service/CompanyDomainService.java | 8 +++++ .../controller/CompanyController.java | 31 ++++++++++++++++--- 4 files changed, 62 insertions(+), 5 deletions(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java index e862d35..9ce5644 100644 --- a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java +++ b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java @@ -7,6 +7,9 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.List; +import java.util.UUID; + @Service @RequiredArgsConstructor public class CompanyService { @@ -21,6 +24,19 @@ public CompanyDto createCompany(CompanyCreateRequest request) { request.address(), userId ); + // presentation에서 받은 요청을 파싱해서 domainService에 넘기고 처리 결과를 DTO로 만들어서 다시 controller로 반환 + return CompanyDto.fromEntity(company); + } + + public List getAllCompanies() { + return companyDomainService.findAll() + .stream() + .map(CompanyDto::fromEntity) + .toList(); + } + + public CompanyDto getCompanyById(UUID id) { + Company company = companyDomainService.findById(id); return CompanyDto.fromEntity(company); } } \ No newline at end of file diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java index 796f592..28b838c 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java @@ -2,6 +2,18 @@ import com.sparta.companyservice.domain.model.Company; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + public interface CompanyRepository { Company save(Company company); + + List findAll(); + + Optional findById(UUID id); + + boolean existsByName(String name); + + void delete(Company company); } \ No newline at end of file diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java b/company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java index b45ddfd..28102fc 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java @@ -8,6 +8,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.List; import java.util.UUID; // 도메인 계층: 오직 순수한 값만 받아서 도메인 로직을 수행해야 함 (순수 비즈니스 규칙 실행, 객체 생성/검증/저장 책임) @@ -35,4 +36,11 @@ public Company create(String name, CompanyType type, UUID hubId, String address, } + public List findAll() { + return companyRepository.findAll(); + } + + public Company findById(UUID id) { + return companyRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("해당 업체를 찾을 수 없습니다.")); + } } diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java index 0fa5982..b082191 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -1,15 +1,15 @@ package com.sparta.companyservice.presentation.controller; import com.sparta.companyservice.application.dto.CompanyDto; -import com.sparta.companyservice.presentation.request.CompanyCreateRequest; import com.sparta.companyservice.application.service.CompanyService; +import com.sparta.companyservice.presentation.request.CompanyCreateRequest; import com.sparta.companyservice.presentation.response.CompanyResponse; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.UUID; @RestController @RequestMapping("/api/v1/companies") @@ -18,10 +18,31 @@ public class CompanyController { private final CompanyService companyService; + // 생성 @PostMapping public ResponseEntity createCompany(@RequestBody CompanyCreateRequest request) { CompanyDto created = companyService.createCompany(request); return ResponseEntity.ok(CompanyResponse.fromDto(created)); } + + // 전체 조회 + @GetMapping + public ResponseEntity> getAllCompanies() { + List companies = companyService.getAllCompanies(); + List responses = companies.stream().map(CompanyResponse::fromDto).toList(); + return ResponseEntity.ok(responses); + } + + // 단일 조회 + @GetMapping("/{companyId}") + public ResponseEntity getCompanyById(@PathVariable UUID companyId) { + CompanyDto oneCompany = companyService.getCompanyById(companyId); + return ResponseEntity.ok(CompanyResponse.fromDto(oneCompany)); + } + + // 수정 + + // 삭제 + } From 1fb73d0b802265dcb42eea8fd26b657122e00e19 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Wed, 19 Mar 2025 02:40:29 +0900 Subject: [PATCH 080/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20Hub=20=EA=B8=B0?= =?UTF-8?q?=EB=B3=B8=20CRUD=20=EA=B5=AC=ED=98=84=20-=20=EA=B5=AC=EC=A1=B0?= =?UTF-8?q?=20=EB=A7=9E=EC=B6=B0=EC=84=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hub-service/build.gradle | 4 ++ .../domain/repository/HubRepository.java | 16 ------ .../application/dto/HubCreateResponseDto.java | 4 +- .../application/dto/HubDeleteResponseDto.java | 2 +- .../application/dto/HubRequestDto.java | 2 +- .../application/dto/HubResponseDto.java | 4 +- .../application/dto/HubUpdateRequestDto.java | 2 +- .../application/dto/HubUpdateResponseDto.java | 4 +- .../application/service/HubService.java | 50 +++++++++---------- .../{ => hub}/domain/model/Hub.java | 6 +-- .../{ => hub}/domain/model/HubRoute.java | 6 +-- .../domain/model/HubRouteCheckpoint.java | 6 +-- .../hub/domain/repository/HubRepository.java | 10 ++++ .../persistence/JPAHubRepository.java | 11 ++++ .../controller/HubController.java | 36 ++++++------- .../presentation/HubController.java | 17 ------- 16 files changed, 81 insertions(+), 99 deletions(-) delete mode 100644 hub-service/src/main/java/com/sparta/hubservice/domain/repository/HubRepository.java rename hub-service/src/main/java/com/sparta/hubservice/{ => hub}/application/dto/HubCreateResponseDto.java (83%) rename hub-service/src/main/java/com/sparta/hubservice/{ => hub}/application/dto/HubDeleteResponseDto.java (86%) rename hub-service/src/main/java/com/sparta/hubservice/{ => hub}/application/dto/HubRequestDto.java (87%) rename hub-service/src/main/java/com/sparta/hubservice/{ => hub}/application/dto/HubResponseDto.java (90%) rename hub-service/src/main/java/com/sparta/hubservice/{ => hub}/application/dto/HubUpdateRequestDto.java (88%) rename hub-service/src/main/java/com/sparta/hubservice/{ => hub}/application/dto/HubUpdateResponseDto.java (88%) rename hub-service/src/main/java/com/sparta/hubservice/{ => hub}/application/service/HubService.java (50%) rename hub-service/src/main/java/com/sparta/hubservice/{ => hub}/domain/model/Hub.java (90%) rename hub-service/src/main/java/com/sparta/hubservice/{ => hub}/domain/model/HubRoute.java (89%) rename hub-service/src/main/java/com/sparta/hubservice/{ => hub}/domain/model/HubRouteCheckpoint.java (88%) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/JPAHubRepository.java rename hub-service/src/main/java/com/sparta/hubservice/{ => hub/presentation}/controller/HubController.java (59%) delete mode 100644 hub-service/src/main/java/com/sparta/hubservice/presentation/HubController.java diff --git a/hub-service/build.gradle b/hub-service/build.gradle index 8adac4d..330baa5 100644 --- a/hub-service/build.gradle +++ b/hub-service/build.gradle @@ -5,6 +5,10 @@ ext { dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' + implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' + + implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' } dependencyManagement { diff --git a/hub-service/src/main/java/com/sparta/hubservice/domain/repository/HubRepository.java b/hub-service/src/main/java/com/sparta/hubservice/domain/repository/HubRepository.java deleted file mode 100644 index 63529c1..0000000 --- a/hub-service/src/main/java/com/sparta/hubservice/domain/repository/HubRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.sparta.hubservice.domain.repository; - -import com.sparta.hubservice.application.dto.HubResponseDto; -import com.sparta.hubservice.domain.model.Hub; -import java.util.UUID; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface HubRepository extends JpaRepository { - Page findAllAndIsDeletedFalse(Pageable pageable); - - boolean existsByName(String name); -} diff --git a/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubCreateResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubCreateResponseDto.java similarity index 83% rename from hub-service/src/main/java/com/sparta/hubservice/application/dto/HubCreateResponseDto.java rename to hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubCreateResponseDto.java index 3b19a99..cbf8f2a 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubCreateResponseDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubCreateResponseDto.java @@ -1,6 +1,6 @@ -package com.sparta.hubservice.application.dto; +package com.sparta.hubservice.hub.application.dto; -import com.sparta.hubservice.domain.model.Hub; +import com.sparta.hubservice.hub.domain.model.Hub; import java.time.LocalDateTime; import java.util.UUID; import lombok.Builder; diff --git a/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubDeleteResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubDeleteResponseDto.java similarity index 86% rename from hub-service/src/main/java/com/sparta/hubservice/application/dto/HubDeleteResponseDto.java rename to hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubDeleteResponseDto.java index 5d3f098..7b20efa 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubDeleteResponseDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubDeleteResponseDto.java @@ -1,4 +1,4 @@ -package com.sparta.hubservice.application.dto; +package com.sparta.hubservice.hub.application.dto; import java.util.UUID; import lombok.Builder; diff --git a/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubRequestDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubRequestDto.java similarity index 87% rename from hub-service/src/main/java/com/sparta/hubservice/application/dto/HubRequestDto.java rename to hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubRequestDto.java index e6315a0..c673942 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubRequestDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubRequestDto.java @@ -1,4 +1,4 @@ -package com.sparta.hubservice.application.dto; +package com.sparta.hubservice.hub.application.dto; import java.math.BigDecimal; import lombok.AllArgsConstructor; diff --git a/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubResponseDto.java similarity index 90% rename from hub-service/src/main/java/com/sparta/hubservice/application/dto/HubResponseDto.java rename to hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubResponseDto.java index a550150..1fcbcf8 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubResponseDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubResponseDto.java @@ -1,6 +1,6 @@ -package com.sparta.hubservice.application.dto; +package com.sparta.hubservice.hub.application.dto; -import com.sparta.hubservice.domain.model.Hub; +import com.sparta.hubservice.hub.domain.model.Hub; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.UUID; diff --git a/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubUpdateRequestDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateRequestDto.java similarity index 88% rename from hub-service/src/main/java/com/sparta/hubservice/application/dto/HubUpdateRequestDto.java rename to hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateRequestDto.java index e6b129a..0c9662e 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubUpdateRequestDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateRequestDto.java @@ -1,4 +1,4 @@ -package com.sparta.hubservice.application.dto; +package com.sparta.hubservice.hub.application.dto; import java.math.BigDecimal; import java.util.UUID; diff --git a/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubUpdateResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateResponseDto.java similarity index 88% rename from hub-service/src/main/java/com/sparta/hubservice/application/dto/HubUpdateResponseDto.java rename to hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateResponseDto.java index a2cbfe2..be8eee7 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/application/dto/HubUpdateResponseDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateResponseDto.java @@ -1,6 +1,6 @@ -package com.sparta.hubservice.application.dto; +package com.sparta.hubservice.hub.application.dto; -import com.sparta.hubservice.domain.model.Hub; +import com.sparta.hubservice.hub.domain.model.Hub; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.UUID; diff --git a/hub-service/src/main/java/com/sparta/hubservice/application/service/HubService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java similarity index 50% rename from hub-service/src/main/java/com/sparta/hubservice/application/service/HubService.java rename to hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java index b71c836..f0caae1 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/application/service/HubService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java @@ -1,55 +1,53 @@ -package com.sparta.hubservice.application.service; +package com.sparta.hubservice.hub.application.service; import com.sparta.commonmodule.exception.DuplicateResourceException; import com.sparta.commonmodule.exception.ResourceNotFoundException; -import com.sparta.hubservice.application.dto.HubCreateResponseDto; -import com.sparta.hubservice.application.dto.HubDeleteResponseDto; -import com.sparta.hubservice.application.dto.HubRequestDto; -import com.sparta.hubservice.application.dto.HubResponseDto; -import com.sparta.hubservice.application.dto.HubUpdateRequestDto; -import com.sparta.hubservice.application.dto.HubUpdateResponseDto; -import com.sparta.hubservice.domain.model.Hub; -import com.sparta.hubservice.domain.repository.HubRepository; +import com.sparta.hubservice.hub.application.dto.HubCreateResponseDto; +import com.sparta.hubservice.hub.application.dto.HubDeleteResponseDto; +import com.sparta.hubservice.hub.application.dto.HubRequestDto; +import com.sparta.hubservice.hub.application.dto.HubResponseDto; +import com.sparta.hubservice.hub.application.dto.HubUpdateRequestDto; +import com.sparta.hubservice.hub.application.dto.HubUpdateResponseDto; +import com.sparta.hubservice.hub.domain.model.Hub; +import com.sparta.hubservice.hub.infrastructure.persistence.JPAHubRepository; import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor @Slf4j +@Transactional public class HubService { - private final HubRepository hubRepository; + private final JPAHubRepository hubRepository; // 허브 목록 조회 @Transactional(readOnly = true) - public ResponseEntity> getHubs(Pageable pageable) { - Page hubResponseDtos = hubRepository.findAllAndIsDeletedFalse(pageable); - if (hubResponseDtos.isEmpty()) { + public Page getHubs(Pageable pageable) { + Page hubPages = hubRepository.findByIsDeletedFalse(pageable); + if (hubPages.isEmpty()) { log.error("not found hubs"); throw new ResourceNotFoundException(); } - return new ResponseEntity<>(hubResponseDtos, HttpStatus.OK); + return hubPages.map(HubResponseDto::new); } // 특정 허브 조회 @Transactional(readOnly = true) - public ResponseEntity getHub(UUID hubId) { + public HubResponseDto getHub(UUID hubId) { Hub hubDetail = hubRepository.findById(hubId) .orElseThrow(ResourceNotFoundException::new); - return ResponseEntity.ok(new HubResponseDto(hubDetail)); + return new HubResponseDto(hubDetail); } // 허브 생성 - @Transactional - public ResponseEntity createHub(HubRequestDto hubRequestDto, long userId) { + public HubCreateResponseDto createHub(HubRequestDto hubRequestDto, long userId) { if(hubRepository.existsByName(hubRequestDto.getName())){ throw new DuplicateResourceException(); } @@ -62,26 +60,24 @@ public ResponseEntity createHub(HubRequestDto hubRequestDt .build(); Hub savedHub = hubRepository.save(hub); - return ResponseEntity.ok(new HubCreateResponseDto(savedHub, "Hub successfully created.")); + return new HubCreateResponseDto(savedHub, "Hub successfully created."); } // 허브 수정 - @Transactional - public ResponseEntity updateHub(HubUpdateRequestDto requestDto, long userId) { + public HubUpdateResponseDto updateHub(HubUpdateRequestDto requestDto, long userId) { Hub hub = hubRepository.findById(requestDto.getHubId()) .orElseThrow(ResourceNotFoundException::new); hub.updateHub(requestDto.getAddress(), requestDto.getLatitude(), requestDto.getLongitude(), userId); - return ResponseEntity.ok(new HubUpdateResponseDto(hub, "Hub successfully updated.")); + return new HubUpdateResponseDto(hub, "Hub successfully updated."); } // 허브삭제 (Soft Delete) - @Transactional - public ResponseEntity deleteHub(UUID hubId, long userId) { + public HubDeleteResponseDto deleteHub(UUID hubId, long userId) { Hub hub = hubRepository.findById(hubId) .orElseThrow(ResourceNotFoundException::new); hub.delete(userId); - return ResponseEntity.ok(new HubDeleteResponseDto(hubId, "Hub successfully deleted.")); + return new HubDeleteResponseDto(hubId, "Hub successfully deleted."); } } diff --git a/hub-service/src/main/java/com/sparta/hubservice/domain/model/Hub.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/Hub.java similarity index 90% rename from hub-service/src/main/java/com/sparta/hubservice/domain/model/Hub.java rename to hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/Hub.java index 52e055a..b3076f5 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/domain/model/Hub.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/Hub.java @@ -1,4 +1,4 @@ -package com.sparta.hubservice.domain.model; +package com.sparta.hubservice.hub.domain.model; import com.sparta.commonmodule.entity.BaseEntity; import jakarta.persistence.Column; @@ -13,7 +13,6 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import org.hibernate.annotations.UuidGenerator; @Entity @Getter @@ -21,9 +20,8 @@ @Table(name = "p_hub") public class Hub extends BaseEntity { @Id + @GeneratedValue(strategy = GenerationType.UUID) @Column(name = "hub_id", nullable = false) - @GeneratedValue(strategy = GenerationType.IDENTITY) - @UuidGenerator private UUID hubId; @Column(unique = true, nullable = false, length = 255) diff --git a/hub-service/src/main/java/com/sparta/hubservice/domain/model/HubRoute.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubRoute.java similarity index 89% rename from hub-service/src/main/java/com/sparta/hubservice/domain/model/HubRoute.java rename to hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubRoute.java index 78bd650..e49e054 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/domain/model/HubRoute.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubRoute.java @@ -1,4 +1,4 @@ -package com.sparta.hubservice.domain.model; +package com.sparta.hubservice.hub.domain.model; import com.sparta.commonmodule.entity.BaseEntity; import jakarta.persistence.Column; @@ -15,7 +15,6 @@ import java.util.UUID; import lombok.Getter; import lombok.NoArgsConstructor; -import org.hibernate.annotations.UuidGenerator; @Entity @Getter @@ -24,9 +23,8 @@ public class HubRoute extends BaseEntity { @Id + @GeneratedValue(strategy = GenerationType.UUID) @Column(name = "hub_route_id", nullable = false) - @GeneratedValue(strategy = GenerationType.IDENTITY) - @UuidGenerator private UUID hubRouteId; @ManyToOne(fetch = FetchType.LAZY) diff --git a/hub-service/src/main/java/com/sparta/hubservice/domain/model/HubRouteCheckpoint.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubRouteCheckpoint.java similarity index 88% rename from hub-service/src/main/java/com/sparta/hubservice/domain/model/HubRouteCheckpoint.java rename to hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubRouteCheckpoint.java index 681f65a..7975ec2 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/domain/model/HubRouteCheckpoint.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubRouteCheckpoint.java @@ -1,4 +1,4 @@ -package com.sparta.hubservice.domain.model; +package com.sparta.hubservice.hub.domain.model; import com.sparta.commonmodule.entity.BaseEntity; import jakarta.persistence.Column; @@ -13,7 +13,6 @@ import java.util.UUID; import lombok.Getter; import lombok.NoArgsConstructor; -import org.hibernate.annotations.UuidGenerator; @Entity @Getter @@ -22,9 +21,8 @@ public class HubRouteCheckpoint extends BaseEntity { @Id + @GeneratedValue(strategy = GenerationType.UUID) @Column(name = "hub_route_checkpoint_id", nullable = false) - @GeneratedValue(strategy = GenerationType.IDENTITY) - @UuidGenerator private UUID hubRouteCheckpointId; @ManyToOne(fetch = FetchType.LAZY) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java new file mode 100644 index 0000000..db7c88b --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java @@ -0,0 +1,10 @@ +package com.sparta.hubservice.hub.domain.repository; + +import com.sparta.hubservice.hub.domain.model.Hub; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +public interface HubRepository { + Page findByIsDeletedFalse(Pageable pageable); + boolean existsByName(String name); +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/JPAHubRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/JPAHubRepository.java new file mode 100644 index 0000000..44ab2f7 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/JPAHubRepository.java @@ -0,0 +1,11 @@ +package com.sparta.hubservice.hub.infrastructure.persistence; + +import com.sparta.hubservice.hub.domain.model.Hub; +import com.sparta.hubservice.hub.domain.repository.HubRepository; +import java.util.UUID; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface JPAHubRepository extends JpaRepository, HubRepository { +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/controller/HubController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java similarity index 59% rename from hub-service/src/main/java/com/sparta/hubservice/controller/HubController.java rename to hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java index bc39661..c1cb12f 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/controller/HubController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java @@ -1,12 +1,12 @@ -package com.sparta.hubservice.controller; +package com.sparta.hubservice.hub.presentation.controller; -import com.sparta.hubservice.application.dto.HubCreateResponseDto; -import com.sparta.hubservice.application.dto.HubDeleteResponseDto; -import com.sparta.hubservice.application.dto.HubRequestDto; -import com.sparta.hubservice.application.dto.HubResponseDto; -import com.sparta.hubservice.application.dto.HubUpdateRequestDto; -import com.sparta.hubservice.application.dto.HubUpdateResponseDto; -import com.sparta.hubservice.application.service.HubService; +import com.sparta.hubservice.hub.application.dto.HubCreateResponseDto; +import com.sparta.hubservice.hub.application.dto.HubDeleteResponseDto; +import com.sparta.hubservice.hub.application.dto.HubRequestDto; +import com.sparta.hubservice.hub.application.dto.HubResponseDto; +import com.sparta.hubservice.hub.application.dto.HubUpdateRequestDto; +import com.sparta.hubservice.hub.application.dto.HubUpdateResponseDto; +import com.sparta.hubservice.hub.application.service.HubService; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; @@ -30,35 +30,35 @@ public class HubController { private final HubService hubService; - @GetMapping - public ResponseEntity hubTest(){ - return ResponseEntity.ok("connect hub-service"); - } - @GetMapping public ResponseEntity> getHubs( @PageableDefault(page = 0, size = 10, sort = "createdAt") Pageable pageable) { - return hubService.getHubs(pageable); + Page responseDtos = hubService.getHubs(pageable); + return ResponseEntity.ok(responseDtos); } @GetMapping("/{hub_id}") public ResponseEntity getHubById(@PathVariable("hub_id") UUID hubId) { - return hubService.getHub(hubId); + HubResponseDto responseDto = hubService.getHub(hubId); + return ResponseEntity.ok(responseDto); } @PostMapping public ResponseEntity createHub(@RequestBody HubRequestDto requestDto, @RequestParam long userId) { - return hubService.createHub(requestDto, userId); + HubCreateResponseDto responseDto = hubService.createHub(requestDto, userId); + return ResponseEntity.ok(responseDto); } @PutMapping public ResponseEntity updateHub(@RequestBody HubUpdateRequestDto requestDto, @RequestParam long userId) { - return hubService.updateHub(requestDto, userId); + HubUpdateResponseDto responseDto = hubService.updateHub(requestDto, userId); + return ResponseEntity.ok(responseDto); } @DeleteMapping("{hub_id}") public ResponseEntity deleteHub(@PathVariable("hub_id") UUID hubId, @RequestParam long userId) { - return hubService.deleteHub(hubId, userId); + HubDeleteResponseDto responseDto = hubService.deleteHub(hubId, userId); + return ResponseEntity.ok(responseDto); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/presentation/HubController.java b/hub-service/src/main/java/com/sparta/hubservice/presentation/HubController.java deleted file mode 100644 index 80e5784..0000000 --- a/hub-service/src/main/java/com/sparta/hubservice/presentation/HubController.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.sparta.hubservice.presentation; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/v1/hubs") -public class HubController { - - @GetMapping - public ResponseEntity hubTest(){ - return ResponseEntity.ok("connect hub-service"); - } - -} From d3bfa195eeff4f96c062e4b14e4489aa655933c6 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Wed, 19 Mar 2025 04:50:09 +0900 Subject: [PATCH 081/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20Hub=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20CRUD=20=EC=88=98=EC=A0=95=20-=20DDD=20?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EB=B9=84=EC=A6=88?= =?UTF-8?q?=EB=8B=88=EC=8A=A4=20=EB=A1=9C=EC=A7=81=20=EB=B6=84=EB=A6=AC?= =?UTF-8?q?=ED=95=98=EC=97=AC=20DomainService=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/HubUpdateRequestDto.java | 1 - .../hub/application/service/HubService.java | 42 +++++++++---------- .../hub/domain/repository/HubRepository.java | 6 +++ .../hub/domain/service/HubDomainService.java | 38 +++++++++++++++++ .../controller/HubController.java | 6 +-- 5 files changed, 66 insertions(+), 27 deletions(-) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/domain/service/HubDomainService.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateRequestDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateRequestDto.java index 0c9662e..38c84f4 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateRequestDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateRequestDto.java @@ -13,7 +13,6 @@ @Builder public class HubUpdateRequestDto { - private UUID hubId; private String address; private BigDecimal latitude; private BigDecimal longitude; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java index f0caae1..18292d8 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java @@ -9,7 +9,8 @@ import com.sparta.hubservice.hub.application.dto.HubUpdateRequestDto; import com.sparta.hubservice.hub.application.dto.HubUpdateResponseDto; import com.sparta.hubservice.hub.domain.model.Hub; -import com.sparta.hubservice.hub.infrastructure.persistence.JPAHubRepository; +import com.sparta.hubservice.hub.domain.repository.HubRepository; +import com.sparta.hubservice.hub.domain.service.HubDomainService; import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -21,10 +22,10 @@ @Service @RequiredArgsConstructor @Slf4j -@Transactional public class HubService { - private final JPAHubRepository hubRepository; + private final HubDomainService hubDomainService; + private final HubRepository hubRepository; // 허브 목록 조회 @Transactional(readOnly = true) @@ -40,44 +41,39 @@ public Page getHubs(Pageable pageable) { // 특정 허브 조회 @Transactional(readOnly = true) public HubResponseDto getHub(UUID hubId) { - Hub hubDetail = hubRepository.findById(hubId) - .orElseThrow(ResourceNotFoundException::new); - + Hub hubDetail = hubRepository.findById(hubId).orElseThrow(ResourceNotFoundException::new); return new HubResponseDto(hubDetail); } // 허브 생성 + @Transactional public HubCreateResponseDto createHub(HubRequestDto hubRequestDto, long userId) { - if(hubRepository.existsByName(hubRequestDto.getName())){ + if(hubRepository.existsByName(hubRequestDto.getName())) { throw new DuplicateResourceException(); } - Hub hub = Hub.builder() - .name(hubRequestDto.getName()) - .address(hubRequestDto.getAddress()) - .latitude(hubRequestDto.getLatitude()) - .longitude(hubRequestDto.getLongitude()) - .userId(userId) - .build(); - Hub savedHub = hubRepository.save(hub); + Hub savedHub = hubDomainService.createHub(userId, hubRequestDto.getName(), hubRequestDto.getAddress(), hubRequestDto.getLatitude(), hubRequestDto.getLongitude()); + hubRepository.save(savedHub); return new HubCreateResponseDto(savedHub, "Hub successfully created."); } // 허브 수정 - public HubUpdateResponseDto updateHub(HubUpdateRequestDto requestDto, long userId) { - Hub hub = hubRepository.findById(requestDto.getHubId()) - .orElseThrow(ResourceNotFoundException::new); + @Transactional + public HubUpdateResponseDto updateHub(UUID hubId, HubUpdateRequestDto requestDto, long userId) { + Hub hub = hubRepository.findById(hubId).orElseThrow(ResourceNotFoundException::new); - hub.updateHub(requestDto.getAddress(), requestDto.getLatitude(), requestDto.getLongitude(), userId); + hubDomainService.updateHub(hub, userId, requestDto.getAddress() , requestDto.getLatitude(), requestDto.getLongitude()); + hubRepository.save(hub); return new HubUpdateResponseDto(hub, "Hub successfully updated."); } // 허브삭제 (Soft Delete) + @Transactional public HubDeleteResponseDto deleteHub(UUID hubId, long userId) { - Hub hub = hubRepository.findById(hubId) - .orElseThrow(ResourceNotFoundException::new); + Hub hub = hubRepository.findById(hubId).orElseThrow(ResourceNotFoundException::new); - hub.delete(userId); - return new HubDeleteResponseDto(hubId, "Hub successfully deleted."); + hubDomainService.deleteHub(hub, userId); + hubRepository.save(hub); + return new HubDeleteResponseDto(hub.getHubId(), "Hub successfully deleted."); } } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java index db7c88b..78f642c 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java @@ -1,10 +1,16 @@ package com.sparta.hubservice.hub.domain.repository; import com.sparta.hubservice.hub.domain.model.Hub; +import java.util.Optional; +import java.util.UUID; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; public interface HubRepository { Page findByIsDeletedFalse(Pageable pageable); boolean existsByName(String name); + + Optional findById(UUID hubId); + + void save(Hub savedHub); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/service/HubDomainService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/service/HubDomainService.java new file mode 100644 index 0000000..33ee9cc --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/service/HubDomainService.java @@ -0,0 +1,38 @@ +package com.sparta.hubservice.hub.domain.service; + +// 도메인 계층: 오직 순수한 값만 받아서 도메인 로직을 수행해야 함 +// (순수 비즈니스 규칙 실행, 객체 생성/검증/저장 책임) + +import com.sparta.hubservice.hub.domain.model.Hub; +import java.math.BigDecimal; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +@RequiredArgsConstructor +public class HubDomainService { + + // 허브 생성 + public Hub createHub(long userId, String name, String address, BigDecimal latitude, BigDecimal longitude) { + return Hub.builder() + .name(name) + .address(address) + .latitude(latitude) + .longitude(longitude) + .userId(userId) + .build(); + } + + // 허브 수정 + public void updateHub(Hub hub, long userId, String address, BigDecimal latitude, BigDecimal longitude) { + hub.updateHub(address, latitude, longitude, userId); + } + + // 허브삭제 (Soft Delete) + public void deleteHub(Hub hub, long userId) { + hub.delete(userId); + } + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java index c1cb12f..256308f 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java @@ -49,9 +49,9 @@ public ResponseEntity createHub(@RequestBody HubRequestDto return ResponseEntity.ok(responseDto); } - @PutMapping - public ResponseEntity updateHub(@RequestBody HubUpdateRequestDto requestDto, @RequestParam long userId) { - HubUpdateResponseDto responseDto = hubService.updateHub(requestDto, userId); + @PutMapping("{hub_id}") + public ResponseEntity updateHub(@PathVariable("hub_id") UUID hubId, @RequestBody HubUpdateRequestDto requestDto, @RequestParam long userId) { + HubUpdateResponseDto responseDto = hubService.updateHub(hubId, requestDto, userId); return ResponseEntity.ok(responseDto); } From ae66caa670b44425cf578b137267deb671947948 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Wed, 19 Mar 2025 10:37:28 +0900 Subject: [PATCH 082/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20Delete=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orderservice/application/service/OrderService.java | 10 ++++++++++ .../presentation/controller/Ordercontroller.java | 8 +++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java index d0949bc..15ef4a5 100644 --- a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java +++ b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; @@ -72,6 +73,7 @@ public OrderResponseDto getOrderById(UUID orderId){ ); } + // 주문 수정 @Transactional public OrderResponseDto updateOrder(UUID orderId, OrderRequestDto requestDto){ Order order = orderRepository.findById(orderId) @@ -89,7 +91,15 @@ public OrderResponseDto updateOrder(UUID orderId, OrderRequestDto requestDto){ requestDto.getRequestDetail() ); return new OrderResponseDto(order); + } + + // 주문 삭제 + @Transactional + public void deleteOrder(UUID orderId){ + Order order = orderRepository.findById(orderId) + .orElseThrow(() -> new RuntimeException("Not found id" + orderId)); + orderRepository.delete(order); } diff --git a/order-service/src/main/java/com/sparta/orderservice/presentation/controller/Ordercontroller.java b/order-service/src/main/java/com/sparta/orderservice/presentation/controller/Ordercontroller.java index 5bceab8..a9d3d59 100644 --- a/order-service/src/main/java/com/sparta/orderservice/presentation/controller/Ordercontroller.java +++ b/order-service/src/main/java/com/sparta/orderservice/presentation/controller/Ordercontroller.java @@ -37,10 +37,16 @@ public ResponseEntity getOrderById(@PathVariable UUID id){ return ResponseEntity.ok(orderService.getOrderById(id)); } - @PutMapping("{id}") + @PutMapping("/{id}") public ResponseEntity updateOrder( @PathVariable UUID id, @RequestBody OrderRequestDto orderRequestDto){ return ResponseEntity.ok(orderService.updateOrder(id,orderRequestDto)); } + + @DeleteMapping("/{id}") + public ResponseEntity deleteOrder(@PathVariable UUID id){ + orderService.deleteOrder(id); + return ResponseEntity.noContent().build(); + } } From 926cd71220ce8d1b45e244cf5f68e14cb2e52f62 Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Wed, 19 Mar 2025 12:02:38 +0900 Subject: [PATCH 083/389] =?UTF-8?q?=E2=9C=A8=20feat[#33]=20:=20shipping-se?= =?UTF-8?q?rvice=20=EB=8B=A8=EA=B1=B4=20=EC=A1=B0=ED=9A=8C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shipping-service/build.gradle | 1 + .../shippingservice/ShippingController.java | 15 ----------- ...ponseDto.java => ShippingResponseDto.java} | 6 ++--- .../application/service/ShippingService.java | 27 ++++++++++++++++--- .../presentation/ShippingController.java | 22 ++++++++++++--- .../src/main/resources/application.yaml | 17 ++++++------ 6 files changed, 53 insertions(+), 35 deletions(-) delete mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/ShippingController.java rename shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/{CreateShippingResponseDto.java => ShippingResponseDto.java} (78%) diff --git a/shipping-service/build.gradle b/shipping-service/build.gradle index c5d113a..4c5b9c3 100644 --- a/shipping-service/build.gradle +++ b/shipping-service/build.gradle @@ -8,6 +8,7 @@ dependencies { implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' implementation 'org.hibernate:hibernate-core:6.3.1.Final' implementation project(':common-module') + implementation("org.postgresql:postgresql:42.7.2") runtimeOnly 'com.h2database:h2' } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/ShippingController.java deleted file mode 100644 index 1905853..0000000 --- a/shipping-service/src/main/java/com/sparta/shippingservice/ShippingController.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.sparta.shippingservice; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/v1/shippings") -public class ShippingController { - - @GetMapping("/test") - public String getShipping() { - return "Hello World"; - } -} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/CreateShippingResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingResponseDto.java similarity index 78% rename from shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/CreateShippingResponseDto.java rename to shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingResponseDto.java index 0379ae0..5268ba8 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/CreateShippingResponseDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingResponseDto.java @@ -5,15 +5,15 @@ import java.util.UUID; -public record CreateShippingResponseDto( +public record ShippingResponseDto( UUID shippingId, String shippingAddress, String receiverName, UUID shippingManagerId, ShippingStatus status ){ - public static CreateShippingResponseDto send (Shipping shipping) { - return new CreateShippingResponseDto( + public static ShippingResponseDto send (Shipping shipping) { + return new ShippingResponseDto( shipping.getId(), shipping.getShippingAddress(), shipping.getReceiverName(), diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java index eb4074e..bc2c021 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -1,13 +1,18 @@ package com.sparta.shippingservice.application.service; import com.sparta.shippingservice.application.dto.request.CreateShippingRequestDto; -import com.sparta.shippingservice.application.dto.response.CreateShippingResponseDto; +import com.sparta.shippingservice.application.dto.response.ShippingResponseDto; import com.sparta.shippingservice.domain.model.Shipping; import com.sparta.shippingservice.domain.repository.ShippingRepository; +import com.sparta.commonmodule.exception.*; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +import java.util.UUID; @Service @@ -15,13 +20,27 @@ public class ShippingService { private final ShippingRepository shippingRepository; - public CreateShippingResponseDto create(@Valid CreateShippingRequestDto request){ + + @Transactional + public ShippingResponseDto create(@Valid CreateShippingRequestDto request){ Shipping shipping = request.tobe().toShipping(); - shippingRepository.save(shipping); + shippingRepository.save(shipping); //DB 저장 + + return ShippingResponseDto.send(shipping); + } - return CreateShippingResponseDto.send(shipping); + @Transactional(readOnly = true) + public ShippingResponseDto getShippingById(UUID shippingId){ + Shipping shipping = shippingRepository.findById(shippingId).orElseThrow( + () -> new ResourceNotFoundException("찾을 수 없는 배송 정보 입니다.") + ); + return ShippingResponseDto.send(shipping); } + + + + } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index d8ef3d0..5f750bd 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -1,7 +1,7 @@ package com.sparta.shippingservice.presentation; import com.sparta.shippingservice.application.dto.request.CreateShippingRequestDto; -import com.sparta.shippingservice.application.dto.response.CreateShippingResponseDto; +import com.sparta.shippingservice.application.dto.response.ShippingResponseDto; import com.sparta.shippingservice.application.service.ShippingService; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -9,15 +9,29 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; +import java.util.UUID; + @RestController @RequestMapping("/api/v1/shippings") @RequiredArgsConstructor public class ShippingController { private final ShippingService shippingService; - @PostMapping() - public ResponseEntityShipping(@Valid @RequestBody CreateShippingRequestDto requestDto) { - CreateShippingResponseDto responseDto = shippingService.create(requestDto); + @PostMapping() // 배송 생성 + public ResponseEntityShipping(@Valid @RequestBody CreateShippingRequestDto requestDto) { + ShippingResponseDto responseDto = shippingService.create(requestDto); return ResponseEntity.status(HttpStatus.CREATED).body(responseDto); } + + @GetMapping("/{id}") // 특정 배송 정보 조회 + public ResponseEntity getShippingById(@PathVariable UUID id){ + ShippingResponseDto responseDto = shippingService.getShippingById(id); + return ResponseEntity.status(HttpStatus.OK).body(responseDto); + } + +// @GetMapping() +// public ResponseEntity> getAllShipping(){ +// return ResponseEntity.status(HttpStatus.OK).body() +// } } diff --git a/shipping-service/src/main/resources/application.yaml b/shipping-service/src/main/resources/application.yaml index 754efb8..b452be1 100644 --- a/shipping-service/src/main/resources/application.yaml +++ b/shipping-service/src/main/resources/application.yaml @@ -2,17 +2,16 @@ spring: application: name: shipping-service datasource: - url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS TEST - username: sa - password: + url: jdbc:postgresql://localhost:5432/shipping + username: myuser + password: mypassword + driver-class-name: org.postgresql.Driver + jpa: - database-platform: org.hibernate.dialect.H2Dialect hibernate: - ddl-auto: update # 또는 create - h2: - console: - enabled: true - path: /h2-console + ddl-auto: update + show-sql: true # 실행되는 SQL 쿼리 출력 + database-platform: org.hibernate.dialect.PostgreSQLDialect server: port: 8088 From 22a5abf2178e17c1f0275230a674372af725d0a8 Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Wed, 19 Mar 2025 12:18:06 +0900 Subject: [PATCH 084/389] =?UTF-8?q?=F0=9F=90=9B=20bugfix=20:=20OrderServic?= =?UTF-8?q?e=20=EC=B6=A9=EB=8F=8C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orderservice/application/service/OrderService.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java index 14d3bf8..68686b3 100644 --- a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java +++ b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java @@ -1,19 +1,14 @@ package com.sparta.orderservice.application.service; import com.sparta.orderservice.application.dto.OrderRequestDto; -<<<<<<< HEAD import com.sparta.orderservice.application.dto.OrderResponseDto; import com.sparta.orderservice.domain.model.Order; import com.sparta.orderservice.domain.model.OrderStatus; -======= -import com.sparta.orderservice.domain.model.Order; ->>>>>>> 7deb867 (application - service - OrderService create 기능구현) import com.sparta.orderservice.domain.repository.OrderRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -<<<<<<< HEAD import java.util.List; import java.util.UUID; import java.util.stream.Collectors; From d41087902493f9acf4b889d0a123a76dfec8f4eb Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Wed, 19 Mar 2025 14:06:14 +0900 Subject: [PATCH 085/389] .xml .iml --- .idea/compiler.xml | 25 ------------------- .../logistics-delivery.common-module.main.iml | 8 ------ ...ogistics-delivery.company-service.main.iml | 8 ------ .../eureka/logistics-delivery.eureka.main.iml | 8 ------ .../logistics-delivery.gateway.main.iml | 8 ------ ...ogistics-delivery.product-service.main.iml | 8 ------ ...gistics-delivery.shipping-service.main.iml | 8 ------ .../logistics-delivery.slack-service.main.iml | 8 ------ .../logistics-delivery.user-service.main.iml | 8 ------ 9 files changed, 89 deletions(-) delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/modules/common-module/logistics-delivery.common-module.main.iml delete mode 100644 .idea/modules/company-service/logistics-delivery.company-service.main.iml delete mode 100644 .idea/modules/eureka/logistics-delivery.eureka.main.iml delete mode 100644 .idea/modules/gateway/logistics-delivery.gateway.main.iml delete mode 100644 .idea/modules/product-service/logistics-delivery.product-service.main.iml delete mode 100644 .idea/modules/shipping-service/logistics-delivery.shipping-service.main.iml delete mode 100644 .idea/modules/slack-service/logistics-delivery.slack-service.main.iml delete mode 100644 .idea/modules/user-service/logistics-delivery.user-service.main.iml diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 9f8185a..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/common-module/logistics-delivery.common-module.main.iml b/.idea/modules/common-module/logistics-delivery.common-module.main.iml deleted file mode 100644 index c9a4af1..0000000 --- a/.idea/modules/common-module/logistics-delivery.common-module.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/company-service/logistics-delivery.company-service.main.iml b/.idea/modules/company-service/logistics-delivery.company-service.main.iml deleted file mode 100644 index f924b0e..0000000 --- a/.idea/modules/company-service/logistics-delivery.company-service.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/eureka/logistics-delivery.eureka.main.iml b/.idea/modules/eureka/logistics-delivery.eureka.main.iml deleted file mode 100644 index 421c373..0000000 --- a/.idea/modules/eureka/logistics-delivery.eureka.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/gateway/logistics-delivery.gateway.main.iml b/.idea/modules/gateway/logistics-delivery.gateway.main.iml deleted file mode 100644 index f96a052..0000000 --- a/.idea/modules/gateway/logistics-delivery.gateway.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/product-service/logistics-delivery.product-service.main.iml b/.idea/modules/product-service/logistics-delivery.product-service.main.iml deleted file mode 100644 index 3250472..0000000 --- a/.idea/modules/product-service/logistics-delivery.product-service.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/shipping-service/logistics-delivery.shipping-service.main.iml b/.idea/modules/shipping-service/logistics-delivery.shipping-service.main.iml deleted file mode 100644 index 3d45724..0000000 --- a/.idea/modules/shipping-service/logistics-delivery.shipping-service.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/slack-service/logistics-delivery.slack-service.main.iml b/.idea/modules/slack-service/logistics-delivery.slack-service.main.iml deleted file mode 100644 index d30f1d8..0000000 --- a/.idea/modules/slack-service/logistics-delivery.slack-service.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/user-service/logistics-delivery.user-service.main.iml b/.idea/modules/user-service/logistics-delivery.user-service.main.iml deleted file mode 100644 index 5a00956..0000000 --- a/.idea/modules/user-service/logistics-delivery.user-service.main.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file From dc9580d325e6c38fa6e5adf0ab18511251d9d6e5 Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Wed, 19 Mar 2025 15:13:38 +0900 Subject: [PATCH 086/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#69]=20:=20?= =?UTF-8?q?=EB=AA=A8=EB=93=A0=20=EB=B0=B0=EC=86=A1=20=EB=82=B4=EC=97=AD=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/ShippingService.java | 21 +++++++++++++++++++ .../domain/repository/ShippingRepository.java | 2 ++ .../presentation/ShippingController.java | 9 ++++---- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java index bc2c021..37b0fbb 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -12,7 +12,9 @@ import org.springframework.transaction.annotation.Transactional; +import java.util.List; import java.util.UUID; +import java.util.stream.Collectors; @Service @@ -39,6 +41,25 @@ public ShippingResponseDto getShippingById(UUID shippingId){ } + @Transactional(readOnly = true) + public List getAllShipping(){ + + List result = shippingRepository.findAll(); + return result.stream() + .map( shipping -> new ShippingResponseDto( + shipping.getId(), + shipping.getShippingAddress(), + shipping.getReceiverName(), + shipping.getShippingManagerId(), + shipping.getStatus() + )) + .collect(Collectors.toList()); + + + + } + + diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRepository.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRepository.java index 0533c5d..fdb7815 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRepository.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRepository.java @@ -4,6 +4,7 @@ import com.sparta.shippingservice.domain.model.Shipping; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; import java.util.UUID; @@ -11,4 +12,5 @@ public interface ShippingRepository { Shipping save(Shipping shipping); Optional findById(UUID id); + List findAll(); } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index 5f750bd..f4fcd95 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -30,8 +30,9 @@ public ResponseEntity getShippingById(@PathVariable UUID id return ResponseEntity.status(HttpStatus.OK).body(responseDto); } -// @GetMapping() -// public ResponseEntity> getAllShipping(){ -// return ResponseEntity.status(HttpStatus.OK).body() -// } + @GetMapping() //모든 배송 내역 조회 + public ResponseEntity> getAllShipping(){ + List allShipping = shippingService.getAllShipping(); + return ResponseEntity.status(HttpStatus.OK).body(allShipping); + } } From 30253788bf53737ac47ddda3a98e36e06ac338b4 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 19 Mar 2025 15:44:15 +0900 Subject: [PATCH 087/389] =?UTF-8?q?=F0=9F=90=9B=20bugfix[#70]:=20Eureka=20?= =?UTF-8?q?&=20Gateway=20=EC=84=9C=EB=B2=84=20=EC=8B=A4=ED=96=89=20?= =?UTF-8?q?=EC=8B=9C=20DataSource=20=EC=98=A4=EB=A5=98=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eureka/src/main/resources/application.yml | 2 ++ gateway/src/main/resources/application.yml | 14 ++++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/eureka/src/main/resources/application.yml b/eureka/src/main/resources/application.yml index bb6cc50..026ddae 100644 --- a/eureka/src/main/resources/application.yml +++ b/eureka/src/main/resources/application.yml @@ -1,6 +1,8 @@ spring: application: name: eureka + autoconfigure: + exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration server: port: 8761 diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index e8a0fe4..591475d 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -6,9 +6,11 @@ spring: web-application-type: reactive application: name: gateway-service + autoconfigure: + exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration cloud: gateway: - routes: # Spring Cloud Gateway? ??? ?? + routes: # Spring Cloud Gateway? ??? ?? - id: user-service # ??? ??? uri: lb://user-service # 'user-service'?? ???? ?? ???? ???? ??? predicates: @@ -16,7 +18,7 @@ spring: - id: order-service uri: lb://order-service predicates: - - Path=/api/v1/orders/** + - Path=/api/v1/orders/** - id: company-service uri: lb://company-service predicates: @@ -41,10 +43,10 @@ spring: uri: lb://payment-service predicates: - Path=/api/v1/payments/** -# - id: auth-service -# uri: lb://auth-service -# predicates: -# - Path=/api/v1/auth/** + # - id: auth-service + # uri: lb://auth-service + # predicates: + # - Path=/api/v1/auth/** discovery: locator: enabled: true # ??? ?????? ?? ???? ???? ????? ?? From 9ae72db9fffaf5c2289c80ec81ce3b9e23e556f7 Mon Sep 17 00:00:00 2001 From: jiyun Date: Wed, 19 Mar 2025 14:09:46 +0900 Subject: [PATCH 088/389] =?UTF-8?q?=E2=9C=A8=20feature=20[#63]=20CompanyUp?= =?UTF-8?q?dateRequest=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/request/CompanyUpdateRequest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java b/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java new file mode 100644 index 0000000..e401305 --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java @@ -0,0 +1,12 @@ +package com.sparta.companyservice.presentation.request; + +import com.sparta.companyservice.domain.model.CompanyType; + +import java.util.UUID; + +public record CompanyUpdateRequest ( + String name, + String address, + UUID hub_id, + CompanyType type + ) {} From 68459df1b73867dbfc115024916906377727a8c0 Mon Sep 17 00:00:00 2001 From: jiyun Date: Wed, 19 Mar 2025 16:29:59 +0900 Subject: [PATCH 089/389] =?UTF-8?q?=E2=9C=A8=20feature=20[#63]=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=A1=9C=EC=A7=81=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/CompanyCreateDto.java | 13 ++++ .../application/service/CompanyService.java | 63 +++++++++++++++---- .../companyservice/domain/model/Company.java | 58 ++++++++++++++++- .../domain/service/CompanyDomainService.java | 46 -------------- .../controller/CompanyController.java | 14 ++++- .../request/CompanyCreateRequest.java | 9 ++- 6 files changed, 138 insertions(+), 65 deletions(-) create mode 100644 company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyCreateDto.java delete mode 100644 company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java diff --git a/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyCreateDto.java b/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyCreateDto.java new file mode 100644 index 0000000..c0dd91e --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyCreateDto.java @@ -0,0 +1,13 @@ +package com.sparta.companyservice.application.dto; + +import com.sparta.companyservice.domain.model.CompanyType; + +import java.util.UUID; + +// Controller로부터 받은 요청 데이터를 내부 비즈니스 로직에서 사용할 수 있게 가공한 객체 +public record CompanyCreateDto ( + String name, + CompanyType type, + UUID hubId, + String address +) {} diff --git a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java index 9ce5644..a9786ec 100644 --- a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java +++ b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java @@ -1,11 +1,16 @@ package com.sparta.companyservice.application.service; +import com.sparta.commonmodule.exception.ResourceNotFoundException; +import com.sparta.companyservice.application.dto.CompanyCreateDto; import com.sparta.companyservice.application.dto.CompanyDto; import com.sparta.companyservice.domain.model.Company; -import com.sparta.companyservice.domain.service.CompanyDomainService; +import com.sparta.companyservice.domain.repository.CompanyRepository; +import com.sparta.companyservice.infrastructure.client.HubClient; import com.sparta.companyservice.presentation.request.CompanyCreateRequest; +import com.sparta.companyservice.presentation.request.CompanyUpdateRequest; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.UUID; @@ -13,30 +18,62 @@ @Service @RequiredArgsConstructor public class CompanyService { - private final CompanyDomainService companyDomainService; + private final CompanyRepository companyRepository; + private final HubClient hubClient; - public CompanyDto createCompany(CompanyCreateRequest request) { - long userId = 1L; // 실제로는 인증된 사용자 ID 가져와야 함 - Company company = companyDomainService.create( - request.name(), - request.type(), - request.hub_id(), - request.address(), + long userId = 1L; // 실제로는 인증된 사용자 ID 가져와야 함 + + @Transactional // 생성 + public CompanyDto createCompany(CompanyCreateDto dto) { + validateHubExists(dto.hubId()); + Company company = Company.create( + dto.name(), + dto.address(), + dto.hubId(), + dto.type(), userId ); - // presentation에서 받은 요청을 파싱해서 domainService에 넘기고 처리 결과를 DTO로 만들어서 다시 controller로 반환 - return CompanyDto.fromEntity(company); + Company createdCompany = companyRepository.save(company); + return CompanyDto.fromEntity(createdCompany); } + @Transactional(readOnly = true) // 전체 조회 public List getAllCompanies() { - return companyDomainService.findAll() + return companyRepository.findAll() .stream() .map(CompanyDto::fromEntity) .toList(); } + @Transactional(readOnly = true) // 단일 조회 public CompanyDto getCompanyById(UUID id) { - Company company = companyDomainService.findById(id); + Company company = companyRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("해당 업체를 찾을 수 없습니다.")); return CompanyDto.fromEntity(company); } + + @Transactional // 수정 + public CompanyDto updateCompany(UUID id, CompanyUpdateRequest request) { + Company company = findCompany(id); + + company.update( + request.name(), + request.address(), + request.hub_id(), + request.type(), + userId + ); + return CompanyDto.fromEntity(companyRepository.save(company)); + } + + /// //////////////////////////////////////////////////////////// + + private void validateHubExists(UUID hubId) { + if (!hubClient.existsById(hubId)) { + throw new ResourceNotFoundException("해당 허브가 존재하지 않습니다."); + } + } + + private Company findCompany(UUID id) { + return companyRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("해당 업체를 찾을 수 없습니다.")); + } } \ No newline at end of file diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java index ba23297..b7cb502 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java @@ -27,7 +27,7 @@ public class Company extends BaseEntity { @Column(nullable = false, columnDefinition = "TEXT") private String address; - @Builder + @Builder // 도메인 객체 생성 책임은 create()가 지고, 그 내부에서 builder로 객체 생성 public Company(UUID id, String name, CompanyType type, UUID hubId, String address, long userId) { super(userId); this.id = id; @@ -36,5 +36,61 @@ public Company(UUID id, String name, CompanyType type, UUID hubId, String addres this.hubId = hubId; this.address = address; } + + public static Company create(String name, String address, UUID hubId, CompanyType type, long userId) { + validateCompany(name, address, hubId, type); + return Company.builder() + .id(UUID.randomUUID()) + .name(name) + .address(address) + .hubId(hubId) + .type(type) + .userId(userId) + .build(); + } + + public void update(String newName, String newAddress, UUID newHubId, CompanyType newType, long userId) { + validateCompany(newName, newAddress, newHubId, newType); + this.name = newName; + this.address = newAddress; + this.hubId = newHubId; + this.type = newType; + super.update(userId); + } + + /// //////////////////////////////////////////////////////////// + + // 업체 생성, 수정 시 검증 + + private static void validateCompany(String newName, String newAddress, UUID newHubId, CompanyType newType) { + validateCompanyNewName(newName); + validateCompanyNewAddress(newAddress); + validateCompanyNewHubId(newHubId); + validateCompanyNewType(newType); + } + + private static void validateCompanyNewType(CompanyType newType) { + if(newType == null) { + throw new IllegalArgumentException("업체 type은 null일 수 없습니다."); + } + } + + private static void validateCompanyNewHubId(UUID newHubId) { + if (newHubId == null) { + throw new IllegalArgumentException("소속 Hub는 null일 수 없습니다."); + } + } + + private static void validateCompanyNewAddress(String newAddress) { + if (newAddress == null) { + throw new IllegalArgumentException("주소는 null일 수 없습니다."); + } + } + + private static void validateCompanyNewName(String newName) { + if (newName == null) { + throw new IllegalArgumentException("업체명은 null일 수 없습니다."); + } + } } diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java b/company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java deleted file mode 100644 index 28102fc..0000000 --- a/company-service/src/main/java/com/sparta/companyservice/domain/service/CompanyDomainService.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.sparta.companyservice.domain.service; - -import com.sparta.commonmodule.exception.ResourceNotFoundException; -import com.sparta.companyservice.domain.model.Company; -import com.sparta.companyservice.domain.model.CompanyType; -import com.sparta.companyservice.domain.repository.CompanyRepository; -import com.sparta.companyservice.infrastructure.client.HubClient; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.UUID; - -// 도메인 계층: 오직 순수한 값만 받아서 도메인 로직을 수행해야 함 (순수 비즈니스 규칙 실행, 객체 생성/검증/저장 책임) - -@Service -@RequiredArgsConstructor -public class CompanyDomainService { - private final CompanyRepository companyRepository; - private final HubClient hubClient; - - public Company create(String name, CompanyType type, UUID hubId, String address, long userId) { - if (!hubClient.existsById(hubId)) { - throw new ResourceNotFoundException("해당 허브가 존재하지 않습니다. 허브 ID: " + hubId); - } - - Company company = Company.builder() - .id(UUID.randomUUID()) - .name(name) - .type(type) - .hubId(hubId) - .address(address) - .userId(userId) - .build(); - return companyRepository.save(company); - } - - - public List findAll() { - return companyRepository.findAll(); - } - - public Company findById(UUID id) { - return companyRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("해당 업체를 찾을 수 없습니다.")); - } -} diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java index b082191..1ec5b53 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -2,8 +2,11 @@ import com.sparta.companyservice.application.dto.CompanyDto; import com.sparta.companyservice.application.service.CompanyService; +import com.sparta.companyservice.domain.model.Company; import com.sparta.companyservice.presentation.request.CompanyCreateRequest; +import com.sparta.companyservice.presentation.request.CompanyUpdateRequest; import com.sparta.companyservice.presentation.response.CompanyResponse; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -20,9 +23,9 @@ public class CompanyController { // 생성 @PostMapping - public ResponseEntity createCompany(@RequestBody CompanyCreateRequest request) { - CompanyDto created = companyService.createCompany(request); - return ResponseEntity.ok(CompanyResponse.fromDto(created)); + public ResponseEntity createCompany(@Valid @RequestBody CompanyCreateRequest request) { + CompanyDto createdCompany = companyService.createCompany(request.toDto()); + return ResponseEntity.ok(CompanyResponse.fromDto(createdCompany)); } // 전체 조회 @@ -41,6 +44,11 @@ public ResponseEntity getCompanyById(@PathVariable UUID company } // 수정 + @PatchMapping("/{companyId}") + public ResponseEntity updateCompany(@PathVariable UUID companyId, @RequestBody CompanyUpdateRequest request) { + CompanyDto updated = companyService.updateCompany(companyId, request); + return ResponseEntity.ok(CompanyResponse.fromDto(updated)); + } // 삭제 diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyCreateRequest.java b/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyCreateRequest.java index 1f1e742..3959cea 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyCreateRequest.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyCreateRequest.java @@ -1,5 +1,6 @@ package com.sparta.companyservice.presentation.request; +import com.sparta.companyservice.application.dto.CompanyCreateDto; import com.sparta.companyservice.domain.model.CompanyType; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -10,9 +11,13 @@ public record CompanyCreateRequest( @NotBlank @Size(min = 3) String name, @NotNull CompanyType type, - @NotNull UUID hub_id, + @NotNull UUID hubId, @NotBlank String address -) {} +) { + public CompanyCreateDto toDto() { + return new CompanyCreateDto(name, type, hubId, address); + } +} // 레이어드 아키텍처 설계 헷갈리는 부분: CompanyCreateRequest가 application 계층의 dto가 아니라 왜 presentation 계층? // ㄴ CompanyCreateRequest는 클라이언트에서 컨트롤러로 들어오는 HTTP 요청을 담는 객체이기 때문에 presentation 계층에 있어야 한다. From e7ab8aeed8025f1376963f108f117044e06429a2 Mon Sep 17 00:00:00 2001 From: jiyun Date: Wed, 19 Mar 2025 16:41:22 +0900 Subject: [PATCH 090/389] =?UTF-8?q?=E2=9C=A8=20feature=20[#63]=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/CompanyUpdateDto.java | 12 ++++++++++++ .../application/service/CompanyService.java | 18 +++++++++--------- .../companyservice/domain/model/Company.java | 5 +++-- .../controller/CompanyController.java | 7 +++---- .../request/CompanyUpdateRequest.java | 18 +++++++++++++----- 5 files changed, 40 insertions(+), 20 deletions(-) create mode 100644 company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyUpdateDto.java diff --git a/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyUpdateDto.java b/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyUpdateDto.java new file mode 100644 index 0000000..260f483 --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyUpdateDto.java @@ -0,0 +1,12 @@ +package com.sparta.companyservice.application.dto; + +import com.sparta.companyservice.domain.model.CompanyType; + +import java.util.UUID; + +public record CompanyUpdateDto( + String name, + CompanyType type, + UUID hubId, + String address +) {} diff --git a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java index a9786ec..3f54530 100644 --- a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java +++ b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java @@ -3,11 +3,10 @@ import com.sparta.commonmodule.exception.ResourceNotFoundException; import com.sparta.companyservice.application.dto.CompanyCreateDto; import com.sparta.companyservice.application.dto.CompanyDto; +import com.sparta.companyservice.application.dto.CompanyUpdateDto; import com.sparta.companyservice.domain.model.Company; import com.sparta.companyservice.domain.repository.CompanyRepository; import com.sparta.companyservice.infrastructure.client.HubClient; -import com.sparta.companyservice.presentation.request.CompanyCreateRequest; -import com.sparta.companyservice.presentation.request.CompanyUpdateRequest; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -52,20 +51,21 @@ public CompanyDto getCompanyById(UUID id) { } @Transactional // 수정 - public CompanyDto updateCompany(UUID id, CompanyUpdateRequest request) { + public CompanyDto updateCompany(UUID id, CompanyUpdateDto dto) { Company company = findCompany(id); company.update( - request.name(), - request.address(), - request.hub_id(), - request.type(), + dto.name(), + dto.address(), + dto.hubId(), + dto.type(), userId ); - return CompanyDto.fromEntity(companyRepository.save(company)); + Company saved = companyRepository.save(company); + return CompanyDto.fromEntity(saved); } - /// //////////////////////////////////////////////////////////// + /// ////////////////////////////////////////////////////////////////////////////////// private void validateHubExists(UUID hubId) { if (!hubClient.existsById(hubId)) { diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java index b7cb502..1ca08bd 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java @@ -27,7 +27,8 @@ public class Company extends BaseEntity { @Column(nullable = false, columnDefinition = "TEXT") private String address; - @Builder // 도메인 객체 생성 책임은 create()가 지고, 그 내부에서 builder로 객체 생성 + @Builder + // 도메인 객체 생성 책임은 create()가 지고, 그 내부에서 builder를 통해 객체 생성 public Company(UUID id, String name, CompanyType type, UUID hubId, String address, long userId) { super(userId); this.id = id; @@ -58,7 +59,7 @@ public void update(String newName, String newAddress, UUID newHubId, CompanyType super.update(userId); } - /// //////////////////////////////////////////////////////////// + /// /////////////////////////////////////////////////////////////////////////////////////// // 업체 생성, 수정 시 검증 diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java index 1ec5b53..4e6c802 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -2,7 +2,6 @@ import com.sparta.companyservice.application.dto.CompanyDto; import com.sparta.companyservice.application.service.CompanyService; -import com.sparta.companyservice.domain.model.Company; import com.sparta.companyservice.presentation.request.CompanyCreateRequest; import com.sparta.companyservice.presentation.request.CompanyUpdateRequest; import com.sparta.companyservice.presentation.response.CompanyResponse; @@ -45,9 +44,9 @@ public ResponseEntity getCompanyById(@PathVariable UUID company // 수정 @PatchMapping("/{companyId}") - public ResponseEntity updateCompany(@PathVariable UUID companyId, @RequestBody CompanyUpdateRequest request) { - CompanyDto updated = companyService.updateCompany(companyId, request); - return ResponseEntity.ok(CompanyResponse.fromDto(updated)); + public ResponseEntity updateCompany(@PathVariable UUID companyId, @Valid @RequestBody CompanyUpdateRequest request) { + CompanyDto updatedCompany = companyService.updateCompany(companyId, request.toDto()); + return ResponseEntity.ok(CompanyResponse.fromDto(updatedCompany)); } // 삭제 diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java b/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java index e401305..124c46d 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java @@ -1,12 +1,20 @@ package com.sparta.companyservice.presentation.request; +import com.sparta.companyservice.application.dto.CompanyUpdateDto; import com.sparta.companyservice.domain.model.CompanyType; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import java.util.UUID; public record CompanyUpdateRequest ( - String name, - String address, - UUID hub_id, - CompanyType type - ) {} + @NotBlank @Size(min = 3) String name, + @NotNull CompanyType type, + @NotNull UUID hubId, + @NotBlank String address + ) { + public CompanyUpdateDto toDto() { + return new CompanyUpdateDto(name, type, hubId, address); + } +} From ac18cae014ae0b5d033cf49ef7d951cae7c4a132 Mon Sep 17 00:00:00 2001 From: jiyun Date: Wed, 19 Mar 2025 16:49:47 +0900 Subject: [PATCH 091/389] =?UTF-8?q?=E2=99=BB=EF=B8=8Frefactor=20[#63]=20?= =?UTF-8?q?=EC=97=85=EC=B2=B4=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=20=EA=B3=B5?= =?UTF-8?q?=ED=86=B5=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../companyservice/application/service/CompanyService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java index 3f54530..0a1c1bc 100644 --- a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java +++ b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java @@ -46,8 +46,7 @@ public List getAllCompanies() { @Transactional(readOnly = true) // 단일 조회 public CompanyDto getCompanyById(UUID id) { - Company company = companyRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("해당 업체를 찾을 수 없습니다.")); - return CompanyDto.fromEntity(company); + return CompanyDto.fromEntity(findCompany(id)); } @Transactional // 수정 From 1e82d2c65852fa07ae006b46d85925806551e04d Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 19 Mar 2025 17:18:27 +0900 Subject: [PATCH 092/389] =?UTF-8?q?=E2=9C=A8=20feat[#59]:=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20=EB=8B=A8=EC=9D=BC=20=EC=A1=B0=ED=9A=8C=20Api=20?= =?UTF-8?q?=EB=B0=8F=20=EC=9D=91=EB=8B=B5=20Dto=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ProductController.java | 14 +++++++- .../dto/response/ReadProductResponseDto.java | 34 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 product-service/src/main/java/com/sparta/product/presentation/dto/response/ReadProductResponseDto.java diff --git a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java index c91d644..5c0145d 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java +++ b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java @@ -3,10 +3,13 @@ import com.sparta.product.application.service.ProductServiceImpl; import com.sparta.product.presentation.dto.request.CreateProductRequestDto; import com.sparta.product.presentation.dto.response.CreateProductResponseDto; +import com.sparta.product.presentation.dto.response.ReadProductResponseDto; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.UUID; + @RestController @RequestMapping("/api/v1/products") @RequiredArgsConstructor @@ -15,11 +18,20 @@ public class ProductController { private final ProductServiceImpl productServiceImpl; /** - * 상품 생성 + * 상품 생성 */ @PostMapping public ResponseEntity createProduct(@RequestBody CreateProductRequestDto requestDto, @RequestHeader(value = "X-User-Id", required = true) Long userId) { return ResponseEntity.ok(productServiceImpl.createProduct(requestDto, userId)); } + + + /** + * 상품 단일 조회 + */ + @GetMapping("/{productId}") + public ResponseEntity readProduct(@PathVariable UUID productId) { + return ResponseEntity.ok(productServiceImpl.readProduct(productId)); + } } diff --git a/product-service/src/main/java/com/sparta/product/presentation/dto/response/ReadProductResponseDto.java b/product-service/src/main/java/com/sparta/product/presentation/dto/response/ReadProductResponseDto.java new file mode 100644 index 0000000..703ae99 --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/presentation/dto/response/ReadProductResponseDto.java @@ -0,0 +1,34 @@ +package com.sparta.product.presentation.dto.response; + + +import com.sparta.product.domain.model.Product; +import lombok.Builder; + +import java.math.BigDecimal; +import java.util.UUID; + +@Builder +public record ReadProductResponseDto(UUID id, + String name, + String description, + BigDecimal price, + Integer quantity, + boolean isDisplay, + UUID companyId, + UUID hubId) { + + // Entity -> DTO 변환 메서드 + public static ReadProductResponseDto from(Product product) { + return ReadProductResponseDto.builder() + .id(product.getId()) + .name(product.getName()) + .description(product.getDescription()) + .price(product.getPrice()) + .quantity(product.getQuantity()) + .isDisplay(product.isDisplay()) + .companyId(product.getCompanyId()) + .hubId(product.getHubId()) + .build(); + } +} + From aa86b2f8361208eff77e8a40a5ea562ef9c2904d Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 19 Mar 2025 17:22:44 +0900 Subject: [PATCH 093/389] =?UTF-8?q?=E2=9C=A8=20feat[#59]:=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20=EB=8B=A8=EC=9D=BC=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/ProductService.java | 7 ++++++- .../service/ProductServiceImpl.java | 18 +++++++++++++++++- .../domain/repository/ProductRepository.java | 6 ++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductService.java b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java index 4532ccc..2b14d49 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductService.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java @@ -2,10 +2,15 @@ import com.sparta.product.presentation.dto.request.CreateProductRequestDto; import com.sparta.product.presentation.dto.response.CreateProductResponseDto; +import com.sparta.product.presentation.dto.response.ReadProductResponseDto; + +import java.util.UUID; public interface ProductService { - CreateProductResponseDto createProduct(CreateProductRequestDto requestDto, Long userId); + CreateProductResponseDto createProduct(CreateProductRequestDto requestDto, Long userId); + + ReadProductResponseDto readProduct(UUID productId); } diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java index 20c0ef2..ad086c4 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java @@ -1,13 +1,17 @@ package com.sparta.product.application.service; +import com.sparta.commonmodule.exception.ResourceNotFoundException; import com.sparta.product.domain.model.Product; import com.sparta.product.domain.repository.ProductRepository; import com.sparta.product.presentation.dto.request.CreateProductRequestDto; import com.sparta.product.presentation.dto.response.CreateProductResponseDto; +import com.sparta.product.presentation.dto.response.ReadProductResponseDto; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.UUID; + @Service @RequiredArgsConstructor @Transactional @@ -17,11 +21,23 @@ public class ProductServiceImpl implements ProductService { /** - * 상품 생성 + * 상품 생성 */ @Override public CreateProductResponseDto createProduct(CreateProductRequestDto requestDto, Long userId) { Product product = productRepository.save(Product.createProduct(requestDto, userId)); return CreateProductResponseDto.from(product); } + + + /** + * 상품 단일 조회 + */ + @Override + @Transactional(readOnly = true) + public ReadProductResponseDto readProduct(UUID productId) { + Product product = productRepository.findById(productId) + .orElseThrow(() -> new ResourceNotFoundException("찾을 수 없는 상품 입니다.")); + return ReadProductResponseDto.from(product); + } } diff --git a/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java b/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java index 93bf12d..ead68cf 100644 --- a/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java +++ b/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java @@ -2,7 +2,13 @@ import com.sparta.product.domain.model.Product; +import java.util.Optional; +import java.util.UUID; + public interface ProductRepository { Product save(Product product); + + Optional findById(UUID productId); + } From 6215296beb2cce5ad74f91680d08c07a0fcf2bc3 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 19 Mar 2025 17:23:29 +0900 Subject: [PATCH 094/389] =?UTF-8?q?=E2=9C=A8=20feat[#59]:=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20=EB=8B=A8=EC=9D=BC=20=EC=A1=B0=ED=9A=8C=20http=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- product-service/src/test/http/product.http | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/product-service/src/test/http/product.http b/product-service/src/test/http/product.http index ac4aad7..3bd453e 100644 --- a/product-service/src/test/http/product.http +++ b/product-service/src/test/http/product.http @@ -1,5 +1,5 @@ ### 상품 생성 -POST http://localhost:8080/api/v1/products +POST http://localhost:8083/api/v1/products Content-Type: application/json X-User-Id: 12345 # 사용자 ID (Long 타입) @@ -13,3 +13,9 @@ X-User-Id: 12345 # 사용자 ID (Long 타입) "hubId": "123e4567-e89b-12d3-a456-426614174000" } + +### 상품 단일 조회 +GET http://localhost:8083/api/v1/products/979f3da1-8082-4e4a-b136-062d4d1d56cb +Content-Type: application/json + + From 1a822e2499a7ec21c1c30bfbcb02d0e3da6babec Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 19 Mar 2025 17:37:38 +0900 Subject: [PATCH 095/389] =?UTF-8?q?=E2=9C=A8=20feat[#59]:=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20Api=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 --- .../sparta/product/presentation/ProductController.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java index 5c0145d..c8d7b2e 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java +++ b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java @@ -8,6 +8,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; import java.util.UUID; @RestController @@ -34,4 +35,13 @@ public ResponseEntity createProduct(@RequestBody Creat public ResponseEntity readProduct(@PathVariable UUID productId) { return ResponseEntity.ok(productServiceImpl.readProduct(productId)); } + + + /** + * 상품 목록 조회 + */ + @GetMapping + public ResponseEntity> readAllProduct() { + return ResponseEntity.ok(productServiceImpl.readAllProduct()); + } } From 3b129b38b24103e7e38f93ae55967cbe777a7d34 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 19 Mar 2025 17:38:54 +0900 Subject: [PATCH 096/389] =?UTF-8?q?=E2=9C=A8=20feat[#59]:=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/ProductService.java | 3 +++ .../application/service/ProductServiceImpl.java | 14 ++++++++++++++ .../domain/repository/ProductRepository.java | 2 ++ 3 files changed, 19 insertions(+) diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductService.java b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java index 2b14d49..25454b2 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductService.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java @@ -4,6 +4,7 @@ import com.sparta.product.presentation.dto.response.CreateProductResponseDto; import com.sparta.product.presentation.dto.response.ReadProductResponseDto; +import java.util.List; import java.util.UUID; @@ -13,4 +14,6 @@ public interface ProductService { ReadProductResponseDto readProduct(UUID productId); + List readAllProduct(); + } diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java index ad086c4..9239d0f 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java @@ -10,6 +10,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; import java.util.UUID; @Service @@ -40,4 +41,17 @@ public ReadProductResponseDto readProduct(UUID productId) { .orElseThrow(() -> new ResourceNotFoundException("찾을 수 없는 상품 입니다.")); return ReadProductResponseDto.from(product); } + + + /** + * 상품 목록 조회 + */ + @Override + @Transactional(readOnly = true) + public List readAllProduct() { + return productRepository.findAll() + .stream() + .map(ReadProductResponseDto::from) + .toList(); + } } diff --git a/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java b/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java index ead68cf..1ee3f05 100644 --- a/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java +++ b/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java @@ -2,6 +2,7 @@ import com.sparta.product.domain.model.Product; +import java.util.List; import java.util.Optional; import java.util.UUID; @@ -11,4 +12,5 @@ public interface ProductRepository { Optional findById(UUID productId); + List findAll(); } From 88e6008b79a118764a2a457404190776a801c435 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 19 Mar 2025 17:40:29 +0900 Subject: [PATCH 097/389] =?UTF-8?q?=E2=9C=A8=20feat[#59]:=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20http=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- product-service/src/test/http/product.http | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/product-service/src/test/http/product.http b/product-service/src/test/http/product.http index 3bd453e..d15292d 100644 --- a/product-service/src/test/http/product.http +++ b/product-service/src/test/http/product.http @@ -4,8 +4,8 @@ Content-Type: application/json X-User-Id: 12345 # 사용자 ID (Long 타입) { - "name": "마른오징어", - "description": "마른오징어 입니다.", + "name": "마른오징어3", + "description": "마른오징어 입니다3.", "price": 1000, "quantity": 50, "isDisplay": true, @@ -15,7 +15,13 @@ X-User-Id: 12345 # 사용자 ID (Long 타입) ### 상품 단일 조회 -GET http://localhost:8083/api/v1/products/979f3da1-8082-4e4a-b136-062d4d1d56cb +GET http://localhost:8083/api/v1/products/a8fe0567-e857-4427-a612-555328391a36 Content-Type: application/json +### 상품 목록 조회 +GET http://localhost:8083/api/v1/products +Content-Type: application/json + + + From 320798925bd0215ef440b5a3a0ed2fce8b8dac80 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Wed, 19 Mar 2025 20:00:28 +0900 Subject: [PATCH 098/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=A3=BC?= =?UTF-8?q?=EC=86=8C->=EC=9C=84=EA=B2=BD=EB=8F=84=20=EB=B3=80=ED=99=98=20N?= =?UTF-8?q?aver=20API=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hub-service/build.gradle | 6 +- .../hub/application/dto/GeocodeResponse.java | 18 ++++++ .../hub/application/dto/HubRequestDto.java | 3 - .../application/dto/HubUpdateRequestDto.java | 21 ------- .../service/GeocodeApiService.java | 62 +++++++++++++++++++ .../hub/application/service/HubService.java | 32 +++++++--- .../hub/domain/service/HubDomainService.java | 38 ------------ .../controller/HubController.java | 9 +-- .../src/main/resources/application.yml | 4 ++ 9 files changed, 117 insertions(+), 76 deletions(-) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/GeocodeResponse.java delete mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateRequestDto.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/application/service/GeocodeApiService.java delete mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/domain/service/HubDomainService.java diff --git a/hub-service/build.gradle b/hub-service/build.gradle index 330baa5..1d956db 100644 --- a/hub-service/build.gradle +++ b/hub-service/build.gradle @@ -7,8 +7,12 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' - implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' + // 유효성 검사 + implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + + // 공통 모듈 + implementation project(':common-module') } dependencyManagement { diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/GeocodeResponse.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/GeocodeResponse.java new file mode 100644 index 0000000..1a445a0 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/GeocodeResponse.java @@ -0,0 +1,18 @@ +package com.sparta.hubservice.hub.application.dto; + +import java.math.BigDecimal; +import lombok.Data; + +@Data +public class GeocodeResponse { + + private Address address; + + @Data + public static class Address { + private String x; // longitude + private String y; // latitude + } + + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubRequestDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubRequestDto.java index c673942..9c08a4f 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubRequestDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubRequestDto.java @@ -14,8 +14,5 @@ public class HubRequestDto { private String name; private String address; - private BigDecimal latitude; - private BigDecimal longitude; - } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateRequestDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateRequestDto.java deleted file mode 100644 index 38c84f4..0000000 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateRequestDto.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.sparta.hubservice.hub.application.dto; - -import java.math.BigDecimal; -import java.util.UUID; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class HubUpdateRequestDto { - - private String address; - private BigDecimal latitude; - private BigDecimal longitude; - - -} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/GeocodeApiService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/GeocodeApiService.java new file mode 100644 index 0000000..615ce7f --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/GeocodeApiService.java @@ -0,0 +1,62 @@ +package com.sparta.hubservice.hub.application.service; + + +import com.sparta.commonmodule.exception.OperationNotAllowedException; +import com.sparta.hubservice.hub.application.dto.GeocodeResponse; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +@Service +@Slf4j(topic = "GeocodeApiService : naver geocode api 호출") +public class GeocodeApiService { + + @Value("${naver.api.geocode.url}") + private String geocodeUrl; + + @Value("${naver.api.geocode.client-id}") + private String clientId; + + @Value("${naver.api.geocode.client-secret}") + private String clientSecret; + + private final RestTemplate restTemplate = new RestTemplate(); + + public Map getGeocodeAddress(String address) { + // URL 설정 + String uri = UriComponentsBuilder.fromHttpUrl(geocodeUrl) + .queryParam("query", address) + .toUriString(); + + // Http 요청 헤더 설정 + HttpHeaders headers = new HttpHeaders(); + headers.set("X-NCP-APIGW-API-KEY-ID", clientId); + headers.set("X-NCP-APIGW-API-KEY", clientSecret); + HttpEntity entity = new HttpEntity<>(headers); + + // API 호출 및 응답 받기 + ResponseEntity response = restTemplate.exchange(uri, HttpMethod.GET, entity, GeocodeResponse.class); + + if(response.getBody() != null && response.getBody().getAddress() != null) { + log.error("해당 주소에 대한 위도, 경도 값을 찾을 수 없습니다. Address : {}", address); + throw new OperationNotAllowedException(); + } + + // 위도, 경도 값 추출 + Map result = new HashMap<>(); + result.put("latitude", new BigDecimal(response.getBody().getAddress().getY())); + result.put("longitude", new BigDecimal(response.getBody().getAddress().getX())); + + return result; + } + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java index 18292d8..4d812fd 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java @@ -6,11 +6,11 @@ import com.sparta.hubservice.hub.application.dto.HubDeleteResponseDto; import com.sparta.hubservice.hub.application.dto.HubRequestDto; import com.sparta.hubservice.hub.application.dto.HubResponseDto; -import com.sparta.hubservice.hub.application.dto.HubUpdateRequestDto; import com.sparta.hubservice.hub.application.dto.HubUpdateResponseDto; import com.sparta.hubservice.hub.domain.model.Hub; import com.sparta.hubservice.hub.domain.repository.HubRepository; -import com.sparta.hubservice.hub.domain.service.HubDomainService; +import java.math.BigDecimal; +import java.util.Map; import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -24,7 +24,7 @@ @Slf4j public class HubService { - private final HubDomainService hubDomainService; + private final GeocodeApiService geocodeApiService; private final HubRepository hubRepository; // 허브 목록 조회 @@ -52,17 +52,30 @@ public HubCreateResponseDto createHub(HubRequestDto hubRequestDto, long userId) throw new DuplicateResourceException(); } - Hub savedHub = hubDomainService.createHub(userId, hubRequestDto.getName(), hubRequestDto.getAddress(), hubRequestDto.getLatitude(), hubRequestDto.getLongitude()); - hubRepository.save(savedHub); - return new HubCreateResponseDto(savedHub, "Hub successfully created."); + // 주소 -> 위,경도값 변환 + Map map = geocodeApiService.getGeocodeAddress(hubRequestDto.getAddress()); + + Hub createHub = Hub.builder() + .name(hubRequestDto.getName()) + .address(hubRequestDto.getAddress()) + .latitude(map.get("latitude")) + .longitude(map.get("longitude")) + .userId(userId) + .build(); + + hubRepository.save(createHub); + return new HubCreateResponseDto(createHub, "Hub successfully created."); } // 허브 수정 @Transactional - public HubUpdateResponseDto updateHub(UUID hubId, HubUpdateRequestDto requestDto, long userId) { + public HubUpdateResponseDto updateHub(UUID hubId, String address, long userId) { Hub hub = hubRepository.findById(hubId).orElseThrow(ResourceNotFoundException::new); - hubDomainService.updateHub(hub, userId, requestDto.getAddress() , requestDto.getLatitude(), requestDto.getLongitude()); + // 주소 -> 위, 경도값 변환 + Map map = geocodeApiService.getGeocodeAddress(hub.getAddress()); + hub.updateHub(address, map.get("latitude"), map.get("longitude"), userId); + hubRepository.save(hub); return new HubUpdateResponseDto(hub, "Hub successfully updated."); } @@ -72,8 +85,9 @@ public HubUpdateResponseDto updateHub(UUID hubId, HubUpdateRequestDto requestDto public HubDeleteResponseDto deleteHub(UUID hubId, long userId) { Hub hub = hubRepository.findById(hubId).orElseThrow(ResourceNotFoundException::new); - hubDomainService.deleteHub(hub, userId); + hub.delete(userId); hubRepository.save(hub); + return new HubDeleteResponseDto(hub.getHubId(), "Hub successfully deleted."); } } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/service/HubDomainService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/service/HubDomainService.java deleted file mode 100644 index 33ee9cc..0000000 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/service/HubDomainService.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.sparta.hubservice.hub.domain.service; - -// 도메인 계층: 오직 순수한 값만 받아서 도메인 로직을 수행해야 함 -// (순수 비즈니스 규칙 실행, 객체 생성/검증/저장 책임) - -import com.sparta.hubservice.hub.domain.model.Hub; -import java.math.BigDecimal; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -@Service -@Slf4j -@RequiredArgsConstructor -public class HubDomainService { - - // 허브 생성 - public Hub createHub(long userId, String name, String address, BigDecimal latitude, BigDecimal longitude) { - return Hub.builder() - .name(name) - .address(address) - .latitude(latitude) - .longitude(longitude) - .userId(userId) - .build(); - } - - // 허브 수정 - public void updateHub(Hub hub, long userId, String address, BigDecimal latitude, BigDecimal longitude) { - hub.updateHub(address, latitude, longitude, userId); - } - - // 허브삭제 (Soft Delete) - public void deleteHub(Hub hub, long userId) { - hub.delete(userId); - } - -} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java index 256308f..6eb9265 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java @@ -4,9 +4,9 @@ import com.sparta.hubservice.hub.application.dto.HubDeleteResponseDto; import com.sparta.hubservice.hub.application.dto.HubRequestDto; import com.sparta.hubservice.hub.application.dto.HubResponseDto; -import com.sparta.hubservice.hub.application.dto.HubUpdateRequestDto; import com.sparta.hubservice.hub.application.dto.HubUpdateResponseDto; import com.sparta.hubservice.hub.application.service.HubService; +import jakarta.validation.Valid; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; @@ -44,14 +44,14 @@ public ResponseEntity getHubById(@PathVariable("hub_id") UUID hu } @PostMapping - public ResponseEntity createHub(@RequestBody HubRequestDto requestDto, @RequestParam long userId) { + public ResponseEntity createHub(@RequestBody @Valid HubRequestDto requestDto, @RequestParam long userId) { HubCreateResponseDto responseDto = hubService.createHub(requestDto, userId); return ResponseEntity.ok(responseDto); } @PutMapping("{hub_id}") - public ResponseEntity updateHub(@PathVariable("hub_id") UUID hubId, @RequestBody HubUpdateRequestDto requestDto, @RequestParam long userId) { - HubUpdateResponseDto responseDto = hubService.updateHub(hubId, requestDto, userId); + public ResponseEntity updateHub(@PathVariable("hub_id") UUID hubId, @RequestParam String address, @RequestParam long userId) { + HubUpdateResponseDto responseDto = hubService.updateHub(hubId, address, userId); return ResponseEntity.ok(responseDto); } @@ -62,4 +62,5 @@ public ResponseEntity deleteHub(@PathVariable("hub_id") UU } + } diff --git a/hub-service/src/main/resources/application.yml b/hub-service/src/main/resources/application.yml index ec35b6f..39f5dfd 100644 --- a/hub-service/src/main/resources/application.yml +++ b/hub-service/src/main/resources/application.yml @@ -1,6 +1,10 @@ spring: application: name: hub-service + config: + import: "application-secret.yml" + autoconfigure: + exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration server: port: 8082 From a02922c47f1009d38db88e91e86dd20ace998925 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Wed, 19 Mar 2025 20:01:12 +0900 Subject: [PATCH 099/389] =?UTF-8?q?=F0=9F=99=88=20gitfix=20:=20=EC=8B=9C?= =?UTF-8?q?=ED=81=AC=EB=A6=BF=ED=82=A4=20=EB=B3=B4=EA=B4=80=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20gitignore=EC=97=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index f3a40c6..fc97a18 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,9 @@ *.crt *.pfx +# 시크릿키 보관 파일 +application-secret.yml + # DB 및 로그 파일 *.db *.sqlite From c44e80edf667f1f86ee4ff3d05cb08ed397f481d Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 19 Mar 2025 21:20:20 +0900 Subject: [PATCH 100/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#77]=20:=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EC=88=98=EC=A0=95=20Api=20=EB=B0=8F=20Dto?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ProductController.java | 14 ++++++++++ .../dto/request/UpdateProductRequestDto.java | 9 +++++++ .../response/UpdateProductResponseDto.java | 26 +++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 product-service/src/main/java/com/sparta/product/presentation/dto/request/UpdateProductRequestDto.java create mode 100644 product-service/src/main/java/com/sparta/product/presentation/dto/response/UpdateProductResponseDto.java diff --git a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java index c8d7b2e..0d24135 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java +++ b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java @@ -1,9 +1,12 @@ package com.sparta.product.presentation; +import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.application.service.ProductServiceImpl; import com.sparta.product.presentation.dto.request.CreateProductRequestDto; +import com.sparta.product.presentation.dto.request.UpdateProductRequestDto; import com.sparta.product.presentation.dto.response.CreateProductResponseDto; import com.sparta.product.presentation.dto.response.ReadProductResponseDto; +import com.sparta.product.presentation.dto.response.UpdateProductResponseDto; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -44,4 +47,15 @@ public ResponseEntity readProduct(@PathVariable UUID pro public ResponseEntity> readAllProduct() { return ResponseEntity.ok(productServiceImpl.readAllProduct()); } + + + /** + * 상품 수정 + */ + @PutMapping("/{productId}") + public ResponseEntity updateProduct(@PathVariable UUID productId, + @RequestBody UpdateProductRequestDto requestDto) { + return ResponseEntity.ok(productServiceImpl.updateProduct( + UpdateProductServiceRequestDto.of(requestDto, productId))); + } } diff --git a/product-service/src/main/java/com/sparta/product/presentation/dto/request/UpdateProductRequestDto.java b/product-service/src/main/java/com/sparta/product/presentation/dto/request/UpdateProductRequestDto.java new file mode 100644 index 0000000..e56a329 --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/presentation/dto/request/UpdateProductRequestDto.java @@ -0,0 +1,9 @@ +package com.sparta.product.presentation.dto.request; + +import java.math.BigDecimal; + +public record UpdateProductRequestDto(String name, + String description, + BigDecimal price, + boolean isDisplay) { +} diff --git a/product-service/src/main/java/com/sparta/product/presentation/dto/response/UpdateProductResponseDto.java b/product-service/src/main/java/com/sparta/product/presentation/dto/response/UpdateProductResponseDto.java new file mode 100644 index 0000000..294e35c --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/presentation/dto/response/UpdateProductResponseDto.java @@ -0,0 +1,26 @@ +package com.sparta.product.presentation.dto.response; + +import com.sparta.product.domain.model.Product; +import lombok.Builder; + +import java.math.BigDecimal; +import java.util.UUID; + +@Builder +public record UpdateProductResponseDto(UUID id, + String name, + String description, + BigDecimal price, + boolean isDisplay) { + + // Entity -> DTO 변환 메서드 + public static UpdateProductResponseDto from(Product product) { + return UpdateProductResponseDto.builder() + .id(product.getId()) + .name(product.getName()) + .description(product.getDescription()) + .price(product.getPrice()) + .isDisplay(product.isDisplay()) + .build(); + } +} From cc67d6a3511e8bb67ab6daf8e1f347ae32f928d8 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Wed, 19 Mar 2025 21:20:55 +0900 Subject: [PATCH 101/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20:=20Ord?= =?UTF-8?q?er=20entity=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orderservice/domain/model/Order.java | 20 +++---------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java b/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java index cf5f9d5..6865ad8 100644 --- a/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java +++ b/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java @@ -1,5 +1,6 @@ package com.sparta.orderservice.domain.model; +import com.sparta.commonmodule.entity.BaseEntity; import jakarta.persistence.*; import lombok.*; import org.hibernate.annotations.CreationTimestamp; @@ -17,7 +18,7 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor @Builder -public class Order { +public class Order extends BaseEntity { @Id @GeneratedValue @@ -46,22 +47,6 @@ public class Order { @Lob private String requestDetail; // 요청 사항 - @CreationTimestamp - @Column(nullable = false, updatable = false) - private LocalDateTime createdAt; // 주문 생성 시간 - - @Column(nullable = false) - private UUID createdBy; // 주문자 ID - - @UpdateTimestamp - private LocalDateTime updatedAt; // 수정 시간 - - private UUID updatedBy; // 수정자 ID - - private LocalDateTime deletedAt; // 삭제 시간 - - private UUID deletedBy; // 삭제자 ID - @Lob private String cancelReason; // 주문 취소 사유 @@ -70,6 +55,7 @@ public class Order { private List orderItems = new ArrayList<>(); // 주문 아이템 1:N 관계 설정 + // 주문 update 메서드 public void updateOrderDetails(String name, UUID supplierId, UUID receiverId, UUID productId, BigDecimal totalPrice, String requestDetail) { this.name = name; From 5a3c70cf220291733ab040f4b9895aa726b1c8fd Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 19 Mar 2025 21:21:47 +0900 Subject: [PATCH 102/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#77]=20:=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=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 --- .../dto/UpdateProductServiceRequestDto.java | 28 +++++++++++++++++++ .../application/service/ProductService.java | 5 +++- .../service/ProductServiceImpl.java | 14 ++++++++++ .../sparta/product/domain/model/Product.java | 15 ++++++++-- 4 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 product-service/src/main/java/com/sparta/product/application/dto/UpdateProductServiceRequestDto.java diff --git a/product-service/src/main/java/com/sparta/product/application/dto/UpdateProductServiceRequestDto.java b/product-service/src/main/java/com/sparta/product/application/dto/UpdateProductServiceRequestDto.java new file mode 100644 index 0000000..9379b0d --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/application/dto/UpdateProductServiceRequestDto.java @@ -0,0 +1,28 @@ +package com.sparta.product.application.dto; + + +import com.sparta.product.presentation.dto.request.UpdateProductRequestDto; +import lombok.Builder; + +import java.math.BigDecimal; +import java.util.UUID; + +@Builder +public record UpdateProductServiceRequestDto(UUID id, + String name, + String description, + BigDecimal price, + boolean isDisplay +) { + + // 요청 DTO -> 서비스 DTO 변환 메서드 + public static UpdateProductServiceRequestDto of(UpdateProductRequestDto request, UUID productId) { + return UpdateProductServiceRequestDto.builder() + .id(productId) + .name(request.name()) + .description(request.description()) + .price(request.price()) + .isDisplay(request.isDisplay()) + .build(); + } +} diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductService.java b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java index 25454b2..636884e 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductService.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java @@ -1,8 +1,10 @@ package com.sparta.product.application.service; +import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.presentation.dto.request.CreateProductRequestDto; import com.sparta.product.presentation.dto.response.CreateProductResponseDto; import com.sparta.product.presentation.dto.response.ReadProductResponseDto; +import com.sparta.product.presentation.dto.response.UpdateProductResponseDto; import java.util.List; import java.util.UUID; @@ -15,5 +17,6 @@ public interface ProductService { ReadProductResponseDto readProduct(UUID productId); List readAllProduct(); - + + UpdateProductResponseDto updateProduct(UpdateProductServiceRequestDto requestDto); } diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java index 9239d0f..233a7b7 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java @@ -1,11 +1,13 @@ package com.sparta.product.application.service; import com.sparta.commonmodule.exception.ResourceNotFoundException; +import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.domain.model.Product; import com.sparta.product.domain.repository.ProductRepository; import com.sparta.product.presentation.dto.request.CreateProductRequestDto; import com.sparta.product.presentation.dto.response.CreateProductResponseDto; import com.sparta.product.presentation.dto.response.ReadProductResponseDto; +import com.sparta.product.presentation.dto.response.UpdateProductResponseDto; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -54,4 +56,16 @@ public List readAllProduct() { .map(ReadProductResponseDto::from) .toList(); } + + + /** + * 상품 수정 + */ + @Override + public UpdateProductResponseDto updateProduct(UpdateProductServiceRequestDto serviceDto) { + Product product = productRepository.findById(serviceDto.id()) + .orElseThrow(() -> new ResourceNotFoundException("찾을 수 없는 상품 입니다.")); + product.updateProduct(serviceDto); + return UpdateProductResponseDto.from(product); + } } diff --git a/product-service/src/main/java/com/sparta/product/domain/model/Product.java b/product-service/src/main/java/com/sparta/product/domain/model/Product.java index 4f01a18..b1eb777 100644 --- a/product-service/src/main/java/com/sparta/product/domain/model/Product.java +++ b/product-service/src/main/java/com/sparta/product/domain/model/Product.java @@ -2,6 +2,7 @@ import com.sparta.commonmodule.entity.BaseEntity; +import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.presentation.dto.request.CreateProductRequestDto; import com.sparta.product.presentation.dto.response.CreateProductResponseDto; import jakarta.persistence.*; @@ -46,9 +47,8 @@ public class Product extends BaseEntity { private UUID hubId; - /** - * 상품 생성 + * 상품 생성 */ public static Product createProduct(CreateProductRequestDto requestDto, Long userId) { return Product.builder() @@ -63,7 +63,18 @@ public static Product createProduct(CreateProductRequestDto requestDto, Long use } + /** + * 상품 수정 + */ + public Product updateProduct(UpdateProductServiceRequestDto serviceDto) { + this.name = serviceDto.name(); + this.description = serviceDto.description(); + this.price = serviceDto.price(); + this.isDisplay = serviceDto.isDisplay(); + return this; + } + // DTO -> Entity 변환 메서드 public static Product of(CreateProductResponseDto responseDto) { return Product.builder() From 9b5003f2304d23a2596c2bdfdac00d54f29507d8 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 19 Mar 2025 21:22:50 +0900 Subject: [PATCH 103/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#77]=20:=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EC=88=98=EC=A0=95=20http=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- product-service/src/test/http/product.http | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/product-service/src/test/http/product.http b/product-service/src/test/http/product.http index d15292d..5b373b0 100644 --- a/product-service/src/test/http/product.http +++ b/product-service/src/test/http/product.http @@ -24,4 +24,13 @@ GET http://localhost:8083/api/v1/products Content-Type: application/json +### 상품 수정 +PUT http://localhost:8083/api/v1/products/69e23662-9e36-4172-96db-8003308fcb45 +Content-Type: application/json +{ + "name": "마른오징어 수정", + "description": "마른오징어 입니다 수정.", + "price": 3000, + "isDisplay": false +} From c89abf1f6e7c2f79dcda1c00d0442fc15e77fbc0 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Wed, 19 Mar 2025 22:13:08 +0900 Subject: [PATCH 104/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20:=20Ord?= =?UTF-8?q?erRepository=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/repository/OrderRepository.java | 10 +++++++--- .../repository/JpaOrderRepository.java | 13 +++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 order-service/src/main/java/com/sparta/orderservice/infrastructure/repository/JpaOrderRepository.java diff --git a/order-service/src/main/java/com/sparta/orderservice/domain/repository/OrderRepository.java b/order-service/src/main/java/com/sparta/orderservice/domain/repository/OrderRepository.java index 1a0e4e4..0efc45b 100644 --- a/order-service/src/main/java/com/sparta/orderservice/domain/repository/OrderRepository.java +++ b/order-service/src/main/java/com/sparta/orderservice/domain/repository/OrderRepository.java @@ -1,10 +1,14 @@ package com.sparta.orderservice.domain.repository; import com.sparta.orderservice.domain.model.Order; -import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; +import java.util.Optional; import java.util.UUID; -public interface OrderRepository extends JpaRepository { - +public interface OrderRepository { + Order save(Order order); + Optional findById(UUID orderId); + List findAll(); + void delete(Order order); } diff --git a/order-service/src/main/java/com/sparta/orderservice/infrastructure/repository/JpaOrderRepository.java b/order-service/src/main/java/com/sparta/orderservice/infrastructure/repository/JpaOrderRepository.java new file mode 100644 index 0000000..2b42eea --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/infrastructure/repository/JpaOrderRepository.java @@ -0,0 +1,13 @@ +package com.sparta.orderservice.infrastructure.repository; + +import com.sparta.orderservice.domain.model.Order; +import com.sparta.orderservice.domain.repository.OrderRepository; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + +@Repository +public interface JpaOrderRepository extends OrderRepository, JpaRepository { + +} From 86bbc9fb5152f650b3772a365a29d150cfb8280f Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 19 Mar 2025 23:28:07 +0900 Subject: [PATCH 105/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#82]=20:=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EC=82=AD=EC=A0=9C=20Api=20=EB=B0=8F=20Dto?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/DeleteProductServiceRequestDto.java | 19 +++++++++++++++++++ .../presentation/ProductController.java | 13 +++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 product-service/src/main/java/com/sparta/product/application/dto/DeleteProductServiceRequestDto.java diff --git a/product-service/src/main/java/com/sparta/product/application/dto/DeleteProductServiceRequestDto.java b/product-service/src/main/java/com/sparta/product/application/dto/DeleteProductServiceRequestDto.java new file mode 100644 index 0000000..12eb24e --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/application/dto/DeleteProductServiceRequestDto.java @@ -0,0 +1,19 @@ +package com.sparta.product.application.dto; + +import lombok.Builder; + +import java.util.UUID; + +@Builder +public record DeleteProductServiceRequestDto(Long userId, + UUID productId) { + + // 요청 값 -> 서비스 DTO 변환 메서드 + public static DeleteProductServiceRequestDto of(Long userId, + UUID productId) { + return DeleteProductServiceRequestDto.builder() + .userId(userId) + .productId(productId) + .build(); + } +} diff --git a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java index 0d24135..e1594a1 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java +++ b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java @@ -1,5 +1,6 @@ package com.sparta.product.presentation; +import com.sparta.product.application.dto.DeleteProductServiceRequestDto; import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.application.service.ProductServiceImpl; import com.sparta.product.presentation.dto.request.CreateProductRequestDto; @@ -58,4 +59,16 @@ public ResponseEntity updateProduct(@PathVariable UUID return ResponseEntity.ok(productServiceImpl.updateProduct( UpdateProductServiceRequestDto.of(requestDto, productId))); } + + + /** + * 상품 삭제 + */ + @DeleteMapping("/{productId}") + public ResponseEntity deleteProduct(@PathVariable UUID productId, + @RequestHeader(value = "X-User-Id", required = true) Long userId) { + productServiceImpl.deleteProduct( + DeleteProductServiceRequestDto.of(userId, productId)); + return ResponseEntity.noContent().build(); + } } From 4d6e0fc089be5c1a01302697601d97b83a8aa79b Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 19 Mar 2025 23:28:55 +0900 Subject: [PATCH 106/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#82]=20:=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EC=82=AD=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=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 --- .../product/application/service/ProductService.java | 5 ++++- .../application/service/ProductServiceImpl.java | 12 ++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductService.java b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java index 636884e..4f068a5 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductService.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java @@ -1,5 +1,6 @@ package com.sparta.product.application.service; +import com.sparta.product.application.dto.DeleteProductServiceRequestDto; import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.presentation.dto.request.CreateProductRequestDto; import com.sparta.product.presentation.dto.response.CreateProductResponseDto; @@ -18,5 +19,7 @@ public interface ProductService { List readAllProduct(); - UpdateProductResponseDto updateProduct(UpdateProductServiceRequestDto requestDto); + UpdateProductResponseDto updateProduct(UpdateProductServiceRequestDto serviceDto); + + void deleteProduct(DeleteProductServiceRequestDto serviceDto); } diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java index 233a7b7..a073d4a 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java @@ -1,6 +1,7 @@ package com.sparta.product.application.service; import com.sparta.commonmodule.exception.ResourceNotFoundException; +import com.sparta.product.application.dto.DeleteProductServiceRequestDto; import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.domain.model.Product; import com.sparta.product.domain.repository.ProductRepository; @@ -68,4 +69,15 @@ public UpdateProductResponseDto updateProduct(UpdateProductServiceRequestDto ser product.updateProduct(serviceDto); return UpdateProductResponseDto.from(product); } + + + /** + * 상품 삭제 + */ + @Override + public void deleteProduct(DeleteProductServiceRequestDto serviceDto) { + Product product = productRepository.findById(serviceDto.productId()) + .orElseThrow(() -> new ResourceNotFoundException("찾을 수 없는 상품 입니다.")); + product.delete(serviceDto.userId()); + } } From 856142f52970ecf6ce4b42c67a7039cf115c2487 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 19 Mar 2025 23:30:19 +0900 Subject: [PATCH 107/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#82]=20:=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EC=82=AD=EC=A0=9C=20http=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- product-service/src/test/http/product.http | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/product-service/src/test/http/product.http b/product-service/src/test/http/product.http index 5b373b0..5c53bf5 100644 --- a/product-service/src/test/http/product.http +++ b/product-service/src/test/http/product.http @@ -34,3 +34,8 @@ Content-Type: application/json "price": 3000, "isDisplay": false } + + +### 상품 삭제 +DELETE http://localhost:8083/api/v1/products/225dc81a-7b96-4905-83b9-16945fef9a7d +X-User-Id: 12345 # 사용자 ID (Long 타입) \ No newline at end of file From 4ad01a301d131aa64025ca5ef7ce4c6ee1eb152a Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Thu, 20 Mar 2025 00:41:41 +0900 Subject: [PATCH 108/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#83]?= =?UTF-8?q?=20:=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=AA=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=B0=8F=20=EC=A3=BC=EC=84=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/request/CreateShippingRequestDto.java | 2 +- .../application/dto/response/ShippingResponseDto.java | 2 +- .../com/sparta/shippingservice/domain/model/ShippingSelf.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java index 039d798..e576e3a 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java @@ -27,7 +27,7 @@ public record CreateShippingRequestDto( ShippingStatus status ) { - public ShippingSelf tobe(){ + public ShippingSelf of(){ return new ShippingSelf( this.orderId(), this.shippingAddress(), diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingResponseDto.java index 5268ba8..34cdfc5 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingResponseDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingResponseDto.java @@ -12,7 +12,7 @@ public record ShippingResponseDto( UUID shippingManagerId, ShippingStatus status ){ - public static ShippingResponseDto send (Shipping shipping) { + public static ShippingResponseDto from (Shipping shipping) { return new ShippingResponseDto( shipping.getId(), shipping.getShippingAddress(), diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingSelf.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingSelf.java index 2331606..d613cf8 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingSelf.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingSelf.java @@ -7,7 +7,7 @@ public record ShippingSelf(UUID orderId, String receiverName, UUID shippingManagerId, ShippingStatus status) { - public Shipping toShipping(){ + public Shipping toShipping(){ // DTO - > entity 전환 return new Shipping( this.orderId, this.shippingAddress, From 9027a25f608a1ba98368c85118ded629defa8c80 Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Thu, 20 Mar 2025 00:42:55 +0900 Subject: [PATCH 109/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#83]=20:=20Shipping?= =?UTF-8?q?=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/UpdateShippingRequestDto.java | 32 ++++++++++++ .../application/service/ShippingService.java | 26 ++++++---- .../domain/model/Shipping.java | 50 +++++++++++++------ .../presentation/ShippingController.java | 14 ++++-- 4 files changed, 93 insertions(+), 29 deletions(-) create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/UpdateShippingRequestDto.java diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/UpdateShippingRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/UpdateShippingRequestDto.java new file mode 100644 index 0000000..ce7b694 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/UpdateShippingRequestDto.java @@ -0,0 +1,32 @@ +package com.sparta.shippingservice.application.dto.request; + +import com.sparta.shippingservice.domain.model.ShippingStatus; + +import java.util.Optional; +import java.util.UUID; + + +public record UpdateShippingRequestDto( + Optional orderId, + Optional shippingAddress, + Optional receiverName, + Optional shippingManagerId, + Optional status +) { + public static UpdateShippingRequestDto of( + UUID orderId, + String shippingAddress, + String receiverName, + UUID shippingManagerId, + ShippingStatus status + ) { + return new UpdateShippingRequestDto( + Optional.ofNullable(orderId), + Optional.ofNullable(shippingAddress), + Optional.ofNullable(receiverName), + Optional.ofNullable(shippingManagerId), + Optional.ofNullable(status) + ); + } +} + diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java index 37b0fbb..8a0d28d 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -1,6 +1,7 @@ package com.sparta.shippingservice.application.service; import com.sparta.shippingservice.application.dto.request.CreateShippingRequestDto; +import com.sparta.shippingservice.application.dto.request.UpdateShippingRequestDto; import com.sparta.shippingservice.application.dto.response.ShippingResponseDto; import com.sparta.shippingservice.domain.model.Shipping; import com.sparta.shippingservice.domain.repository.ShippingRepository; @@ -24,29 +25,29 @@ public class ShippingService { @Transactional - public ShippingResponseDto create(@Valid CreateShippingRequestDto request){ + public ShippingResponseDto create(@Valid CreateShippingRequestDto request) { - Shipping shipping = request.tobe().toShipping(); + Shipping shipping = request.of().toShipping(); shippingRepository.save(shipping); //DB 저장 - return ShippingResponseDto.send(shipping); + return ShippingResponseDto.from(shipping); } @Transactional(readOnly = true) - public ShippingResponseDto getShippingById(UUID shippingId){ + public ShippingResponseDto getShippingById(UUID shippingId) { Shipping shipping = shippingRepository.findById(shippingId).orElseThrow( () -> new ResourceNotFoundException("찾을 수 없는 배송 정보 입니다.") ); - return ShippingResponseDto.send(shipping); + return ShippingResponseDto.from(shipping); } @Transactional(readOnly = true) - public List getAllShipping(){ + public List getAllShipping() { List result = shippingRepository.findAll(); return result.stream() - .map( shipping -> new ShippingResponseDto( + .map(shipping -> new ShippingResponseDto( shipping.getId(), shipping.getShippingAddress(), shipping.getReceiverName(), @@ -56,12 +57,17 @@ public List getAllShipping(){ .collect(Collectors.toList()); - } + @Transactional + public ShippingResponseDto updateShipping(UUID shippingId, @Valid UpdateShippingRequestDto request){ + Shipping shipping = shippingRepository.findById(shippingId).orElseThrow( + () -> new ResourceNotFoundException("찾을 수 없는 배송 정보 입니다.") + ); + shipping.updateShipping(request); + return ShippingResponseDto.from(shipping); - - + } } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java index b4e458b..15184a4 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java @@ -1,6 +1,7 @@ package com.sparta.shippingservice.domain.model; import com.sparta.commonmodule.entity.BaseEntity; +import com.sparta.shippingservice.application.dto.request.UpdateShippingRequestDto; import jakarta.persistence.*; import lombok.*; @@ -33,7 +34,7 @@ public class Shipping extends BaseEntity { @Column(name = "status", nullable = false, length = 50) private ShippingStatus status = ShippingStatus.PENDING; // 기본값 설정 - public Shipping( UUID orderId, String shippingAddress, String receiverName, UUID shippingManagerId, ShippingStatus status) { + public Shipping(UUID orderId, String shippingAddress, String receiverName, UUID shippingManagerId, ShippingStatus status) { this.orderId = orderId; this.shippingAddress = shippingAddress; this.receiverName = receiverName; @@ -41,6 +42,20 @@ public Shipping( UUID orderId, String shippingAddress, String receiverName, UUID this.status = status; } + + public void updateShipping(UpdateShippingRequestDto requestDto) { + if (this.status == ShippingStatus.DELIVERED) { + throw new IllegalStateException("배송이 완료된 후에는 정보를 변경할 수 없습니다."); + } + + requestDto.orderId().ifPresent(order -> this.orderId = order); + requestDto.shippingAddress().ifPresent(address -> this.shippingAddress = address); + requestDto.receiverName().ifPresent(name -> this.receiverName = name); + requestDto.shippingManagerId().ifPresent(manager -> this.shippingManagerId = manager); + requestDto.status().ifPresent(s -> this.status = s); + } + + @PrePersist public void prePersist(){ if(this.id == null){ @@ -51,21 +66,24 @@ public void prePersist(){ - public void updateShippingAddress(String newAddress) { - if (this.status == ShippingStatus.DELIVERED) { - throw new IllegalStateException("배송이 완료된 후에는 주소를 변경할 수 없습니다."); - } - this.shippingAddress = newAddress; - } - public void updateReceiverName(String newReceiverName) { - if (this.status == ShippingStatus.DELIVERED) { - throw new IllegalStateException("배송이 완료된 후에는 수령인 정보를 변경할 수 없습니다."); - } - this.receiverName = newReceiverName; - } - public void markAsDelivered() { - this.status = ShippingStatus.DELIVERED; - } + +// public void updateShippingAddress(String newAddress) { +// if (this.status == ShippingStatus.DELIVERED) { +// throw new IllegalStateException("배송이 완료된 후에는 주소를 변경할 수 없습니다."); +// } +// this.shippingAddress = newAddress; +// } +// +// public void updateReceiverName(String newReceiverName) { +// if (this.status == ShippingStatus.DELIVERED) { +// throw new IllegalStateException("배송이 완료된 후에는 수령인 정보를 변경할 수 없습니다."); +// } +// this.receiverName = newReceiverName; +// } +// +// public void markAsDelivered() { +// this.status = ShippingStatus.DELIVERED; +// } } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index f4fcd95..b94cd01 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -1,6 +1,7 @@ package com.sparta.shippingservice.presentation; import com.sparta.shippingservice.application.dto.request.CreateShippingRequestDto; +import com.sparta.shippingservice.application.dto.request.UpdateShippingRequestDto; import com.sparta.shippingservice.application.dto.response.ShippingResponseDto; import com.sparta.shippingservice.application.service.ShippingService; import jakarta.validation.Valid; @@ -21,18 +22,25 @@ public class ShippingController { public ResponseEntityShipping(@Valid @RequestBody CreateShippingRequestDto requestDto) { ShippingResponseDto responseDto = shippingService.create(requestDto); - return ResponseEntity.status(HttpStatus.CREATED).body(responseDto); + return ResponseEntity.ok(responseDto); } @GetMapping("/{id}") // 특정 배송 정보 조회 public ResponseEntity getShippingById(@PathVariable UUID id){ ShippingResponseDto responseDto = shippingService.getShippingById(id); - return ResponseEntity.status(HttpStatus.OK).body(responseDto); + return ResponseEntity.ok(responseDto); } @GetMapping() //모든 배송 내역 조회 public ResponseEntity> getAllShipping(){ List allShipping = shippingService.getAllShipping(); - return ResponseEntity.status(HttpStatus.OK).body(allShipping); + return ResponseEntity.ok(allShipping); + } + + + @PatchMapping("/{id}") // 배송 내역 수정 + public ResponseEntity updateShipping(@PathVariable UUID id, @Valid @RequestBody UpdateShippingRequestDto request) { + ShippingResponseDto ResponseDto = shippingService.updateShipping(id, request); + return ResponseEntity.ok(ResponseDto); } } From 5f0c8431444146f9bfeff1b2958d5868f94a2b68 Mon Sep 17 00:00:00 2001 From: jiyun Date: Thu, 20 Mar 2025 00:47:55 +0900 Subject: [PATCH 110/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#76]?= =?UTF-8?q?=20=EC=97=85=EC=B2=B4=20=EC=88=98=EC=A0=95=20=EB=B0=A9=EC=8B=9D?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20(put->patch)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/CompanyService.java | 16 +++++++--------- .../companyservice/domain/model/Company.java | 13 ++++++++++++- .../request/CompanyUpdateRequest.java | 11 ++++------- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java index 0a1c1bc..366b352 100644 --- a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java +++ b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java @@ -53,15 +53,13 @@ public CompanyDto getCompanyById(UUID id) { public CompanyDto updateCompany(UUID id, CompanyUpdateDto dto) { Company company = findCompany(id); - company.update( - dto.name(), - dto.address(), - dto.hubId(), - dto.type(), - userId - ); - Company saved = companyRepository.save(company); - return CompanyDto.fromEntity(saved); + // hubId가 변경된 경우 유효한 허브Id인지 유효성 검사 + if (dto.hubId() != null && !dto.hubId().equals(company.getHubId())) { + validateHubExists(dto.hubId()); + } + + company.applyUpdate(dto, userId); + return CompanyDto.fromEntity(company); } /// ////////////////////////////////////////////////////////////////////////////////// diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java index 1ca08bd..d7fb2ee 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java @@ -1,6 +1,7 @@ package com.sparta.companyservice.domain.model; import com.sparta.commonmodule.entity.BaseEntity; +import com.sparta.companyservice.application.dto.CompanyUpdateDto; import jakarta.persistence.*; import lombok.*; @@ -29,7 +30,7 @@ public class Company extends BaseEntity { @Builder // 도메인 객체 생성 책임은 create()가 지고, 그 내부에서 builder를 통해 객체 생성 - public Company(UUID id, String name, CompanyType type, UUID hubId, String address, long userId) { + private Company(UUID id, String name, CompanyType type, UUID hubId, String address, long userId) { super(userId); this.id = id; this.name = name; @@ -59,6 +60,16 @@ public void update(String newName, String newAddress, UUID newHubId, CompanyType super.update(userId); } + public void applyUpdate(CompanyUpdateDto dto, long userId) { + // 수정 시 사용자가 입력하지 않은 필드는 기존 값으로 씌움 + String newName = dto.name() != null ? dto.name() : this.name; + String newAddress = dto.address() != null ? dto.address() : this.address; + UUID newHubId = dto.hubId() != null ? dto.hubId() : this.hubId; + CompanyType newType = dto.type() != null ? dto.type() : this.type; + + update(newName, newAddress, newHubId, newType, userId); + } + /// /////////////////////////////////////////////////////////////////////////////////////// // 업체 생성, 수정 시 검증 diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java b/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java index 124c46d..d2ab57d 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java @@ -2,17 +2,14 @@ import com.sparta.companyservice.application.dto.CompanyUpdateDto; import com.sparta.companyservice.domain.model.CompanyType; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; import java.util.UUID; public record CompanyUpdateRequest ( - @NotBlank @Size(min = 3) String name, - @NotNull CompanyType type, - @NotNull UUID hubId, - @NotBlank String address + String name, + CompanyType type, + UUID hubId, + String address ) { public CompanyUpdateDto toDto() { return new CompanyUpdateDto(name, type, hubId, address); From 2744fd228cb2ecb9c3a68e19405118e2024b3038 Mon Sep 17 00:00:00 2001 From: jiyun Date: Thu, 20 Mar 2025 00:59:16 +0900 Subject: [PATCH 111/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#76]?= =?UTF-8?q?=20=EC=97=85=EC=B2=B4=20type=EC=9D=80=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EB=AA=BB=ED=95=98=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 --- .../application/dto/CompanyUpdateDto.java | 1 - .../companyservice/domain/model/Company.java | 18 +++++++++++------- .../request/CompanyUpdateRequest.java | 3 +-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyUpdateDto.java b/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyUpdateDto.java index 260f483..9d50f55 100644 --- a/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyUpdateDto.java +++ b/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyUpdateDto.java @@ -6,7 +6,6 @@ public record CompanyUpdateDto( String name, - CompanyType type, UUID hubId, String address ) {} diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java index d7fb2ee..f471f99 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java @@ -51,12 +51,11 @@ public static Company create(String name, String address, UUID hubId, CompanyTyp .build(); } - public void update(String newName, String newAddress, UUID newHubId, CompanyType newType, long userId) { - validateCompany(newName, newAddress, newHubId, newType); + public void update(String newName, String newAddress, UUID newHubId, long userId) { + validateCompany(newName, newAddress, newHubId); this.name = newName; this.address = newAddress; this.hubId = newHubId; - this.type = newType; super.update(userId); } @@ -65,15 +64,13 @@ public void applyUpdate(CompanyUpdateDto dto, long userId) { String newName = dto.name() != null ? dto.name() : this.name; String newAddress = dto.address() != null ? dto.address() : this.address; UUID newHubId = dto.hubId() != null ? dto.hubId() : this.hubId; - CompanyType newType = dto.type() != null ? dto.type() : this.type; - update(newName, newAddress, newHubId, newType, userId); + update(newName, newAddress, newHubId, userId); } /// /////////////////////////////////////////////////////////////////////////////////////// - // 업체 생성, 수정 시 검증 - + // 업체 생성 시 검증 private static void validateCompany(String newName, String newAddress, UUID newHubId, CompanyType newType) { validateCompanyNewName(newName); validateCompanyNewAddress(newAddress); @@ -81,6 +78,13 @@ private static void validateCompany(String newName, String newAddress, UUID newH validateCompanyNewType(newType); } + // 업체 수정 시 검증 + private static void validateCompany(String newName, String newAddress, UUID newHubId) { + validateCompanyNewName(newName); + validateCompanyNewAddress(newAddress); + validateCompanyNewHubId(newHubId); + } + private static void validateCompanyNewType(CompanyType newType) { if(newType == null) { throw new IllegalArgumentException("업체 type은 null일 수 없습니다."); diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java b/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java index d2ab57d..5d2ddeb 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java @@ -7,11 +7,10 @@ public record CompanyUpdateRequest ( String name, - CompanyType type, UUID hubId, String address ) { public CompanyUpdateDto toDto() { - return new CompanyUpdateDto(name, type, hubId, address); + return new CompanyUpdateDto(name, hubId, address); } } From 7f0999e3d092b74582532e0c601b6a3422912eca Mon Sep 17 00:00:00 2001 From: jiyun Date: Thu, 20 Mar 2025 01:13:52 +0900 Subject: [PATCH 112/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#76]?= =?UTF-8?q?=20=EC=88=98=EC=A0=95,=20=EC=83=9D=EC=84=B1=20=EC=8B=9C=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=ED=95=98=EB=8A=94=20validateCompany=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/CompanyUpdateDto.java | 2 - .../companyservice/domain/model/Company.java | 40 +++++-------------- .../request/CompanyUpdateRequest.java | 1 - 3 files changed, 10 insertions(+), 33 deletions(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyUpdateDto.java b/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyUpdateDto.java index 9d50f55..f8b2459 100644 --- a/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyUpdateDto.java +++ b/company-service/src/main/java/com/sparta/companyservice/application/dto/CompanyUpdateDto.java @@ -1,7 +1,5 @@ package com.sparta.companyservice.application.dto; -import com.sparta.companyservice.domain.model.CompanyType; - import java.util.UUID; public record CompanyUpdateDto( diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java index f471f99..21bdc85 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java @@ -70,42 +70,22 @@ public void applyUpdate(CompanyUpdateDto dto, long userId) { /// /////////////////////////////////////////////////////////////////////////////////////// - // 업체 생성 시 검증 - private static void validateCompany(String newName, String newAddress, UUID newHubId, CompanyType newType) { - validateCompanyNewName(newName); - validateCompanyNewAddress(newAddress); - validateCompanyNewHubId(newHubId); - validateCompanyNewType(newType); - } - // 업체 수정 시 검증 private static void validateCompany(String newName, String newAddress, UUID newHubId) { - validateCompanyNewName(newName); - validateCompanyNewAddress(newAddress); - validateCompanyNewHubId(newHubId); - } - - private static void validateCompanyNewType(CompanyType newType) { - if(newType == null) { - throw new IllegalArgumentException("업체 type은 null일 수 없습니다."); - } + validateNotNull(newName, "업체명"); + validateNotNull(newAddress, "주소"); + validateNotNull(newHubId, "소속 Hub"); } - private static void validateCompanyNewHubId(UUID newHubId) { - if (newHubId == null) { - throw new IllegalArgumentException("소속 Hub는 null일 수 없습니다."); - } - } - - private static void validateCompanyNewAddress(String newAddress) { - if (newAddress == null) { - throw new IllegalArgumentException("주소는 null일 수 없습니다."); - } + // 업체 생성 시 검증 + private static void validateCompany(String newName, String newAddress, UUID newHubId, CompanyType newType) { + validateCompany(newName, newAddress, newHubId); + validateNotNull(newType, "업체 type"); } - private static void validateCompanyNewName(String newName) { - if (newName == null) { - throw new IllegalArgumentException("업체명은 null일 수 없습니다."); + private static void validateNotNull(Object value, String fieldName) { + if (value == null) { + throw new IllegalArgumentException(fieldName + "은(는) null일 수 없습니다."); } } } diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java b/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java index 5d2ddeb..a4f80f9 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/request/CompanyUpdateRequest.java @@ -1,7 +1,6 @@ package com.sparta.companyservice.presentation.request; import com.sparta.companyservice.application.dto.CompanyUpdateDto; -import com.sparta.companyservice.domain.model.CompanyType; import java.util.UUID; From c37747600093b9510b560a228c4e4ae30f0d2381 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Thu, 20 Mar 2025 03:53:20 +0900 Subject: [PATCH 113/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20:=20hub?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95=20-=20update=20api?= =?UTF-8?q?=20:=20Response=20DTO=20=EC=88=98=EC=A0=95=20-=20Geocode=20api?= =?UTF-8?q?=20:=20uri=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hub-service/build.gradle | 7 +++--- .../hub/application/dto/GeocodeResponse.java | 9 +++++--- .../application/dto/HubCreateResponseDto.java | 14 ++++++++++- .../hub/application/dto/HubRequestDto.java | 5 +++- .../hub/application/dto/HubResponseDto.java | 2 ++ .../application/dto/HubUpdateResponseDto.java | 12 ++++++---- .../service/GeocodeApiService.java | 16 ++++++------- .../hub/application/service/HubService.java | 13 ++++------- .../hubservice/hub/domain/model/Hub.java | 4 ++-- .../hub/domain/repository/HubRepository.java | 2 +- .../controller/HubController.java | 6 ++--- .../src/main/resources/application.yml | 23 +++++++++++++++---- 12 files changed, 74 insertions(+), 39 deletions(-) diff --git a/hub-service/build.gradle b/hub-service/build.gradle index 1d956db..49502ac 100644 --- a/hub-service/build.gradle +++ b/hub-service/build.gradle @@ -6,13 +6,14 @@ ext { dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' - // 유효성 검사 implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - // 공통 모듈 - implementation project(':common-module') + implementation project(':common-module') // 공통 모듈 + implementation 'org.hibernate:hibernate-core:6.3.1.Final' // Hibernate ORM 라이브러리 + implementation("org.postgresql:postgresql:42.7.2") // PostgreSQL JDBC 드라이버 + runtimeOnly 'com.h2database:h2' // 개발/테스트 환경에서 H2 사용 } dependencyManagement { diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/GeocodeResponse.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/GeocodeResponse.java index 1a445a0..cd06315 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/GeocodeResponse.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/GeocodeResponse.java @@ -1,12 +1,15 @@ package com.sparta.hubservice.hub.application.dto; -import java.math.BigDecimal; +import java.util.List; import lombok.Data; +import org.springframework.data.jpa.repository.query.Meta; @Data public class GeocodeResponse { - - private Address address; + private String status; + private Meta meta; + private List
addresses; + private String errorMessage; @Data public static class Address { diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubCreateResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubCreateResponseDto.java index cbf8f2a..4500897 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubCreateResponseDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubCreateResponseDto.java @@ -1,23 +1,35 @@ package com.sparta.hubservice.hub.application.dto; import com.sparta.hubservice.hub.domain.model.Hub; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.UUID; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; @Getter @Builder +@AllArgsConstructor public class HubCreateResponseDto { private final UUID hubId; private final String message; + private final String name; + private final String address; + private final BigDecimal latitud; + private final BigDecimal longitud; private final LocalDateTime createdAt; private final long createdBy; public HubCreateResponseDto(Hub hub, String message) { - this.hubId = getHubId(); + this.hubId = hub.getHubId(); this.message = message; + this.name = hub.getName(); + this.address = hub.getAddress(); + this.latitud = hub.getLatitude(); + this.longitud = hub.getLongitude(); this.createdAt = LocalDateTime.now(); this.createdBy = hub.getCreatedBy(); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubRequestDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubRequestDto.java index 9c08a4f..6ba4c60 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubRequestDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubRequestDto.java @@ -1,6 +1,6 @@ package com.sparta.hubservice.hub.application.dto; -import java.math.BigDecimal; +import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -12,7 +12,10 @@ @Builder public class HubRequestDto { + @NotBlank(message = "허브 이름을 입력해주세요.") private String name; + + @NotBlank(message = "주소를 입력해주세요.") private String address; } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubResponseDto.java index 1fcbcf8..1c3b5eb 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubResponseDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubResponseDto.java @@ -4,11 +4,13 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.UUID; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @Getter @Builder +@AllArgsConstructor public class HubResponseDto { private final UUID hubId; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateResponseDto.java index be8eee7..af49f50 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateResponseDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateResponseDto.java @@ -4,27 +4,29 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.UUID; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @Getter @Builder +@AllArgsConstructor public class HubUpdateResponseDto { private final UUID hubId; private final String message; - private final String location; + private final String address; private final BigDecimal latitude; private final BigDecimal longitude; private final LocalDateTime updatedAt; private final long updatedBy; public HubUpdateResponseDto(Hub hub, String message) { - this.hubId = getHubId(); + this.hubId = hub.getHubId(); this.message = message; - this.location = getLocation(); - this.latitude = getLatitude(); - this.longitude = getLongitude(); + this.address = hub.getAddress(); + this.latitude = hub.getLatitude(); + this.longitude = hub.getLongitude(); this.updatedAt = LocalDateTime.now(); this.updatedBy = hub.getCreatedBy(); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/GeocodeApiService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/GeocodeApiService.java index 615ce7f..84605b4 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/GeocodeApiService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/GeocodeApiService.java @@ -14,7 +14,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponentsBuilder; @Service @Slf4j(topic = "GeocodeApiService : naver geocode api 호출") @@ -29,32 +28,33 @@ public class GeocodeApiService { @Value("${naver.api.geocode.client-secret}") private String clientSecret; + private final RestTemplate restTemplate = new RestTemplate(); public Map getGeocodeAddress(String address) { // URL 설정 - String uri = UriComponentsBuilder.fromHttpUrl(geocodeUrl) - .queryParam("query", address) - .toUriString(); + String uri = geocodeUrl + "?query=" + address; // Http 요청 헤더 설정 HttpHeaders headers = new HttpHeaders(); headers.set("X-NCP-APIGW-API-KEY-ID", clientId); headers.set("X-NCP-APIGW-API-KEY", clientSecret); + headers.set("Content-Type", "application/json; charset=UTF-8"); + headers.set("Accept", "application/json"); HttpEntity entity = new HttpEntity<>(headers); // API 호출 및 응답 받기 ResponseEntity response = restTemplate.exchange(uri, HttpMethod.GET, entity, GeocodeResponse.class); - if(response.getBody() != null && response.getBody().getAddress() != null) { - log.error("해당 주소에 대한 위도, 경도 값을 찾을 수 없습니다. Address : {}", address); + if(response.getBody() == null || response.getBody().getAddresses() == null) { throw new OperationNotAllowedException(); } // 위도, 경도 값 추출 Map result = new HashMap<>(); - result.put("latitude", new BigDecimal(response.getBody().getAddress().getY())); - result.put("longitude", new BigDecimal(response.getBody().getAddress().getX())); + + result.put("latitude", new BigDecimal(response.getBody().getAddresses().get(0).getY())); + result.put("longitude", new BigDecimal(response.getBody().getAddresses().get(0).getX())); return result; } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java index 4d812fd..a4006fa 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java @@ -47,10 +47,7 @@ public HubResponseDto getHub(UUID hubId) { // 허브 생성 @Transactional - public HubCreateResponseDto createHub(HubRequestDto hubRequestDto, long userId) { - if(hubRepository.existsByName(hubRequestDto.getName())) { - throw new DuplicateResourceException(); - } + public HubCreateResponseDto createHub(HubRequestDto hubRequestDto, Long userId) { // 주소 -> 위,경도값 변환 Map map = geocodeApiService.getGeocodeAddress(hubRequestDto.getAddress()); @@ -69,20 +66,20 @@ public HubCreateResponseDto createHub(HubRequestDto hubRequestDto, long userId) // 허브 수정 @Transactional - public HubUpdateResponseDto updateHub(UUID hubId, String address, long userId) { + public HubUpdateResponseDto updateHub(UUID hubId, String address, Long userId) { Hub hub = hubRepository.findById(hubId).orElseThrow(ResourceNotFoundException::new); // 주소 -> 위, 경도값 변환 Map map = geocodeApiService.getGeocodeAddress(hub.getAddress()); - hub.updateHub(address, map.get("latitude"), map.get("longitude"), userId); + hub.updateHub(address, map.get("latitude"), map.get("longitude"), userId); hubRepository.save(hub); - return new HubUpdateResponseDto(hub, "Hub successfully updated."); + return new HubUpdateResponseDto(hub,"Hub successfully updated."); } // 허브삭제 (Soft Delete) @Transactional - public HubDeleteResponseDto deleteHub(UUID hubId, long userId) { + public HubDeleteResponseDto deleteHub(UUID hubId, Long userId) { Hub hub = hubRepository.findById(hubId).orElseThrow(ResourceNotFoundException::new); hub.delete(userId); diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/Hub.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/Hub.java index b3076f5..7e07293 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/Hub.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/Hub.java @@ -31,11 +31,11 @@ public class Hub extends BaseEntity { private String address; @Column(nullable = false) - @Digits(integer = 10, fraction = 6) + @Digits(integer = 10, fraction = 8) private BigDecimal latitude; @Column(nullable = false) - @Digits(integer = 10, fraction = 6) + @Digits(integer = 10, fraction = 8) private BigDecimal longitude; @Builder diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java index 78f642c..ca27177 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java @@ -12,5 +12,5 @@ public interface HubRepository { Optional findById(UUID hubId); - void save(Hub savedHub); + S save(S hub); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java index 6eb9265..9a27720 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java @@ -44,19 +44,19 @@ public ResponseEntity getHubById(@PathVariable("hub_id") UUID hu } @PostMapping - public ResponseEntity createHub(@RequestBody @Valid HubRequestDto requestDto, @RequestParam long userId) { + public ResponseEntity createHub(@RequestBody @Valid HubRequestDto requestDto, @RequestParam Long userId) { HubCreateResponseDto responseDto = hubService.createHub(requestDto, userId); return ResponseEntity.ok(responseDto); } @PutMapping("{hub_id}") - public ResponseEntity updateHub(@PathVariable("hub_id") UUID hubId, @RequestParam String address, @RequestParam long userId) { + public ResponseEntity updateHub(@PathVariable("hub_id") UUID hubId, @RequestParam String address, @RequestParam Long userId) { HubUpdateResponseDto responseDto = hubService.updateHub(hubId, address, userId); return ResponseEntity.ok(responseDto); } @DeleteMapping("{hub_id}") - public ResponseEntity deleteHub(@PathVariable("hub_id") UUID hubId, @RequestParam long userId) { + public ResponseEntity deleteHub(@PathVariable("hub_id") UUID hubId, @RequestParam Long userId) { HubDeleteResponseDto responseDto = hubService.deleteHub(hubId, userId); return ResponseEntity.ok(responseDto); } diff --git a/hub-service/src/main/resources/application.yml b/hub-service/src/main/resources/application.yml index 39f5dfd..8595439 100644 --- a/hub-service/src/main/resources/application.yml +++ b/hub-service/src/main/resources/application.yml @@ -1,13 +1,21 @@ +server: + port: 8082 spring: application: name: hub-service config: import: "application-secret.yml" - autoconfigure: - exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration + datasource: + url: jdbc:postgresql://localhost:5432/testdb + username: postgres + password: 1234 + driver-class-name: org.postgresql.Driver -server: - port: 8082 + jpa: + database-platform: org.hibernate.dialect.PostgreSQLDialect + hibernate: + ddl-auto: update # 테이블 자동 생성 + show-sql: true # SQL 로그 출력 eureka: client: @@ -15,3 +23,10 @@ eureka: fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka/ + instance: + prefer-ip-address: true + +security: + basic: + enabled: false + From 28985d7e027cdb1f82c13363b139a9d918bb31ac Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Thu, 20 Mar 2025 03:54:10 +0900 Subject: [PATCH 114/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20Http=20Client=20?= =?UTF-8?q?test=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/resources/http/hub-service-test.http | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 hub-service/src/test/resources/http/hub-service-test.http diff --git a/hub-service/src/test/resources/http/hub-service-test.http b/hub-service/src/test/resources/http/hub-service-test.http new file mode 100644 index 0000000..d5b8a72 --- /dev/null +++ b/hub-service/src/test/resources/http/hub-service-test.http @@ -0,0 +1,23 @@ +### 🔹 API 테스트 (서버 체크) +GET http://localhost:8082/api/v1/hubs/test + +### 🔹 허브 목록 조회 (GET, 페이징) +GET http://localhost:8082/api/v1/hubs?page=0&size=10 + +### 🔹 특정 허브 조회 (GET, UUID 사용) +GET http://localhost:8082/api/v1/hubs/b2778763-7721-4bb2-a436-8104336c6a7d + +### 🔹 허브 생성 (POST) +POST http://localhost:8082/api/v1/hubs?userId=123 +Content-Type: application/json + +{ + "name": "test02", + "address": "서울시 강남구" +} + +### 🔹 허브 업데이트 (PUT, UUID 사용) +PUT http://localhost:8082/api/v1/hubs/4eafa45b-3a1f-484c-8294-b6924025b86f?userId=123456789&address=서울시 강남구 + +### 🔹 허브 삭제 (DELETE, UUID 사용) +DELETE http://localhost:8082/api/v1/hubs/b2778763-7721-4bb2-a436-8104336c6a7d?userId=123 From 7004ca968a2aabec6b2784d6e3e937827c1163b0 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Thu, 20 Mar 2025 03:55:31 +0900 Subject: [PATCH 115/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20:=20Bas?= =?UTF-8?q?eEntity=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commonmodule/entity/BaseEntity.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java b/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java index 6e4537b..8655213 100644 --- a/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java +++ b/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java @@ -27,41 +27,41 @@ public class BaseEntity { private LocalDateTime createdAt; @CreatedBy - @JoinColumn(name = "created_by") - private long createdBy; + @Column(name = "created_by") + private Long createdBy; @LastModifiedDate - @Column(name = "updated_at") + @Column(name = "updated_at", nullable = true) private LocalDateTime updatedAt; @LastModifiedBy - @JoinColumn(name = "updated_by") - private long updatedBy; + @Column(name = "updated_by", nullable = true) + private Long updatedBy; @Column(name = "is_deleted") @ColumnDefault("FALSE") private Boolean isDeleted; - @Column(name = "deleted_at") + @Column(name = "deleted_at", nullable = true) private LocalDateTime deletedAt; - @JoinColumn(name = "deleted_by") - private long deletedBy; + @Column(name = "deleted_by", nullable = true) + private Long deletedBy; // 생성을 위한 method - public BaseEntity(long userId) { + public BaseEntity(Long userId) { this.createdBy = userId; this.updatedBy = userId; this.isDeleted = false; } // update를 위한 method - public void update(long userId) { + public void update(Long userId) { this.updatedBy = userId; } // 소프트 delete를 위한 method - public void delete(long userId) { + public void delete(Long userId) { this.isDeleted = true; this.deletedAt = LocalDateTime.now(); this.deletedBy = userId; From 0b71e42a3bee956780234365f30f6ab6246eec0c Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Thu, 20 Mar 2025 04:42:55 +0900 Subject: [PATCH 116/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20:=20dto?= =?UTF-8?q?=20=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/{ => request}/HubRequestDto.java | 2 +- .../dto/{ => response}/GeocodeResponse.java | 2 +- .../dto/{ => response}/HubCreateResponseDto.java | 3 +-- .../dto/{ => response}/HubDeleteResponseDto.java | 2 +- .../dto/{ => response}/HubResponseDto.java | 2 +- .../dto/{ => response}/HubUpdateResponseDto.java | 2 +- .../hub/application/service/GeocodeApiService.java | 2 +- .../hub/application/service/HubService.java | 11 +++++------ .../sparta/hubservice/hub/domain/model/HubRoute.java | 2 ++ .../hub/domain/repository/HubRepository.java | 3 +++ .../hub/presentation/controller/HubController.java | 10 +++++----- 11 files changed, 22 insertions(+), 19 deletions(-) rename hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/{ => request}/HubRequestDto.java (87%) rename hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/{ => response}/GeocodeResponse.java (86%) rename hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/{ => response}/HubCreateResponseDto.java (91%) rename hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/{ => response}/HubDeleteResponseDto.java (84%) rename hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/{ => response}/HubResponseDto.java (94%) rename hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/{ => response}/HubUpdateResponseDto.java (93%) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubRequestDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/request/HubRequestDto.java similarity index 87% rename from hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubRequestDto.java rename to hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/request/HubRequestDto.java index 6ba4c60..3b904b9 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubRequestDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/request/HubRequestDto.java @@ -1,4 +1,4 @@ -package com.sparta.hubservice.hub.application.dto; +package com.sparta.hubservice.hub.application.dto.request; import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/GeocodeResponse.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/GeocodeResponse.java similarity index 86% rename from hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/GeocodeResponse.java rename to hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/GeocodeResponse.java index cd06315..b265ad8 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/GeocodeResponse.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/GeocodeResponse.java @@ -1,4 +1,4 @@ -package com.sparta.hubservice.hub.application.dto; +package com.sparta.hubservice.hub.application.dto.response; import java.util.List; import lombok.Data; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubCreateResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/HubCreateResponseDto.java similarity index 91% rename from hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubCreateResponseDto.java rename to hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/HubCreateResponseDto.java index 4500897..0700de6 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubCreateResponseDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/HubCreateResponseDto.java @@ -1,4 +1,4 @@ -package com.sparta.hubservice.hub.application.dto; +package com.sparta.hubservice.hub.application.dto.response; import com.sparta.hubservice.hub.domain.model.Hub; import java.math.BigDecimal; @@ -7,7 +7,6 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; -import lombok.NoArgsConstructor; @Getter @Builder diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubDeleteResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/HubDeleteResponseDto.java similarity index 84% rename from hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubDeleteResponseDto.java rename to hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/HubDeleteResponseDto.java index 7b20efa..4650d0a 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubDeleteResponseDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/HubDeleteResponseDto.java @@ -1,4 +1,4 @@ -package com.sparta.hubservice.hub.application.dto; +package com.sparta.hubservice.hub.application.dto.response; import java.util.UUID; import lombok.Builder; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/HubResponseDto.java similarity index 94% rename from hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubResponseDto.java rename to hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/HubResponseDto.java index 1c3b5eb..9250b64 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubResponseDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/HubResponseDto.java @@ -1,4 +1,4 @@ -package com.sparta.hubservice.hub.application.dto; +package com.sparta.hubservice.hub.application.dto.response; import com.sparta.hubservice.hub.domain.model.Hub; import java.math.BigDecimal; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/HubUpdateResponseDto.java similarity index 93% rename from hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateResponseDto.java rename to hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/HubUpdateResponseDto.java index af49f50..7b24891 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/HubUpdateResponseDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/HubUpdateResponseDto.java @@ -1,4 +1,4 @@ -package com.sparta.hubservice.hub.application.dto; +package com.sparta.hubservice.hub.application.dto.response; import com.sparta.hubservice.hub.domain.model.Hub; import java.math.BigDecimal; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/GeocodeApiService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/GeocodeApiService.java index 84605b4..1d434d7 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/GeocodeApiService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/GeocodeApiService.java @@ -2,7 +2,7 @@ import com.sparta.commonmodule.exception.OperationNotAllowedException; -import com.sparta.hubservice.hub.application.dto.GeocodeResponse; +import com.sparta.hubservice.hub.application.dto.response.GeocodeResponse; import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java index a4006fa..4dcff5a 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java @@ -1,12 +1,11 @@ package com.sparta.hubservice.hub.application.service; -import com.sparta.commonmodule.exception.DuplicateResourceException; import com.sparta.commonmodule.exception.ResourceNotFoundException; -import com.sparta.hubservice.hub.application.dto.HubCreateResponseDto; -import com.sparta.hubservice.hub.application.dto.HubDeleteResponseDto; -import com.sparta.hubservice.hub.application.dto.HubRequestDto; -import com.sparta.hubservice.hub.application.dto.HubResponseDto; -import com.sparta.hubservice.hub.application.dto.HubUpdateResponseDto; +import com.sparta.hubservice.hub.application.dto.response.HubCreateResponseDto; +import com.sparta.hubservice.hub.application.dto.response.HubDeleteResponseDto; +import com.sparta.hubservice.hub.application.dto.request.HubRequestDto; +import com.sparta.hubservice.hub.application.dto.response.HubResponseDto; +import com.sparta.hubservice.hub.application.dto.response.HubUpdateResponseDto; import com.sparta.hubservice.hub.domain.model.Hub; import com.sparta.hubservice.hub.domain.repository.HubRepository; import java.math.BigDecimal; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubRoute.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubRoute.java index e49e054..68d0cf3 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubRoute.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubRoute.java @@ -13,6 +13,7 @@ import jakarta.validation.constraints.Digits; import java.math.BigDecimal; import java.util.UUID; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -42,6 +43,7 @@ public class HubRoute extends BaseEntity { @Digits(integer = 10, fraction = 2) private BigDecimal distance; + @Builder public HubRoute(Hub fromHub, Hub toHub, int duration, BigDecimal distance, long userId) { super(userId); this.fromHub = fromHub; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java index ca27177..43f7f7f 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java @@ -1,6 +1,7 @@ package com.sparta.hubservice.hub.domain.repository; import com.sparta.hubservice.hub.domain.model.Hub; +import com.sparta.hubservice.hub.domain.model.HubRoute; import java.util.Optional; import java.util.UUID; import org.springframework.data.domain.Page; @@ -13,4 +14,6 @@ public interface HubRepository { Optional findById(UUID hubId); S save(S hub); + + Optional findByFromHubIdAndToHubIdAndIsDeletedFalse(UUID fromHubId, UUID toHubId); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java index 9a27720..154fb2f 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java @@ -1,10 +1,10 @@ package com.sparta.hubservice.hub.presentation.controller; -import com.sparta.hubservice.hub.application.dto.HubCreateResponseDto; -import com.sparta.hubservice.hub.application.dto.HubDeleteResponseDto; -import com.sparta.hubservice.hub.application.dto.HubRequestDto; -import com.sparta.hubservice.hub.application.dto.HubResponseDto; -import com.sparta.hubservice.hub.application.dto.HubUpdateResponseDto; +import com.sparta.hubservice.hub.application.dto.response.HubCreateResponseDto; +import com.sparta.hubservice.hub.application.dto.response.HubDeleteResponseDto; +import com.sparta.hubservice.hub.application.dto.request.HubRequestDto; +import com.sparta.hubservice.hub.application.dto.response.HubResponseDto; +import com.sparta.hubservice.hub.application.dto.response.HubUpdateResponseDto; import com.sparta.hubservice.hub.application.service.HubService; import jakarta.validation.Valid; import java.util.UUID; From fae7173b5c4114d3a8dfa7ba1d0961a46a8a3fc0 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Thu, 20 Mar 2025 04:44:35 +0900 Subject: [PATCH 117/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=ED=97=88?= =?UTF-8?q?=EB=B8=8C=20=EA=B0=84=20=EA=B2=BD=EB=A1=9C=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/HubRouteResponse.java | 29 +++++++++++++++++ .../application/service/HubRoutesService.java | 32 +++++++++++++++++++ .../controller/HubRoutesController.java | 28 ++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/HubRouteResponse.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubRoutesService.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubRoutesController.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/HubRouteResponse.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/HubRouteResponse.java new file mode 100644 index 0000000..079153d --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/HubRouteResponse.java @@ -0,0 +1,29 @@ +package com.sparta.hubservice.hub.application.dto.response; + +import com.sparta.hubservice.hub.domain.model.HubRoute; +import java.math.BigDecimal; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor +public class HubRouteResponse { + + private final UUID routeId; + private final UUID fromHubId; + private final UUID toHubId; + private final int duration; + private final BigDecimal distance; + + public HubRouteResponse(HubRoute hubRoute) { + this.routeId = hubRoute.getHubRouteId(); + this.fromHubId = hubRoute.getFromHub().getHubId(); + this.toHubId = hubRoute.getToHub().getHubId(); + this.duration = hubRoute.getDuration(); + this.distance = hubRoute.getDistance(); + } + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubRoutesService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubRoutesService.java new file mode 100644 index 0000000..cc29ba2 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubRoutesService.java @@ -0,0 +1,32 @@ +package com.sparta.hubservice.hub.application.service; + +import com.sparta.commonmodule.exception.ResourceNotFoundException; +import com.sparta.hubservice.hub.application.dto.response.HubRouteResponse; +import com.sparta.hubservice.hub.domain.model.HubRoute; +import com.sparta.hubservice.hub.domain.repository.HubRepository; +import java.util.Optional; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +@Slf4j(topic = "HubRoutesService") +public class HubRoutesService { + + private final HubRepository hubRepository; + + public HubRouteResponse getHubRoute(String fromHubIdString, String toHubIdString) { + UUID fromHubId = UUID.fromString(fromHubIdString); + UUID toHubId = UUID.fromString(toHubIdString); + + Optional hubRoute = hubRepository.findByFromHubIdAndToHubIdAndIsDeletedFalse(fromHubId, toHubId); + + if(hubRoute.isEmpty()){ + throw new ResourceNotFoundException("Hub route not found"); + } + + return new HubRouteResponse(hubRoute.get()); + } +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubRoutesController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubRoutesController.java new file mode 100644 index 0000000..53e80dc --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubRoutesController.java @@ -0,0 +1,28 @@ +package com.sparta.hubservice.hub.presentation.controller; + + +import com.sparta.hubservice.hub.application.dto.response.HubRouteResponse; +import com.sparta.hubservice.hub.application.service.HubRoutesService; +import com.sparta.hubservice.hub.domain.model.HubRoute; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/v1/hub-routes") +@RequiredArgsConstructor +public class HubRoutesController { + + private final HubRoutesService hubRoutesService; + + // 허브 간 경로 조회 + @GetMapping("/{from_hub_id}/{to_hub_id}") + public ResponseEntity getHubRoute(@PathVariable String fromHubId, @PathVariable String toHubId) { + HubRouteResponse response = hubRoutesService.getHubRoute(fromHubId, toHubId); + return ResponseEntity.ok(response); + } + +} From b2f6e2a6f1dedb326292e2d8bc04ea37064ef8cf Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Thu, 20 Mar 2025 04:49:37 +0900 Subject: [PATCH 118/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20parameter=20?= =?UTF-8?q?=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub/presentation/controller/HubRoutesController.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubRoutesController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubRoutesController.java index 53e80dc..e6383dc 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubRoutesController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubRoutesController.java @@ -3,7 +3,6 @@ import com.sparta.hubservice.hub.application.dto.response.HubRouteResponse; import com.sparta.hubservice.hub.application.service.HubRoutesService; -import com.sparta.hubservice.hub.domain.model.HubRoute; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -20,8 +19,8 @@ public class HubRoutesController { // 허브 간 경로 조회 @GetMapping("/{from_hub_id}/{to_hub_id}") - public ResponseEntity getHubRoute(@PathVariable String fromHubId, @PathVariable String toHubId) { - HubRouteResponse response = hubRoutesService.getHubRoute(fromHubId, toHubId); + public ResponseEntity getHubRoute(@PathVariable String from_hub_id, @PathVariable String to_hub_id) { + HubRouteResponse response = hubRoutesService.getHubRoute(from_hub_id, to_hub_id); return ResponseEntity.ok(response); } From b85be3546c4c7c1d57ddeb65cffd88cf8c32967f Mon Sep 17 00:00:00 2001 From: gwongilnam Date: Thu, 20 Mar 2025 05:23:51 +0900 Subject: [PATCH 119/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#87]=20:=20Shipping?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/ShippingService.java | 30 ++++++++++++------- .../domain/model/ShippingStatus.java | 3 +- .../presentation/ShippingController.java | 17 ++++++++--- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java index 8a0d28d..6f6b302 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -4,6 +4,7 @@ import com.sparta.shippingservice.application.dto.request.UpdateShippingRequestDto; import com.sparta.shippingservice.application.dto.response.ShippingResponseDto; import com.sparta.shippingservice.domain.model.Shipping; +import com.sparta.shippingservice.domain.model.ShippingStatus; import com.sparta.shippingservice.domain.repository.ShippingRepository; import com.sparta.commonmodule.exception.*; @@ -35,16 +36,13 @@ public ShippingResponseDto create(@Valid CreateShippingRequestDto request) { @Transactional(readOnly = true) public ShippingResponseDto getShippingById(UUID shippingId) { - Shipping shipping = shippingRepository.findById(shippingId).orElseThrow( - () -> new ResourceNotFoundException("찾을 수 없는 배송 정보 입니다.") - ); + Shipping shipping = findShipping(shippingId); return ShippingResponseDto.from(shipping); } @Transactional(readOnly = true) public List getAllShipping() { - List result = shippingRepository.findAll(); return result.stream() .map(shipping -> new ShippingResponseDto( @@ -55,19 +53,31 @@ public List getAllShipping() { shipping.getStatus() )) .collect(Collectors.toList()); - - } @Transactional - public ShippingResponseDto updateShipping(UUID shippingId, @Valid UpdateShippingRequestDto request){ - Shipping shipping = shippingRepository.findById(shippingId).orElseThrow( - () -> new ResourceNotFoundException("찾을 수 없는 배송 정보 입니다.") - ); + public ShippingResponseDto updateShipping(UUID shippingId, @Valid UpdateShippingRequestDto request) { + Shipping shipping = findShipping(shippingId); shipping.updateShipping(request); return ShippingResponseDto.from(shipping); } + @Transactional + public ShippingResponseDto deleteShipping(UUID shippingId, long userId) { + Shipping shipping = findShipping(shippingId); + shipping.delete(userId); + shipping.setStatus(ShippingStatus.CANCELED); + shippingRepository.save(shipping); + return ShippingResponseDto.from(shipping); + } + + + private Shipping findShipping(UUID shippingId) { + Shipping shipping = shippingRepository.findById(shippingId).orElseThrow( + () -> new ResourceNotFoundException("찾을 수 없는 배송 정보 입니다.")); + return shipping; + } + } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingStatus.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingStatus.java index f72152a..31d9033 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingStatus.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingStatus.java @@ -2,5 +2,6 @@ public enum ShippingStatus { PENDING, // 배송 대기중 - DELIVERED // 배송 완료 + DELIVERED, // 배송 완료 + CANCELED // 배송 취소 } \ No newline at end of file diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index b94cd01..274bd19 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -18,29 +18,38 @@ @RequiredArgsConstructor public class ShippingController { private final ShippingService shippingService; + @PostMapping() // 배송 생성 - public ResponseEntityShipping(@Valid @RequestBody CreateShippingRequestDto requestDto) { + public ResponseEntity Shipping(@Valid @RequestBody CreateShippingRequestDto requestDto) { ShippingResponseDto responseDto = shippingService.create(requestDto); return ResponseEntity.ok(responseDto); } @GetMapping("/{id}") // 특정 배송 정보 조회 - public ResponseEntity getShippingById(@PathVariable UUID id){ + public ResponseEntity getShippingById(@PathVariable("id") UUID id) { ShippingResponseDto responseDto = shippingService.getShippingById(id); return ResponseEntity.ok(responseDto); } @GetMapping() //모든 배송 내역 조회 - public ResponseEntity> getAllShipping(){ + public ResponseEntity> getAllShipping() { List allShipping = shippingService.getAllShipping(); return ResponseEntity.ok(allShipping); } @PatchMapping("/{id}") // 배송 내역 수정 - public ResponseEntity updateShipping(@PathVariable UUID id, @Valid @RequestBody UpdateShippingRequestDto request) { + public ResponseEntity updateShipping(@PathVariable("id") UUID id, @Valid @RequestBody UpdateShippingRequestDto request) { ShippingResponseDto ResponseDto = shippingService.updateShipping(id, request); return ResponseEntity.ok(ResponseDto); } + + @DeleteMapping("/{id}") + public ResponseEntity deleteHub(@PathVariable("id") UUID id, @RequestParam long userId) { + ShippingResponseDto responseDto = shippingService.deleteShipping(id, userId); + return ResponseEntity.ok(responseDto); + } + + } From 2853c62c5f96569242c34a761577c832f32f50b5 Mon Sep 17 00:00:00 2001 From: jiyun Date: Thu, 20 Mar 2025 10:55:54 +0900 Subject: [PATCH 120/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#92]=20:=20Company?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/CompanyService.java | 10 ++++++++-- .../sparta/companyservice/domain/model/Company.java | 4 ++++ .../domain/repository/CompanyRepository.java | 8 ++------ .../presentation/controller/CompanyController.java | 5 +++++ 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java index 366b352..29067e5 100644 --- a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java +++ b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java @@ -38,7 +38,7 @@ public CompanyDto createCompany(CompanyCreateDto dto) { @Transactional(readOnly = true) // 전체 조회 public List getAllCompanies() { - return companyRepository.findAll() + return companyRepository.findAllByDeletedAtIsNull() .stream() .map(CompanyDto::fromEntity) .toList(); @@ -62,6 +62,12 @@ public CompanyDto updateCompany(UUID id, CompanyUpdateDto dto) { return CompanyDto.fromEntity(company); } + @Transactional // 삭제 + public void deleteCompany(UUID id) { + Company company = findCompany(id); + company.delete(userId); + } + /// ////////////////////////////////////////////////////////////////////////////////// private void validateHubExists(UUID hubId) { @@ -71,6 +77,6 @@ private void validateHubExists(UUID hubId) { } private Company findCompany(UUID id) { - return companyRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("해당 업체를 찾을 수 없습니다.")); + return companyRepository.findByIdAndDeletedAtIsNull(id).orElseThrow(() -> new ResourceNotFoundException("해당 업체를 찾을 수 없습니다.")); } } \ No newline at end of file diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java index 21bdc85..5605c27 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java @@ -68,6 +68,10 @@ public void applyUpdate(CompanyUpdateDto dto, long userId) { update(newName, newAddress, newHubId, userId); } + public void delete(long userId) { + super.delete(userId); + } + /// /////////////////////////////////////////////////////////////////////////////////////// // 업체 수정 시 검증 diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java index 28b838c..e7a8003 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java @@ -9,11 +9,7 @@ public interface CompanyRepository { Company save(Company company); - List findAll(); + List findAllByDeletedAtIsNull(); - Optional findById(UUID id); - - boolean existsByName(String name); - - void delete(Company company); + Optional findByIdAndDeletedAtIsNull(UUID id); } \ No newline at end of file diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java index 4e6c802..8c9b686 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -50,6 +50,11 @@ public ResponseEntity updateCompany(@PathVariable UUID companyI } // 삭제 + @DeleteMapping("/{companyId}") + public ResponseEntity deleteCompany(@PathVariable UUID companyId) { + companyService.deleteCompany(companyId); + return ResponseEntity.noContent().build(); + } } From 2cda32d12265c35ccd94f6ef4c8fc9b6c19c4fa5 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Thu, 20 Mar 2025 13:55:30 +0900 Subject: [PATCH 121/389] =?UTF-8?q?=F0=9F=9A=9A=20move=20:=20HubRoute=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/HubRoutesService.java | 32 ------------ .../hub/domain/repository/HubRepository.java | 2 - .../controller/HubRoutesController.java | 27 ---------- .../dto/response/HubRouteCreateResponse.java | 29 +++++++++++ .../dto/response/HubRouteResponse.java | 4 +- .../application/service/HubRouteService.java | 50 +++++++++++++++++++ .../domain/model/HubRoute.java | 3 +- .../domain/model/HubRouteCheckpoint.java | 3 +- .../domain/repository/HubRouteRepository.java | 10 ++++ .../persistence/JPAHubRouteRepository.java | 12 +++++ .../controller/HubRouteController.java | 38 ++++++++++++++ 11 files changed, 145 insertions(+), 65 deletions(-) delete mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubRoutesService.java delete mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubRoutesController.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteCreateResponse.java rename hub-service/src/main/java/com/sparta/hubservice/{hub => hub_route}/application/dto/response/HubRouteResponse.java (84%) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java rename hub-service/src/main/java/com/sparta/hubservice/{hub => hub_route}/domain/model/HubRoute.java (93%) rename hub-service/src/main/java/com/sparta/hubservice/{hub => hub_route}/domain/model/HubRouteCheckpoint.java (92%) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteRepository.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubRoutesService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubRoutesService.java deleted file mode 100644 index cc29ba2..0000000 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubRoutesService.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.sparta.hubservice.hub.application.service; - -import com.sparta.commonmodule.exception.ResourceNotFoundException; -import com.sparta.hubservice.hub.application.dto.response.HubRouteResponse; -import com.sparta.hubservice.hub.domain.model.HubRoute; -import com.sparta.hubservice.hub.domain.repository.HubRepository; -import java.util.Optional; -import java.util.UUID; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -@Slf4j(topic = "HubRoutesService") -public class HubRoutesService { - - private final HubRepository hubRepository; - - public HubRouteResponse getHubRoute(String fromHubIdString, String toHubIdString) { - UUID fromHubId = UUID.fromString(fromHubIdString); - UUID toHubId = UUID.fromString(toHubIdString); - - Optional hubRoute = hubRepository.findByFromHubIdAndToHubIdAndIsDeletedFalse(fromHubId, toHubId); - - if(hubRoute.isEmpty()){ - throw new ResourceNotFoundException("Hub route not found"); - } - - return new HubRouteResponse(hubRoute.get()); - } -} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java index 43f7f7f..e48e6c2 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java @@ -1,7 +1,6 @@ package com.sparta.hubservice.hub.domain.repository; import com.sparta.hubservice.hub.domain.model.Hub; -import com.sparta.hubservice.hub.domain.model.HubRoute; import java.util.Optional; import java.util.UUID; import org.springframework.data.domain.Page; @@ -15,5 +14,4 @@ public interface HubRepository { S save(S hub); - Optional findByFromHubIdAndToHubIdAndIsDeletedFalse(UUID fromHubId, UUID toHubId); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubRoutesController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubRoutesController.java deleted file mode 100644 index e6383dc..0000000 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubRoutesController.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.sparta.hubservice.hub.presentation.controller; - - -import com.sparta.hubservice.hub.application.dto.response.HubRouteResponse; -import com.sparta.hubservice.hub.application.service.HubRoutesService; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/v1/hub-routes") -@RequiredArgsConstructor -public class HubRoutesController { - - private final HubRoutesService hubRoutesService; - - // 허브 간 경로 조회 - @GetMapping("/{from_hub_id}/{to_hub_id}") - public ResponseEntity getHubRoute(@PathVariable String from_hub_id, @PathVariable String to_hub_id) { - HubRouteResponse response = hubRoutesService.getHubRoute(from_hub_id, to_hub_id); - return ResponseEntity.ok(response); - } - -} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteCreateResponse.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteCreateResponse.java new file mode 100644 index 0000000..f4640e5 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteCreateResponse.java @@ -0,0 +1,29 @@ +package com.sparta.hubservice.hub_route.application.dto.response; + +import com.sparta.hubservice.hub_route.domain.model.HubRoute; +import java.math.BigDecimal; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor +public class HubRouteCreateResponse { + + private final UUID hubRouteId; + private final UUID fromHubId; + private final UUID toHubId; + private final int duration; + private final BigDecimal distance; + + public HubRouteCreateResponse(HubRoute hubRoute) { + this.hubRouteId = hubRoute.getHubRouteId(); + this.fromHubId = hubRoute.getFromHub().getHubId(); + this.toHubId = hubRoute.getToHub().getHubId(); + this.duration = hubRoute.getDuration(); + this.distance = hubRoute.getDistance(); + } + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/HubRouteResponse.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteResponse.java similarity index 84% rename from hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/HubRouteResponse.java rename to hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteResponse.java index 079153d..3dd0f57 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/dto/response/HubRouteResponse.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteResponse.java @@ -1,6 +1,6 @@ -package com.sparta.hubservice.hub.application.dto.response; +package com.sparta.hubservice.hub_route.application.dto.response; -import com.sparta.hubservice.hub.domain.model.HubRoute; +import com.sparta.hubservice.hub_route.domain.model.HubRoute; import java.math.BigDecimal; import java.util.UUID; import lombok.AllArgsConstructor; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java new file mode 100644 index 0000000..8957a28 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java @@ -0,0 +1,50 @@ +package com.sparta.hubservice.hub_route.application.service; + +import com.sparta.commonmodule.exception.ResourceNotFoundException; +import com.sparta.hubservice.hub.domain.repository.HubRepository; +import com.sparta.hubservice.hub_route.application.dto.response.HubRouteCreateResponse; +import com.sparta.hubservice.hub_route.application.dto.response.HubRouteResponse; +import com.sparta.hubservice.hub.domain.model.Hub; +import com.sparta.hubservice.hub_route.domain.model.HubRoute; +import com.sparta.hubservice.hub_route.domain.repository.HubRouteRepository; +import java.util.Optional; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +@Slf4j(topic = "HubRoutesService") +public class HubRouteService { + + private final HubRouteRepository hubRouteRepository; + private final HubRepository hubRepository; + + // 허브 간 경로 조회 + public HubRouteResponse getHubRoute(UUID fromHubId, UUID toHubId) { + + Optional hubRoute = hubRouteRepository.findByFromHubIdAndToHubIdAndIsDeletedFalse(fromHubId, toHubId); + + if(hubRoute.isEmpty()){ + throw new ResourceNotFoundException("Hub route not found"); + } + + return new HubRouteResponse(hubRoute.get()); + } + + // 허브 간 경로 생성 + public HubRouteCreateResponse createHubRoute(UUID fromHubId, UUID toHubId) { + Optional fromHub = hubRepository.findById(fromHubId); + Optional toHub = hubRepository.findById(toHubId); + // fromHub.getAddress() 와 toHub.getAddress()를 가지고 거리, 시간 가져오기 + + HubRoute saveHubRoute = + HubRoute.builder() + .fromHub(fromHub.get()) + .toHub(toHub.get()) + .build(); + + return null; + } +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubRoute.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRoute.java similarity index 93% rename from hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubRoute.java rename to hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRoute.java index 68d0cf3..6c0d541 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubRoute.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRoute.java @@ -1,6 +1,7 @@ -package com.sparta.hubservice.hub.domain.model; +package com.sparta.hubservice.hub_route.domain.model; import com.sparta.commonmodule.entity.BaseEntity; +import com.sparta.hubservice.hub.domain.model.Hub; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubRouteCheckpoint.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRouteCheckpoint.java similarity index 92% rename from hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubRouteCheckpoint.java rename to hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRouteCheckpoint.java index 7975ec2..0a78c71 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubRouteCheckpoint.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRouteCheckpoint.java @@ -1,6 +1,7 @@ -package com.sparta.hubservice.hub.domain.model; +package com.sparta.hubservice.hub_route.domain.model; import com.sparta.commonmodule.entity.BaseEntity; +import com.sparta.hubservice.hub.domain.model.Hub; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java new file mode 100644 index 0000000..3958c12 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java @@ -0,0 +1,10 @@ +package com.sparta.hubservice.hub_route.domain.repository; + +import com.sparta.hubservice.hub_route.domain.model.HubRoute; +import java.util.Optional; +import java.util.UUID; + +public interface HubRouteRepository { + + Optional findByFromHubIdAndToHubIdAndIsDeletedFalse(UUID fromHubId, UUID toHubId); +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteRepository.java new file mode 100644 index 0000000..834170d --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteRepository.java @@ -0,0 +1,12 @@ +package com.sparta.hubservice.hub_route.infrastructure.persistence; + +import com.sparta.hubservice.hub_route.domain.model.HubRoute; +import com.sparta.hubservice.hub_route.domain.repository.HubRouteRepository; +import java.util.UUID; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface JPAHubRouteRepository extends JpaRepository, HubRouteRepository { + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java new file mode 100644 index 0000000..5a61a01 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java @@ -0,0 +1,38 @@ +package com.sparta.hubservice.hub_route.presentation.controller; + + +import com.sparta.hubservice.hub_route.application.dto.response.HubRouteCreateResponse; +import com.sparta.hubservice.hub_route.application.dto.response.HubRouteResponse; +import com.sparta.hubservice.hub_route.application.service.HubRouteService; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/v1/hub-routes") +@RequiredArgsConstructor +public class HubRouteController { + + private final HubRouteService hubRoutesService; + + // 허브 간 경로 조회 -> 기능 추가 예정 + @GetMapping("/{from_hub_id}/{to_hub_id}") + public ResponseEntity getHubRoute(@PathVariable String from_hub_id, @PathVariable String to_hub_id) { + HubRouteResponse response = hubRoutesService.getHubRoute(UUID.fromString(from_hub_id), UUID.fromString(to_hub_id)); + return ResponseEntity.ok(response); + } + + // 허브 간 경로 생성 + // 미완성-> naver api 이용하여 자동 경로 생성으로 기능 추가 예정 + @PostMapping("/{from_hub_id}/{to_hub_id}") + public ResponseEntity createHubRoute(@PathVariable String from_hub_id, @PathVariable String to_hub_id) { + HubRouteCreateResponse response = hubRoutesService.createHubRoute(UUID.fromString(from_hub_id), UUID.fromString(to_hub_id)); + return ResponseEntity.ok(response); + } + +} From bbffaf5da917511455ec17150ce04fddcaa3f271 Mon Sep 17 00:00:00 2001 From: jiyun Date: Thu, 20 Mar 2025 15:46:43 +0900 Subject: [PATCH 122/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#95]?= =?UTF-8?q?=20=EC=97=85=EC=B2=B4=20=EC=82=AD=EC=A0=9C=20=EC=8B=9C=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/CompanyService.java | 4 +++- .../presentation/controller/CompanyController.java | 7 ++++--- .../presentation/response/CompanyDeleteResponse.java | 12 ++++++++++++ 3 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 company-service/src/main/java/com/sparta/companyservice/presentation/response/CompanyDeleteResponse.java diff --git a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java index 29067e5..13fcb4e 100644 --- a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java +++ b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java @@ -7,6 +7,7 @@ import com.sparta.companyservice.domain.model.Company; import com.sparta.companyservice.domain.repository.CompanyRepository; import com.sparta.companyservice.infrastructure.client.HubClient; +import com.sparta.companyservice.presentation.response.CompanyDeleteResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -63,9 +64,10 @@ public CompanyDto updateCompany(UUID id, CompanyUpdateDto dto) { } @Transactional // 삭제 - public void deleteCompany(UUID id) { + public CompanyDeleteResponse deleteCompany(UUID id) { Company company = findCompany(id); company.delete(userId); + return CompanyDeleteResponse.of(id); } /// ////////////////////////////////////////////////////////////////////////////////// diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java index 8c9b686..592d914 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -4,6 +4,7 @@ import com.sparta.companyservice.application.service.CompanyService; import com.sparta.companyservice.presentation.request.CompanyCreateRequest; import com.sparta.companyservice.presentation.request.CompanyUpdateRequest; +import com.sparta.companyservice.presentation.response.CompanyDeleteResponse; import com.sparta.companyservice.presentation.response.CompanyResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -51,9 +52,9 @@ public ResponseEntity updateCompany(@PathVariable UUID companyI // 삭제 @DeleteMapping("/{companyId}") - public ResponseEntity deleteCompany(@PathVariable UUID companyId) { - companyService.deleteCompany(companyId); - return ResponseEntity.noContent().build(); + public ResponseEntity deleteCompany(@PathVariable UUID companyId) { + CompanyDeleteResponse deletedCompany = companyService.deleteCompany(companyId); + return ResponseEntity.ok(deletedCompany); } } diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/response/CompanyDeleteResponse.java b/company-service/src/main/java/com/sparta/companyservice/presentation/response/CompanyDeleteResponse.java new file mode 100644 index 0000000..460e45e --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/response/CompanyDeleteResponse.java @@ -0,0 +1,12 @@ +package com.sparta.companyservice.presentation.response; + +import java.util.UUID; + +public record CompanyDeleteResponse ( + UUID id, + String Message +) { + public static CompanyDeleteResponse of(UUID id) { + return new CompanyDeleteResponse(id, "업체가 성공적으로 삭제되었습니다."); + } +} From 5fcc73979fc2766056a57da32902256c04af41ac Mon Sep 17 00:00:00 2001 From: devdaeun Date: Thu, 20 Mar 2025 16:25:07 +0900 Subject: [PATCH 123/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#97]?= =?UTF-8?q?=20:=20gateway,=20user=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= =?UTF-8?q?=20-=20GATEWAY=EC=97=90=EC=84=9C=EC=9D=98=20=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=20=EC=9D=B8=EA=B0=80=EC=B2=98=EB=A6=AC=EB=A5=BC=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20security=20filter=EC=9D=B4=EB=8F=99=20-=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=20=EA=B2=80=EC=A6=9D=20=ED=9B=84=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=EC=9D=84=20=EC=A0=90=EA=B2=80=ED=95=A0=20=EC=88=98=20?= =?UTF-8?q?=EC=9E=88=EB=8F=84=EB=A1=9D=20@Component=20=EC=96=B4=EB=85=B8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=82=AD=EC=A0=9C=20-=20jwt=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=EA=B0=92=20=EA=B2=80=EC=A6=9D=20=ED=9B=84=20?= =?UTF-8?q?reqeustheader=EC=97=90=20payload=EB=82=B4=EC=9A=A9=EB=93=A4?= =?UTF-8?q?=EB=A7=8C=20=EC=B6=94=EA=B0=80=ED=95=98=EC=97=AC=20=EC=A0=84?= =?UTF-8?q?=EB=8B=AC=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95.=20-?= =?UTF-8?q?=20user=20=EC=84=9C=EB=B9=84=EC=8A=A4=20security=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gateway/build.gradle | 4 + .../gateway/JwtAuthenticationFilter.java | 77 ++++++++++++------- .../sparta/gateway/config/SecurityConfig.java | 39 ++++++++++ user-service/build.gradle | 2 +- .../configuration/JwtConfig.java | 28 ------- 5 files changed, 94 insertions(+), 56 deletions(-) create mode 100644 gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java diff --git a/gateway/build.gradle b/gateway/build.gradle index 6b55c02..df6f6d4 100644 --- a/gateway/build.gradle +++ b/gateway/build.gradle @@ -4,9 +4,13 @@ ext { dependencies { implementation 'io.jsonwebtoken:jjwt:0.12.6' + runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.6' + runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.12.6' implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.cloud:spring-cloud-starter-gateway' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' + implementation 'org.springframework.boot:spring-boot-starter-security' + } dependencyManagement { diff --git a/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java b/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java index fd8ed0e..2605c34 100644 --- a/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java +++ b/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java @@ -6,54 +6,73 @@ import io.jsonwebtoken.io.Decoders; import io.jsonwebtoken.security.Keys; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.cloud.gateway.filter.GatewayFilterChain; -import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.server.reactive.ServerHttpRequest; -import org.springframework.stereotype.Component; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebFilter; +import org.springframework.web.server.WebFilterChain; import reactor.core.publisher.Mono; import javax.crypto.SecretKey; @Slf4j -@Component -public class JwtAuthenticationFilter implements GlobalFilter { - @Value("${service.jwt.secret-key}") +public class JwtAuthenticationFilter implements WebFilter { private String secretKey; + public JwtAuthenticationFilter(String secretKey) { + this.secretKey = secretKey; + } + @Override - public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { String path = exchange.getRequest().getURI().getPath(); - log.debug("Request Path: {}", path); if (path.equals("/api/v1/users/sign-up") || path.equals("/api/v1/users/sign-in")) { return chain.filter(exchange); //회원가입, 로그인은 JWT 토큰인증 x } + ServerHttpRequest request = exchange.getRequest(); + ServerHttpResponse response = exchange.getResponse(); + log.info(secretKey); + log.info(request.getURI().toString()); + + String token = extractToken(request); //토큰값을 Bearer 떼고 가져옴 + log.info(token); - String token = extractToken(exchange); if (token == null || !validateToken(token)) { - exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); + response.setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } - Claims claims = extractClaims(token); //Payload 부분 추출 - log.info("Extracted user_id from token: {}", claims.get("user_id")); - log.info("Extracted role from token: {}", claims.get("role")); + log.info(token); + Claims claims = extractClaims(token); //사용자 정보 추출 + log.info(claims.getSubject()); + + //응답 헤더에 사용자 정보 반환처리 + setAuthenticationHeader(claims,request); + log.info(request.getHeaders().toString()); + return chain.filter(exchange); + } + - // 추출한 정보(header로 전달) - ServerHttpRequest modifiedRequest =exchange.getRequest().mutate() - .header("user_id",claims.get("user_id", String.class)) - .header("role", claims.get("role",String.class)) - .header("slack_id",claims.get("slack_id",String.class)) - .build(); - log.info(String.valueOf(exchange.getRequest().getHeaders())); - // 수정된 요청을 포함하여 필터 체인으로 이동 - return chain.filter(exchange.mutate().request(modifiedRequest).build()); + private void setAuthenticationHeader(Claims claims, ServerHttpRequest request) { + SecurityContext context = SecurityContextHolder.createEmptyContext(); + String user_id = claims.get("user_id", String.class); + String role = claims.get("role", String.class); + String slack_name = claims.get("slack_name",String.class); + + HttpHeaders headers = request.getHeaders(); + headers.add("user_id", user_id); + headers.add("role", role); + headers.add("slack_name", slack_name); } + + private Claims extractClaims(String token) { SecretKey key = Keys.hmacShaKeyFor(Decoders.BASE64URL.decode(secretKey)); //SecretKey 형태로 변환 @@ -66,8 +85,8 @@ private Claims extractClaims(String token) { } - private String extractToken(ServerWebExchange exchange) { - String authHeader = exchange.getRequest().getHeaders().getFirst("Authorization"); + private String extractToken(ServerHttpRequest request) { + String authHeader = request.getHeaders().getFirst("Authorization"); if (authHeader != null && authHeader.startsWith("Bearer ")) { return authHeader.substring(7); } @@ -78,14 +97,18 @@ private boolean validateToken(String token) { try { SecretKey key = Keys.hmacShaKeyFor(Decoders.BASE64URL.decode(secretKey)); Jws claimsJws = Jwts.parser() - .verifyWith(key) - .build().parseSignedClaims(token); + .setSigningKey(key) + .build() + .parseClaimsJws(token); log.info("#####payload :: " + claimsJws.getPayload().toString()); // 추가적인 검증 로직 (예: 토큰 만료 여부 확인 등)을 여기에 추가할 수 있습니다. return true; } catch (Exception e) { + log.error("Error extracting claims: " + e.getMessage()); return false; } } + + } diff --git a/gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java b/gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java new file mode 100644 index 0000000..a3f3cd7 --- /dev/null +++ b/gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java @@ -0,0 +1,39 @@ +package com.sparta.gateway.config; + +import com.sparta.gateway.JwtAuthenticationFilter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; +import org.springframework.security.config.web.server.SecurityWebFiltersOrder; +import org.springframework.security.config.web.server.ServerHttpSecurity; +import org.springframework.security.web.server.SecurityWebFilterChain; +import org.springframework.security.web.server.context.NoOpServerSecurityContextRepository; + +@EnableWebFluxSecurity +@Configuration +public class SecurityConfig { + + @Value("${service.jwt.secret-key}") + private String secretKey; + + @Bean + public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { + return http + .csrf(csrf -> csrf.disable()) + .authorizeExchange(exchange -> exchange + .pathMatchers("api/v1/users/sign-in", "api/v1/users/sign-up").permitAll() + .pathMatchers("/api/v1/**").permitAll() // 권한 기반 접근 + .anyExchange().authenticated() + ) + .addFilterBefore(jwtAuthenticationFilter(), SecurityWebFiltersOrder.AUTHENTICATION) + .securityContextRepository(NoOpServerSecurityContextRepository.getInstance()) + .build(); + } + + private JwtAuthenticationFilter jwtAuthenticationFilter() { + return new JwtAuthenticationFilter(secretKey); + } + + +} diff --git a/user-service/build.gradle b/user-service/build.gradle index b68d183..3209f29 100644 --- a/user-service/build.gradle +++ b/user-service/build.gradle @@ -7,7 +7,7 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'io.jsonwebtoken:jjwt:0.12.6' implementation 'org.springframework.boot:spring-boot-starter-actuator' - implementation 'org.springframework.boot:spring-boot-starter-security' +// implementation 'org.springframework.boot:spring-boot-starter-security' testImplementation 'org.springframework.security:spring-security-test' testImplementation 'io.projectreactor:reactor-test' runtimeOnly 'org.postgresql:postgresql' diff --git a/user-service/src/main/java/com/sparta/user/infastructure/configuration/JwtConfig.java b/user-service/src/main/java/com/sparta/user/infastructure/configuration/JwtConfig.java index 31f8c4f..7aeb4cb 100644 --- a/user-service/src/main/java/com/sparta/user/infastructure/configuration/JwtConfig.java +++ b/user-service/src/main/java/com/sparta/user/infastructure/configuration/JwtConfig.java @@ -2,39 +2,11 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.web.SecurityFilterChain; @Configuration -@EnableWebSecurity public class JwtConfig { - // SecurityFilterChain 빈을 정의합니다. 이 메서드는 Spring Security의 보안 필터 체인을 구성합니다. - @Bean - public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - http - // CSRF 보호를 비활성화합니다. CSRF 보호는 주로 브라우저 클라이언트를 대상으로 하는 공격을 방지하기 위해 사용됩니다. - .csrf(csrf -> csrf.disable()) - // 요청에 대한 접근 권한을 설정합니다. - .authorizeRequests(authorize -> authorize - // /auth/signIn 경로에 대한 접근을 허용합니다. 이 경로는 인증 없이 접근할 수 있습니다. - .requestMatchers("/api/v1/users/sign-up").permitAll() - .requestMatchers("/api/v1/users/sign-in").permitAll() - // 그 외의 모든 요청은 인증이 필요합니다. - .anyRequest().authenticated() - ) - // 세션 관리 정책을 정의합니다. 여기서는 세션을 사용하지 않도록 STATELESS로 설정합니다. - .sessionManagement(session -> session - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - ); - - // 설정된 보안 필터 체인을 반환합니다. - return http.build(); - } - @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); From 0b0e57f927ccff3673246b53e9b994ccc652a0fe Mon Sep 17 00:00:00 2001 From: devdaeun Date: Thu, 20 Mar 2025 16:40:02 +0900 Subject: [PATCH 124/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#97]?= =?UTF-8?q?=20:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EB=A5=BC=EC=9C=84=ED=95=9C?= =?UTF-8?q?=20exclude=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- slack-service/src/main/resources/application.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/slack-service/src/main/resources/application.yml b/slack-service/src/main/resources/application.yml index ecfb44b..ce6a6e9 100644 --- a/slack-service/src/main/resources/application.yml +++ b/slack-service/src/main/resources/application.yml @@ -1,7 +1,8 @@ spring: application: name: slack-service - + autoconfigure: + exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration server: port: 8087 From 36118c1de01bf8997fb963282fd7bf0030995196 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Thu, 20 Mar 2025 20:06:52 +0900 Subject: [PATCH 125/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#98]?= =?UTF-8?q?=20:=20=EA=B0=9D=EC=B2=B4=EC=A7=80=ED=96=A5=20=EC=9B=90?= =?UTF-8?q?=EC=B9=99=EC=97=90=20=EB=A7=9E=EB=8A=94=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=84=B0=EB=A7=81=20=EC=A7=84=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/UserSigninResponseDto.java | 13 ---- .../{ => request}/UserSigninReqeustDto.java | 2 +- .../{ => request}/UserSignupRequestDto.java | 15 +++- .../dto/response/UserSigninResponseDto.java | 19 +++++ .../user/application/service/AuthService.java | 14 +--- .../user/application/service/UserService.java | 76 ++++++++----------- .../com/sparta/user/domain/model/User.java | 8 +- .../domain/repository/UserRepository.java | 11 +++ .../{JwtConfig.java => UserConfig.java} | 4 +- .../repository/JpaUserRepository.java | 12 +-- .../user/presentation/UserController.java | 62 +++++---------- 11 files changed, 106 insertions(+), 130 deletions(-) delete mode 100644 user-service/src/main/java/com/sparta/user/application/dto/UserSigninResponseDto.java rename user-service/src/main/java/com/sparta/user/application/dto/{ => request}/UserSigninReqeustDto.java (94%) rename user-service/src/main/java/com/sparta/user/application/dto/{ => request}/UserSignupRequestDto.java (75%) create mode 100644 user-service/src/main/java/com/sparta/user/application/dto/response/UserSigninResponseDto.java create mode 100644 user-service/src/main/java/com/sparta/user/domain/repository/UserRepository.java rename user-service/src/main/java/com/sparta/user/infastructure/configuration/{JwtConfig.java => UserConfig.java} (94%) diff --git a/user-service/src/main/java/com/sparta/user/application/dto/UserSigninResponseDto.java b/user-service/src/main/java/com/sparta/user/application/dto/UserSigninResponseDto.java deleted file mode 100644 index fc833c3..0000000 --- a/user-service/src/main/java/com/sparta/user/application/dto/UserSigninResponseDto.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.sparta.user.application.dto; - -import com.sparta.user.domain.model.UserRoleEnum; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class UserSigninResponseDto { - private Long id; - private String role; - private String slackName; -} diff --git a/user-service/src/main/java/com/sparta/user/application/dto/UserSigninReqeustDto.java b/user-service/src/main/java/com/sparta/user/application/dto/request/UserSigninReqeustDto.java similarity index 94% rename from user-service/src/main/java/com/sparta/user/application/dto/UserSigninReqeustDto.java rename to user-service/src/main/java/com/sparta/user/application/dto/request/UserSigninReqeustDto.java index 5967598..4bd5f7e 100644 --- a/user-service/src/main/java/com/sparta/user/application/dto/UserSigninReqeustDto.java +++ b/user-service/src/main/java/com/sparta/user/application/dto/request/UserSigninReqeustDto.java @@ -1,4 +1,4 @@ -package com.sparta.user.application.dto; +package com.sparta.user.application.dto.request; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Pattern; diff --git a/user-service/src/main/java/com/sparta/user/application/dto/UserSignupRequestDto.java b/user-service/src/main/java/com/sparta/user/application/dto/request/UserSignupRequestDto.java similarity index 75% rename from user-service/src/main/java/com/sparta/user/application/dto/UserSignupRequestDto.java rename to user-service/src/main/java/com/sparta/user/application/dto/request/UserSignupRequestDto.java index 6f74b61..66d6cdf 100644 --- a/user-service/src/main/java/com/sparta/user/application/dto/UserSignupRequestDto.java +++ b/user-service/src/main/java/com/sparta/user/application/dto/request/UserSignupRequestDto.java @@ -1,5 +1,7 @@ -package com.sparta.user.application.dto; +package com.sparta.user.application.dto.request; +import com.sparta.user.domain.model.User; +import com.sparta.user.domain.model.UserRoleEnum; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Pattern; @@ -34,5 +36,16 @@ public class UserSignupRequestDto { private String tokenValue; + public User createUser(String password, UserRoleEnum role){ + return User.builder() + .username(username) + .password(password) + .email(email) + .slackName(slackName) + .role(role.getAuthority()) + .build(); + } + + } diff --git a/user-service/src/main/java/com/sparta/user/application/dto/response/UserSigninResponseDto.java b/user-service/src/main/java/com/sparta/user/application/dto/response/UserSigninResponseDto.java new file mode 100644 index 0000000..1269439 --- /dev/null +++ b/user-service/src/main/java/com/sparta/user/application/dto/response/UserSigninResponseDto.java @@ -0,0 +1,19 @@ +package com.sparta.user.application.dto.response; + +import com.sparta.user.domain.model.User; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UserSigninResponseDto { + private Long id; + private String role; + private String slackName; + + public UserSigninResponseDto(User user) { + this.id = user.getId(); + this.role = user.getRole(); + this.slackName = user.getSlackName(); + } +} diff --git a/user-service/src/main/java/com/sparta/user/application/service/AuthService.java b/user-service/src/main/java/com/sparta/user/application/service/AuthService.java index 3c2a333..f3caa7e 100644 --- a/user-service/src/main/java/com/sparta/user/application/service/AuthService.java +++ b/user-service/src/main/java/com/sparta/user/application/service/AuthService.java @@ -1,6 +1,6 @@ package com.sparta.user.application.service; -import com.sparta.user.application.dto.UserSigninResponseDto; +import com.sparta.user.application.dto.response.UserSigninResponseDto; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.io.Decoders; import io.jsonwebtoken.security.Keys; @@ -20,22 +20,10 @@ public class AuthService { private final SecretKey secretKey; - /** - * AuthService 생성자. - * Base64 URL 인코딩된 비밀 키를 디코딩하여 HMAC-SHA 알고리즘에 적합한 SecretKey 객체를 생성합니다. - * - * @param secretKey Base64 URL 인코딩된 비밀 키 - */ public AuthService(@Value("${service.jwt.secret-key}") String secretKey) { this.secretKey = Keys.hmacShaKeyFor(Decoders.BASE64URL.decode(secretKey)); } - /** - * 사용자 UserSigninResponseDto 받아 JWT 액세스 토큰을 생성합니다. - * - * responseDto 사용자 정보Dto - * @return 생성된 JWT 액세스 토큰 - */ public String createAccessToken(UserSigninResponseDto responseDto) { return Jwts.builder() // 사용자 ID를 클레임으로 설정 diff --git a/user-service/src/main/java/com/sparta/user/application/service/UserService.java b/user-service/src/main/java/com/sparta/user/application/service/UserService.java index d16c8c4..96a703e 100644 --- a/user-service/src/main/java/com/sparta/user/application/service/UserService.java +++ b/user-service/src/main/java/com/sparta/user/application/service/UserService.java @@ -1,74 +1,51 @@ package com.sparta.user.application.service; -import com.sparta.user.application.dto.UserSigninReqeustDto; -import com.sparta.user.application.dto.UserSigninResponseDto; -import com.sparta.user.application.dto.UserSignupRequestDto; +import com.sparta.user.application.dto.request.UserSigninReqeustDto; +import com.sparta.user.application.dto.response.UserSigninResponseDto; +import com.sparta.user.application.dto.request.UserSignupRequestDto; import com.sparta.user.domain.model.User; import com.sparta.user.domain.model.UserRoleEnum; import com.sparta.user.infastructure.configuration.AuthConfig; import com.sparta.user.infastructure.repository.JpaUserRepository; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import javax.naming.AuthenticationException; -import java.util.Optional; @Service @RequiredArgsConstructor public class UserService { private final JpaUserRepository userRepository; - private final PasswordEncoder passwordEncoder; - private final AuthConfig authConfig; + private final AuthService authService; - public ResponseEntity signUp(UserSignupRequestDto requestDto) { - //중복 확인 - Optional duplicate = userRepository.findDulicate(requestDto.getUsername(), - requestDto.getEmail(), requestDto.getSlackName()); - if(duplicate.isPresent()){ - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Username or Email is already taken."); - } - //권한 설정 + //회원가입 + public Long signUp(UserSignupRequestDto requestDto) throws IllegalAccessException { + validDuplicatedNames(requestDto); UserRoleEnum role = checkUserRole(requestDto.getTokenValue()); - - User user = userRepository.save( - User.builder() - .username(requestDto.getUsername()) - .password(passwordEncoder.encode(requestDto.getPassword())) - .email(requestDto.getEmail()) - .slackName(requestDto.getSlackName()) - .role(role.getAuthority()) - .build() - ); - return ResponseEntity.ok("sign-up success"); + User user = requestDto.createUser(encryptPassword(requestDto.getPassword()), role); + return userRepository.save(user).getId(); } - - public UserSigninResponseDto signIn(@Valid UserSigninReqeustDto reqeustDto) throws AuthenticationException { - //아이디 비밀번호 일치여부 확인. - Optional userinfo = userRepository.findByUsername(reqeustDto.getUsername()); - - User user = userinfo.orElseThrow(()-> new AuthenticationException("아이디가 존재하지않습니다.")); - boolean pwcheck = passwordEncoder.matches(reqeustDto.getPassword(), user.getPassword()); //비밀번호 일치여부 판단 - + //로그인 + public String signIn(@Valid UserSigninReqeustDto reqeustDto) throws AuthenticationException { + User user = userRepository.findByUsername(reqeustDto.getUsername()) + .orElseThrow(()-> new AuthenticationException("아이디가 존재하지않습니다.")); + passwordMatchChecker(reqeustDto,user); + UserSigninResponseDto responseDto = new UserSigninResponseDto(user); + return authService.createAccessToken(responseDto); + } + //비밀번호 인증 + private void passwordMatchChecker(UserSigninReqeustDto reqeustDto, User user) throws AuthenticationException { + boolean pwcheck = passwordEncoder.matches(reqeustDto.getPassword(), user.getPassword()); if(!pwcheck){ throw new AuthenticationException("아이디나 비밀번호가 일치하지않습니다.");// 일치하지않는 부분 특정방지 } - - //비밀번호 일치 (토큰 생성을 위한 dto 전달.) - UserSigninResponseDto responseDto = new UserSigninResponseDto(); - responseDto.setId(user.getId()); - responseDto.setRole(user.getRole()); - responseDto.setSlackName(user.getSlackName()); - - return responseDto; } - + //권한 키 체크 private UserRoleEnum checkUserRole(String tokenValue) { if (authConfig.getMasterKey().equals(tokenValue)) { return UserRoleEnum.MASTER; @@ -80,6 +57,17 @@ private UserRoleEnum checkUserRole(String tokenValue) { return UserRoleEnum.COMPANY; } } + //비밀번호 암호화 + private String encryptPassword (String password) { + return passwordEncoder.encode(password); + } + //중복이름방지 + private void validDuplicatedNames(UserSignupRequestDto requestDto) throws IllegalAccessException { + boolean exsist = userRepository.existsByUsername(requestDto.getUsername()); + if(exsist){ + throw new IllegalAccessException("Username or Email or SlackName is already taken."); + } + } } diff --git a/user-service/src/main/java/com/sparta/user/domain/model/User.java b/user-service/src/main/java/com/sparta/user/domain/model/User.java index 6073f4d..ab42d09 100644 --- a/user-service/src/main/java/com/sparta/user/domain/model/User.java +++ b/user-service/src/main/java/com/sparta/user/domain/model/User.java @@ -4,12 +4,9 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; @Getter -@Setter @NoArgsConstructor -@Builder @Table(name = "p_users") @Entity public class User{ @@ -35,9 +32,8 @@ public class User{ private String role; - - public User(Long id, String username, String password, String email, String slackName, String role) { - this.id = id; + @Builder + public User(String username, String password, String email, String slackName, String role) { this.username = username; this.password = password; this.email = email; diff --git a/user-service/src/main/java/com/sparta/user/domain/repository/UserRepository.java b/user-service/src/main/java/com/sparta/user/domain/repository/UserRepository.java new file mode 100644 index 0000000..c712004 --- /dev/null +++ b/user-service/src/main/java/com/sparta/user/domain/repository/UserRepository.java @@ -0,0 +1,11 @@ +package com.sparta.user.domain.repository; + +import com.sparta.user.domain.model.User; + +import java.util.Optional; + +public interface UserRepository { + Optional findByUsername(String username); + + boolean existsByUsername(String username); +} diff --git a/user-service/src/main/java/com/sparta/user/infastructure/configuration/JwtConfig.java b/user-service/src/main/java/com/sparta/user/infastructure/configuration/UserConfig.java similarity index 94% rename from user-service/src/main/java/com/sparta/user/infastructure/configuration/JwtConfig.java rename to user-service/src/main/java/com/sparta/user/infastructure/configuration/UserConfig.java index 7aeb4cb..c285837 100644 --- a/user-service/src/main/java/com/sparta/user/infastructure/configuration/JwtConfig.java +++ b/user-service/src/main/java/com/sparta/user/infastructure/configuration/UserConfig.java @@ -6,11 +6,9 @@ import org.springframework.security.crypto.password.PasswordEncoder; @Configuration -public class JwtConfig { +public class UserConfig { @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } - - } diff --git a/user-service/src/main/java/com/sparta/user/infastructure/repository/JpaUserRepository.java b/user-service/src/main/java/com/sparta/user/infastructure/repository/JpaUserRepository.java index 0b33898..276cb25 100644 --- a/user-service/src/main/java/com/sparta/user/infastructure/repository/JpaUserRepository.java +++ b/user-service/src/main/java/com/sparta/user/infastructure/repository/JpaUserRepository.java @@ -1,18 +1,14 @@ package com.sparta.user.infastructure.repository; import com.sparta.user.domain.model.User; +import com.sparta.user.domain.repository.UserRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; import java.util.Optional; - -public interface JpaUserRepository extends JpaRepository { - @Query("select u from User u where (u.username = :username or u.email = :email or u.slackName = :slackName)") - Optional findDulicate(@Param("username") String username, - @Param("email") String email, - @Param("slackName") String slackName); - - Optional findByUsername(@Param("username") String username); +@Repository +public interface JpaUserRepository extends JpaRepository , UserRepository { } diff --git a/user-service/src/main/java/com/sparta/user/presentation/UserController.java b/user-service/src/main/java/com/sparta/user/presentation/UserController.java index 08cfacf..f9ed004 100644 --- a/user-service/src/main/java/com/sparta/user/presentation/UserController.java +++ b/user-service/src/main/java/com/sparta/user/presentation/UserController.java @@ -1,68 +1,48 @@ package com.sparta.user.presentation; -import com.sparta.user.application.dto.UserSigninReqeustDto; -import com.sparta.user.application.dto.UserSigninResponseDto; -import com.sparta.user.application.dto.UserSignupRequestDto; -import com.sparta.user.application.service.AuthService; +import com.sparta.user.application.dto.request.UserSigninReqeustDto; +import com.sparta.user.application.dto.request.UserSignupRequestDto; import com.sparta.user.application.service.UserService; +import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; +import org.springframework.web.util.UriComponentsBuilder; import javax.naming.AuthenticationException; +import java.net.URI; @RestController @RequestMapping("/api/v1/users") @RequiredArgsConstructor public class UserController { - - private final AuthService authService; private final UserService userService; @PostMapping("/sign-up") - public ResponseEntity signUp(@Valid @RequestBody UserSignupRequestDto requestDto, BindingResult bindingResult) { - if (bindingResult.hasErrors()) { //회원가입 요구사항 검증 - return ResponseEntity.badRequest().body(bindingResult.getFieldError().getDefaultMessage()); //에러코드 + public ResponseEntity signUp(@Valid @RequestBody UserSignupRequestDto requestDto, BindingResult bindingResult) throws IllegalAccessException { + if (bindingResult.hasErrors()) { + return ResponseEntity.badRequest().build(); } - return userService.signUp(requestDto); + Long userId = userService.signUp(requestDto); + URI createdUserUri = UriComponentsBuilder + .fromUriString("/api/v1/users/{id}") + .buildAndExpand(userId) + .toUri(); + + return ResponseEntity.created(createdUserUri).build(); } @PostMapping("/sign-in") - public ResponseEntity signIn(@Valid @RequestBody UserSigninReqeustDto reqeustDto) throws AuthenticationException { - - //토큰 생성을 위한 user 정보 추출 - UserSigninResponseDto responseDto - = userService.signIn(reqeustDto); - - // 토큰 생성하여 추출 - String accessToken = authService.createAccessToken(responseDto); - - HttpHeaders headers = new HttpHeaders(); - headers.set("Authorization", "Bearer " + accessToken); //ResponseEntity에 추가하기위한 HTTP헤더 생성 - - //토큰생성은 auth Service에서 진행(추출한 user 정보로 토큰생성 후 엑세스 토큰값 전달.) - - return ResponseEntity.ok() - .headers(headers) - .body("success"); + public ResponseEntity signIn(@Valid @RequestBody UserSigninReqeustDto reqeustDto, + HttpServletResponse httpServletResponse) throws AuthenticationException { + String accessToken= userService.signIn(reqeustDto); + //HttpHeaders(중요) + httpServletResponse.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken); + return ResponseEntity.ok().build(); } - -// /** -// * JWT 액세스 토큰을 포함하는 응답 객체입니다. -// */ -// @Data -// @AllArgsConstructor -// @NoArgsConstructor -// static class AuthResponse { -// private String access_token; -// -// } } \ No newline at end of file From 14d3bce65c71e78277299146d3a3fef18687cb1a Mon Sep 17 00:00:00 2001 From: jin2304 Date: Thu, 20 Mar 2025 20:42:35 +0900 Subject: [PATCH 126/389] =?UTF-8?q?=E2=9C=A8=20fix=20[#94]=20:=20=EB=A3=A8?= =?UTF-8?q?=ED=8A=B8=EB=AA=A8=EB=93=88=20=EB=B0=8F=20=EA=B3=B5=ED=86=B5?= =?UTF-8?q?=EB=AA=A8=EB=93=88=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 - common-module/build.gradle | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index f4fb962..a1df3ce 100644 --- a/build.gradle +++ b/build.gradle @@ -37,7 +37,6 @@ subprojects { apply plugin: 'io.spring.dependency-management' dependencies { - implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' //jpa 추가 compileOnly 'org.projectlombok:lombok' diff --git a/common-module/build.gradle b/common-module/build.gradle index be3bee6..d001452 100644 --- a/common-module/build.gradle +++ b/common-module/build.gradle @@ -1,4 +1,5 @@ dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.springframework:spring-tx:5.3.30' } From b49f4cb935b0f704b1a1d8464a2b507ce77b74a3 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Thu, 20 Mar 2025 21:33:06 +0900 Subject: [PATCH 127/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#94]=20:=20Swagger?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20Gateway=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gateway/build.gradle | 3 + .../gateway/JwtAuthenticationFilter.java | 6 +- gateway/src/main/resources/application.yml | 117 +++++++++++++++++- 3 files changed, 118 insertions(+), 8 deletions(-) diff --git a/gateway/build.gradle b/gateway/build.gradle index 6b55c02..3e9dc4b 100644 --- a/gateway/build.gradle +++ b/gateway/build.gradle @@ -7,6 +7,9 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.cloud:spring-cloud-starter-gateway' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' + + implementation 'org.springframework.boot:spring-boot-starter-webflux' + implementation 'org.springdoc:springdoc-openapi-starter-webflux-ui:2.3.0' } dependencyManagement { diff --git a/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java b/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java index fd8ed0e..a55d906 100644 --- a/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java +++ b/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java @@ -27,8 +27,10 @@ public class JwtAuthenticationFilter implements GlobalFilter { public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { String path = exchange.getRequest().getURI().getPath(); log.debug("Request Path: {}", path); - if (path.equals("/api/v1/users/sign-up") || path.equals("/api/v1/users/sign-in")) { - return chain.filter(exchange); //회원가입, 로그인은 JWT 토큰인증 x + if (path.equals("/api/v1/users/sign-up") || path.equals("/api/v1/users/sign-in") || + path.equals("/swagger-ui") || path.equals("/swagger-ui.html") || + path.endsWith("/v3/api-docs") || path.equals("/webjars/swagger-ui")) { + return chain.filter(exchange); //회원가입, 로그인, Swagger 관련 요청은 JWT 토큰인증 x } String token = extractToken(exchange); diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index 591475d..a4deef0 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -10,35 +10,106 @@ spring: exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration cloud: gateway: - routes: # Spring Cloud Gateway? ??? ?? - - id: user-service # ??? ??? - uri: lb://user-service # 'user-service'?? ???? ?? ???? ???? ??? + routes: # Spring Cloud Gateway + # User + - id: user-service + uri: lb://user-service predicates: - - Path=/api/v1/users/** # /api/v1/users/** ??? ???? ??? ? ???? ?? + - Path=/api/v1/users/** + - id: user-docs + uri: lb://user-service + predicates: + - Path=/user-service/** + filters: + - RemoveRequestHeader=Cookie + - RewritePath=/user-service/api/v1/users/(?.*), /api/v1/users/$\{segment} + + + # Order - id: order-service uri: lb://order-service predicates: - Path=/api/v1/orders/** + - id: order-docs + uri: lb://order-service + predicates: + - Path=/order-service/** + filters: + - RemoveRequestHeader=Cookie + - RewritePath=/order-service/api/v1/orders/(?.*), /api/v1/orders/$\{segment} + + + # Company - id: company-service uri: lb://company-service predicates: - Path=/api/v1/companies/** + - id: company-docs + uri: lb://company-service + predicates: + - Path=/company-service/** + filters: + - RemoveRequestHeader=Cookie + - RewritePath=/company-service/api/v1/companies/(?.*), /api/v1/companies/$\{segment} + + + # Hub - id: hub-service uri: lb://hub-service predicates: - Path=/api/v1/hubs/** + - id: hub-docs + uri: lb://hub-service + predicates: + - Path=/hub-service/** + filters: + - RemoveRequestHeader=Cookie + - RewritePath=/hub-service/api/v1/hubs/(?.*), /api/v1/hubs/$\{segment} + + + # Product - id: product-service uri: lb://product-service predicates: - Path=/api/v1/products/** + - id: product-docs + uri: lb://product-service + predicates: + - Path=/product-service/** + filters: + - RemoveRequestHeader=Cookie + - RewritePath=/product-service/api/v1/products/(?.*), /api/v1/products/$\{segment} + + + # Slack - id: slack-service uri: lb://slack-service predicates: - Path=/api/v1/slacks/** + - id: slack-docs + uri: lb://slack-service + predicates: + - Path=/slack-service/** + filters: + - RemoveRequestHeader=Cookie + - RewritePath=/slack-service/api/v1/slacks/(?.*), /api/v1/slacks/$\{segment} + + + # Shipping - id: shipping-service uri: lb://shipping-service predicates: - Path=/api/v1/shippings/** + - id: shipping-docs + uri: lb://shipping-service + predicates: + - Path=/shipping-service/** + filters: + - RemoveRequestHeader=Cookie + - RewritePath=/shipping-service/api/v1/shippings/(?.*), /api/v1/shippings/$\{segment} + + + # Payment - id: payment-service uri: lb://payment-service predicates: @@ -49,7 +120,9 @@ spring: # - Path=/api/v1/auth/** discovery: locator: - enabled: true # ??? ?????? ?? ???? ???? ????? ?? + enabled: true + loadbalancer: + enable: true eureka: client: @@ -59,4 +132,36 @@ eureka: service: jwt: - secret-key: "50OsBNAaYDd8KJkGL8DCy8l8GFeJY--lzgxXrQJA-vUl1ZfivKtLNuwR_qNn2LJ6NkXpg8AAa2fe2CVUtN4UcQ" \ No newline at end of file + secret-key: "50OsBNAaYDd8KJkGL8DCy8l8GFeJY--lzgxXrQJA-vUl1ZfivKtLNuwR_qNn2LJ6NkXpg8AAa2fe2CVUtN4UcQ" + + +springdoc: + enable-native-support: true + api-docs: + enabled: true + path: /v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui.html + use-root-path: true + urls[0]: + name: Order Service + url: /order-service/v3/api-docs + urls[1]: + name: Shipping Service + url: /shipping-service/v3/api-docs + urls[2]: + name: Hub Service + url: /hub-service/v3/api-docs + urls[3]: + name: Company Service + url: /comp-service/v3/api-docs + urls[4]: + name: Slack Service + url: /slack-service/v3/api-docs + urls[5]: + name: User Service + url: /user-service/v3/api-docs + urls[6]: + name: Product Service + url: /product-service/v3/api-docs From 88d66ee2378044c0b7400aac0cf153d0ccb35df9 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Thu, 20 Mar 2025 21:34:27 +0900 Subject: [PATCH 128/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#94]=20:=20Swagger?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EA=B0=81=20=EC=84=9C=EB=B8=8C?= =?UTF-8?q?=20=EB=AA=A8=EB=93=88=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- product-service/build.gradle | 1 + .../infrastructure/config/SwaggerConfig.java | 21 +++++++++++++++++++ .../presentation/ProductController.java | 5 +++++ .../src/main/resources/application.yml | 11 +++++++++- 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 product-service/src/main/java/com/sparta/product/infrastructure/config/SwaggerConfig.java diff --git a/product-service/build.gradle b/product-service/build.gradle index fe552d9..6ae4b91 100644 --- a/product-service/build.gradle +++ b/product-service/build.gradle @@ -3,6 +3,7 @@ ext { } dependencies { + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation project(':common-module') diff --git a/product-service/src/main/java/com/sparta/product/infrastructure/config/SwaggerConfig.java b/product-service/src/main/java/com/sparta/product/infrastructure/config/SwaggerConfig.java new file mode 100644 index 0000000..91be798 --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/infrastructure/config/SwaggerConfig.java @@ -0,0 +1,21 @@ +package com.sparta.product.infrastructure.config; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.servers.Server; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +@Configuration +public class SwaggerConfig { + + @Bean + public OpenAPI openAPI() { + return new OpenAPI() + .servers(List.of( + new Server().url("http://localhost:8080") + )); + } + +} diff --git a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java index e1594a1..defaadd 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java +++ b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java @@ -8,6 +8,8 @@ import com.sparta.product.presentation.dto.response.CreateProductResponseDto; import com.sparta.product.presentation.dto.response.ReadProductResponseDto; import com.sparta.product.presentation.dto.response.UpdateProductResponseDto; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -18,6 +20,7 @@ @RestController @RequestMapping("/api/v1/products") @RequiredArgsConstructor +@Tag(name = "Product Service", description = "상품 서비스 API") public class ProductController { private final ProductServiceImpl productServiceImpl; @@ -25,6 +28,7 @@ public class ProductController { /** * 상품 생성 */ + @Operation(summary = "Product 등록", description = "Product 생성 api 입니다.") @PostMapping public ResponseEntity createProduct(@RequestBody CreateProductRequestDto requestDto, @RequestHeader(value = "X-User-Id", required = true) Long userId) { @@ -35,6 +39,7 @@ public ResponseEntity createProduct(@RequestBody Creat /** * 상품 단일 조회 */ + @Operation(summary = "Product 단일 조회", description = "Product 단일 조회 api 입니다.") @GetMapping("/{productId}") public ResponseEntity readProduct(@PathVariable UUID productId) { return ResponseEntity.ok(productServiceImpl.readProduct(productId)); diff --git a/product-service/src/main/resources/application.yml b/product-service/src/main/resources/application.yml index 956a8c7..f9ea8e3 100644 --- a/product-service/src/main/resources/application.yml +++ b/product-service/src/main/resources/application.yml @@ -25,4 +25,13 @@ eureka: register-with-eureka: true fetch-registry: true service-url: - defaultZone: http://localhost:8761/eureka/ \ No newline at end of file + defaultZone: http://localhost:8761/eureka/ + +springdoc: + api-docs: + version: openapi_3_1 + enabled: true + path: /product-service/v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui.html \ No newline at end of file From e4e8e3ad1ec5c09ff68506b5c4c47ea7093e785b Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Thu, 20 Mar 2025 21:43:20 +0900 Subject: [PATCH 129/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20Query=20DSL?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=9C=20build.gradle=20&=20application?= =?UTF-8?q?.yml=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 --- common-module/build.gradle | 19 +++++++++++++ hub-service/build.gradle | 27 +++++++++++++++++-- .../src/main/resources/application.yml | 4 ++- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/common-module/build.gradle b/common-module/build.gradle index be3bee6..29a32fb 100644 --- a/common-module/build.gradle +++ b/common-module/build.gradle @@ -1,5 +1,24 @@ dependencies { compileOnly 'org.springframework:spring-tx:5.3.30' + // QueryDSL : (hub-service에서 필요) + implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta' + annotationProcessor 'com.querydsl:querydsl-apt:5.1.0:jakarta' + annotationProcessor 'jakarta.annotation:jakarta.annotation-api' + annotationProcessor 'jakarta.persistence:jakarta.persistence-api' +} + +// ✅ QueryDSL 자동 생성 디렉토리 설정 +tasks.withType(JavaCompile).configureEach { + options.annotationProcessorGeneratedSourcesDirectory = file("$buildDir/generated/querydsl") +} + +// ✅ 자동 생성된 QueryDSL 클래스 경로 추가 +sourceSets { + main { + java { + srcDirs += "$buildDir/generated/querydsl" + } + } } diff --git a/hub-service/build.gradle b/hub-service/build.gradle index 49502ac..2144fb5 100644 --- a/hub-service/build.gradle +++ b/hub-service/build.gradle @@ -4,18 +4,41 @@ ext { } dependencies { + // 공통 모듈 + implementation project(':common-module') + // eureka client implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' - implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' // 유효성 검사 implementation 'org.springframework.boot:spring-boot-starter-validation' + // Spring Boot 및 JPA 관련 의존성 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' + + // QueryDSL + implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta' + annotationProcessor 'com.querydsl:querydsl-apt:5.1.0:jakarta' + annotationProcessor 'jakarta.annotation:jakarta.annotation-api' + annotationProcessor 'jakarta.persistence:jakarta.persistence-api' - implementation project(':common-module') // 공통 모듈 implementation 'org.hibernate:hibernate-core:6.3.1.Final' // Hibernate ORM 라이브러리 implementation("org.postgresql:postgresql:42.7.2") // PostgreSQL JDBC 드라이버 runtimeOnly 'com.h2database:h2' // 개발/테스트 환경에서 H2 사용 } +// ✅ QueryDSL 자동 생성 디렉토리 설정 +tasks.withType(JavaCompile).configureEach { + options.annotationProcessorGeneratedSourcesDirectory = file("$buildDir/generated/querydsl") +} + +// ✅ 자동 생성된 QueryDSL 클래스 경로 추가 +sourceSets { + main { + java { + srcDirs += "$buildDir/generated/querydsl" + } + } +} + dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" diff --git a/hub-service/src/main/resources/application.yml b/hub-service/src/main/resources/application.yml index 8595439..b29a17c 100644 --- a/hub-service/src/main/resources/application.yml +++ b/hub-service/src/main/resources/application.yml @@ -12,7 +12,9 @@ spring: driver-class-name: org.postgresql.Driver jpa: - database-platform: org.hibernate.dialect.PostgreSQLDialect + properties: + hibernate: + dialect: org.hibernate.dialect.PostgreSQLDialect hibernate: ddl-auto: update # 테이블 자동 생성 show-sql: true # SQL 로그 출력 From 7d08571c0541b67221ab23378f1b4ca118824ddc Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Thu, 20 Mar 2025 21:45:26 +0900 Subject: [PATCH 130/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20Query=20DSL=20?= =?UTF-8?q?=EC=9D=84=20=EC=9D=B4=EC=9A=A9=ED=95=9C=20=ED=97=88=EB=B8=8C=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=EA=B8=B0=EB=8A=A5=20api=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=20-=20name=20or=20address=20=EC=9E=85=EB=A0=A5=EC=8B=9C=20?= =?UTF-8?q?=ED=95=B4=EB=8B=B9=20=EA=B0=92=EC=9D=84=20=ED=8F=AC=ED=95=A8?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B0=92=EB=93=A4=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=95=20=EC=B2=98=EB=A6=AC=20=ED=9B=84=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub/application/service/HubService.java | 12 +++++ .../hubservice/hub/config/JpaConfig.java | 19 +++++++ .../hubservice/hub/domain/model/Hub.java | 7 +-- .../domain/repository/HubQueryRepository.java | 9 ++++ .../persistence/QueryDSLHubRepository.java | 54 +++++++++++++++++++ .../controller/HubController.java | 15 ++++++ 6 files changed, 110 insertions(+), 6 deletions(-) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/config/JpaConfig.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubQueryRepository.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java index 4dcff5a..cdb6d0e 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java @@ -7,6 +7,7 @@ import com.sparta.hubservice.hub.application.dto.response.HubResponseDto; import com.sparta.hubservice.hub.application.dto.response.HubUpdateResponseDto; import com.sparta.hubservice.hub.domain.model.Hub; +import com.sparta.hubservice.hub.domain.repository.HubQueryRepository; import com.sparta.hubservice.hub.domain.repository.HubRepository; import java.math.BigDecimal; import java.util.Map; @@ -25,6 +26,7 @@ public class HubService { private final GeocodeApiService geocodeApiService; private final HubRepository hubRepository; + private final HubQueryRepository hubQueryRepository; // 허브 목록 조회 @Transactional(readOnly = true) @@ -44,6 +46,16 @@ public HubResponseDto getHub(UUID hubId) { return new HubResponseDto(hubDetail); } + // 허브 검색 + @Transactional(readOnly = true) + public Page getSearchHubs(String name, String address, Pageable pageable) { + Page searchHubs = hubQueryRepository.searchByKeyword(name, address, pageable); + if (searchHubs.isEmpty()) { + throw new ResourceNotFoundException("해당하는 정보의 허브가 존재하지 않습니다."); + } + return searchHubs.map(HubResponseDto::new); + } + // 허브 생성 @Transactional public HubCreateResponseDto createHub(HubRequestDto hubRequestDto, Long userId) { diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/config/JpaConfig.java b/hub-service/src/main/java/com/sparta/hubservice/hub/config/JpaConfig.java new file mode 100644 index 0000000..eafbfc1 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/config/JpaConfig.java @@ -0,0 +1,19 @@ +package com.sparta.hubservice.hub.config; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class JpaConfig { + + @PersistenceContext // ✅ EntityManager가 자동으로 주입됨 + private EntityManager entityManager; + + @Bean + public JPAQueryFactory queryFactory() { + return new JPAQueryFactory(entityManager); // ✅ QueryDSL이 사용할 JPAQueryFactory Bean 등록 + } +} \ No newline at end of file diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/Hub.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/Hub.java index 7e07293..9615a7a 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/Hub.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/Hub.java @@ -1,12 +1,7 @@ package com.sparta.hubservice.hub.domain.model; import com.sparta.commonmodule.entity.BaseEntity; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; +import jakarta.persistence.*; import jakarta.validation.constraints.Digits; import java.math.BigDecimal; import java.util.UUID; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubQueryRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubQueryRepository.java new file mode 100644 index 0000000..57d1ba7 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubQueryRepository.java @@ -0,0 +1,9 @@ +package com.sparta.hubservice.hub.domain.repository; + +import com.sparta.hubservice.hub.domain.model.Hub; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +public interface HubQueryRepository { + Page searchByKeyword(String name, String address, Pageable pageable); +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java new file mode 100644 index 0000000..71a0d50 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java @@ -0,0 +1,54 @@ +package com.sparta.hubservice.hub.infrastructure.persistence; + +import com.querydsl.core.BooleanBuilder; +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.sparta.hubservice.hub.domain.model.Hub; +import com.sparta.hubservice.hub.domain.model.QHub; +import com.sparta.hubservice.hub.domain.repository.HubQueryRepository; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class QueryDSLHubRepository implements HubQueryRepository { + + private final JPAQueryFactory queryFactory; + + @Override + public Page searchByKeyword(String name, String address, Pageable pageable) { + QHub hub = QHub.hub; + + BooleanBuilder predicate = new BooleanBuilder(); + + if(name != null && !name.isEmpty()) { + predicate.or(hub.name.containsIgnoreCase(name)); + } + if(address != null && !address.isEmpty()) { + predicate.or(hub.address.containsIgnoreCase(address)); + } + + List hubList = queryFactory + .selectFrom(hub) + .where(predicate + .and(hub.isDeleted.eq(false))) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + // 페이징 처리 + long total = queryFactory + .selectFrom(hub) + .where(predicate + .and(hub.isDeleted.eq(false))) + .fetchCount(); + + return new PageImpl<>(hubList, pageable, total); + + } + + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java index 154fb2f..aca6d1a 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java @@ -30,6 +30,7 @@ public class HubController { private final HubService hubService; + // 허브 목록 검색 @GetMapping public ResponseEntity> getHubs( @PageableDefault(page = 0, size = 10, sort = "createdAt") Pageable pageable) { @@ -37,24 +38,38 @@ public ResponseEntity> getHubs( return ResponseEntity.ok(responseDtos); } + // 특정 허브 조회 @GetMapping("/{hub_id}") public ResponseEntity getHubById(@PathVariable("hub_id") UUID hubId) { HubResponseDto responseDto = hubService.getHub(hubId); return ResponseEntity.ok(responseDto); } + // 허브 검색 + @GetMapping("/search") + public ResponseEntity> getSearchHubs( + @RequestParam(required = false) String name, + @RequestParam(required = false) String address, + @PageableDefault(page = 0, size = 10, sort = "createdAt") Pageable pageable){ + Page responseDto = hubService.getSearchHubs(name, address, pageable); + return ResponseEntity.ok(responseDto); + } + + // 허브 생성 @PostMapping public ResponseEntity createHub(@RequestBody @Valid HubRequestDto requestDto, @RequestParam Long userId) { HubCreateResponseDto responseDto = hubService.createHub(requestDto, userId); return ResponseEntity.ok(responseDto); } + // 허브 수정 @PutMapping("{hub_id}") public ResponseEntity updateHub(@PathVariable("hub_id") UUID hubId, @RequestParam String address, @RequestParam Long userId) { HubUpdateResponseDto responseDto = hubService.updateHub(hubId, address, userId); return ResponseEntity.ok(responseDto); } + // 허브 삭제 @DeleteMapping("{hub_id}") public ResponseEntity deleteHub(@PathVariable("hub_id") UUID hubId, @RequestParam Long userId) { HubDeleteResponseDto responseDto = hubService.deleteHub(hubId, userId); From 2bf049eeeeda8ff968bc0873df2994db3d9ff438 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Thu, 20 Mar 2025 21:45:45 +0900 Subject: [PATCH 131/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=ED=97=88?= =?UTF-8?q?=EB=B8=8C=20=EA=B2=80=EC=83=89=EA=B8=B0=EB=8A=A5=20api=20test?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hub-service/src/test/resources/http/hub-service-test.http | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/hub-service/src/test/resources/http/hub-service-test.http b/hub-service/src/test/resources/http/hub-service-test.http index d5b8a72..ef76a33 100644 --- a/hub-service/src/test/resources/http/hub-service-test.http +++ b/hub-service/src/test/resources/http/hub-service-test.http @@ -1,12 +1,13 @@ -### 🔹 API 테스트 (서버 체크) -GET http://localhost:8082/api/v1/hubs/test - ### 🔹 허브 목록 조회 (GET, 페이징) GET http://localhost:8082/api/v1/hubs?page=0&size=10 ### 🔹 특정 허브 조회 (GET, UUID 사용) GET http://localhost:8082/api/v1/hubs/b2778763-7721-4bb2-a436-8104336c6a7d +### 🔹 허브 검색 +GET http://localhost:8082/api/v1/hubs/search?address=강남구 + + ### 🔹 허브 생성 (POST) POST http://localhost:8082/api/v1/hubs?userId=123 Content-Type: application/json From 1b27dc9fa26b74c5ce629548a901aa24707d6964 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Thu, 20 Mar 2025 21:50:09 +0900 Subject: [PATCH 132/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=ED=97=88?= =?UTF-8?q?=EB=B8=8C=20Hub=20Route=20=EA=B4=80=EB=A0=A8=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub_route/application/service/HubRouteService.java | 2 +- .../hub_route/domain/repository/HubRouteRepository.java | 2 +- hub-service/src/test/resources/http/hub-route-test.http | 0 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 hub-service/src/test/resources/http/hub-route-test.http diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java index 8957a28..0a6bcf8 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java @@ -24,7 +24,7 @@ public class HubRouteService { // 허브 간 경로 조회 public HubRouteResponse getHubRoute(UUID fromHubId, UUID toHubId) { - Optional hubRoute = hubRouteRepository.findByFromHubIdAndToHubIdAndIsDeletedFalse(fromHubId, toHubId); + Optional hubRoute = hubRouteRepository.findByFromHub_HubIdAndToHub_HubIdAndIsDeletedFalse(fromHubId, toHubId); if(hubRoute.isEmpty()){ throw new ResourceNotFoundException("Hub route not found"); diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java index 3958c12..f2e0b7d 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java @@ -6,5 +6,5 @@ public interface HubRouteRepository { - Optional findByFromHubIdAndToHubIdAndIsDeletedFalse(UUID fromHubId, UUID toHubId); + Optional findByFromHub_HubIdAndToHub_HubIdAndIsDeletedFalse(UUID fromHubId, UUID toHubId); } diff --git a/hub-service/src/test/resources/http/hub-route-test.http b/hub-service/src/test/resources/http/hub-route-test.http new file mode 100644 index 0000000..e69de29 From ab355e3ea22d27b77872d2eb3b712ed0b7695927 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Thu, 20 Mar 2025 22:38:42 +0900 Subject: [PATCH 133/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20hub=20Service?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EB=8B=A8=EC=88=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sparta/hubservice/hub/application/service/HubService.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java index cdb6d0e..2af6992 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java @@ -84,7 +84,6 @@ public HubUpdateResponseDto updateHub(UUID hubId, String address, Long userId) { Map map = geocodeApiService.getGeocodeAddress(hub.getAddress()); hub.updateHub(address, map.get("latitude"), map.get("longitude"), userId); - hubRepository.save(hub); return new HubUpdateResponseDto(hub,"Hub successfully updated."); } @@ -94,8 +93,6 @@ public HubDeleteResponseDto deleteHub(UUID hubId, Long userId) { Hub hub = hubRepository.findById(hubId).orElseThrow(ResourceNotFoundException::new); hub.delete(userId); - hubRepository.save(hub); - return new HubDeleteResponseDto(hub.getHubId(), "Hub successfully deleted."); } } From e55b5dc0f9fbea1133144a85eaaf0d689fa8a773 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Thu, 20 Mar 2025 22:39:04 +0900 Subject: [PATCH 134/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=ED=97=88?= =?UTF-8?q?=EB=B8=8C=20=EA=B0=84=20=EA=B2=BD=EB=A1=9C=20=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C=20api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/HubRouteDeleteResponse.java | 22 +++++++++++++++++++ .../application/service/HubRouteService.java | 19 +++++++++++++++- .../domain/repository/HubRouteRepository.java | 2 ++ .../controller/HubRouteController.java | 11 ++++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDeleteResponse.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDeleteResponse.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDeleteResponse.java new file mode 100644 index 0000000..6f655d8 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDeleteResponse.java @@ -0,0 +1,22 @@ +package com.sparta.hubservice.hub_route.application.dto.response; + +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + + +@Builder +@Getter +public class HubRouteDeleteResponse { + + private final UUID hub_route_id; + private final String message; + + public HubRouteDeleteResponse(UUID hub_route_id, String message) { + this.hub_route_id = hub_route_id; + this.message = message; + } + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java index 0a6bcf8..a2c9173 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java @@ -3,25 +3,29 @@ import com.sparta.commonmodule.exception.ResourceNotFoundException; import com.sparta.hubservice.hub.domain.repository.HubRepository; import com.sparta.hubservice.hub_route.application.dto.response.HubRouteCreateResponse; +import com.sparta.hubservice.hub_route.application.dto.response.HubRouteDeleteResponse; import com.sparta.hubservice.hub_route.application.dto.response.HubRouteResponse; import com.sparta.hubservice.hub.domain.model.Hub; import com.sparta.hubservice.hub_route.domain.model.HubRoute; import com.sparta.hubservice.hub_route.domain.repository.HubRouteRepository; +import jakarta.persistence.Table; import java.util.Optional; import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor -@Slf4j(topic = "HubRoutesService") +@Slf4j(topic = "HubRoutesService ") public class HubRouteService { private final HubRouteRepository hubRouteRepository; private final HubRepository hubRepository; // 허브 간 경로 조회 + @Transactional(readOnly = true) public HubRouteResponse getHubRoute(UUID fromHubId, UUID toHubId) { Optional hubRoute = hubRouteRepository.findByFromHub_HubIdAndToHub_HubIdAndIsDeletedFalse(fromHubId, toHubId); @@ -34,6 +38,7 @@ public HubRouteResponse getHubRoute(UUID fromHubId, UUID toHubId) { } // 허브 간 경로 생성 + @Transactional public HubRouteCreateResponse createHubRoute(UUID fromHubId, UUID toHubId) { Optional fromHub = hubRepository.findById(fromHubId); Optional toHub = hubRepository.findById(toHubId); @@ -47,4 +52,16 @@ public HubRouteCreateResponse createHubRoute(UUID fromHubId, UUID toHubId) { return null; } + + // 허브 간 경로 정보 삭제 (soft deleted) + @Transactional + public HubRouteDeleteResponse deleteHubRoute(UUID hubRouteId, Long userId) { + HubRoute hubRoute = hubRouteRepository.findByHubRouteIdAndIsDeletedFalse(hubRouteId); + if(hubRoute == null){ + throw new ResourceNotFoundException("Hub route not found"); + } + + hubRoute.delete(userId); + return new HubRouteDeleteResponse(hubRouteId, "Hub successfully deleted."); + } } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java index f2e0b7d..fd495af 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java @@ -7,4 +7,6 @@ public interface HubRouteRepository { Optional findByFromHub_HubIdAndToHub_HubIdAndIsDeletedFalse(UUID fromHubId, UUID toHubId); + + HubRoute findByHubRouteIdAndIsDeletedFalse(UUID hubRouteId); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java index 5a61a01..5978015 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java @@ -2,15 +2,18 @@ import com.sparta.hubservice.hub_route.application.dto.response.HubRouteCreateResponse; +import com.sparta.hubservice.hub_route.application.dto.response.HubRouteDeleteResponse; import com.sparta.hubservice.hub_route.application.dto.response.HubRouteResponse; import com.sparta.hubservice.hub_route.application.service.HubRouteService; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @@ -35,4 +38,12 @@ public ResponseEntity createHubRoute(@PathVariable Strin return ResponseEntity.ok(response); } + // 허브 간 경로 정보 삭제 + @DeleteMapping("/{hub_route_id}") + public ResponseEntity deleteHubRoute(@PathVariable String hub_route_id, @RequestParam Long userId) { + HubRouteDeleteResponse response = hubRoutesService.deleteHubRoute(UUID.fromString(hub_route_id), userId); + return ResponseEntity.ok(response); + } + + } From 3f7aae19c790c64a2b3824deefcb2253d1bf8fe6 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Thu, 20 Mar 2025 22:39:37 +0900 Subject: [PATCH 135/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=ED=97=88?= =?UTF-8?q?=EB=B8=8C=20=EA=B0=84=20=EA=B2=BD=EB=A1=9C=20=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C=20api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/response/HubRouteDeleteResponse.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDeleteResponse.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDeleteResponse.java index 6f655d8..3dc77ca 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDeleteResponse.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDeleteResponse.java @@ -1,10 +1,8 @@ package com.sparta.hubservice.hub_route.application.dto.response; import java.util.UUID; -import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; -import lombok.NoArgsConstructor; @Builder From a90b16657af744ae41bfaa77d1bffdea45a8e739 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Thu, 20 Mar 2025 22:41:14 +0900 Subject: [PATCH 136/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#99]?= =?UTF-8?q?=20:=20=EA=B0=9D=EC=B2=B4=EC=A7=80=ED=96=A5=20=EC=9B=90?= =?UTF-8?q?=EC=B9=99=EC=97=90=20=EB=A7=9E=EB=8A=94=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=84=B0=EB=A7=81=20=EC=A7=84=ED=96=89=20-?= =?UTF-8?q?=20=EC=A0=84=EC=B2=B4=EC=A0=81=EC=9D=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=84=B0=EB=A7=81=EC=9D=84=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=ED=95=B4=EB=B3=B4=EC=95=98=EC=8A=B5=EB=8B=88=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✨ feat [#34] : user crud구현 - user update 메소드 구현했습니다. - 테스트를 위한 코드도 추가했습니다. --- api-http/user/user-service.http | 14 ++++++- .../dto/request/UserSigninReqeustDto.java | 1 - .../dto/request/UserSignupRequestDto.java | 3 +- .../dto/request/UserUpdateRequestDto.java | 37 +++++++++++++++++++ .../user/application/service/UserService.java | 18 ++++++++- .../com/sparta/user/domain/model/User.java | 21 +++++++++++ .../user/presentation/UserController.java | 12 +++++- 7 files changed, 99 insertions(+), 7 deletions(-) create mode 100644 user-service/src/main/java/com/sparta/user/application/dto/request/UserUpdateRequestDto.java diff --git a/api-http/user/user-service.http b/api-http/user/user-service.http index 516efac..55a1b95 100644 --- a/api-http/user/user-service.http +++ b/api-http/user/user-service.http @@ -5,7 +5,7 @@ Content-Type: application/json "username":"asdf123", "password":"asdfgA12@", "email":"asdf@naver.com", - "slackName": "asdggg" + "slackName": "asdggg" } ### @@ -18,3 +18,15 @@ Content-Type: application/json "password": "asdfgA12@" } +### + +PUT http://localhost:8080/api/v1/users/update +Content-Type: application/json +Authorization: 로그인하고 생성된 토큰 넣어주세요! + +{ + "username": "afdsjhsd24", + "password": "asdfgA12gg@", + "email":"asdfg3@naver.com", + "slackName": "asdgggh" +} \ No newline at end of file diff --git a/user-service/src/main/java/com/sparta/user/application/dto/request/UserSigninReqeustDto.java b/user-service/src/main/java/com/sparta/user/application/dto/request/UserSigninReqeustDto.java index 4bd5f7e..8200cd9 100644 --- a/user-service/src/main/java/com/sparta/user/application/dto/request/UserSigninReqeustDto.java +++ b/user-service/src/main/java/com/sparta/user/application/dto/request/UserSigninReqeustDto.java @@ -6,7 +6,6 @@ import lombok.Setter; @Getter -@Setter public class UserSigninReqeustDto { //최소 4자 이상, 10자 이하이며 알파벳 소문자(a~z), 숫자(0~9) diff --git a/user-service/src/main/java/com/sparta/user/application/dto/request/UserSignupRequestDto.java b/user-service/src/main/java/com/sparta/user/application/dto/request/UserSignupRequestDto.java index 66d6cdf..27ef940 100644 --- a/user-service/src/main/java/com/sparta/user/application/dto/request/UserSignupRequestDto.java +++ b/user-service/src/main/java/com/sparta/user/application/dto/request/UserSignupRequestDto.java @@ -8,9 +8,7 @@ import lombok.*; @Getter -@Setter @EqualsAndHashCode -@Builder @AllArgsConstructor public class UserSignupRequestDto { @@ -47,5 +45,6 @@ public User createUser(String password, UserRoleEnum role){ } + } diff --git a/user-service/src/main/java/com/sparta/user/application/dto/request/UserUpdateRequestDto.java b/user-service/src/main/java/com/sparta/user/application/dto/request/UserUpdateRequestDto.java new file mode 100644 index 0000000..4c545b6 --- /dev/null +++ b/user-service/src/main/java/com/sparta/user/application/dto/request/UserUpdateRequestDto.java @@ -0,0 +1,37 @@ +package com.sparta.user.application.dto.request; + +import com.sparta.user.domain.model.User; +import com.sparta.user.domain.model.UserRoleEnum; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@Getter +@EqualsAndHashCode +@AllArgsConstructor +public class UserUpdateRequestDto { + + //최소 4자 이상, 10자 이하이며 알파벳 소문자(a~z), 숫자(0~9) + @Pattern(regexp = "^(?=.*[a-z])(?=.*[0-9])[a-z0-9^\\s]{4,10}$", + message = "회원이름은 알파벳 소문자와 숫자로 이루어진 4자 이상 10자 이하로 입력해주세요.") + private String username; + + //최소 8자 이상, 15자 이하이며 알파벳 대소문자(a~z, A~Z), 숫자(0~9), 특수문자 + @Pattern(regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[^A-Za-z\\d\\s])[^\\s]{8,15}$", + message = "비밀번호는 알파벳 대소문자, 숫자, 특수문자를 포함한 8자 이상 15자 이하입니다.") + private String password; + + @Email(message = "유효한 이메일 주소를 입력하세요.") + @Pattern(regexp = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,25}$", message = "유효한 이메일 주소를 입력하세요.") + private String email; + + private String slackName; + + private String tokenValue; + + +} + diff --git a/user-service/src/main/java/com/sparta/user/application/service/UserService.java b/user-service/src/main/java/com/sparta/user/application/service/UserService.java index 96a703e..146d585 100644 --- a/user-service/src/main/java/com/sparta/user/application/service/UserService.java +++ b/user-service/src/main/java/com/sparta/user/application/service/UserService.java @@ -1,6 +1,7 @@ package com.sparta.user.application.service; import com.sparta.user.application.dto.request.UserSigninReqeustDto; +import com.sparta.user.application.dto.request.UserUpdateRequestDto; import com.sparta.user.application.dto.response.UserSigninResponseDto; import com.sparta.user.application.dto.request.UserSignupRequestDto; import com.sparta.user.domain.model.User; @@ -9,6 +10,7 @@ import com.sparta.user.infastructure.repository.JpaUserRepository; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.apache.commons.lang.NullArgumentException; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @@ -31,13 +33,22 @@ public Long signUp(UserSignupRequestDto requestDto) throws IllegalAccessExceptio return userRepository.save(user).getId(); } //로그인 - public String signIn(@Valid UserSigninReqeustDto reqeustDto) throws AuthenticationException { + public String signIn(UserSigninReqeustDto reqeustDto) throws AuthenticationException { User user = userRepository.findByUsername(reqeustDto.getUsername()) .orElseThrow(()-> new AuthenticationException("아이디가 존재하지않습니다.")); passwordMatchChecker(reqeustDto,user); UserSigninResponseDto responseDto = new UserSigninResponseDto(user); return authService.createAccessToken(responseDto); } + //회원정보 수정 + public void updateUser(UserUpdateRequestDto requestDto, String userId) { + User user = userRepository.findById(Long.parseLong(userId)).orElseThrow(()->new IllegalArgumentException("존재하지않는 회원입니다.")); + UserRoleEnum userRole = checkUserRole(requestDto.getTokenValue()); + user.updateUser(encryptPassword(requestDto.getPassword()), requestDto, userRole.getAuthority()); + + userRepository.save(user); + } + //비밀번호 인증 private void passwordMatchChecker(UserSigninReqeustDto reqeustDto, User user) throws AuthenticationException { boolean pwcheck = passwordEncoder.matches(reqeustDto.getPassword(), user.getPassword()); @@ -59,8 +70,12 @@ private UserRoleEnum checkUserRole(String tokenValue) { } //비밀번호 암호화 private String encryptPassword (String password) { + if(password == null){ + throw new NullArgumentException("비밀번호를 입력해주세요"); + } return passwordEncoder.encode(password); } + //중복이름방지 private void validDuplicatedNames(UserSignupRequestDto requestDto) throws IllegalAccessException { boolean exsist = userRepository.existsByUsername(requestDto.getUsername()); @@ -70,4 +85,5 @@ private void validDuplicatedNames(UserSignupRequestDto requestDto) throws Illega } + } diff --git a/user-service/src/main/java/com/sparta/user/domain/model/User.java b/user-service/src/main/java/com/sparta/user/domain/model/User.java index ab42d09..a1df286 100644 --- a/user-service/src/main/java/com/sparta/user/domain/model/User.java +++ b/user-service/src/main/java/com/sparta/user/domain/model/User.java @@ -1,10 +1,14 @@ package com.sparta.user.domain.model; +import com.sparta.user.application.dto.request.UserSignupRequestDto; +import com.sparta.user.application.dto.request.UserUpdateRequestDto; import jakarta.persistence.*; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import java.util.Optional; + @Getter @NoArgsConstructor @Table(name = "p_users") @@ -40,4 +44,21 @@ public User(String username, String password, String email, String slackName, St this.slackName = slackName; this.role = role; } + + @Builder + public User(String username, String password, String email, String slackName) { + this.username = username; + this.password = password; + this.email = email; + this.slackName = slackName; + } + + + public void updateUser(String encryptedpassword, UserUpdateRequestDto requestDto, String userRole) { + Optional.ofNullable(requestDto.getUsername()).ifPresent(username -> this.username = username); + Optional.ofNullable(encryptedpassword).ifPresent(password -> this.password = encryptedpassword); + Optional.ofNullable(requestDto.getEmail()).ifPresent(email -> this.email = email); + Optional.ofNullable(requestDto.getSlackName()).ifPresent(slackName -> this.slackName = slackName); + Optional.ofNullable(userRole).ifPresent(role -> this.role = userRole); + } } diff --git a/user-service/src/main/java/com/sparta/user/presentation/UserController.java b/user-service/src/main/java/com/sparta/user/presentation/UserController.java index f9ed004..0944f28 100644 --- a/user-service/src/main/java/com/sparta/user/presentation/UserController.java +++ b/user-service/src/main/java/com/sparta/user/presentation/UserController.java @@ -3,6 +3,7 @@ import com.sparta.user.application.dto.request.UserSigninReqeustDto; import com.sparta.user.application.dto.request.UserSignupRequestDto; +import com.sparta.user.application.dto.request.UserUpdateRequestDto; import com.sparta.user.application.service.UserService; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; @@ -37,12 +38,19 @@ public ResponseEntity signUp(@Valid @RequestBody UserSignupRequestDto requ } @PostMapping("/sign-in") - public ResponseEntity signIn(@Valid @RequestBody UserSigninReqeustDto reqeustDto, + public ResponseEntity signIn(@Valid @RequestBody UserSigninReqeustDto requestDto, HttpServletResponse httpServletResponse) throws AuthenticationException { - String accessToken= userService.signIn(reqeustDto); + String accessToken= userService.signIn(requestDto); //HttpHeaders(중요) httpServletResponse.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken); return ResponseEntity.ok().build(); } + + @PutMapping("/update") + public ResponseEntity updateUser(@Valid @RequestBody UserUpdateRequestDto requestDto, @RequestHeader("user_id") String userId) { + userService.updateUser(requestDto, userId); + + return ResponseEntity.ok().build(); + } } \ No newline at end of file From f4588c4de67008ba22e41540bd46757ecdd9dd87 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Thu, 20 Mar 2025 22:54:32 +0900 Subject: [PATCH 137/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20:=20Ord?= =?UTF-8?q?er=20create=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20BaseEntity?= =?UTF-8?q?=20=EC=83=81=EC=86=8D=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=B4=20?= =?UTF-8?q?createBy=20=EA=B8=B0=EB=B3=B8=EA=B0=92=EC=9D=84=20=EC=9E=84?= =?UTF-8?q?=EC=9D=98=EB=A1=9C=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orderservice/OrderServiceApplication.java | 2 + .../application/service/OrderService.java | 52 ++++++------------- .../orderservice/domain/model/Order.java | 22 ++++++-- ...ercontroller.java => OrderController.java} | 29 ++++++----- 4 files changed, 52 insertions(+), 53 deletions(-) rename order-service/src/main/java/com/sparta/orderservice/presentation/controller/{Ordercontroller.java => OrderController.java} (61%) diff --git a/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java b/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java index 2521a0c..30ecb04 100644 --- a/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java +++ b/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java @@ -2,7 +2,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +@EnableJpaAuditing @SpringBootApplication public class OrderServiceApplication { diff --git a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java index e69b1d0..c9c4a7f 100644 --- a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java +++ b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java @@ -9,7 +9,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDateTime; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; @@ -21,8 +20,9 @@ public class OrderService { private final OrderRepository orderRepository; + //주문 생성 @Transactional - public Order createOrder(OrderRequestDto requestDto){ + public OrderResponseDto createOrder(OrderRequestDto requestDto) { Order order = Order.builder() .name(requestDto.getName()) .supplierId(requestDto.getSupplierId()) @@ -30,56 +30,39 @@ public Order createOrder(OrderRequestDto requestDto){ .productId(requestDto.getProductId()) .totalPrice(requestDto.getTotalPrice()) .requestDetail(requestDto.getRequestDetail()) - .createdBy(requestDto.getCreateBy()) + .status(OrderStatus.CREATED) .build(); - return orderRepository.save(order); - } + order.setCreatedBy(0L); // createdBy 기본값 설정 (BaseEntity 상속으로 인해 필요) + + orderRepository.save(order); + return new OrderResponseDto(order); + } + + // 주문 전체 조회 @Transactional(readOnly = true) public List getALlOrders(){ List orders = orderRepository.findAll(); return orders.stream() - .map(order -> new OrderResponseDto( - order.getOrderId(), - order.getName(), - order.getSupplierId(), - order.getReceiverId(), - order.getProductId(), - order.getTotalPrice(), - order.getStatus(), - order.getRequestDetail(), - order.getCreatedAt(), - order.getCreatedBy() - )) + .map(OrderResponseDto::fromEntity) .collect(Collectors.toList()); } - + // 주문 단일 조회 @Transactional(readOnly = true) public OrderResponseDto getOrderById(UUID orderId){ Order order = orderRepository.findById(orderId) - .orElseThrow(() -> new RuntimeException("order Not found" + orderId)); - return new OrderResponseDto( - order.getOrderId(), - order.getName(), - order.getSupplierId(), - order.getReceiverId(), - order.getProductId(), - order.getTotalPrice(), - order.getStatus(), - order.getRequestDetail(), - order.getCreatedAt(), - order.getCreatedBy() - ); + .orElseThrow(() -> new RuntimeException("order Not found : " + orderId)); + return OrderResponseDto.fromEntity(order); } // 주문 수정 @Transactional - public OrderResponseDto updateOrder(UUID orderId, OrderRequestDto requestDto){ + public OrderResponseDto updateOrder(UUID orderId, OrderRequestDto requestDto) { Order order = orderRepository.findById(orderId) .orElseThrow(() -> new RuntimeException("Not found id" + orderId)); - if(order.getStatus() != OrderStatus.CREATED){ + if (order.getStatus() != OrderStatus.CREATED) { throw new RuntimeException("CREATED Status에서만 Update 가능"); } order.updateOrderDetails( @@ -95,7 +78,7 @@ public OrderResponseDto updateOrder(UUID orderId, OrderRequestDto requestDto){ // 주문 삭제 @Transactional - public void deleteOrder(UUID orderId){ + public void deleteOrder(UUID orderId) { Order order = orderRepository.findById(orderId) .orElseThrow(() -> new RuntimeException("Not found id" + orderId)); @@ -103,5 +86,4 @@ public void deleteOrder(UUID orderId){ } - } diff --git a/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java b/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java index 6865ad8..aa85be3 100644 --- a/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java +++ b/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java @@ -3,17 +3,14 @@ import com.sparta.commonmodule.entity.BaseEntity; import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.CreationTimestamp; -import org.hibernate.annotations.UpdateTimestamp; import java.math.BigDecimal; -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.UUID; @Entity -@Table(name = "orders") +@Table(name = "p_order") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor @@ -21,7 +18,7 @@ public class Order extends BaseEntity { @Id - @GeneratedValue + @GeneratedValue(strategy = GenerationType.AUTO) private UUID orderId; // 주문 ID @Column(nullable = false, length = 100) @@ -54,6 +51,21 @@ public class Order extends BaseEntity { @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true) private List orderItems = new ArrayList<>(); // 주문 아이템 1:N 관계 설정 + public void setCreatedBy(Long createdBy) { + super.update(createdBy); + } + + + // 주문 생성자 (BaseEntity의 createdBy 강제 설정) + public Order(String name, UUID supplierId, UUID receiverId, UUID productId, BigDecimal totalPrice, String requestDetail) { + super(0L); // createdBy 기본값 0L (임시 사용자) + this.name = name; + this.supplierId = supplierId; + this.receiverId = receiverId; + this.productId = productId; + this.totalPrice = totalPrice; + this.requestDetail = requestDetail; + } // 주문 update 메서드 diff --git a/order-service/src/main/java/com/sparta/orderservice/presentation/controller/Ordercontroller.java b/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java similarity index 61% rename from order-service/src/main/java/com/sparta/orderservice/presentation/controller/Ordercontroller.java rename to order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java index a9d3d59..72485bd 100644 --- a/order-service/src/main/java/com/sparta/orderservice/presentation/controller/Ordercontroller.java +++ b/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java @@ -2,9 +2,9 @@ import com.sparta.orderservice.application.dto.OrderRequestDto; import com.sparta.orderservice.application.dto.OrderResponseDto; -import com.sparta.orderservice.application.dto.UpdateOrderRequestDto; import com.sparta.orderservice.application.service.OrderService; import com.sparta.orderservice.domain.model.Order; +import jakarta.validation.Valid; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -13,39 +13,42 @@ @RestController @RequestMapping("/api/v1/orders") -public class Ordercontroller { +public class OrderController { private final OrderService orderService; - public Ordercontroller(OrderService orderService) { + public OrderController(OrderService orderService) { + this.orderService = orderService; } - + // 주문 생성 @PostMapping - public ResponseEntity createOrder(@RequestBody OrderRequestDto requestDto){ - return ResponseEntity.ok(orderService.createOrder(requestDto)); + public ResponseEntity createOrder( + @Valid @RequestBody OrderRequestDto requestDto) { + OrderResponseDto responseDto = orderService.createOrder(requestDto); + return ResponseEntity.ok(responseDto); } - + // 주문 전체 조회 @GetMapping public ResponseEntity> getAllOrders(){ return ResponseEntity.ok(orderService.getALlOrders()); } - + // 주문 단일 조회 @GetMapping("/{id}") - public ResponseEntity getOrderById(@PathVariable UUID id){ + public ResponseEntity getOrderById(@PathVariable("id") UUID id){ return ResponseEntity.ok(orderService.getOrderById(id)); } @PutMapping("/{id}") public ResponseEntity updateOrder( - @PathVariable UUID id, - @RequestBody OrderRequestDto orderRequestDto){ - return ResponseEntity.ok(orderService.updateOrder(id,orderRequestDto)); + @PathVariable("id") UUID id, + @RequestBody OrderRequestDto orderRequestDto) { + return ResponseEntity.ok(orderService.updateOrder(id, orderRequestDto)); } @DeleteMapping("/{id}") - public ResponseEntity deleteOrder(@PathVariable UUID id){ + public ResponseEntity deleteOrder(@PathVariable("id") UUID id) { orderService.deleteOrder(id); return ResponseEntity.noContent().build(); } From 1589ca5059cf156fdff086d024cf555bc299974a Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Thu, 20 Mar 2025 22:55:07 +0900 Subject: [PATCH 138/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20:=20Ord?= =?UTF-8?q?er=20create=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=A7=84=ED=96=89?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=9C=20DB=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EB=B0=8F=20dependencies=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- order-service/build.gradle | 1 + .../src/main/resources/application.yml | 17 ++++++++-- order-service/src/test/http/order.http | 33 +++++++++++++++++++ 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 order-service/src/test/http/order.http diff --git a/order-service/build.gradle b/order-service/build.gradle index f7fb11c..44c05a3 100644 --- a/order-service/build.gradle +++ b/order-service/build.gradle @@ -3,6 +3,7 @@ ext { } dependencies { + implementation 'org.postgresql:postgresql:42.6.0' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' diff --git a/order-service/src/main/resources/application.yml b/order-service/src/main/resources/application.yml index cfcb4aa..7845dc4 100644 --- a/order-service/src/main/resources/application.yml +++ b/order-service/src/main/resources/application.yml @@ -2,12 +2,25 @@ spring: application: name: order-service + datasource: + url: jdbc:postgresql://localhost:5432/delivery + username: admin + password: 1234 + driver-class-name: org.postgresql.Driver + + jpa: + database-platform: org.hibernate.dialect.PostgreSQLDialect + hibernate: + ddl-auto: update + show-sql: true + eureka: client: + register-with-eureka: true + fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka/ - register-with-eureka: true - fetch-registry: ture + server: port: 8084 diff --git a/order-service/src/test/http/order.http b/order-service/src/test/http/order.http new file mode 100644 index 0000000..120637b --- /dev/null +++ b/order-service/src/test/http/order.http @@ -0,0 +1,33 @@ +### Order 생성 API 테스트 +POST http://localhost:8084/api/v1/orders?userId=123 +Content-Type: application/json + +{ + "name": "테스트 주문", + "supplierId": "550e8400-e29b-41d4-a716-446655440000", + "receiverId": "550e8400-e29b-41d4-a716-446655440001", + "productId": "550e8400-e29b-41d4-a716-446655440002", + "totalPrice": 25000.00, + "requestDetail": "빠른 배송 부탁드립니다." +} + +### 모든 주문 조회 +GET http://localhost:8084/api/v1/orders + +### 특정 주문 조회 (실제 UUID로 바꿔서 사용) +GET http://localhost:8084/api/v1/orders/fac5ba71-5844-4928-a2be-7e477517324c + +### 주문 수정 (실제 UUID로 바꿔서 사용) +PUT http://localhost:8084/api/v1/orders/fac5ba71-5844-4928-a2be-7e477517324c +Content-Type: application/json + +{ + "name": "수정된 주문명", + "supplierId": "550e8400-e29b-41d4-a716-446655440000", + "receiverId": "550e8400-e29b-41d4-a716-446655440001", + "productId": "550e8400-e29b-41d4-a716-446655440002", + "totalPrice": 30000.00, + "requestDetail": "수정된 요청사항" +} +### 주문 삭제 (실제 UUID로 바꿔서 사용) +DELETE http://localhost:8084/api/v1/orders/fac5ba71-5844-4928-a2be-7e477517324c From 9ddf8fd07aa6ca6150bb3772fa67e03158a09d9b Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Thu, 20 Mar 2025 22:55:21 +0900 Subject: [PATCH 139/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20:=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=82=B4=EC=9A=A9=20=EC=97=86=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commonmodule/entity/BaseEntity.java | 112 +++++++++--------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java b/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java index 6e4537b..967fb04 100644 --- a/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java +++ b/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java @@ -1,69 +1,69 @@ -package com.sparta.commonmodule.entity; + package com.sparta.commonmodule.entity; -import jakarta.persistence.Column; -import jakarta.persistence.EntityListeners; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.MappedSuperclass; -import java.time.LocalDateTime; -import lombok.Data; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.hibernate.annotations.ColumnDefault; -import org.springframework.data.annotation.CreatedBy; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedBy; -import org.springframework.data.annotation.LastModifiedDate; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; + import jakarta.persistence.Column; + import jakarta.persistence.EntityListeners; + import jakarta.persistence.JoinColumn; + import jakarta.persistence.MappedSuperclass; + import java.time.LocalDateTime; + import lombok.Data; + import lombok.Getter; + import lombok.RequiredArgsConstructor; + import org.hibernate.annotations.ColumnDefault; + import org.springframework.data.annotation.CreatedBy; + import org.springframework.data.annotation.CreatedDate; + import org.springframework.data.annotation.LastModifiedBy; + import org.springframework.data.annotation.LastModifiedDate; + import org.springframework.data.jpa.domain.support.AuditingEntityListener; -@Data -@Getter -@RequiredArgsConstructor -@EntityListeners(AuditingEntityListener.class) -@MappedSuperclass -public class BaseEntity { + @Data + @Getter + @RequiredArgsConstructor + @EntityListeners(AuditingEntityListener.class) + @MappedSuperclass + public class BaseEntity { - @CreatedDate - @Column(name = "created_at", updatable = false) - private LocalDateTime createdAt; + @CreatedDate + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; - @CreatedBy - @JoinColumn(name = "created_by") - private long createdBy; + @CreatedBy + @JoinColumn(name = "created_by") + private long createdBy; - @LastModifiedDate - @Column(name = "updated_at") - private LocalDateTime updatedAt; + @LastModifiedDate + @Column(name = "updated_at") + private LocalDateTime updatedAt; - @LastModifiedBy - @JoinColumn(name = "updated_by") - private long updatedBy; + @LastModifiedBy + @JoinColumn(name = "updated_by") + private long updatedBy; - @Column(name = "is_deleted") - @ColumnDefault("FALSE") - private Boolean isDeleted; + @Column(name = "is_deleted") + @ColumnDefault("FALSE") + private Boolean isDeleted; - @Column(name = "deleted_at") - private LocalDateTime deletedAt; + @Column(name = "deleted_at") + private LocalDateTime deletedAt; - @JoinColumn(name = "deleted_by") - private long deletedBy; + @JoinColumn(name = "deleted_by") + private long deletedBy; - // 생성을 위한 method - public BaseEntity(long userId) { - this.createdBy = userId; - this.updatedBy = userId; - this.isDeleted = false; - } + // 생성을 위한 method + public BaseEntity(long userId) { + this.createdBy = userId; + this.updatedBy = userId; + this.isDeleted = false; + } - // update를 위한 method - public void update(long userId) { - this.updatedBy = userId; - } + // update를 위한 method + public void update(long userId) { + this.updatedBy = userId; + } - // 소프트 delete를 위한 method - public void delete(long userId) { - this.isDeleted = true; - this.deletedAt = LocalDateTime.now(); - this.deletedBy = userId; + // 소프트 delete를 위한 method + public void delete(long userId) { + this.isDeleted = true; + this.deletedAt = LocalDateTime.now(); + this.deletedBy = userId; + } } -} From 225db5fbee54710ebd7c7edb3d3c25455c398e91 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Thu, 20 Mar 2025 22:55:47 +0900 Subject: [PATCH 140/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20:=20Ord?= =?UTF-8?q?erRequestDto=20=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=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 --- .../application/dto/OrderRequestDto.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/order-service/src/main/java/com/sparta/orderservice/application/dto/OrderRequestDto.java b/order-service/src/main/java/com/sparta/orderservice/application/dto/OrderRequestDto.java index 3fff48d..1f4f290 100644 --- a/order-service/src/main/java/com/sparta/orderservice/application/dto/OrderRequestDto.java +++ b/order-service/src/main/java/com/sparta/orderservice/application/dto/OrderRequestDto.java @@ -1,19 +1,34 @@ package com.sparta.orderservice.application.dto; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; +import jakarta.validation.constraints.NotNull; import java.math.BigDecimal; import java.util.UUID; +@Setter @Getter @NoArgsConstructor +@AllArgsConstructor public class OrderRequestDto { + + @NotNull(message = "name 필드는 필수입니다.") private String name; + + @NotNull(message = "supplierId 필드는 필수입니다.") private UUID supplierId; + + @NotNull(message = "receiverId 필드는 필수입니다.") private UUID receiverId; + + @NotNull(message = "productId 필드는 필수입니다.") private UUID productId; + + @NotNull(message = "totalPrice 필드는 필수입니다.") private BigDecimal totalPrice; + private String requestDetail; - private UUID createBy; } From 2e6647eb02af1328cdf5d0ec8ed2f43633f3fb43 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Thu, 20 Mar 2025 22:56:11 +0900 Subject: [PATCH 141/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20:=20Ord?= =?UTF-8?q?erResponseDto=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/OrderResponseDto.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/order-service/src/main/java/com/sparta/orderservice/application/dto/OrderResponseDto.java b/order-service/src/main/java/com/sparta/orderservice/application/dto/OrderResponseDto.java index 7e02394..6a2f4f5 100644 --- a/order-service/src/main/java/com/sparta/orderservice/application/dto/OrderResponseDto.java +++ b/order-service/src/main/java/com/sparta/orderservice/application/dto/OrderResponseDto.java @@ -21,11 +21,10 @@ public class OrderResponseDto { private UUID supplierId; private UUID receiverId; private UUID productId; - private BigDecimal totolPrice; + private BigDecimal totalPrice; private OrderStatus status; private String requestDetail; private LocalDateTime createdAt; - private UUID createdBy; public OrderResponseDto(Order order) { this.orderId = order.getOrderId(); @@ -33,11 +32,25 @@ public OrderResponseDto(Order order) { this.supplierId = order.getSupplierId(); this.receiverId = order.getReceiverId(); this.productId = order.getProductId(); - this.totolPrice = order.getTotalPrice(); + this.totalPrice = order.getTotalPrice(); this.status = order.getStatus(); this.requestDetail = order.getRequestDetail(); this.createdAt = order.getCreatedAt(); - this.createdBy = order.getCreatedBy(); + } + + // 더 직관적인 DTO 변환 + public static OrderResponseDto fromEntity(Order order) { + return OrderResponseDto.builder() + .orderId(order.getOrderId()) + .name(order.getName()) + .supplierId(order.getSupplierId()) + .receiverId(order.getReceiverId()) + .productId(order.getProductId()) + .totalPrice(order.getTotalPrice()) + .status(order.getStatus()) + .requestDetail(order.getRequestDetail()) + .createdAt(order.getCreatedAt()) + .build(); } } From deb8d979f4693e5776fab6c06d89e4bb21a00da5 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Fri, 21 Mar 2025 00:08:25 +0900 Subject: [PATCH 142/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#34]=20:=20user=20c?= =?UTF-8?q?rud=EA=B5=AC=ED=98=84=20-=20user=20read=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EA=B5=AC=ED=98=84=ED=96=88=EC=8A=B5=EB=8B=88?= =?UTF-8?q?=EB=8B=A4.=20-=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EB=A5=BC=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20=EC=BD=94=EB=93=9C=EB=8F=84=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=96=88=EC=8A=B5=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api-http/user/user-service.http | 13 +++++++++- .../dto/response/UserInfoResponseDto.java | 23 ++++++++++++++++++ .../dto/response/UserSigninResponseDto.java | 1 - .../user/application/service/UserService.java | 24 ++++++++++++++++--- .../user/presentation/UserController.java | 15 ++++++++++++ 5 files changed, 71 insertions(+), 5 deletions(-) create mode 100644 user-service/src/main/java/com/sparta/user/application/dto/response/UserInfoResponseDto.java diff --git a/api-http/user/user-service.http b/api-http/user/user-service.http index 55a1b95..6b766d0 100644 --- a/api-http/user/user-service.http +++ b/api-http/user/user-service.http @@ -20,6 +20,11 @@ Content-Type: application/json ### +GET http://localhost:8080/api/v1/users +Authorization: 로그인하고 생성된 토큰 넣어주세요! + +### + PUT http://localhost:8080/api/v1/users/update Content-Type: application/json Authorization: 로그인하고 생성된 토큰 넣어주세요! @@ -29,4 +34,10 @@ Authorization: 로그인하고 생성된 토큰 넣어주세요! "password": "asdfgA12gg@", "email":"asdfg3@naver.com", "slackName": "asdgggh" -} \ No newline at end of file +} + +### + +DELETE http://localhost:8080/api/v1/users +Content-Type: application/json +Authorization: 로그인하고 생성된 토큰 넣어주세요! \ No newline at end of file diff --git a/user-service/src/main/java/com/sparta/user/application/dto/response/UserInfoResponseDto.java b/user-service/src/main/java/com/sparta/user/application/dto/response/UserInfoResponseDto.java new file mode 100644 index 0000000..ee4c62f --- /dev/null +++ b/user-service/src/main/java/com/sparta/user/application/dto/response/UserInfoResponseDto.java @@ -0,0 +1,23 @@ +package com.sparta.user.application.dto.response; + +import com.sparta.user.domain.model.User; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor +public class UserInfoResponseDto { + private String username; + private String email; + private String slackName; + private String role; + + public UserInfoResponseDto(User user) { + this.username = user.getUsername(); + this.email = user.getEmail(); + this.slackName = user.getSlackName(); + this.role = user.getRole(); + } +} diff --git a/user-service/src/main/java/com/sparta/user/application/dto/response/UserSigninResponseDto.java b/user-service/src/main/java/com/sparta/user/application/dto/response/UserSigninResponseDto.java index 1269439..cf0db50 100644 --- a/user-service/src/main/java/com/sparta/user/application/dto/response/UserSigninResponseDto.java +++ b/user-service/src/main/java/com/sparta/user/application/dto/response/UserSigninResponseDto.java @@ -5,7 +5,6 @@ import lombok.Setter; @Getter -@Setter public class UserSigninResponseDto { private Long id; private String role; diff --git a/user-service/src/main/java/com/sparta/user/application/service/UserService.java b/user-service/src/main/java/com/sparta/user/application/service/UserService.java index 146d585..7870fd8 100644 --- a/user-service/src/main/java/com/sparta/user/application/service/UserService.java +++ b/user-service/src/main/java/com/sparta/user/application/service/UserService.java @@ -2,6 +2,7 @@ import com.sparta.user.application.dto.request.UserSigninReqeustDto; import com.sparta.user.application.dto.request.UserUpdateRequestDto; +import com.sparta.user.application.dto.response.UserInfoResponseDto; import com.sparta.user.application.dto.response.UserSigninResponseDto; import com.sparta.user.application.dto.request.UserSignupRequestDto; import com.sparta.user.domain.model.User; @@ -13,6 +14,7 @@ import org.apache.commons.lang.NullArgumentException; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.naming.AuthenticationException; @@ -40,14 +42,27 @@ public String signIn(UserSigninReqeustDto reqeustDto) throws AuthenticationExcep UserSigninResponseDto responseDto = new UserSigninResponseDto(user); return authService.createAccessToken(responseDto); } + //회원정보 조회(관리자) + + //회원정보 조회(본인) + @Transactional(readOnly = true) + public UserInfoResponseDto getUserInfo(String userId) { + User user = findUserInfo(userId); + return new UserInfoResponseDto(user); + } + //회원정보 수정 public void updateUser(UserUpdateRequestDto requestDto, String userId) { - User user = userRepository.findById(Long.parseLong(userId)).orElseThrow(()->new IllegalArgumentException("존재하지않는 회원입니다.")); + User user = findUserInfo(userId); UserRoleEnum userRole = checkUserRole(requestDto.getTokenValue()); user.updateUser(encryptPassword(requestDto.getPassword()), requestDto, userRole.getAuthority()); userRepository.save(user); } + //회원정보 삭제 + public void deleteUser(String userId) { + userRepository.deleteById(Long.parseLong(userId)); + } //비밀번호 인증 private void passwordMatchChecker(UserSigninReqeustDto reqeustDto, User user) throws AuthenticationException { @@ -75,7 +90,6 @@ private String encryptPassword (String password) { } return passwordEncoder.encode(password); } - //중복이름방지 private void validDuplicatedNames(UserSignupRequestDto requestDto) throws IllegalAccessException { boolean exsist = userRepository.existsByUsername(requestDto.getUsername()); @@ -83,7 +97,11 @@ private void validDuplicatedNames(UserSignupRequestDto requestDto) throws Illega throw new IllegalAccessException("Username or Email or SlackName is already taken."); } } - + //회원 존재여부 + private User findUserInfo(String userId) { + return userRepository.findById(Long.parseLong(userId)) + .orElseThrow(()->new IllegalArgumentException("존재하지않는 회원입니다.")); + } } diff --git a/user-service/src/main/java/com/sparta/user/presentation/UserController.java b/user-service/src/main/java/com/sparta/user/presentation/UserController.java index 0944f28..35c3fbd 100644 --- a/user-service/src/main/java/com/sparta/user/presentation/UserController.java +++ b/user-service/src/main/java/com/sparta/user/presentation/UserController.java @@ -4,11 +4,14 @@ import com.sparta.user.application.dto.request.UserSigninReqeustDto; import com.sparta.user.application.dto.request.UserSignupRequestDto; import com.sparta.user.application.dto.request.UserUpdateRequestDto; +import com.sparta.user.application.dto.response.UserInfoResponseDto; import com.sparta.user.application.service.UserService; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -47,10 +50,22 @@ public ResponseEntity signIn(@Valid @RequestBody UserSigninReqeustDto requ return ResponseEntity.ok().build(); } + @GetMapping + public ResponseEntity getUserInfo(@RequestHeader("user_id") String userId) { + UserInfoResponseDto userInfoResponseDto = userService.getUserInfo(userId); + return ResponseEntity.ok(userInfoResponseDto); + } + @PutMapping("/update") public ResponseEntity updateUser(@Valid @RequestBody UserUpdateRequestDto requestDto, @RequestHeader("user_id") String userId) { userService.updateUser(requestDto, userId); return ResponseEntity.ok().build(); } + + @DeleteMapping("/") + public ResponseEntity deleteUser(@RequestHeader("user_id") String userId) { + userService.deleteUser(userId); + return ResponseEntity.noContent().build(); + } } \ No newline at end of file From dbf2789f99ac6c1ce3ef779bbf2ffc1054d1259b Mon Sep 17 00:00:00 2001 From: devdaeun Date: Fri, 21 Mar 2025 00:41:13 +0900 Subject: [PATCH 143/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#34]=20:=20user=20d?= =?UTF-8?q?elete=20=EC=88=98=EC=A0=95=20-=20user=20delete=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=88=98=EC=A0=95=ED=96=88=EC=8A=B5?= =?UTF-8?q?=EB=8B=88=EB=8B=A4.=20-=20softDelete=20=EB=A1=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=EA=B5=AC=ED=98=84=ED=96=88=EC=8A=B5=EB=8B=88=EB=8B=A4?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gateway/build.gradle | 1 + .../java/com/sparta/gateway/JwtAuthenticationFilter.java | 6 ++++-- user-service/build.gradle | 1 + .../com/sparta/user/application/service/UserService.java | 4 +++- .../src/main/java/com/sparta/user/domain/model/User.java | 3 ++- .../java/com/sparta/user/presentation/UserController.java | 2 +- 6 files changed, 12 insertions(+), 5 deletions(-) diff --git a/gateway/build.gradle b/gateway/build.gradle index df6f6d4..b133b31 100644 --- a/gateway/build.gradle +++ b/gateway/build.gradle @@ -10,6 +10,7 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-gateway' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'org.springframework.boot:spring-boot-starter-security' + implementation project(':common-module') } diff --git a/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java b/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java index 2605c34..38cff0e 100644 --- a/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java +++ b/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java @@ -30,8 +30,10 @@ public JwtAuthenticationFilter(String secretKey) { @Override public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { String path = exchange.getRequest().getURI().getPath(); - if (path.equals("/api/v1/users/sign-up") || path.equals("/api/v1/users/sign-in")) { - return chain.filter(exchange); //회원가입, 로그인은 JWT 토큰인증 x + if (path.equals("/api/v1/users/sign-up") || path.equals("/api/v1/users/sign-in") || + path.equals("/swagger-ui") || path.equals("/swagger-ui.html") || + path.endsWith("/v3/api-docs") || path.equals("/webjars/swagger-ui")) { + return chain.filter(exchange); //회원가입, 로그인, Swagger 관련 요청은 JWT 토큰인증 x } ServerHttpRequest request = exchange.getRequest(); ServerHttpResponse response = exchange.getResponse(); diff --git a/user-service/build.gradle b/user-service/build.gradle index 3209f29..0b54c48 100644 --- a/user-service/build.gradle +++ b/user-service/build.gradle @@ -11,6 +11,7 @@ dependencies { testImplementation 'org.springframework.security:spring-security-test' testImplementation 'io.projectreactor:reactor-test' runtimeOnly 'org.postgresql:postgresql' + implementation project(':common-module') } dependencyManagement { diff --git a/user-service/src/main/java/com/sparta/user/application/service/UserService.java b/user-service/src/main/java/com/sparta/user/application/service/UserService.java index 7870fd8..5ceb07a 100644 --- a/user-service/src/main/java/com/sparta/user/application/service/UserService.java +++ b/user-service/src/main/java/com/sparta/user/application/service/UserService.java @@ -61,7 +61,9 @@ public void updateUser(UserUpdateRequestDto requestDto, String userId) { } //회원정보 삭제 public void deleteUser(String userId) { - userRepository.deleteById(Long.parseLong(userId)); + User user = findUserInfo(userId); + user.delete(Long.parseLong(userId)); + userRepository.save(user); } //비밀번호 인증 diff --git a/user-service/src/main/java/com/sparta/user/domain/model/User.java b/user-service/src/main/java/com/sparta/user/domain/model/User.java index a1df286..b4ec79a 100644 --- a/user-service/src/main/java/com/sparta/user/domain/model/User.java +++ b/user-service/src/main/java/com/sparta/user/domain/model/User.java @@ -1,5 +1,6 @@ package com.sparta.user.domain.model; +import com.sparta.commonmodule.entity.BaseEntity; import com.sparta.user.application.dto.request.UserSignupRequestDto; import com.sparta.user.application.dto.request.UserUpdateRequestDto; import jakarta.persistence.*; @@ -13,7 +14,7 @@ @NoArgsConstructor @Table(name = "p_users") @Entity -public class User{ +public class User extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/user-service/src/main/java/com/sparta/user/presentation/UserController.java b/user-service/src/main/java/com/sparta/user/presentation/UserController.java index 35c3fbd..d2c928c 100644 --- a/user-service/src/main/java/com/sparta/user/presentation/UserController.java +++ b/user-service/src/main/java/com/sparta/user/presentation/UserController.java @@ -63,7 +63,7 @@ public ResponseEntity updateUser(@Valid @RequestBody UserUpdateRequestDto return ResponseEntity.ok().build(); } - @DeleteMapping("/") + @DeleteMapping public ResponseEntity deleteUser(@RequestHeader("user_id") String userId) { userService.deleteUser(userId); return ResponseEntity.noContent().build(); From a3b1eabca6e95b7ac57e9d5c82b2ad2e19505fee Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Fri, 21 Mar 2025 03:16:23 +0900 Subject: [PATCH 144/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20hub=20route=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20api=20=EC=9E=91=EC=84=B1=20-=20=ED=8A=B9?= =?UTF-8?q?=EC=A0=95=20=EC=B6=9C=EB=B0=9C=20=ED=97=88=EB=B8=8C=20=E2=86=92?= =?UTF-8?q?=20=EB=8F=84=EC=B0=A9=20=ED=97=88=EB=B8=8C=20=EA=B2=BD=EB=A1=9C?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=20api=20=EC=88=98=EC=A0=95=20-=20(?= =?UTF-8?q?=EC=A0=95=ED=95=B4=EC=A7=84)=20=ED=97=88=EB=B8=8C=20=EA=B0=84?= =?UTF-8?q?=20=EA=B2=BD=EB=A1=9C=20=EC=83=9D=EC=84=B1=20api=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20-=20//=20=ED=97=88=EB=B8=8C=20=EA=B0=84=20=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C=20=EC=A0=95=EB=B3=B4=20=EC=82=AD=EC=A0=9C=20api=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/HubRouteService.java | 31 +++++++++++++++---- .../domain/common/HaversineCalculator.java | 29 +++++++++++++++++ .../HubRouteCheckpointRepository.java | 10 ++++++ .../domain/repository/HubRouteRepository.java | 2 ++ .../JPAHubRouteCheckpointRepository.java | 13 ++++++++ .../controller/HubRouteController.java | 19 +++++++++--- 6 files changed, 93 insertions(+), 11 deletions(-) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/common/HaversineCalculator.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java index a2c9173..197ff93 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java @@ -6,9 +6,14 @@ import com.sparta.hubservice.hub_route.application.dto.response.HubRouteDeleteResponse; import com.sparta.hubservice.hub_route.application.dto.response.HubRouteResponse; import com.sparta.hubservice.hub.domain.model.Hub; +import com.sparta.hubservice.hub_route.domain.common.HaversineCalculator; import com.sparta.hubservice.hub_route.domain.model.HubRoute; +import com.sparta.hubservice.hub_route.domain.model.HubRouteCheckpoint; +import com.sparta.hubservice.hub_route.domain.repository.HubRouteCheckpointRepository; import com.sparta.hubservice.hub_route.domain.repository.HubRouteRepository; import jakarta.persistence.Table; +import java.math.BigDecimal; +import java.util.List; import java.util.Optional; import java.util.UUID; import lombok.RequiredArgsConstructor; @@ -23,6 +28,7 @@ public class HubRouteService { private final HubRouteRepository hubRouteRepository; private final HubRepository hubRepository; + private final HubRouteCheckpointRepository checkpointRepository; // 허브 간 경로 조회 @Transactional(readOnly = true) @@ -33,24 +39,34 @@ public HubRouteResponse getHubRoute(UUID fromHubId, UUID toHubId) { if(hubRoute.isEmpty()){ throw new ResourceNotFoundException("Hub route not found"); } - return new HubRouteResponse(hubRoute.get()); } // 허브 간 경로 생성 @Transactional - public HubRouteCreateResponse createHubRoute(UUID fromHubId, UUID toHubId) { + public HubRouteCreateResponse createHubRoute(Long userId, UUID fromHubId, UUID toHubId) { Optional fromHub = hubRepository.findById(fromHubId); Optional toHub = hubRepository.findById(toHubId); - // fromHub.getAddress() 와 toHub.getAddress()를 가지고 거리, 시간 가져오기 - HubRoute saveHubRoute = - HubRoute.builder() + // 거리 계산 + double distance = HaversineCalculator.haversineDistance( + fromHub.get().getLatitude(), fromHub.get().getLongitude(), + toHub.get().getLatitude(), toHub.get().getLongitude()); + + // 시간 계산 + double speed = 60; + int duration = (int)Math.round(distance / speed); + + HubRoute saveHubRoute = HubRoute.builder() .fromHub(fromHub.get()) .toHub(toHub.get()) + .duration(duration) + .distance(BigDecimal.valueOf(distance)) + .userId(userId) .build(); - return null; + HubRoute hubRoute = hubRouteRepository.save(saveHubRoute); + return new HubRouteCreateResponse(hubRoute); } // 허브 간 경로 정보 삭제 (soft deleted) @@ -60,6 +76,9 @@ public HubRouteDeleteResponse deleteHubRoute(UUID hubRouteId, Long userId) { if(hubRoute == null){ throw new ResourceNotFoundException("Hub route not found"); } + // hubRouteId와 관련있는 hub_route_checkpoint 정보 삭제 + checkpointRepository.findAllByHubRouteId(hubRouteId) + .forEach(checkpoint -> checkpoint.delete(userId)); hubRoute.delete(userId); return new HubRouteDeleteResponse(hubRouteId, "Hub successfully deleted."); diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/common/HaversineCalculator.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/common/HaversineCalculator.java new file mode 100644 index 0000000..1428645 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/common/HaversineCalculator.java @@ -0,0 +1,29 @@ +package com.sparta.hubservice.hub_route.domain.common; + + +import java.math.BigDecimal; + +public class HaversineCalculator { + + private static final double R = 6371; // 지구 반지름 (km) + + public static double haversineDistance(BigDecimal lat1, BigDecimal lon1, BigDecimal lat2, BigDecimal lon2) { + + // 삼각함수 계산을 하기 위해 radian 단위로 변경 + double latRad1 = Math.toRadians(lat1.doubleValue()); + double latRad2 = Math.toRadians(lat2.doubleValue()); + double lonRad1 = Math.toRadians(lon1.doubleValue()); + double lonRad2 = Math.toRadians(lon2.doubleValue()); + + double diffLat = latRad2 - latRad1; + double diffLon = lonRad2 - lonRad1; + + // haversine 공식 + double a = Math.sin(diffLat / 2) * Math.sin(diffLat / 2) + + Math.cos(latRad1) * Math.cos(latRad2) * Math.sin(diffLon / 2) * Math.sin(diffLon / 2); + double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + + return R * c; + } + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java new file mode 100644 index 0000000..7d743bb --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java @@ -0,0 +1,10 @@ +package com.sparta.hubservice.hub_route.domain.repository; + +import com.sparta.hubservice.hub_route.domain.model.HubRouteCheckpoint; +import java.util.List; +import java.util.UUID; + +public interface HubRouteCheckpointRepository { + + List findAllByHubRouteId(UUID hubRouteId); +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java index fd495af..db9b0a9 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java @@ -9,4 +9,6 @@ public interface HubRouteRepository { Optional findByFromHub_HubIdAndToHub_HubIdAndIsDeletedFalse(UUID fromHubId, UUID toHubId); HubRoute findByHubRouteIdAndIsDeletedFalse(UUID hubRouteId); + + HubRoute save(HubRoute saveHubRoute); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java new file mode 100644 index 0000000..0183bdc --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java @@ -0,0 +1,13 @@ +package com.sparta.hubservice.hub_route.infrastructure.persistence; + +import com.sparta.hubservice.hub_route.domain.model.HubRouteCheckpoint; +import com.sparta.hubservice.hub_route.domain.repository.HubRouteCheckpointRepository; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface JPAHubRouteCheckpointRepository extends JpaRepository, + HubRouteCheckpointRepository { + + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java index 5978015..eec14e0 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java @@ -23,18 +23,27 @@ public class HubRouteController { private final HubRouteService hubRoutesService; - // 허브 간 경로 조회 -> 기능 추가 예정 + // 전체 허브 간 경로 목록 조회 + + + // 특정 경로 ID 조회 + + + // 특정 출발 허브 → 도착 허브 경로 조회 @GetMapping("/{from_hub_id}/{to_hub_id}") public ResponseEntity getHubRoute(@PathVariable String from_hub_id, @PathVariable String to_hub_id) { HubRouteResponse response = hubRoutesService.getHubRoute(UUID.fromString(from_hub_id), UUID.fromString(to_hub_id)); return ResponseEntity.ok(response); } - // 허브 간 경로 생성 - // 미완성-> naver api 이용하여 자동 경로 생성으로 기능 추가 예정 + // (정해진) 허브 간 경로 생성 + // Todo : 더미데이터 필요 (추후 중요한 경로만 주기적으로 naver api 실시간 거리 및 시간 반영 고려) @PostMapping("/{from_hub_id}/{to_hub_id}") - public ResponseEntity createHubRoute(@PathVariable String from_hub_id, @PathVariable String to_hub_id) { - HubRouteCreateResponse response = hubRoutesService.createHubRoute(UUID.fromString(from_hub_id), UUID.fromString(to_hub_id)); + public ResponseEntity createHubRoute( + @PathVariable String from_hub_id, + @PathVariable String to_hub_id, + @RequestParam Long userId) { + HubRouteCreateResponse response = hubRoutesService.createHubRoute(userId, UUID.fromString(from_hub_id), UUID.fromString(to_hub_id)); return ResponseEntity.ok(response); } From 265ad06a9e28f4ac49f299e945dc92be295e401a Mon Sep 17 00:00:00 2001 From: devdaeun Date: Fri, 21 Mar 2025 03:48:29 +0900 Subject: [PATCH 145/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#107]?= =?UTF-8?q?=20:=20gateway=20=EC=9D=B8=EA=B0=80=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81=20-=20gateway=20filter=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=9A=B0=EC=84=A0=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=EC=9D=84=20=ED=99=95=EC=9D=B8=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gateway/JwtAuthenticationFilter.java | 37 +++++++++++++------ .../sparta/gateway/config/SecurityConfig.java | 10 ++++- .../persistence/QueryDSLHubRepository.java | 1 - 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java b/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java index 38cff0e..9f9106f 100644 --- a/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java +++ b/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java @@ -10,6 +10,11 @@ import org.springframework.http.HttpStatus; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.ReactiveSecurityContextHolder; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.server.ServerWebExchange; @@ -18,6 +23,8 @@ import reactor.core.publisher.Mono; import javax.crypto.SecretKey; +import java.util.Collections; +import java.util.List; @Slf4j public class JwtAuthenticationFilter implements WebFilter { @@ -30,18 +37,13 @@ public JwtAuthenticationFilter(String secretKey) { @Override public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { String path = exchange.getRequest().getURI().getPath(); - if (path.equals("/api/v1/users/sign-up") || path.equals("/api/v1/users/sign-in") || - path.equals("/swagger-ui") || path.equals("/swagger-ui.html") || - path.endsWith("/v3/api-docs") || path.equals("/webjars/swagger-ui")) { - return chain.filter(exchange); //회원가입, 로그인, Swagger 관련 요청은 JWT 토큰인증 x + if (path.equals("/api/v1/users/sign-up") || path.equals("/api/v1/users/sign-in")) { + return chain.filter(exchange); //회원가입, 로그인은 JWT 토큰인증 x } ServerHttpRequest request = exchange.getRequest(); ServerHttpResponse response = exchange.getResponse(); - log.info(secretKey); - log.info(request.getURI().toString()); String token = extractToken(request); //토큰값을 Bearer 떼고 가져옴 - log.info(token); if (token == null || !validateToken(token)) { @@ -49,16 +51,15 @@ public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { return exchange.getResponse().setComplete(); } - log.info(token); Claims claims = extractClaims(token); //사용자 정보 추출 - log.info(claims.getSubject()); //응답 헤더에 사용자 정보 반환처리 setAuthenticationHeader(claims,request); - log.info(request.getHeaders().toString()); - return chain.filter(exchange); - } + Authentication authentication = setAuthenticationContext(claims); + + return chain.filter(exchange).contextWrite(ReactiveSecurityContextHolder.withAuthentication(authentication)); + } private void setAuthenticationHeader(Claims claims, ServerHttpRequest request) { @@ -112,5 +113,17 @@ private boolean validateToken(String token) { } } + private Authentication setAuthenticationContext(Claims claims) { + // JWT에서 사용자 정보와 권한 추출 + String userId = claims.get("user_id", String.class); + String role = claims.get("role", String.class); + + // 권한 설정 + List authorities = Collections.singletonList(new SimpleGrantedAuthority(role)); + + // 인증 객체 생성 후 SecurityContext에 설정 + return new UsernamePasswordAuthenticationToken(userId, null, authorities); + } + } diff --git a/gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java b/gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java index a3f3cd7..b237ade 100644 --- a/gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java +++ b/gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java @@ -22,8 +22,14 @@ public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { return http .csrf(csrf -> csrf.disable()) .authorizeExchange(exchange -> exchange - .pathMatchers("api/v1/users/sign-in", "api/v1/users/sign-up").permitAll() - .pathMatchers("/api/v1/**").permitAll() // 권한 기반 접근 + .pathMatchers("api/v1/users/**").permitAll() + .pathMatchers("/api/v1/companys/**").hasAnyRole("MASTER","COMPANY","SHIPPING") + .pathMatchers("/api/v1/shippings/**").hasAnyRole("MASTER","SHIPPING") + .pathMatchers("/api/v1/hubs/**").hasAnyRole("MASTER","HUB","SHIPPING") + .pathMatchers("/api/v1/products/**").hasAnyRole("MASTER","COMPANY","HUB") + .pathMatchers("/api/v1/orders/**").permitAll() + .pathMatchers("/api/v1/payments/**").hasAnyRole("MASTER","COMPANY","SHIPPING") + .pathMatchers("/api/v1/slacks/**").hasRole("COMPANY") // 권한 기반 접근 .anyExchange().authenticated() ) .addFilterBefore(jwtAuthenticationFilter(), SecurityWebFiltersOrder.AUTHENTICATION) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java index 71a0d50..20445df 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java @@ -3,7 +3,6 @@ import com.querydsl.core.BooleanBuilder; import com.querydsl.jpa.impl.JPAQueryFactory; import com.sparta.hubservice.hub.domain.model.Hub; -import com.sparta.hubservice.hub.domain.model.QHub; import com.sparta.hubservice.hub.domain.repository.HubQueryRepository; import java.util.List; import lombok.RequiredArgsConstructor; From d9bd1c6751bb198e7588126d893a7761759ff8d4 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Fri, 21 Mar 2025 03:50:49 +0900 Subject: [PATCH 146/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#107]?= =?UTF-8?q?=20:=20gateway=20=EC=9D=B8=EA=B0=80=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81=20-=20gateway=20filter=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=9A=B0=EC=84=A0=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=EC=9D=84=20=ED=99=95=EC=9D=B8=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub/infrastructure/persistence/QueryDSLHubRepository.java | 1 + 1 file changed, 1 insertion(+) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java index 20445df..71a0d50 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java @@ -3,6 +3,7 @@ import com.querydsl.core.BooleanBuilder; import com.querydsl.jpa.impl.JPAQueryFactory; import com.sparta.hubservice.hub.domain.model.Hub; +import com.sparta.hubservice.hub.domain.model.QHub; import com.sparta.hubservice.hub.domain.repository.HubQueryRepository; import java.util.List; import lombok.RequiredArgsConstructor; From 70d879043316fd4eb1850dc8a8246c0d1109d380 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Fri, 21 Mar 2025 04:08:33 +0900 Subject: [PATCH 147/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=A0=84?= =?UTF-8?q?=EC=B2=B4=20=ED=97=88=EB=B8=8C=20=EA=B0=84=20=EA=B2=BD=EB=A1=9C?= =?UTF-8?q?=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20api=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/HubRouteService.java | 18 ++++++++++++++++++ .../domain/repository/HubRouteRepository.java | 4 ++++ .../controller/HubRouteController.java | 10 +++++++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java index 197ff93..e4cff6d 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java @@ -18,6 +18,8 @@ import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -30,6 +32,20 @@ public class HubRouteService { private final HubRepository hubRepository; private final HubRouteCheckpointRepository checkpointRepository; + // 전체 허브 간 경로 목록 조회 + @Transactional(readOnly = true) + public Page getHubRoutes(Pageable pageable) { + Page hubRoutes = hubRouteRepository.findAllByIsDeletedFalse(pageable); + + if(hubRoutes.isEmpty()) { + throw new ResourceNotFoundException("Hub routes not found"); + } + + return hubRoutes.map(HubRouteResponse::new); + } + + // 특정 경로 ID 조회 + // 허브 간 경로 조회 @Transactional(readOnly = true) public HubRouteResponse getHubRoute(UUID fromHubId, UUID toHubId) { @@ -83,4 +99,6 @@ public HubRouteDeleteResponse deleteHubRoute(UUID hubRouteId, Long userId) { hubRoute.delete(userId); return new HubRouteDeleteResponse(hubRouteId, "Hub successfully deleted."); } + + } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java index db9b0a9..814ef0c 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java @@ -3,6 +3,8 @@ import com.sparta.hubservice.hub_route.domain.model.HubRoute; import java.util.Optional; import java.util.UUID; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; public interface HubRouteRepository { @@ -11,4 +13,6 @@ public interface HubRouteRepository { HubRoute findByHubRouteIdAndIsDeletedFalse(UUID hubRouteId); HubRoute save(HubRoute saveHubRoute); + + Page findAllByIsDeletedFalse(Pageable pageable); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java index eec14e0..28376b3 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java @@ -7,6 +7,9 @@ import com.sparta.hubservice.hub_route.application.service.HubRouteService; import java.util.UUID; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -24,7 +27,12 @@ public class HubRouteController { private final HubRouteService hubRoutesService; // 전체 허브 간 경로 목록 조회 - + @GetMapping + public ResponseEntity> getHubRoutes(@PageableDefault(page = 0, size = 10, sort = "createdAt") + Pageable pageable){ + Page responses = hubRoutesService.getHubRoutes(pageable); + return ResponseEntity.ok(responses); + } // 특정 경로 ID 조회 From b32485908aca0daa9802c9997cd4e72f62fc08d7 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Fri, 21 Mar 2025 04:09:15 +0900 Subject: [PATCH 148/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20Exception=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hubservice/hub/application/service/HubService.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java index 2af6992..3220fbe 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java @@ -33,8 +33,7 @@ public class HubService { public Page getHubs(Pageable pageable) { Page hubPages = hubRepository.findByIsDeletedFalse(pageable); if (hubPages.isEmpty()) { - log.error("not found hubs"); - throw new ResourceNotFoundException(); + throw new ResourceNotFoundException("Hub not found"); } return hubPages.map(HubResponseDto::new); } @@ -51,7 +50,7 @@ public HubResponseDto getHub(UUID hubId) { public Page getSearchHubs(String name, String address, Pageable pageable) { Page searchHubs = hubQueryRepository.searchByKeyword(name, address, pageable); if (searchHubs.isEmpty()) { - throw new ResourceNotFoundException("해당하는 정보의 허브가 존재하지 않습니다."); + throw new ResourceNotFoundException("Hub not found - name : " + name +" and address : " + address); } return searchHubs.map(HubResponseDto::new); } From 75eb207a190b3501f0f8d6169db736b767cf14bc Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Fri, 21 Mar 2025 04:10:45 +0900 Subject: [PATCH 149/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20=EC=95=88?= =?UTF-8?q?=EC=93=B0=EB=8A=94=20import=EB=AC=B8=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub_route/application/service/HubRouteService.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java index e4cff6d..c153ff5 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java @@ -1,19 +1,16 @@ package com.sparta.hubservice.hub_route.application.service; import com.sparta.commonmodule.exception.ResourceNotFoundException; +import com.sparta.hubservice.hub.domain.model.Hub; import com.sparta.hubservice.hub.domain.repository.HubRepository; import com.sparta.hubservice.hub_route.application.dto.response.HubRouteCreateResponse; import com.sparta.hubservice.hub_route.application.dto.response.HubRouteDeleteResponse; import com.sparta.hubservice.hub_route.application.dto.response.HubRouteResponse; -import com.sparta.hubservice.hub.domain.model.Hub; import com.sparta.hubservice.hub_route.domain.common.HaversineCalculator; import com.sparta.hubservice.hub_route.domain.model.HubRoute; -import com.sparta.hubservice.hub_route.domain.model.HubRouteCheckpoint; import com.sparta.hubservice.hub_route.domain.repository.HubRouteCheckpointRepository; import com.sparta.hubservice.hub_route.domain.repository.HubRouteRepository; -import jakarta.persistence.Table; import java.math.BigDecimal; -import java.util.List; import java.util.Optional; import java.util.UUID; import lombok.RequiredArgsConstructor; From dfe4ac813ab0a889f046d7dcced8b4d3ecf638a8 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Fri, 21 Mar 2025 10:34:17 +0900 Subject: [PATCH 150/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20hub=20route=20ap?= =?UTF-8?q?i=20-=20=ED=8A=B9=EC=A0=95=20=EA=B2=BD=EB=A1=9C=20ID=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20api=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/HubRouteService.java | 9 ++++++--- .../domain/repository/HubRouteRepository.java | 2 ++ .../controller/HubRouteController.java | 20 +++++++++++-------- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java index c153ff5..c52f358 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java @@ -42,10 +42,14 @@ public Page getHubRoutes(Pageable pageable) { } // 특정 경로 ID 조회 + public HubRouteResponse getHubRoute(UUID hubRouteId) { + HubRoute hubRoute = hubRouteRepository.findById(hubRouteId).orElseThrow(ResourceNotFoundException::new); + return new HubRouteResponse(hubRoute); + } - // 허브 간 경로 조회 + //특정 출발 허브 → 도착 허브 경로 조회 @Transactional(readOnly = true) - public HubRouteResponse getHubRoute(UUID fromHubId, UUID toHubId) { + public HubRouteResponse getHubRouteFromHubToHub(UUID fromHubId, UUID toHubId) { Optional hubRoute = hubRouteRepository.findByFromHub_HubIdAndToHub_HubIdAndIsDeletedFalse(fromHubId, toHubId); @@ -97,5 +101,4 @@ public HubRouteDeleteResponse deleteHubRoute(UUID hubRouteId, Long userId) { return new HubRouteDeleteResponse(hubRouteId, "Hub successfully deleted."); } - } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java index 814ef0c..32f1c05 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java @@ -15,4 +15,6 @@ public interface HubRouteRepository { HubRoute save(HubRoute saveHubRoute); Page findAllByIsDeletedFalse(Pageable pageable); + + Optional findById(UUID hubRouteId); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java index 28376b3..8a53961 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java @@ -24,23 +24,27 @@ @RequiredArgsConstructor public class HubRouteController { - private final HubRouteService hubRoutesService; + private final HubRouteService hubRouteService; // 전체 허브 간 경로 목록 조회 @GetMapping - public ResponseEntity> getHubRoutes(@PageableDefault(page = 0, size = 10, sort = "createdAt") - Pageable pageable){ - Page responses = hubRoutesService.getHubRoutes(pageable); + public ResponseEntity> getHubRoutes( + @PageableDefault(page = 0, size = 10, sort = "createdAt") Pageable pageable){ + Page responses = hubRouteService.getHubRoutes(pageable); return ResponseEntity.ok(responses); } // 특정 경로 ID 조회 - + @GetMapping("/{hub_route_id}") + public ResponseEntity getHubRoute(@PathVariable("hub_route_id") UUID hubRouteId) { + HubRouteResponse response = hubRouteService.getHubRoute(hubRouteId); + return ResponseEntity.ok(response); + } // 특정 출발 허브 → 도착 허브 경로 조회 @GetMapping("/{from_hub_id}/{to_hub_id}") public ResponseEntity getHubRoute(@PathVariable String from_hub_id, @PathVariable String to_hub_id) { - HubRouteResponse response = hubRoutesService.getHubRoute(UUID.fromString(from_hub_id), UUID.fromString(to_hub_id)); + HubRouteResponse response = hubRouteService.getHubRouteFromHubToHub(UUID.fromString(from_hub_id), UUID.fromString(to_hub_id)); return ResponseEntity.ok(response); } @@ -51,14 +55,14 @@ public ResponseEntity createHubRoute( @PathVariable String from_hub_id, @PathVariable String to_hub_id, @RequestParam Long userId) { - HubRouteCreateResponse response = hubRoutesService.createHubRoute(userId, UUID.fromString(from_hub_id), UUID.fromString(to_hub_id)); + HubRouteCreateResponse response = hubRouteService.createHubRoute(userId, UUID.fromString(from_hub_id), UUID.fromString(to_hub_id)); return ResponseEntity.ok(response); } // 허브 간 경로 정보 삭제 @DeleteMapping("/{hub_route_id}") public ResponseEntity deleteHubRoute(@PathVariable String hub_route_id, @RequestParam Long userId) { - HubRouteDeleteResponse response = hubRoutesService.deleteHubRoute(UUID.fromString(hub_route_id), userId); + HubRouteDeleteResponse response = hubRouteService.deleteHubRoute(UUID.fromString(hub_route_id), userId); return ResponseEntity.ok(response); } From f4eb9d224b0e3d995d0c39335e4ea722444cc1c8 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Fri, 21 Mar 2025 10:47:21 +0900 Subject: [PATCH 151/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20parameter?= =?UTF-8?q?=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HubRouteController.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java index 8a53961..a50b757 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java @@ -43,8 +43,10 @@ public ResponseEntity getHubRoute(@PathVariable("hub_route_id" // 특정 출발 허브 → 도착 허브 경로 조회 @GetMapping("/{from_hub_id}/{to_hub_id}") - public ResponseEntity getHubRoute(@PathVariable String from_hub_id, @PathVariable String to_hub_id) { - HubRouteResponse response = hubRouteService.getHubRouteFromHubToHub(UUID.fromString(from_hub_id), UUID.fromString(to_hub_id)); + public ResponseEntity getHubRoute( + @PathVariable("from_hub_id") String fromHubId, + @PathVariable("to_hub_id") String toHubId) { + HubRouteResponse response = hubRouteService.getHubRouteFromHubToHub(UUID.fromString(fromHubId), UUID.fromString(toHubId)); return ResponseEntity.ok(response); } @@ -52,17 +54,19 @@ public ResponseEntity getHubRoute(@PathVariable String from_hu // Todo : 더미데이터 필요 (추후 중요한 경로만 주기적으로 naver api 실시간 거리 및 시간 반영 고려) @PostMapping("/{from_hub_id}/{to_hub_id}") public ResponseEntity createHubRoute( - @PathVariable String from_hub_id, - @PathVariable String to_hub_id, + @PathVariable("from_hub_id") String fromHubId, + @PathVariable("to_hub_id") String toHubId, @RequestParam Long userId) { - HubRouteCreateResponse response = hubRouteService.createHubRoute(userId, UUID.fromString(from_hub_id), UUID.fromString(to_hub_id)); + HubRouteCreateResponse response = hubRouteService.createHubRoute(userId, UUID.fromString(fromHubId), UUID.fromString(toHubId)); return ResponseEntity.ok(response); } // 허브 간 경로 정보 삭제 @DeleteMapping("/{hub_route_id}") - public ResponseEntity deleteHubRoute(@PathVariable String hub_route_id, @RequestParam Long userId) { - HubRouteDeleteResponse response = hubRouteService.deleteHubRoute(UUID.fromString(hub_route_id), userId); + public ResponseEntity deleteHubRoute( + @PathVariable("hub_route_id") String hubRouteId, + @RequestParam Long userId) { + HubRouteDeleteResponse response = hubRouteService.deleteHubRoute(UUID.fromString(hubRouteId), userId); return ResponseEntity.ok(response); } From 7dc4f81fc0f23a67558e111051aab7dbf3946c05 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Fri, 21 Mar 2025 12:44:37 +0900 Subject: [PATCH 152/389] =?UTF-8?q?bug=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commonmodule/entity/BaseEntity.java | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java b/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java index 7a2dc3b..0f1d8c2 100644 --- a/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java +++ b/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java @@ -1,33 +1,32 @@ - package com.sparta.commonmodule.entity; - - import jakarta.persistence.Column; - import jakarta.persistence.EntityListeners; - import jakarta.persistence.JoinColumn; - import jakarta.persistence.MappedSuperclass; - import java.time.LocalDateTime; - import lombok.Data; - import lombok.Getter; - import lombok.RequiredArgsConstructor; - import org.hibernate.annotations.ColumnDefault; - import org.springframework.data.annotation.CreatedBy; - import org.springframework.data.annotation.CreatedDate; - import org.springframework.data.annotation.LastModifiedBy; - import org.springframework.data.annotation.LastModifiedDate; - import org.springframework.data.jpa.domain.support.AuditingEntityListener; - - @Data - @Getter - @RequiredArgsConstructor - @EntityListeners(AuditingEntityListener.class) - @MappedSuperclass - public class BaseEntity { - - @CreatedDate - @Column(name = "created_at", updatable = false) - private LocalDateTime createdAt; - - - +package com.sparta.commonmodule.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.MappedSuperclass; + +import java.time.LocalDateTime; + +import lombok.Data; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.hibernate.annotations.ColumnDefault; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +@Data +@Getter +@RequiredArgsConstructor +@EntityListeners(AuditingEntityListener.class) +@MappedSuperclass +public class BaseEntity { + + @CreatedDate + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; @CreatedBy @Column(name = "created_by") @@ -42,9 +41,9 @@ public class BaseEntity { private Long updatedBy; - @Column(name = "is_deleted") - @ColumnDefault("FALSE") - private Boolean isDeleted; + @Column(name = "is_deleted") + @ColumnDefault("FALSE") + private Boolean isDeleted; @Column(name = "deleted_at", nullable = true) @@ -71,3 +70,4 @@ public void delete(Long userId) { this.deletedAt = LocalDateTime.now(); this.deletedBy = userId; } +} \ No newline at end of file From 00a9714bc900039cfcbdb154d46d64deac3c43df Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Fri, 21 Mar 2025 12:44:52 +0900 Subject: [PATCH 153/389] =?UTF-8?q?bug=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- order-service/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/order-service/build.gradle b/order-service/build.gradle index 44c05a3..2a84401 100644 --- a/order-service/build.gradle +++ b/order-service/build.gradle @@ -3,6 +3,7 @@ ext { } dependencies { + implementation project(':common-module') implementation 'org.postgresql:postgresql:42.6.0' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' From fd23a665163e813b80f57d2ee96c01d11e68db4d Mon Sep 17 00:00:00 2001 From: jin2304 Date: Fri, 21 Mar 2025 12:49:10 +0900 Subject: [PATCH 154/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#94]?= =?UTF-8?q?=20:=20SwaggerConfig=20=EC=84=A4=EC=A0=95=20=EA=B3=B5=ED=86=B5?= =?UTF-8?q?=EB=AA=A8=EB=93=88=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 --- common-module/build.gradle | 1 + .../java/com/sparta/commonmodule}/config/SwaggerConfig.java | 2 +- .../java/com/sparta/product/ProductServiceApplication.java | 3 +++ 3 files changed, 5 insertions(+), 1 deletion(-) rename {product-service/src/main/java/com/sparta/product/infrastructure => common-module/src/main/java/com/sparta/commonmodule}/config/SwaggerConfig.java (90%) diff --git a/common-module/build.gradle b/common-module/build.gradle index d001452..35c1c81 100644 --- a/common-module/build.gradle +++ b/common-module/build.gradle @@ -1,5 +1,6 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' compileOnly 'org.springframework:spring-tx:5.3.30' } diff --git a/product-service/src/main/java/com/sparta/product/infrastructure/config/SwaggerConfig.java b/common-module/src/main/java/com/sparta/commonmodule/config/SwaggerConfig.java similarity index 90% rename from product-service/src/main/java/com/sparta/product/infrastructure/config/SwaggerConfig.java rename to common-module/src/main/java/com/sparta/commonmodule/config/SwaggerConfig.java index 91be798..9c146f3 100644 --- a/product-service/src/main/java/com/sparta/product/infrastructure/config/SwaggerConfig.java +++ b/common-module/src/main/java/com/sparta/commonmodule/config/SwaggerConfig.java @@ -1,4 +1,4 @@ -package com.sparta.product.infrastructure.config; +package com.sparta.commonmodule.config; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.servers.Server; diff --git a/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java b/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java index 647e151..b4a1049 100644 --- a/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java +++ b/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java @@ -1,9 +1,12 @@ package com.sparta.product; +import com.sparta.commonmodule.config.SwaggerConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Import; @SpringBootApplication +@Import(SwaggerConfig.class) public class ProductServiceApplication { public static void main(String[] args) { From d61db2a8cd4f08be47af155d047feea98fdaca5a Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Fri, 21 Mar 2025 14:35:11 +0900 Subject: [PATCH 155/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20=ED=97=88?= =?UTF-8?q?=EB=B8=8C=20=EA=B0=84=20=EA=B2=BD=EB=A1=9C=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/HubRouteService.java | 29 ++++++++----------- .../domain/common/HaversineCalculator.java | 11 +++---- .../domain/repository/HubRouteRepository.java | 8 ++--- 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java index c52f358..241a1aa 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java @@ -32,11 +32,8 @@ public class HubRouteService { // 전체 허브 간 경로 목록 조회 @Transactional(readOnly = true) public Page getHubRoutes(Pageable pageable) { - Page hubRoutes = hubRouteRepository.findAllByIsDeletedFalse(pageable); - - if(hubRoutes.isEmpty()) { - throw new ResourceNotFoundException("Hub routes not found"); - } + Page hubRoutes = hubRouteRepository.findAllByIsDeletedFalse(pageable) + .orElseThrow(ResourceNotFoundException::new); return hubRoutes.map(HubRouteResponse::new); } @@ -62,37 +59,35 @@ public HubRouteResponse getHubRouteFromHubToHub(UUID fromHubId, UUID toHubId) { // 허브 간 경로 생성 @Transactional public HubRouteCreateResponse createHubRoute(Long userId, UUID fromHubId, UUID toHubId) { - Optional fromHub = hubRepository.findById(fromHubId); - Optional toHub = hubRepository.findById(toHubId); + Hub fromHub = hubRepository.findById(fromHubId).get(); + Hub toHub = hubRepository.findById(toHubId).get(); // 거리 계산 - double distance = HaversineCalculator.haversineDistance( - fromHub.get().getLatitude(), fromHub.get().getLongitude(), - toHub.get().getLatitude(), toHub.get().getLongitude()); + double distance = HaversineCalculator.haversineDistance(fromHub, toHub); // 시간 계산 double speed = 60; int duration = (int)Math.round(distance / speed); HubRoute saveHubRoute = HubRoute.builder() - .fromHub(fromHub.get()) - .toHub(toHub.get()) + .fromHub(fromHub) + .toHub(toHub) .duration(duration) .distance(BigDecimal.valueOf(distance)) .userId(userId) .build(); - HubRoute hubRoute = hubRouteRepository.save(saveHubRoute); + HubRoute hubRoute = hubRouteRepository.save(saveHubRoute) + .orElseThrow(ResourceNotFoundException::new); return new HubRouteCreateResponse(hubRoute); } // 허브 간 경로 정보 삭제 (soft deleted) @Transactional public HubRouteDeleteResponse deleteHubRoute(UUID hubRouteId, Long userId) { - HubRoute hubRoute = hubRouteRepository.findByHubRouteIdAndIsDeletedFalse(hubRouteId); - if(hubRoute == null){ - throw new ResourceNotFoundException("Hub route not found"); - } + HubRoute hubRoute = hubRouteRepository.findByHubRouteIdAndIsDeletedFalse(hubRouteId) + .orElseThrow(ResourceNotFoundException::new); + // hubRouteId와 관련있는 hub_route_checkpoint 정보 삭제 checkpointRepository.findAllByHubRouteId(hubRouteId) .forEach(checkpoint -> checkpoint.delete(userId)); diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/common/HaversineCalculator.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/common/HaversineCalculator.java index 1428645..7239333 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/common/HaversineCalculator.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/common/HaversineCalculator.java @@ -1,19 +1,20 @@ package com.sparta.hubservice.hub_route.domain.common; +import com.sparta.hubservice.hub.domain.model.Hub; import java.math.BigDecimal; public class HaversineCalculator { private static final double R = 6371; // 지구 반지름 (km) - public static double haversineDistance(BigDecimal lat1, BigDecimal lon1, BigDecimal lat2, BigDecimal lon2) { + public static double haversineDistance(Hub hub1, Hub hub2) { // 삼각함수 계산을 하기 위해 radian 단위로 변경 - double latRad1 = Math.toRadians(lat1.doubleValue()); - double latRad2 = Math.toRadians(lat2.doubleValue()); - double lonRad1 = Math.toRadians(lon1.doubleValue()); - double lonRad2 = Math.toRadians(lon2.doubleValue()); + double latRad1 = Math.toRadians(hub1.getLatitude().doubleValue()); + double latRad2 = Math.toRadians(hub2.getLatitude().doubleValue()); + double lonRad1 = Math.toRadians(hub1.getLongitude().doubleValue()); + double lonRad2 = Math.toRadians(hub2.getLongitude().doubleValue()); double diffLat = latRad2 - latRad1; double diffLon = lonRad2 - lonRad1; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java index 32f1c05..850ec1f 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java @@ -10,11 +10,11 @@ public interface HubRouteRepository { Optional findByFromHub_HubIdAndToHub_HubIdAndIsDeletedFalse(UUID fromHubId, UUID toHubId); - HubRoute findByHubRouteIdAndIsDeletedFalse(UUID hubRouteId); + Optional findByHubRouteIdAndIsDeletedFalse(UUID hubRouteId); - HubRoute save(HubRoute saveHubRoute); + Optional save(HubRoute saveHubRoute); - Page findAllByIsDeletedFalse(Pageable pageable); + Optional> findAllByIsDeletedFalse(Pageable pageable); - Optional findById(UUID hubRouteId); + Optional findById(java.util.UUID hubRouteId); } From 17c6c49f12fe0fc66131886d324036290eefc033 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Fri, 21 Mar 2025 14:36:01 +0900 Subject: [PATCH 156/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20=ED=97=88?= =?UTF-8?q?=EB=B8=8C=20=EA=B0=84=20=EA=B2=BD=EB=A1=9C=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hubservice/hub_route/domain/common/HaversineCalculator.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/common/HaversineCalculator.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/common/HaversineCalculator.java index 7239333..691d3ca 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/common/HaversineCalculator.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/common/HaversineCalculator.java @@ -1,8 +1,6 @@ package com.sparta.hubservice.hub_route.domain.common; - import com.sparta.hubservice.hub.domain.model.Hub; -import java.math.BigDecimal; public class HaversineCalculator { From f19429449f75d635c79486220dce090e48fe551d Mon Sep 17 00:00:00 2001 From: jiyun Date: Fri, 21 Mar 2025 12:59:42 +0900 Subject: [PATCH 157/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20[109]=20yml,=20gra?= =?UTF-8?q?dle=20=ED=8C=8C=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- company-service/build.gradle | 3 +++ .../src/main/resources/application.yml | 20 ++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/company-service/build.gradle b/company-service/build.gradle index b294214..51c7966 100644 --- a/company-service/build.gradle +++ b/company-service/build.gradle @@ -8,6 +8,9 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation project(':common-module') implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' + implementation 'org.postgresql:postgresql:42.6.0' + implementation 'jakarta.validation:jakarta.validation-api:3.0.2' + implementation 'org.hibernate.validator:hibernate-validator:8.0.0.Final' } dependencyManagement { diff --git a/company-service/src/main/resources/application.yml b/company-service/src/main/resources/application.yml index 25a0a1d..b15285c 100644 --- a/company-service/src/main/resources/application.yml +++ b/company-service/src/main/resources/application.yml @@ -1,13 +1,27 @@ spring: application: name: company-service + datasource: + url: jdbc:postgresql://localhost:5432/company-service + username: myuser + password: mypassword + driver-class-name: org.postgresql.Driver + jpa: + hibernate: + ddl-auto: update + open-in-view: false + show-sql: true + properties: + hibernate: + format_sql: true + default_batch_fetch_size: 10 eureka: client: + register-with-eureka: true + fetch-registry: true service-url: - defaultZone: http://localhost:8761/eureka/ - register-with-eureka: true - fetch-registry: ture + defaultZone: http://eureka-server:8761/eureka/ server: port: 8085 From 5db1f2191a7a58eb545c9e80f126aba244aa03a8 Mon Sep 17 00:00:00 2001 From: jiyun Date: Fri, 21 Mar 2025 13:22:36 +0900 Subject: [PATCH 158/389] =?UTF-8?q?=E2=9C=A8=20feature=20[109]=20http=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- company-service/src/test/http/company.http | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 company-service/src/test/http/company.http diff --git a/company-service/src/test/http/company.http b/company-service/src/test/http/company.http new file mode 100644 index 0000000..030fce6 --- /dev/null +++ b/company-service/src/test/http/company.http @@ -0,0 +1,33 @@ +### 업체 생성 +POST http://localhost:8082/api/v1/companies +Content-Type: application/json +X-User-Id: 12345 + +{ + "name": "오징어 가공식품 회사", + "address": "경기도 수원시", + "companyType": "PRODUCER", + "hubId": "123e4567-e89b-12d3-a456-426614174000" +} + +### 업체 단일 조회 +GET http://localhost:8082/api/v1/companies/550e8400-e29b-41d4-a716-446655440000 +Content-Type: application/json + +### 업체 목록 조회 +GET http://localhost:8082/api/v1/companies +Content-Type: application/json✨ + +### 업체 수정 +PUT http://localhost:8082/api/v1/companies/550e8400-e29b-41d4-a716-446655440000 +Content-Type: application/json +X-User-Id: 12345 + +{ + "name": "오징어 가공센터", + "address": "서울특별시 강남구" +} + +### 업체 삭제 +DELETE http://localhost:8082/api/v1/companies/550e8400-e29b-41d4-a716-446655440000 +X-User-Id: 12345 From 642e339106783f9a25e4bf3a19c9ab3b83ea029a Mon Sep 17 00:00:00 2001 From: jiyun Date: Fri, 21 Mar 2025 14:24:17 +0900 Subject: [PATCH 159/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#109]=20:=20Company?= =?UTF-8?q?=20=EC=8A=A4=EC=9B=A8=EA=B1=B0=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- company-service/build.gradle | 1 + .../sparta/companyservice/CompanyServiceApplication.java | 3 +++ .../presentation/controller/CompanyController.java | 8 ++++++++ company-service/src/main/resources/application.yml | 9 +++++++++ 4 files changed, 21 insertions(+) diff --git a/company-service/build.gradle b/company-service/build.gradle index 51c7966..c366ece 100644 --- a/company-service/build.gradle +++ b/company-service/build.gradle @@ -11,6 +11,7 @@ dependencies { implementation 'org.postgresql:postgresql:42.6.0' implementation 'jakarta.validation:jakarta.validation-api:3.0.2' implementation 'org.hibernate.validator:hibernate-validator:8.0.0.Final' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' } dependencyManagement { diff --git a/company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java b/company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java index eed2ee2..f13005e 100644 --- a/company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java +++ b/company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java @@ -1,11 +1,14 @@ package com.sparta.companyservice; +import org.springdoc.webmvc.ui.SwaggerConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.Import; @SpringBootApplication @EnableFeignClients(basePackages = "com.sparta") +@Import(SwaggerConfig.class) public class CompanyServiceApplication { public static void main(String[] args) { diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java index 592d914..9b9d390 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -6,6 +6,8 @@ import com.sparta.companyservice.presentation.request.CompanyUpdateRequest; import com.sparta.companyservice.presentation.response.CompanyDeleteResponse; import com.sparta.companyservice.presentation.response.CompanyResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -17,11 +19,13 @@ @RestController @RequestMapping("/api/v1/companies") @RequiredArgsConstructor +@Tag(name = "Company Service", description = "업체 서비스 API") public class CompanyController { private final CompanyService companyService; // 생성 + @Operation(summary = "Company 등록", description = "Company 등록 API") @PostMapping public ResponseEntity createCompany(@Valid @RequestBody CompanyCreateRequest request) { CompanyDto createdCompany = companyService.createCompany(request.toDto()); @@ -29,6 +33,7 @@ public ResponseEntity createCompany(@Valid @RequestBody Company } // 전체 조회 + @Operation(summary = "Company 전체 조회", description = "Company 전체 조회 API") @GetMapping public ResponseEntity> getAllCompanies() { List companies = companyService.getAllCompanies(); @@ -37,6 +42,7 @@ public ResponseEntity> getAllCompanies() { } // 단일 조회 + @Operation(summary = "Company 단건 조회", description = "Company 단건 조회 API") @GetMapping("/{companyId}") public ResponseEntity getCompanyById(@PathVariable UUID companyId) { CompanyDto oneCompany = companyService.getCompanyById(companyId); @@ -44,6 +50,7 @@ public ResponseEntity getCompanyById(@PathVariable UUID company } // 수정 + @Operation(summary = "Company 수정", description = "Company 수정 API") @PatchMapping("/{companyId}") public ResponseEntity updateCompany(@PathVariable UUID companyId, @Valid @RequestBody CompanyUpdateRequest request) { CompanyDto updatedCompany = companyService.updateCompany(companyId, request.toDto()); @@ -51,6 +58,7 @@ public ResponseEntity updateCompany(@PathVariable UUID companyI } // 삭제 + @Operation(summary = "Company 삭제", description = "Company 삭제 API") @DeleteMapping("/{companyId}") public ResponseEntity deleteCompany(@PathVariable UUID companyId) { CompanyDeleteResponse deletedCompany = companyService.deleteCompany(companyId); diff --git a/company-service/src/main/resources/application.yml b/company-service/src/main/resources/application.yml index b15285c..5b46c03 100644 --- a/company-service/src/main/resources/application.yml +++ b/company-service/src/main/resources/application.yml @@ -25,3 +25,12 @@ eureka: server: port: 8085 + +springdoc: + api-docs: + version: openapi_3_1 + enabled: true + path: /company-service/v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui.html From 6db0e24d831b037622451b1bf4e1dd6638ddf27e Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Fri, 21 Mar 2025 14:52:07 +0900 Subject: [PATCH 160/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=A3=BC=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- order-service/build.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/order-service/build.gradle b/order-service/build.gradle index 44c05a3..2913722 100644 --- a/order-service/build.gradle +++ b/order-service/build.gradle @@ -3,8 +3,10 @@ ext { } dependencies { + implementation project(':common-module') implementation 'org.postgresql:postgresql:42.6.0' - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.bootp:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' } From bc6da26449eb90ed4c21af8625add3313dca7639 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Fri, 21 Mar 2025 14:52:33 +0900 Subject: [PATCH 161/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20:=20sof?= =?UTF-8?q?t=20delete=EB=A1=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orderservice/application/service/OrderService.java | 2 +- .../java/com/sparta/orderservice/domain/model/Order.java | 5 ++++- .../presentation/controller/OrderController.java | 5 ++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java index c9c4a7f..18c975d 100644 --- a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java +++ b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java @@ -82,7 +82,7 @@ public void deleteOrder(UUID orderId) { Order order = orderRepository.findById(orderId) .orElseThrow(() -> new RuntimeException("Not found id" + orderId)); - orderRepository.delete(order); + order.softDelete(); } diff --git a/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java b/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java index aa85be3..d4e0869 100644 --- a/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java +++ b/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java @@ -77,7 +77,10 @@ public void updateOrderDetails(String name, UUID supplierId, UUID receiverId, UU this.totalPrice = totalPrice; this.requestDetail = requestDetail; } - + // 주문 soft 삭제 + public void softDelete() { + super.delete(0L); // 사용자 인증 시스템 없으므로 임시로 0L 사용 + } } diff --git a/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java b/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java index 72485bd..d62c941 100644 --- a/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java +++ b/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java @@ -3,7 +3,6 @@ import com.sparta.orderservice.application.dto.OrderRequestDto; import com.sparta.orderservice.application.dto.OrderResponseDto; import com.sparta.orderservice.application.service.OrderService; -import com.sparta.orderservice.domain.model.Order; import jakarta.validation.Valid; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -48,8 +47,8 @@ public ResponseEntity updateOrder( } @DeleteMapping("/{id}") - public ResponseEntity deleteOrder(@PathVariable("id") UUID id) { + public ResponseEntity deleteOrder(@PathVariable("id") UUID id) { orderService.deleteOrder(id); - return ResponseEntity.noContent().build(); + return ResponseEntity.ok("주문이 성공적으로 삭제되었습니다."); } } From 973de457f6396ec5e65e05a11c54e14dd38b5c8b Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Fri, 21 Mar 2025 15:26:32 +0900 Subject: [PATCH 162/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20=ED=97=88?= =?UTF-8?q?=EB=B8=8C=20=EA=B0=84=20=EA=B2=BD=EB=A1=9C=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20-=20=EA=B1=B0=EB=A6=AC,=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=EA=B3=84=EC=82=B0=20=EC=84=9C=EB=B9=84=EC=8A=A4=20?= =?UTF-8?q?->=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EC=B1=85=EC=9E=84=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=A0=84=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/HubRouteService.java | 11 +---------- .../hub_route/domain/model/HubRoute.java | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java index 241a1aa..2141a30 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java @@ -44,7 +44,7 @@ public HubRouteResponse getHubRoute(UUID hubRouteId) { return new HubRouteResponse(hubRoute); } - //특정 출발 허브 → 도착 허브 경로 조회 + // 출발 허브 -> 도착 허브 : 특정 경로 조회 @Transactional(readOnly = true) public HubRouteResponse getHubRouteFromHubToHub(UUID fromHubId, UUID toHubId) { @@ -62,18 +62,9 @@ public HubRouteCreateResponse createHubRoute(Long userId, UUID fromHubId, UUID t Hub fromHub = hubRepository.findById(fromHubId).get(); Hub toHub = hubRepository.findById(toHubId).get(); - // 거리 계산 - double distance = HaversineCalculator.haversineDistance(fromHub, toHub); - - // 시간 계산 - double speed = 60; - int duration = (int)Math.round(distance / speed); - HubRoute saveHubRoute = HubRoute.builder() .fromHub(fromHub) .toHub(toHub) - .duration(duration) - .distance(BigDecimal.valueOf(distance)) .userId(userId) .build(); diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRoute.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRoute.java index 6c0d541..422b020 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRoute.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRoute.java @@ -2,6 +2,7 @@ import com.sparta.commonmodule.entity.BaseEntity; import com.sparta.hubservice.hub.domain.model.Hub; +import com.sparta.hubservice.hub_route.domain.common.HaversineCalculator; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; @@ -45,14 +46,24 @@ public class HubRoute extends BaseEntity { private BigDecimal distance; @Builder - public HubRoute(Hub fromHub, Hub toHub, int duration, BigDecimal distance, long userId) { + public HubRoute(Hub fromHub, Hub toHub, long userId) { super(userId); this.fromHub = fromHub; this.toHub = toHub; - this.duration = duration; - this.distance = distance; + this.distance = calculateDistance(); + this.duration = calculateDuration(); } + // 거리 계산 (km) + private BigDecimal calculateDistance() { + return BigDecimal.valueOf(HaversineCalculator.haversineDistance(fromHub, toHub)); + } + + // 시간 계산 (분) + private int calculateDuration(){ + double speed = 60.0; + return (int) Math.round(this.distance.doubleValue() / speed); + } } From c2224855757cdaefc2020a371b5cf0dfa89221d6 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Fri, 21 Mar 2025 15:32:50 +0900 Subject: [PATCH 163/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20repository?= =?UTF-8?q?=EC=97=90=EC=84=9C=20Optionl=EB=A1=9C=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=EA=B0=92=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub/application/service/HubService.java | 14 ++++++-------- .../hub/domain/repository/HubQueryRepository.java | 3 ++- .../hub/domain/repository/HubRepository.java | 3 +-- .../persistence/QueryDSLHubRepository.java | 5 +++-- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java index 3220fbe..bf630d1 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java @@ -31,10 +31,9 @@ public class HubService { // 허브 목록 조회 @Transactional(readOnly = true) public Page getHubs(Pageable pageable) { - Page hubPages = hubRepository.findByIsDeletedFalse(pageable); - if (hubPages.isEmpty()) { - throw new ResourceNotFoundException("Hub not found"); - } + Page hubPages = hubRepository.findByIsDeletedFalse(pageable) + .orElseThrow(ResourceNotFoundException::new); + return hubPages.map(HubResponseDto::new); } @@ -48,10 +47,9 @@ public HubResponseDto getHub(UUID hubId) { // 허브 검색 @Transactional(readOnly = true) public Page getSearchHubs(String name, String address, Pageable pageable) { - Page searchHubs = hubQueryRepository.searchByKeyword(name, address, pageable); - if (searchHubs.isEmpty()) { - throw new ResourceNotFoundException("Hub not found - name : " + name +" and address : " + address); - } + Page searchHubs = hubQueryRepository.searchByKeyword(name, address, pageable) + .orElseThrow(ResourceNotFoundException::new); + return searchHubs.map(HubResponseDto::new); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubQueryRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubQueryRepository.java index 57d1ba7..e365a4c 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubQueryRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubQueryRepository.java @@ -1,9 +1,10 @@ package com.sparta.hubservice.hub.domain.repository; import com.sparta.hubservice.hub.domain.model.Hub; +import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; public interface HubQueryRepository { - Page searchByKeyword(String name, String address, Pageable pageable); + Optional> searchByKeyword(String name, String address, Pageable pageable); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java index e48e6c2..5049676 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java @@ -7,8 +7,7 @@ import org.springframework.data.domain.Pageable; public interface HubRepository { - Page findByIsDeletedFalse(Pageable pageable); - boolean existsByName(String name); + Optional> findByIsDeletedFalse(Pageable pageable); Optional findById(UUID hubId); diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java index 71a0d50..866203d 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java @@ -6,6 +6,7 @@ import com.sparta.hubservice.hub.domain.model.QHub; import com.sparta.hubservice.hub.domain.repository.HubQueryRepository; import java.util.List; +import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -19,7 +20,7 @@ public class QueryDSLHubRepository implements HubQueryRepository { private final JPAQueryFactory queryFactory; @Override - public Page searchByKeyword(String name, String address, Pageable pageable) { + public Optional> searchByKeyword(String name, String address, Pageable pageable) { QHub hub = QHub.hub; BooleanBuilder predicate = new BooleanBuilder(); @@ -46,7 +47,7 @@ public Page searchByKeyword(String name, String address, Pageable pageable) .and(hub.isDeleted.eq(false))) .fetchCount(); - return new PageImpl<>(hubList, pageable, total); + return Optional.of(new PageImpl<>(hubList, pageable, total)); } From 64d2204ac0f46b01a656f73f357b873f5e1c5db4 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Fri, 21 Mar 2025 16:39:39 +0900 Subject: [PATCH 164/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#94]?= =?UTF-8?q?=20:=20Swagger=EC=84=A4=EC=A0=95=EC=9D=84=20=EC=9C=84=ED=95=B4?= =?UTF-8?q?=20=EB=A6=AC=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common-module/build.gradle | 1 - .../gateway/JwtAuthenticationFilter.java | 23 +++++++++++++++---- .../sparta/gateway/config/SecurityConfig.java | 13 +++++++++-- product-service/build.gradle | 1 + 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/common-module/build.gradle b/common-module/build.gradle index d97a8bf..87daece 100644 --- a/common-module/build.gradle +++ b/common-module/build.gradle @@ -1,5 +1,4 @@ dependencies { - implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' compileOnly 'org.springframework:spring-tx:5.3.30' // QueryDSL : (hub-service에서 필요) diff --git a/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java b/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java index 38cff0e..06af360 100644 --- a/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java +++ b/gateway/src/main/java/com/sparta/gateway/JwtAuthenticationFilter.java @@ -18,6 +18,7 @@ import reactor.core.publisher.Mono; import javax.crypto.SecretKey; +import java.util.List; @Slf4j public class JwtAuthenticationFilter implements WebFilter { @@ -27,14 +28,25 @@ public JwtAuthenticationFilter(String secretKey) { this.secretKey = secretKey; } + + private static final List EXCLUDED_PATHS = List.of( + "/api/v1/users/sign-in", + "/api/v1/users/sign-up", + "/v3/api-docs", + "/swagger-ui.html", + "/swagger-ui", + "/webjars/swagger-ui" + ); + @Override public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { String path = exchange.getRequest().getURI().getPath(); - if (path.equals("/api/v1/users/sign-up") || path.equals("/api/v1/users/sign-in") || - path.equals("/swagger-ui") || path.equals("/swagger-ui.html") || - path.endsWith("/v3/api-docs") || path.equals("/webjars/swagger-ui")) { - return chain.filter(exchange); //회원가입, 로그인, Swagger 관련 요청은 JWT 토큰인증 x + + if (isExcludedPath(path)) { + log.info("***********" + path); + return chain.filter(exchange); } + ServerHttpRequest request = exchange.getRequest(); ServerHttpResponse response = exchange.getResponse(); log.info(secretKey); @@ -113,4 +125,7 @@ private boolean validateToken(String token) { } + private boolean isExcludedPath(String path) { + return EXCLUDED_PATHS.stream().anyMatch(path::contains); + } } diff --git a/gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java b/gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java index a3f3cd7..c97c961 100644 --- a/gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java +++ b/gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java @@ -22,8 +22,17 @@ public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { return http .csrf(csrf -> csrf.disable()) .authorizeExchange(exchange -> exchange - .pathMatchers("api/v1/users/sign-in", "api/v1/users/sign-up").permitAll() - .pathMatchers("/api/v1/**").permitAll() // 권한 기반 접근 + .pathMatchers( + "/swagger-ui.html", + "/swagger-ui/**", + "/v3/api-docs", + "/v3/api-docs/**", + "/webjars/**", + "/api/v1/users/sign-in", + "/api/v1/users/sign-up" + ).permitAll() + //.pathMatchers("/api/v1/users/sign-in", "/api/v1/users/sign-up").permitAll() + //.pathMatchers("/api/v1/**").permitAll() // 권한 기반 접근 .anyExchange().authenticated() ) .addFilterBefore(jwtAuthenticationFilter(), SecurityWebFiltersOrder.AUTHENTICATION) diff --git a/product-service/build.gradle b/product-service/build.gradle index 6ae4b91..a95f517 100644 --- a/product-service/build.gradle +++ b/product-service/build.gradle @@ -4,6 +4,7 @@ ext { dependencies { implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' + implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation project(':common-module') From 3f8482620a12b291e6857e765a2c66551db6ac08 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Fri, 21 Mar 2025 17:09:04 +0900 Subject: [PATCH 165/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#94]?= =?UTF-8?q?=20:=20Swagger=20=EC=84=A4=EC=A0=95=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=ED=95=B4=20=EB=A6=AC=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/sparta/gateway/config/SecurityConfig.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java b/gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java index b237ade..a6fadea 100644 --- a/gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java +++ b/gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java @@ -21,8 +21,8 @@ public class SecurityConfig { public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { return http .csrf(csrf -> csrf.disable()) - .authorizeExchange(exchange -> exchange - .pathMatchers("api/v1/users/**").permitAll() + .authorizeExchange(exchange -> exchange.anyExchange().permitAll() // 모든 요청 허용 + /* .pathMatchers("api/v1/users/**").permitAll() .pathMatchers("/api/v1/companys/**").hasAnyRole("MASTER","COMPANY","SHIPPING") .pathMatchers("/api/v1/shippings/**").hasAnyRole("MASTER","SHIPPING") .pathMatchers("/api/v1/hubs/**").hasAnyRole("MASTER","HUB","SHIPPING") @@ -31,6 +31,7 @@ public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { .pathMatchers("/api/v1/payments/**").hasAnyRole("MASTER","COMPANY","SHIPPING") .pathMatchers("/api/v1/slacks/**").hasRole("COMPANY") // 권한 기반 접근 .anyExchange().authenticated() + )*/ ) .addFilterBefore(jwtAuthenticationFilter(), SecurityWebFiltersOrder.AUTHENTICATION) .securityContextRepository(NoOpServerSecurityContextRepository.getInstance()) From 363baf662c6db446d003d82b90449ca888d5e37b Mon Sep 17 00:00:00 2001 From: devdaeun Date: Fri, 21 Mar 2025 17:46:30 +0900 Subject: [PATCH 166/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#118]?= =?UTF-8?q?=20:=20user=20=EC=84=9C=EB=B9=84=EC=8A=A4=20swagger=20=EB=AC=B8?= =?UTF-8?q?=EC=84=9C=ED=99=94=20-=20swagger=20=EB=AC=B8=EC=84=9C=ED=99=94?= =?UTF-8?q?=EB=A5=BC=EC=9C=84=ED=95=9C=20=EC=BD=94=EB=93=9C=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sparta/gateway/config/SecurityConfig.java | 2 +- user-service/build.gradle | 2 ++ .../java/com/sparta/user/UserServiceApplication.java | 3 +++ .../com/sparta/user/presentation/UserController.java | 4 ++++ user-service/src/main/resources/application.yml | 12 +++++++++++- 5 files changed, 21 insertions(+), 2 deletions(-) diff --git a/gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java b/gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java index a6fadea..c49056e 100644 --- a/gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java +++ b/gateway/src/main/java/com/sparta/gateway/config/SecurityConfig.java @@ -22,7 +22,7 @@ public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { return http .csrf(csrf -> csrf.disable()) .authorizeExchange(exchange -> exchange.anyExchange().permitAll() // 모든 요청 허용 - /* .pathMatchers("api/v1/users/**").permitAll() + /* .pathMatchers("/api/v1/users/**").permitAll() .pathMatchers("/api/v1/companys/**").hasAnyRole("MASTER","COMPANY","SHIPPING") .pathMatchers("/api/v1/shippings/**").hasAnyRole("MASTER","SHIPPING") .pathMatchers("/api/v1/hubs/**").hasAnyRole("MASTER","HUB","SHIPPING") diff --git a/user-service/build.gradle b/user-service/build.gradle index 0b54c48..e9cd229 100644 --- a/user-service/build.gradle +++ b/user-service/build.gradle @@ -11,6 +11,8 @@ dependencies { testImplementation 'org.springframework.security:spring-security-test' testImplementation 'io.projectreactor:reactor-test' runtimeOnly 'org.postgresql:postgresql' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' + implementation 'org.springframework.boot:spring-boot-starter-web' implementation project(':common-module') } diff --git a/user-service/src/main/java/com/sparta/user/UserServiceApplication.java b/user-service/src/main/java/com/sparta/user/UserServiceApplication.java index 7272457..24fb3ab 100644 --- a/user-service/src/main/java/com/sparta/user/UserServiceApplication.java +++ b/user-service/src/main/java/com/sparta/user/UserServiceApplication.java @@ -1,9 +1,12 @@ package com.sparta.user; +import com.sparta.commonmodule.config.SwaggerConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Import; @SpringBootApplication +@Import(SwaggerConfig.class) public class UserServiceApplication { public static void main(String[] args) { diff --git a/user-service/src/main/java/com/sparta/user/presentation/UserController.java b/user-service/src/main/java/com/sparta/user/presentation/UserController.java index d2c928c..ef88596 100644 --- a/user-service/src/main/java/com/sparta/user/presentation/UserController.java +++ b/user-service/src/main/java/com/sparta/user/presentation/UserController.java @@ -6,6 +6,8 @@ import com.sparta.user.application.dto.request.UserUpdateRequestDto; import com.sparta.user.application.dto.response.UserInfoResponseDto; import com.sparta.user.application.service.UserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -23,9 +25,11 @@ @RestController @RequestMapping("/api/v1/users") @RequiredArgsConstructor +@Tag(name = "User Service", description = "사용자 서비스 API") public class UserController { private final UserService userService; + @Operation(summary = "회원가입", description = "화원가입 api입니다.") @PostMapping("/sign-up") public ResponseEntity signUp(@Valid @RequestBody UserSignupRequestDto requestDto, BindingResult bindingResult) throws IllegalAccessException { if (bindingResult.hasErrors()) { diff --git a/user-service/src/main/resources/application.yml b/user-service/src/main/resources/application.yml index 1728882..87229b4 100644 --- a/user-service/src/main/resources/application.yml +++ b/user-service/src/main/resources/application.yml @@ -32,4 +32,14 @@ service: hub: signup-key: "WS4LLkUhglcrzhFaqWhGXMX70V-ntoQrJdsbT8997aR32veCI2Y35-yyjdHzUzVc4TybaGSdRJ6WYVVcY9K6Uw" shipping: - signup-key: "QqjxcIpIisVqc2evLWPRyjMya8nCyWiheO5L8SbxwKbJFRjlIkxFaX1l8ShI8GlE1hxw_oOoyrfefEE7ZrUkMQ" \ No newline at end of file + signup-key: "QqjxcIpIisVqc2evLWPRyjMya8nCyWiheO5L8SbxwKbJFRjlIkxFaX1l8ShI8GlE1hxw_oOoyrfefEE7ZrUkMQ" + + +springdoc: + api-docs: + version: openapi_3_1 + enabled: true + path: /user-service/v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui.html \ No newline at end of file From 6ae4148bebc0c07ee81c3f1e6a2469fa92e0ec47 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Fri, 21 Mar 2025 18:19:07 +0900 Subject: [PATCH 167/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=A3=BC?= =?UTF-8?q?=EB=AC=B8=20=EC=B7=A8=EC=86=8C=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sparta/orderservice/domain/model/Order.java | 9 +++++++++ .../presentation/controller/OrderController.java | 12 ++++++++++++ 2 files changed, 21 insertions(+) diff --git a/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java b/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java index d4e0869..90d1058 100644 --- a/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java +++ b/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java @@ -82,5 +82,14 @@ public void softDelete() { super.delete(0L); // 사용자 인증 시스템 없으므로 임시로 0L 사용 } + // 주문 cancel + public void cancel(String cancelReason) { + if (this.status != OrderStatus.CREATED) { + throw new IllegalStateException("CREATED 상태의 주문만 취소할 수 있습니다."); + } + this.status = OrderStatus.CANCELED; + this.cancelReason = cancelReason; + } + } diff --git a/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java b/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java index d62c941..f1c0236 100644 --- a/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java +++ b/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java @@ -39,6 +39,7 @@ public ResponseEntity getOrderById(@PathVariable("id") UUID id return ResponseEntity.ok(orderService.getOrderById(id)); } + // 주문 수정 @PutMapping("/{id}") public ResponseEntity updateOrder( @PathVariable("id") UUID id, @@ -46,9 +47,20 @@ public ResponseEntity updateOrder( return ResponseEntity.ok(orderService.updateOrder(id, orderRequestDto)); } + // 주문 삭제 @DeleteMapping("/{id}") public ResponseEntity deleteOrder(@PathVariable("id") UUID id) { orderService.deleteOrder(id); return ResponseEntity.ok("주문이 성공적으로 삭제되었습니다."); } + + // 주문 취소 + @PatchMapping("/{id}/cancel") + public ResponseEntity cancelOrder( + @PathVariable("id") UUID id, + @RequestParam("reason") String cancelReason) { + return ResponseEntity.ok(orderService.cancelOrder(id, cancelReason)); + } + + } From 728a19d04b3872ccb0c161ccc57d31cea29d2e8c Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Fri, 21 Mar 2025 18:19:35 +0900 Subject: [PATCH 168/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=A3=BC?= =?UTF-8?q?=EB=AC=B8=20=EC=B7=A8=EC=86=8C=20=EA=B8=B0=EB=8A=A5=20=E2=99=BB?= =?UTF-8?q?=EF=B8=8F=20refactor=20:=20=EA=B3=B5=ED=86=B5=20=EB=AA=A8?= =?UTF-8?q?=EB=93=88=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=EB=B0=A9?= =?UTF-8?q?=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/OrderService.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java index 18c975d..c37f848 100644 --- a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java +++ b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java @@ -1,5 +1,7 @@ package com.sparta.orderservice.application.service; +import com.sparta.commonmodule.exception.OperationNotAllowedException; +import com.sparta.commonmodule.exception.ResourceNotFoundException; import com.sparta.orderservice.application.dto.OrderRequestDto; import com.sparta.orderservice.application.dto.OrderResponseDto; import com.sparta.orderservice.domain.model.Order; @@ -52,7 +54,7 @@ public List getALlOrders(){ @Transactional(readOnly = true) public OrderResponseDto getOrderById(UUID orderId){ Order order = orderRepository.findById(orderId) - .orElseThrow(() -> new RuntimeException("order Not found : " + orderId)); + .orElseThrow(() -> new ResourceNotFoundException("해당 주문을 찾을 수 없습니다.")); return OrderResponseDto.fromEntity(order); } @@ -60,10 +62,10 @@ public OrderResponseDto getOrderById(UUID orderId){ @Transactional public OrderResponseDto updateOrder(UUID orderId, OrderRequestDto requestDto) { Order order = orderRepository.findById(orderId) - .orElseThrow(() -> new RuntimeException("Not found id" + orderId)); + .orElseThrow(() -> new ResourceNotFoundException("해당 주문을 찾을 수 없습니다.")); if (order.getStatus() != OrderStatus.CREATED) { - throw new RuntimeException("CREATED Status에서만 Update 가능"); + throw new OperationNotAllowedException("CREATED 상태의 주문만 수정할 수 있습니다."); } order.updateOrderDetails( requestDto.getName(), @@ -80,10 +82,19 @@ public OrderResponseDto updateOrder(UUID orderId, OrderRequestDto requestDto) { @Transactional public void deleteOrder(UUID orderId) { Order order = orderRepository.findById(orderId) - .orElseThrow(() -> new RuntimeException("Not found id" + orderId)); + .orElseThrow(() -> new ResourceNotFoundException("해당 주문을 찾을 수 없습니다.")); order.softDelete(); } + // 주문 취소 + @Transactional + public OrderResponseDto cancelOrder(UUID orderId, String cancelReason) { + Order order = orderRepository.findById(orderId) + .orElseThrow(() -> new ResourceNotFoundException("해당 주문을 찾을 수 없습니다.")); + + order.cancel(cancelReason); + return OrderResponseDto.fromEntity(order); + } } From 41650eaf902e0caa0709c675ee5e8b21df3ba929 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Fri, 21 Mar 2025 21:43:10 +0900 Subject: [PATCH 169/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20JGraphT=20depend?= =?UTF-8?q?encies=EC=97=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hub-service/build.gradle | 3 +++ .../hub_route/application/service/HubRouteService.java | 2 -- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/hub-service/build.gradle b/hub-service/build.gradle index 2144fb5..eb9a4f7 100644 --- a/hub-service/build.gradle +++ b/hub-service/build.gradle @@ -14,6 +14,9 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' + // JGraphT : 그래프 자료구조 및 알고리즘 제공 + implementation 'org.jgrapht:jgrapht-core:1.5.1' + // QueryDSL implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta' annotationProcessor 'com.querydsl:querydsl-apt:5.1.0:jakarta' diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java index 2141a30..d0f74c3 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java @@ -6,11 +6,9 @@ import com.sparta.hubservice.hub_route.application.dto.response.HubRouteCreateResponse; import com.sparta.hubservice.hub_route.application.dto.response.HubRouteDeleteResponse; import com.sparta.hubservice.hub_route.application.dto.response.HubRouteResponse; -import com.sparta.hubservice.hub_route.domain.common.HaversineCalculator; import com.sparta.hubservice.hub_route.domain.model.HubRoute; import com.sparta.hubservice.hub_route.domain.repository.HubRouteCheckpointRepository; import com.sparta.hubservice.hub_route.domain.repository.HubRouteRepository; -import java.math.BigDecimal; import java.util.Optional; import java.util.UUID; import lombok.RequiredArgsConstructor; From 04ca8596d0042c5588f40b688e58b40eb859c6d2 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Sat, 22 Mar 2025 00:02:55 +0900 Subject: [PATCH 170/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#122]=20:=20FeignCl?= =?UTF-8?q?ient=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EB=B0=8F=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- product-service/build.gradle | 3 ++- .../java/com/sparta/product/ProductServiceApplication.java | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/product-service/build.gradle b/product-service/build.gradle index a95f517..dbc5e45 100644 --- a/product-service/build.gradle +++ b/product-service/build.gradle @@ -3,11 +3,12 @@ ext { } dependencies { + implementation project(':common-module') implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation project(':common-module') + implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' runtimeOnly 'org.postgresql:postgresql' } diff --git a/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java b/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java index b4a1049..deedcf8 100644 --- a/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java +++ b/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java @@ -3,9 +3,11 @@ import com.sparta.commonmodule.config.SwaggerConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Import; @SpringBootApplication +@EnableFeignClients @Import(SwaggerConfig.class) public class ProductServiceApplication { From 131ea77a0a0454d5ce4c25addee3f1a063bd7cae Mon Sep 17 00:00:00 2001 From: jin2304 Date: Sat, 22 Mar 2025 00:04:05 +0900 Subject: [PATCH 171/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#122]=20:=20?= =?UTF-8?q?=ED=97=88=EB=B8=8C=20=EB=B0=8F=20=EC=97=85=EC=B2=B4=20FeignClie?= =?UTF-8?q?nt=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ProductServiceImpl.java | 23 +++++++++++++++++++ .../infrastructure/client/CompanyClient.java | 17 ++++++++++++++ .../infrastructure/client/HubClient.java | 17 ++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 product-service/src/main/java/com/sparta/product/infrastructure/client/CompanyClient.java create mode 100644 product-service/src/main/java/com/sparta/product/infrastructure/client/HubClient.java diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java index a073d4a..8c87dc8 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java @@ -5,6 +5,8 @@ import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.domain.model.Product; import com.sparta.product.domain.repository.ProductRepository; +import com.sparta.product.infrastructure.client.CompanyClient; +import com.sparta.product.infrastructure.client.HubClient; import com.sparta.product.presentation.dto.request.CreateProductRequestDto; import com.sparta.product.presentation.dto.response.CreateProductResponseDto; import com.sparta.product.presentation.dto.response.ReadProductResponseDto; @@ -22,6 +24,8 @@ public class ProductServiceImpl implements ProductService { private final ProductRepository productRepository; + private final HubClient hubClient; + private final CompanyClient companyClient; /** @@ -29,6 +33,8 @@ public class ProductServiceImpl implements ProductService { */ @Override public CreateProductResponseDto createProduct(CreateProductRequestDto requestDto, Long userId) { + validateCompanyExists(requestDto.companyId()); + validateHubExists(requestDto.hubId()); Product product = productRepository.save(Product.createProduct(requestDto, userId)); return CreateProductResponseDto.from(product); } @@ -80,4 +86,21 @@ public void deleteProduct(DeleteProductServiceRequestDto serviceDto) { .orElseThrow(() -> new ResourceNotFoundException("찾을 수 없는 상품 입니다.")); product.delete(serviceDto.userId()); } + + + // 업체 존재 검증 메서드 + private void validateCompanyExists(UUID companyId) { + if (!companyClient.existsById(companyId)) { + throw new ResourceNotFoundException("해당 업체가 존재하지 않습니다."); + } + } + + + // 허브 존재 검증 메서드 + private void validateHubExists(UUID hubId) { + if (!hubClient.existsById(hubId)) { + throw new ResourceNotFoundException("해당 허브가 존재하지 않습니다."); + } + } + } diff --git a/product-service/src/main/java/com/sparta/product/infrastructure/client/CompanyClient.java b/product-service/src/main/java/com/sparta/product/infrastructure/client/CompanyClient.java new file mode 100644 index 0000000..5a33dfe --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/infrastructure/client/CompanyClient.java @@ -0,0 +1,17 @@ +package com.sparta.product.infrastructure.client; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.UUID; + +@FeignClient(name = "company-service") +public interface CompanyClient { + + /** + * 업체 존재 확인 + */ + @GetMapping("/api/v1/companies/{id}/exists") + boolean existsById(@PathVariable("id") UUID id); +} diff --git a/product-service/src/main/java/com/sparta/product/infrastructure/client/HubClient.java b/product-service/src/main/java/com/sparta/product/infrastructure/client/HubClient.java new file mode 100644 index 0000000..7a9e420 --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/infrastructure/client/HubClient.java @@ -0,0 +1,17 @@ +package com.sparta.product.infrastructure.client; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.UUID; + +@FeignClient(name = "hub-service") +public interface HubClient { + + /** + * 허브 존재 확인 + */ + @GetMapping("/api/v1/hubs/{id}/exists") + boolean existsById(@PathVariable("id") UUID id); +} From 1bd0cb2afe2f1919ab71df022d59b40269592c78 Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Sat, 22 Mar 2025 00:58:51 +0900 Subject: [PATCH 172/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#112]?= =?UTF-8?q?=20:=20application=20dto=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EA=B3=84=EC=B8=B5=EC=9C=BC=EB=A1=9C=20=EB=B6=80=ED=84=B0=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/UpdateShippingRequestDto.java | 32 ++++++++----------- .../application/service/ShippingService.java | 3 +- .../domain/model/Shipping.java | 17 +++++----- 3 files changed, 24 insertions(+), 28 deletions(-) diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/UpdateShippingRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/UpdateShippingRequestDto.java index ce7b694..f796431 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/UpdateShippingRequestDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/UpdateShippingRequestDto.java @@ -1,5 +1,6 @@ package com.sparta.shippingservice.application.dto.request; +import com.sparta.shippingservice.domain.model.ShippingSelf; import com.sparta.shippingservice.domain.model.ShippingStatus; import java.util.Optional; @@ -7,25 +8,20 @@ public record UpdateShippingRequestDto( - Optional orderId, - Optional shippingAddress, - Optional receiverName, - Optional shippingManagerId, - Optional status + UUID orderId, + String shippingAddress, + String receiverName, + UUID shippingManagerId, + ShippingStatus status ) { - public static UpdateShippingRequestDto of( - UUID orderId, - String shippingAddress, - String receiverName, - UUID shippingManagerId, - ShippingStatus status - ) { - return new UpdateShippingRequestDto( - Optional.ofNullable(orderId), - Optional.ofNullable(shippingAddress), - Optional.ofNullable(receiverName), - Optional.ofNullable(shippingManagerId), - Optional.ofNullable(status) + public ShippingSelf of(){ + return new ShippingSelf( + this.orderId(), + this.shippingAddress(), + this.receiverName(), + this.shippingManagerId(), + this.status() + ); } } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java index 6f6b302..c5d78da 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -4,6 +4,7 @@ import com.sparta.shippingservice.application.dto.request.UpdateShippingRequestDto; import com.sparta.shippingservice.application.dto.response.ShippingResponseDto; import com.sparta.shippingservice.domain.model.Shipping; +import com.sparta.shippingservice.domain.model.ShippingSelf; import com.sparta.shippingservice.domain.model.ShippingStatus; import com.sparta.shippingservice.domain.repository.ShippingRepository; import com.sparta.commonmodule.exception.*; @@ -58,7 +59,7 @@ public List getAllShipping() { @Transactional public ShippingResponseDto updateShipping(UUID shippingId, @Valid UpdateShippingRequestDto request) { Shipping shipping = findShipping(shippingId); - shipping.updateShipping(request); + shipping.updateShipping(request.of().toShipping()); return ShippingResponseDto.from(shipping); } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java index 15184a4..4fbb1a5 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java @@ -1,7 +1,6 @@ package com.sparta.shippingservice.domain.model; import com.sparta.commonmodule.entity.BaseEntity; -import com.sparta.shippingservice.application.dto.request.UpdateShippingRequestDto; import jakarta.persistence.*; import lombok.*; @@ -10,7 +9,7 @@ @Entity @Getter @Setter -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(name = "p_shipping") // 테이블 명 지정 public class Shipping extends BaseEntity { @@ -43,16 +42,16 @@ public Shipping(UUID orderId, String shippingAddress, String receiverName, UUID } - public void updateShipping(UpdateShippingRequestDto requestDto) { + public Shipping updateShipping(Shipping shipping) { if (this.status == ShippingStatus.DELIVERED) { throw new IllegalStateException("배송이 완료된 후에는 정보를 변경할 수 없습니다."); } - - requestDto.orderId().ifPresent(order -> this.orderId = order); - requestDto.shippingAddress().ifPresent(address -> this.shippingAddress = address); - requestDto.receiverName().ifPresent(name -> this.receiverName = name); - requestDto.shippingManagerId().ifPresent(manager -> this.shippingManagerId = manager); - requestDto.status().ifPresent(s -> this.status = s); + if(shipping.getStatus() !=null) this.status=shipping.getStatus(); + if(shipping.getOrderId()!=null) this.orderId = shipping.getOrderId(); + if(shipping.getShippingAddress()!=null) this.shippingAddress=shipping.getShippingAddress(); + if(shipping.getReceiverName()!=null) this.receiverName = shipping.getReceiverName(); + if(shipping.getStatus()!=null) this.status=shipping.getStatus(); + return this; } From a6f232a5457e69cc26663901f66f0d39f986a4de Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Sat, 22 Mar 2025 04:40:05 +0900 Subject: [PATCH 173/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#126]=20:=20Shippin?= =?UTF-8?q?g=20Log=20CREATE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shipping-service/build.gradle | 1 + .../dto/request/CreateRouteLogRequestDto.java | 56 ++++++++++++++++ .../CreateShippingWithRouteRequestDto.java | 7 ++ .../response/ShippingRouteResponseDto.java | 30 +++++++++ .../service/ShippingRouteService.java | 25 +++++++ .../application/service/ShippingService.java | 26 ++++++-- .../domain/model/RouteLogSelf.java | 47 ++++++++++++++ .../domain/model/ShippingRouteLog.java | 65 +++++++++++++++++++ .../repository/ShippingRouteRepository.java | 13 ++++ .../JpaShippingRouteRepository.java | 12 ++++ .../presentation/ShippingController.java | 17 +++-- 11 files changed, 289 insertions(+), 10 deletions(-) create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateRouteLogRequestDto.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingWithRouteRequestDto.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingRouteResponseDto.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingRouteService.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/domain/model/RouteLogSelf.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRouteRepository.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/JpaShippingRouteRepository.java diff --git a/shipping-service/build.gradle b/shipping-service/build.gradle index 4c5b9c3..a8046cc 100644 --- a/shipping-service/build.gradle +++ b/shipping-service/build.gradle @@ -7,6 +7,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' implementation 'org.hibernate:hibernate-core:6.3.1.Final' + implementation 'org.springframework.boot:spring-boot-starter-web' implementation project(':common-module') implementation("org.postgresql:postgresql:42.7.2") runtimeOnly 'com.h2database:h2' diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateRouteLogRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateRouteLogRequestDto.java new file mode 100644 index 0000000..2128a3b --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateRouteLogRequestDto.java @@ -0,0 +1,56 @@ +package com.sparta.shippingservice.application.dto.request; + +import com.sparta.shippingservice.domain.model.RouteLogSelf; +import com.sparta.shippingservice.domain.model.Shipping; +import jakarta.validation.constraints.Digits; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; + +import java.math.BigDecimal; +import java.util.UUID; + +public record CreateRouteLogRequestDto( + + Shipping shipping, + + + @NotNull(message = "출발 허브 ID는 필수입니다.") + UUID startHubId, + + @NotNull(message = "도착 허브 ID는 필수입니다.") + UUID endHubId, + + @NotNull(message = "배송 순번은 필수입니다.") + + @Min(value = 1, message = "배송 순번은 1 이상이어야 합니다.") + Integer sequence, + + @NotNull(message = "예상 거리 입력은 필수입니다.") + BigDecimal estimatedDistance, + + @NotNull(message = "예상 시간 입력은 필수입니다.") + @Min(value = 1, message = "예상 시간은 1분 이상이어야 합니다.") + Integer estimatedTime, + + BigDecimal actualDistance, // 실측 데이터는 선택값일 수 있음 + + Integer actualTime, // 마찬가지로 선택값 + + @NotNull(message = "배송 담당자 ID는 필수입니다.") + UUID shippingManagerId +) { + public RouteLogSelf of() { + return new RouteLogSelf( + this.shipping(), + this.startHubId(), + this.endHubId(), + this.sequence(), + this.estimatedDistance(), + this.estimatedTime(), + this.actualDistance(), + this.actualTime(), + this.shippingManagerId() + ); + } + +} \ No newline at end of file diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingWithRouteRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingWithRouteRequestDto.java new file mode 100644 index 0000000..dbe54c5 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingWithRouteRequestDto.java @@ -0,0 +1,7 @@ +package com.sparta.shippingservice.application.dto.request; + +import jakarta.validation.Valid; + +public record CreateShippingWithRouteRequestDto( + @Valid CreateShippingRequestDto shipping, + @Valid CreateRouteLogRequestDto routeLog){} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingRouteResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingRouteResponseDto.java new file mode 100644 index 0000000..6d805c5 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingRouteResponseDto.java @@ -0,0 +1,30 @@ +package com.sparta.shippingservice.application.dto.response; + +import com.sparta.shippingservice.domain.model.ShippingRouteLog; + +import java.math.BigDecimal; +import java.util.UUID; + +public record ShippingRouteResponseDto( + UUID startHubId, + UUID endHubId, + Integer sequence, + BigDecimal estimatedDistance, + Integer estimatedTime, + BigDecimal actualDistance, + Integer actualTime, + UUID shippingManagerId) { + public static ShippingRouteResponseDto from(ShippingRouteLog shippingRouteLog) { + return new ShippingRouteResponseDto( + shippingRouteLog.getStartHubId(), + shippingRouteLog.getEndHubId(), + shippingRouteLog.getSequence(), + shippingRouteLog.getEstimatedDistance(), + shippingRouteLog.getEstimatedTime(), + shippingRouteLog.getActualDistance(), + shippingRouteLog.getActualTime(), + shippingRouteLog.getShippingManagerId() + ); + } + +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingRouteService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingRouteService.java new file mode 100644 index 0000000..a049069 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingRouteService.java @@ -0,0 +1,25 @@ +package com.sparta.shippingservice.application.service; + +import com.sparta.shippingservice.application.dto.request.CreateRouteLogRequestDto; +import com.sparta.shippingservice.application.dto.response.ShippingRouteResponseDto; +import com.sparta.shippingservice.domain.model.ShippingRouteLog; +import com.sparta.shippingservice.domain.repository.ShippingRouteRepository; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class ShippingRouteService { + private final ShippingRouteRepository shippingRouteRepository; + + + @Transactional + public ShippingRouteResponseDto create(@Valid CreateRouteLogRequestDto request) { + ShippingRouteLog shippingRouteLog = request.of().toShippingRouteLog(); + shippingRouteRepository.save(shippingRouteLog); + return ShippingRouteResponseDto.from(shippingRouteLog); + } + +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java index c5d78da..de4e31d 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -1,14 +1,14 @@ package com.sparta.shippingservice.application.service; +import com.sparta.shippingservice.application.dto.request.CreateRouteLogRequestDto; import com.sparta.shippingservice.application.dto.request.CreateShippingRequestDto; import com.sparta.shippingservice.application.dto.request.UpdateShippingRequestDto; import com.sparta.shippingservice.application.dto.response.ShippingResponseDto; -import com.sparta.shippingservice.domain.model.Shipping; -import com.sparta.shippingservice.domain.model.ShippingSelf; -import com.sparta.shippingservice.domain.model.ShippingStatus; +import com.sparta.shippingservice.domain.model.*; import com.sparta.shippingservice.domain.repository.ShippingRepository; import com.sparta.commonmodule.exception.*; +import com.sparta.shippingservice.domain.repository.ShippingRouteRepository; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -24,15 +24,29 @@ @RequiredArgsConstructor public class ShippingService { private final ShippingRepository shippingRepository; + private final ShippingRouteRepository shippingRouteRepository; @Transactional - public ShippingResponseDto create(@Valid CreateShippingRequestDto request) { - + public ShippingResponseDto create(@Valid CreateShippingRequestDto request , @Valid CreateRouteLogRequestDto logDto) { Shipping shipping = request.of().toShipping(); shippingRepository.save(shipping); //DB 저장 - + RouteLogSelf routeLogSelf = new RouteLogSelf( + shipping, + logDto.startHubId(), + logDto.endHubId(), + logDto.sequence(), + logDto.estimatedDistance(), + logDto.estimatedTime(), + logDto.actualDistance(), + logDto.actualTime(), + logDto.shippingManagerId() + + ); + ShippingRouteLog routeLog = routeLogSelf.toShippingRouteLog(); + shippingRouteRepository.save(routeLog); return ShippingResponseDto.from(shipping); + } @Transactional(readOnly = true) diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/RouteLogSelf.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/RouteLogSelf.java new file mode 100644 index 0000000..7156712 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/RouteLogSelf.java @@ -0,0 +1,47 @@ +package com.sparta.shippingservice.domain.model; + +import com.sparta.shippingservice.domain.model.Shipping; +import com.sparta.shippingservice.domain.model.ShippingRouteLog; + +import java.math.BigDecimal; +import java.util.UUID; + +public record RouteLogSelf( + Shipping shipping, + UUID startHubId, + UUID endHubId, + Integer sequence, + BigDecimal estimatedDistance, + Integer estimatedTime, + BigDecimal actualDistance, + Integer actualTime, + UUID shippingManagerId +) { + public ShippingRouteLog toShippingRouteLog() { + return new ShippingRouteLog( + this.shipping, + this.startHubId, + this.endHubId, + this.sequence, + this.estimatedDistance, + this.estimatedTime, + this.actualDistance, + this.actualTime, + this.shippingManagerId + ); + } +} + + + + + + + + + + + + + + diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java new file mode 100644 index 0000000..00775c2 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java @@ -0,0 +1,65 @@ +package com.sparta.shippingservice.domain.model; + + +import jakarta.persistence.*; +import lombok.*; +import java.math.BigDecimal; +import java.util.UUID; + +@Entity +@Table(name = "p_shipping_route_logs", + uniqueConstraints = @UniqueConstraint(columnNames = {"shipping_id", "sequence"})) // 동일 배송에 같은 순번 불가능 +@Getter +@Setter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ShippingRouteLog { + + @Id + @Column(name = "shipping_route_log_id", nullable = false, updatable = false) + private UUID id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "shipping_id", nullable = false) + private Shipping shipping; + + @Column(name = "start_hub_id", nullable = false) + private UUID startHubId; + + @Column(name = "end_hub_id", nullable = false) + private UUID endHubId; + + @Column(name = "sequence", nullable = false) + private Integer sequence; + + @Column(name = "estimated_distance", nullable = false, precision = 10, scale = 2) + private BigDecimal estimatedDistance; + + @Column(name = "estimated_time", nullable = false) + private Integer estimatedTime; + + @Column(name = "actual_distance") + private BigDecimal actualDistance; + + @Column(name = "actual_time") + private Integer actualTime; + + @Column(name = "shipping_manager_id", nullable = false) + private UUID shippingManagerId; + + public ShippingRouteLog(Shipping shipping,UUID startHubId, UUID endHubId, Integer sequence, BigDecimal estimatedDistance, Integer estimatedTime, BigDecimal actualDistance, Integer actualTime, UUID shippingManagerId) { + this.shipping=shipping; + this.startHubId = startHubId; + this.endHubId = endHubId; + this.sequence = sequence; + this.estimatedDistance = estimatedDistance; + this.estimatedTime = estimatedTime; + this.actualDistance = actualDistance; + this.actualTime = actualTime; + this.shippingManagerId = shippingManagerId; + } + + @PrePersist + public void prePersist() { + if (this.id == null) this.id = UUID.randomUUID(); + } +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRouteRepository.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRouteRepository.java new file mode 100644 index 0000000..e3b278d --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRouteRepository.java @@ -0,0 +1,13 @@ +package com.sparta.shippingservice.domain.repository; +import com.sparta.shippingservice.domain.model.ShippingRouteLog; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface ShippingRouteRepository { + ShippingRouteLog save(ShippingRouteLog shippingRouteLog); + Optional findById(UUID id); + List findAll(); + +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/JpaShippingRouteRepository.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/JpaShippingRouteRepository.java new file mode 100644 index 0000000..b5a0de7 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/JpaShippingRouteRepository.java @@ -0,0 +1,12 @@ +package com.sparta.shippingservice.infrastructure; + +import com.sparta.shippingservice.domain.model.ShippingRouteLog; +import com.sparta.shippingservice.domain.repository.ShippingRouteRepository; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + +@Repository +public interface JpaShippingRouteRepository extends JpaRepository, ShippingRouteRepository { +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index 274bd19..93bbfb5 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -1,12 +1,15 @@ package com.sparta.shippingservice.presentation; +import com.sparta.shippingservice.application.dto.request.CreateRouteLogRequestDto; import com.sparta.shippingservice.application.dto.request.CreateShippingRequestDto; +import com.sparta.shippingservice.application.dto.request.CreateShippingWithRouteRequestDto; import com.sparta.shippingservice.application.dto.request.UpdateShippingRequestDto; import com.sparta.shippingservice.application.dto.response.ShippingResponseDto; +import com.sparta.shippingservice.application.dto.response.ShippingRouteResponseDto; +import com.sparta.shippingservice.application.service.ShippingRouteService; import com.sparta.shippingservice.application.service.ShippingService; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -18,11 +21,11 @@ @RequiredArgsConstructor public class ShippingController { private final ShippingService shippingService; + private final ShippingRouteService shippingRouteService; @PostMapping() // 배송 생성 - public ResponseEntity Shipping(@Valid @RequestBody CreateShippingRequestDto requestDto) { - ShippingResponseDto responseDto = shippingService.create(requestDto); - + public ResponseEntity Shipping(@Valid @RequestBody CreateShippingWithRouteRequestDto request) { + ShippingResponseDto responseDto = shippingService.create(request.shipping(),request.routeLog()); return ResponseEntity.ok(responseDto); } @@ -51,5 +54,11 @@ public ResponseEntity deleteHub(@PathVariable("id") UUID id return ResponseEntity.ok(responseDto); } + @PostMapping("/route") // 배송 생성 + public ResponseEntity ShippingRoute(@Valid @RequestBody CreateRouteLogRequestDto requestDto) { + ShippingRouteResponseDto responseDto = shippingRouteService.create(requestDto); + return ResponseEntity.ok(responseDto); + } + } From 72b8a8d832070fb7183de6dcce18bc01471ac4ed Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Sat, 22 Mar 2025 07:15:24 +0900 Subject: [PATCH 174/389] =?UTF-8?q?=E2=9C=A8feat=20[#128]=20:=20Shipping?= =?UTF-8?q?=20Log=20=EB=8B=A8=EA=B1=B4=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/ShippingRouteResponseDto.java | 2 ++ .../ShippingWithRouteResponseDto.java | 24 +++++++++++++++ .../application/service/ShippingService.java | 18 ++++++++++-- .../presentation/ShippingController.java | 29 +++++++++---------- 4 files changed, 56 insertions(+), 17 deletions(-) create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingWithRouteResponseDto.java diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingRouteResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingRouteResponseDto.java index 6d805c5..cf4dba2 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingRouteResponseDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingRouteResponseDto.java @@ -6,6 +6,7 @@ import java.util.UUID; public record ShippingRouteResponseDto( + UUID id, UUID startHubId, UUID endHubId, Integer sequence, @@ -16,6 +17,7 @@ public record ShippingRouteResponseDto( UUID shippingManagerId) { public static ShippingRouteResponseDto from(ShippingRouteLog shippingRouteLog) { return new ShippingRouteResponseDto( + shippingRouteLog.getId(), shippingRouteLog.getStartHubId(), shippingRouteLog.getEndHubId(), shippingRouteLog.getSequence(), diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingWithRouteResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingWithRouteResponseDto.java new file mode 100644 index 0000000..d44423d --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingWithRouteResponseDto.java @@ -0,0 +1,24 @@ +package com.sparta.shippingservice.application.dto.response; +import com.sparta.shippingservice.domain.model.Shipping; +import com.sparta.shippingservice.domain.model.ShippingRouteLog; +import java.util.UUID; +public record ShippingWithRouteResponseDto( + UUID shippingId, + String shippingAddress, + String receiverName, + UUID shippingManagerId, + String status, + ShippingRouteResponseDto route +) { + public static ShippingWithRouteResponseDto from(Shipping shipping, ShippingRouteLog routeLog) { + ShippingRouteResponseDto routeDto = ShippingRouteResponseDto.from(routeLog); + return new ShippingWithRouteResponseDto( + shipping.getId(), + shipping.getShippingAddress(), + shipping.getReceiverName(), + shipping.getShippingManagerId(), + shipping.getStatus().name(), + routeDto + ); + } +} \ No newline at end of file diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java index de4e31d..1de4184 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -4,6 +4,8 @@ import com.sparta.shippingservice.application.dto.request.CreateShippingRequestDto; import com.sparta.shippingservice.application.dto.request.UpdateShippingRequestDto; import com.sparta.shippingservice.application.dto.response.ShippingResponseDto; +import com.sparta.shippingservice.application.dto.response.ShippingRouteResponseDto; +import com.sparta.shippingservice.application.dto.response.ShippingWithRouteResponseDto; import com.sparta.shippingservice.domain.model.*; import com.sparta.shippingservice.domain.repository.ShippingRepository; import com.sparta.commonmodule.exception.*; @@ -28,7 +30,7 @@ public class ShippingService { @Transactional - public ShippingResponseDto create(@Valid CreateShippingRequestDto request , @Valid CreateRouteLogRequestDto logDto) { + public ShippingWithRouteResponseDto create(@Valid CreateShippingRequestDto request , @Valid CreateRouteLogRequestDto logDto) { Shipping shipping = request.of().toShipping(); shippingRepository.save(shipping); //DB 저장 RouteLogSelf routeLogSelf = new RouteLogSelf( @@ -45,7 +47,7 @@ public ShippingResponseDto create(@Valid CreateShippingRequestDto request , @Val ); ShippingRouteLog routeLog = routeLogSelf.toShippingRouteLog(); shippingRouteRepository.save(routeLog); - return ShippingResponseDto.from(shipping); + return ShippingWithRouteResponseDto.from(shipping,routeLog); } @@ -88,6 +90,18 @@ public ShippingResponseDto deleteShipping(UUID shippingId, long userId) { return ShippingResponseDto.from(shipping); } + @Transactional(readOnly = true) + public ShippingRouteResponseDto getLogById(UUID shippingId, UUID shippingLogId){ + ShippingRouteLog routeLog = shippingRouteRepository.findById(shippingLogId).orElseThrow(() -> new ResourceNotFoundException("찾을 수 없는 배송 로그 입니다.")); + if(!routeLog.getShipping().getId().equals(shippingId)) { + throw new ResourceNotFoundException("해당 배송 ID에 해당하는 배송 경로 로그가 아닙니다."); + } + return ShippingRouteResponseDto.from(routeLog); + + } + + + private Shipping findShipping(UUID shippingId) { Shipping shipping = shippingRepository.findById(shippingId).orElseThrow( diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index 93bbfb5..de12bcb 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -1,12 +1,10 @@ package com.sparta.shippingservice.presentation; -import com.sparta.shippingservice.application.dto.request.CreateRouteLogRequestDto; -import com.sparta.shippingservice.application.dto.request.CreateShippingRequestDto; import com.sparta.shippingservice.application.dto.request.CreateShippingWithRouteRequestDto; import com.sparta.shippingservice.application.dto.request.UpdateShippingRequestDto; import com.sparta.shippingservice.application.dto.response.ShippingResponseDto; import com.sparta.shippingservice.application.dto.response.ShippingRouteResponseDto; -import com.sparta.shippingservice.application.service.ShippingRouteService; +import com.sparta.shippingservice.application.dto.response.ShippingWithRouteResponseDto; import com.sparta.shippingservice.application.service.ShippingService; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -21,16 +19,16 @@ @RequiredArgsConstructor public class ShippingController { private final ShippingService shippingService; - private final ShippingRouteService shippingRouteService; @PostMapping() // 배송 생성 - public ResponseEntity Shipping(@Valid @RequestBody CreateShippingWithRouteRequestDto request) { - ShippingResponseDto responseDto = shippingService.create(request.shipping(),request.routeLog()); + public ResponseEntity Shipping(@Valid @RequestBody CreateShippingWithRouteRequestDto request) { + ShippingWithRouteResponseDto responseDto = shippingService.create(request.shipping(), request.routeLog()); return ResponseEntity.ok(responseDto); + } - @GetMapping("/{id}") // 특정 배송 정보 조회 - public ResponseEntity getShippingById(@PathVariable("id") UUID id) { + @GetMapping("/{shippingId}") // 특정 배송 정보 조회 + public ResponseEntity getShippingById(@PathVariable("shippingId") UUID id) { ShippingResponseDto responseDto = shippingService.getShippingById(id); return ResponseEntity.ok(responseDto); } @@ -42,21 +40,22 @@ public ResponseEntity> getAllShipping() { } - @PatchMapping("/{id}") // 배송 내역 수정 - public ResponseEntity updateShipping(@PathVariable("id") UUID id, @Valid @RequestBody UpdateShippingRequestDto request) { + @PatchMapping("/{shippingId}") // 배송 내역 수정 + public ResponseEntity updateShipping(@PathVariable("shippingId") UUID id, @Valid @RequestBody UpdateShippingRequestDto request) { ShippingResponseDto ResponseDto = shippingService.updateShipping(id, request); return ResponseEntity.ok(ResponseDto); } - @DeleteMapping("/{id}") - public ResponseEntity deleteHub(@PathVariable("id") UUID id, @RequestParam long userId) { + @DeleteMapping("/{shippingId}") + public ResponseEntity deleteHub(@PathVariable("shippingId") UUID id, @RequestParam long userId) { ShippingResponseDto responseDto = shippingService.deleteShipping(id, userId); return ResponseEntity.ok(responseDto); } - @PostMapping("/route") // 배송 생성 - public ResponseEntity ShippingRoute(@Valid @RequestBody CreateRouteLogRequestDto requestDto) { - ShippingRouteResponseDto responseDto = shippingRouteService.create(requestDto); + + @GetMapping("/{shippingId}/{shippingLogId}") // 특정 배송 로그 조회 + public ResponseEntity getLogById(@PathVariable("shippingId") UUID id, @PathVariable("shippingLogId") UUID logId) { + ShippingRouteResponseDto responseDto = shippingService.getLogById(id, logId); return ResponseEntity.ok(responseDto); } From f59081f57ab5dd7dc50959d8e373826b97743dba Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Sat, 22 Mar 2025 14:44:48 +0900 Subject: [PATCH 175/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20:=20Ord?= =?UTF-8?q?er-service=20Swagger=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- order-service/build.gradle | 1 + .../com/sparta/orderservice/OrderServiceApplication.java | 3 +++ .../presentation/controller/OrderController.java | 9 +++++++++ order-service/src/main/resources/application.yml | 8 ++++++++ 4 files changed, 21 insertions(+) diff --git a/order-service/build.gradle b/order-service/build.gradle index 2913722..15efdc9 100644 --- a/order-service/build.gradle +++ b/order-service/build.gradle @@ -4,6 +4,7 @@ ext { dependencies { implementation project(':common-module') + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' implementation 'org.postgresql:postgresql:42.6.0' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.bootp:spring-boot-starter-data-jpa' diff --git a/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java b/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java index 30ecb04..3a97c85 100644 --- a/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java +++ b/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java @@ -1,11 +1,14 @@ package com.sparta.orderservice; +import com.sparta.commonmodule.config.SwaggerConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Import; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @EnableJpaAuditing @SpringBootApplication +@Import(SwaggerConfig.class) public class OrderServiceApplication { public static void main(String[] args) { diff --git a/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java b/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java index f1c0236..b630f5b 100644 --- a/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java +++ b/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java @@ -3,6 +3,8 @@ import com.sparta.orderservice.application.dto.OrderRequestDto; import com.sparta.orderservice.application.dto.OrderResponseDto; import com.sparta.orderservice.application.service.OrderService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -10,6 +12,7 @@ import java.util.List; import java.util.UUID; +@Tag(name = "Order Service", description = "주문 서비스 API") @RestController @RequestMapping("/api/v1/orders") public class OrderController { @@ -22,6 +25,7 @@ public OrderController(OrderService orderService) { } // 주문 생성 + @Operation(summary = "Order 등록 ", description = "Order 생성 api 입니다.") @PostMapping public ResponseEntity createOrder( @Valid @RequestBody OrderRequestDto requestDto) { @@ -29,17 +33,20 @@ public ResponseEntity createOrder( return ResponseEntity.ok(responseDto); } // 주문 전체 조회 + @Operation(summary = "Order 전체 조회 ", description = "Order 전체 조회 api 입니다.") @GetMapping public ResponseEntity> getAllOrders(){ return ResponseEntity.ok(orderService.getALlOrders()); } // 주문 단일 조회 + @Operation(summary = "Order 단일 조회 ", description = "Order 단일 조회 api 입니다.") @GetMapping("/{id}") public ResponseEntity getOrderById(@PathVariable("id") UUID id){ return ResponseEntity.ok(orderService.getOrderById(id)); } // 주문 수정 + @Operation(summary = "Order 수정 ", description = "Order 수정 입니다.") @PutMapping("/{id}") public ResponseEntity updateOrder( @PathVariable("id") UUID id, @@ -48,6 +55,7 @@ public ResponseEntity updateOrder( } // 주문 삭제 + @Operation(summary = "Order 삭제 ", description = "Order 삭제 api 입니다.") @DeleteMapping("/{id}") public ResponseEntity deleteOrder(@PathVariable("id") UUID id) { orderService.deleteOrder(id); @@ -55,6 +63,7 @@ public ResponseEntity deleteOrder(@PathVariable("id") UUID id) { } // 주문 취소 + @Operation(summary = "Order 취소 ", description = "Order 생성 api 입니다.") @PatchMapping("/{id}/cancel") public ResponseEntity cancelOrder( @PathVariable("id") UUID id, diff --git a/order-service/src/main/resources/application.yml b/order-service/src/main/resources/application.yml index 7845dc4..25b431b 100644 --- a/order-service/src/main/resources/application.yml +++ b/order-service/src/main/resources/application.yml @@ -21,6 +21,14 @@ eureka: service-url: defaultZone: http://localhost:8761/eureka/ +springdoc: + api-docs: + version: openapi_3_1 + enabled: true + path: /order-service/v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui.html server: port: 8084 From d54e9a7c100c33f0e90f736142173c82242c9568 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Sat, 22 Mar 2025 16:10:07 +0900 Subject: [PATCH 176/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#123]=20:=20QueryDS?= =?UTF-8?q?L=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- payment-service/build.gradle | 2 ++ product-service/build.gradle | 22 +++++++++++++++++++ .../repository/config/QueryDslConfig.java | 21 ++++++++++++++++++ .../src/main/resources/application.yml | 1 + 4 files changed, 46 insertions(+) create mode 100644 product-service/src/main/java/com/sparta/product/infrastructure/repository/config/QueryDslConfig.java diff --git a/payment-service/build.gradle b/payment-service/build.gradle index 1786f75..deb0a7e 100644 --- a/payment-service/build.gradle +++ b/payment-service/build.gradle @@ -4,6 +4,8 @@ ext { dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' + implementation 'org.springframework.boot:spring-boot-starter-web' } dependencyManagement { diff --git a/product-service/build.gradle b/product-service/build.gradle index a95f517..8a23af3 100644 --- a/product-service/build.gradle +++ b/product-service/build.gradle @@ -7,12 +7,34 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' implementation project(':common-module') runtimeOnly 'org.postgresql:postgresql' + + // QueryDSL + implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta' + annotationProcessor 'com.querydsl:querydsl-apt:5.1.0:jakarta' + annotationProcessor 'jakarta.annotation:jakarta.annotation-api' + annotationProcessor 'jakarta.persistence:jakarta.persistence-api' } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } +} + + +// ✅ QueryDSL 자동 생성 디렉토리 설정 +tasks.withType(JavaCompile).configureEach { + options.annotationProcessorGeneratedSourcesDirectory = file("$buildDir/generated/querydsl") +} + +// ✅ 자동 생성된 QueryDSL 클래스 경로 추가 +sourceSets { + main { + java { + srcDirs += "$buildDir/generated/querydsl" + } + } } \ No newline at end of file diff --git a/product-service/src/main/java/com/sparta/product/infrastructure/repository/config/QueryDslConfig.java b/product-service/src/main/java/com/sparta/product/infrastructure/repository/config/QueryDslConfig.java new file mode 100644 index 0000000..f3c1cde --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/infrastructure/repository/config/QueryDslConfig.java @@ -0,0 +1,21 @@ +package com.sparta.product.infrastructure.repository.config; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +@Configuration +@RequiredArgsConstructor +public class QueryDslConfig { + + private final EntityManager em; + + @Bean + public JPAQueryFactory jpaQueryFactory() { + return new JPAQueryFactory(em); + } + +} diff --git a/product-service/src/main/resources/application.yml b/product-service/src/main/resources/application.yml index f9ea8e3..4985a2a 100644 --- a/product-service/src/main/resources/application.yml +++ b/product-service/src/main/resources/application.yml @@ -16,6 +16,7 @@ spring: spring.jpa.open-in-view: false format_sql: true default_batch_fetch_size: 10 + dialect: org.hibernate.dialect.PostgreSQLDialect server: port: 8083 From f20d9b2b81fb16e90978caa52c732e892efb076a Mon Sep 17 00:00:00 2001 From: jin2304 Date: Sat, 22 Mar 2025 16:11:27 +0900 Subject: [PATCH 177/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#123]=20:=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EA=B2=80=EC=83=89=20Api=20=EB=B0=8F=20dto?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ProductController.java | 15 +++++++++ .../dto/request/SearchProductRequestDto.java | 14 +++++++++ .../response/SearchProductResponseDto.java | 31 +++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 product-service/src/main/java/com/sparta/product/presentation/dto/request/SearchProductRequestDto.java create mode 100644 product-service/src/main/java/com/sparta/product/presentation/dto/response/SearchProductResponseDto.java diff --git a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java index defaadd..97ae668 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java +++ b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java @@ -4,13 +4,17 @@ import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.application.service.ProductServiceImpl; import com.sparta.product.presentation.dto.request.CreateProductRequestDto; +import com.sparta.product.presentation.dto.request.SearchProductRequestDto; import com.sparta.product.presentation.dto.request.UpdateProductRequestDto; import com.sparta.product.presentation.dto.response.CreateProductResponseDto; import com.sparta.product.presentation.dto.response.ReadProductResponseDto; +import com.sparta.product.presentation.dto.response.SearchProductResponseDto; import com.sparta.product.presentation.dto.response.UpdateProductResponseDto; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -76,4 +80,15 @@ public ResponseEntity deleteProduct(@PathVariable UUID productId, DeleteProductServiceRequestDto.of(userId, productId)); return ResponseEntity.noContent().build(); } + + + /** + * 상품 검색 + */ + @GetMapping("/search") + public ResponseEntity> searchProducts(@ModelAttribute SearchProductRequestDto requestDto, + Pageable pageable) { + return ResponseEntity.ok(productServiceImpl.searchProducts(requestDto, pageable)); + } + } diff --git a/product-service/src/main/java/com/sparta/product/presentation/dto/request/SearchProductRequestDto.java b/product-service/src/main/java/com/sparta/product/presentation/dto/request/SearchProductRequestDto.java new file mode 100644 index 0000000..c75954b --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/presentation/dto/request/SearchProductRequestDto.java @@ -0,0 +1,14 @@ +package com.sparta.product.presentation.dto.request; + +import java.math.BigDecimal; +import java.util.UUID; + +public record SearchProductRequestDto(String name, + String description, + BigDecimal price, + Integer quantity, + Boolean isDisplay, + UUID companyId, + UUID hubId) { +} + diff --git a/product-service/src/main/java/com/sparta/product/presentation/dto/response/SearchProductResponseDto.java b/product-service/src/main/java/com/sparta/product/presentation/dto/response/SearchProductResponseDto.java new file mode 100644 index 0000000..da39067 --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/presentation/dto/response/SearchProductResponseDto.java @@ -0,0 +1,31 @@ +package com.sparta.product.presentation.dto.response; + +import com.sparta.product.domain.model.Product; +import lombok.Builder; + +import java.math.BigDecimal; +import java.util.UUID; + +@Builder +public record SearchProductResponseDto(UUID id, + String name, + String description, + BigDecimal price, + Integer quantity, + Boolean isDisplay, + UUID companyId, + UUID hubId) { + // Entity -> DTO 변환 메서드 + public static SearchProductResponseDto from(Product product) { + return SearchProductResponseDto.builder() + .id(product.getId()) + .name(product.getName()) + .description(product.getDescription()) + .price(product.getPrice()) + .quantity(product.getQuantity()) + .isDisplay(product.isDisplay()) + .companyId(product.getCompanyId()) + .hubId(product.getHubId()) + .build(); + } +} From a7048ad6cdad1b8d711448ac40accebe7fbb6535 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Sat, 22 Mar 2025 16:17:06 +0900 Subject: [PATCH 178/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#123]=20:=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EA=B2=80=EC=83=89=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ProductRepository는 외부 기술에 의존하지않는 순수 도메인 계층의 인터페이스 --- .../application/service/ProductService.java | 6 ++++++ .../application/service/ProductServiceImpl.java | 14 ++++++++++++++ .../domain/repository/ProductRepository.java | 6 ++++++ 3 files changed, 26 insertions(+) diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductService.java b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java index 4f068a5..8b1116b 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductService.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java @@ -3,9 +3,13 @@ import com.sparta.product.application.dto.DeleteProductServiceRequestDto; import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.presentation.dto.request.CreateProductRequestDto; +import com.sparta.product.presentation.dto.request.SearchProductRequestDto; import com.sparta.product.presentation.dto.response.CreateProductResponseDto; import com.sparta.product.presentation.dto.response.ReadProductResponseDto; +import com.sparta.product.presentation.dto.response.SearchProductResponseDto; import com.sparta.product.presentation.dto.response.UpdateProductResponseDto; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import java.util.List; import java.util.UUID; @@ -22,4 +26,6 @@ public interface ProductService { UpdateProductResponseDto updateProduct(UpdateProductServiceRequestDto serviceDto); void deleteProduct(DeleteProductServiceRequestDto serviceDto); + + Page searchProducts(SearchProductRequestDto requestDto, Pageable pageable); } diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java index a073d4a..d62c3df 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java @@ -6,10 +6,14 @@ import com.sparta.product.domain.model.Product; import com.sparta.product.domain.repository.ProductRepository; import com.sparta.product.presentation.dto.request.CreateProductRequestDto; +import com.sparta.product.presentation.dto.request.SearchProductRequestDto; import com.sparta.product.presentation.dto.response.CreateProductResponseDto; import com.sparta.product.presentation.dto.response.ReadProductResponseDto; +import com.sparta.product.presentation.dto.response.SearchProductResponseDto; import com.sparta.product.presentation.dto.response.UpdateProductResponseDto; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -80,4 +84,14 @@ public void deleteProduct(DeleteProductServiceRequestDto serviceDto) { .orElseThrow(() -> new ResourceNotFoundException("찾을 수 없는 상품 입니다.")); product.delete(serviceDto.userId()); } + + + /** + * 상품 검색 + */ + @Override + @Transactional(readOnly = true) + public Page searchProducts(SearchProductRequestDto requestDto, Pageable pageable) { + return productRepository.searchProducts(requestDto, pageable); + } } diff --git a/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java b/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java index 1ee3f05..a00f561 100644 --- a/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java +++ b/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java @@ -1,6 +1,10 @@ package com.sparta.product.domain.repository; import com.sparta.product.domain.model.Product; +import com.sparta.product.presentation.dto.request.SearchProductRequestDto; +import com.sparta.product.presentation.dto.response.SearchProductResponseDto; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import java.util.List; import java.util.Optional; @@ -13,4 +17,6 @@ public interface ProductRepository { Optional findById(UUID productId); List findAll(); + + Page searchProducts(SearchProductRequestDto requestDto, Pageable pageable); } From 0298b83c8d89a3bef8f9c51b7bffb758c2db26e3 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Sat, 22 Mar 2025 16:20:19 +0900 Subject: [PATCH 179/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#123]=20:=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EA=B2=80=EC=83=89=20QueryDSL=20=EB=B0=8F?= =?UTF-8?q?=20JPA=20=EB=A6=AC=ED=8F=AC=EC=A7=80=ED=86=A0=EB=A6=AC=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - QueryDSL은 외부 기술이기 때문에, QueryDSL 인터페이스 및 구현체는 인프라 계층으로 분리 --- .../repository/JpaProductRepository.java | 2 +- .../repository/ProductQueryDSLRepository.java | 12 ++ .../impl/ProductQueryDSLRepositoryImpl.java | 146 ++++++++++++++++++ 3 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 product-service/src/main/java/com/sparta/product/infrastructure/repository/ProductQueryDSLRepository.java create mode 100644 product-service/src/main/java/com/sparta/product/infrastructure/repository/impl/ProductQueryDSLRepositoryImpl.java diff --git a/product-service/src/main/java/com/sparta/product/infrastructure/repository/JpaProductRepository.java b/product-service/src/main/java/com/sparta/product/infrastructure/repository/JpaProductRepository.java index f11e744..f93c3c7 100644 --- a/product-service/src/main/java/com/sparta/product/infrastructure/repository/JpaProductRepository.java +++ b/product-service/src/main/java/com/sparta/product/infrastructure/repository/JpaProductRepository.java @@ -6,6 +6,6 @@ import java.util.UUID; -public interface JpaProductRepository extends ProductRepository, JpaRepository { +public interface JpaProductRepository extends ProductRepository, JpaRepository, ProductQueryDSLRepository { } diff --git a/product-service/src/main/java/com/sparta/product/infrastructure/repository/ProductQueryDSLRepository.java b/product-service/src/main/java/com/sparta/product/infrastructure/repository/ProductQueryDSLRepository.java new file mode 100644 index 0000000..1c1facf --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/infrastructure/repository/ProductQueryDSLRepository.java @@ -0,0 +1,12 @@ +package com.sparta.product.infrastructure.repository; + +import com.sparta.product.presentation.dto.request.SearchProductRequestDto; +import com.sparta.product.presentation.dto.response.SearchProductResponseDto; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +public interface ProductQueryDSLRepository { + + Page searchProducts(SearchProductRequestDto requestDto, Pageable pageable); + +} diff --git a/product-service/src/main/java/com/sparta/product/infrastructure/repository/impl/ProductQueryDSLRepositoryImpl.java b/product-service/src/main/java/com/sparta/product/infrastructure/repository/impl/ProductQueryDSLRepositoryImpl.java new file mode 100644 index 0000000..4797f93 --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/infrastructure/repository/impl/ProductQueryDSLRepositoryImpl.java @@ -0,0 +1,146 @@ +package com.sparta.product.infrastructure.repository.impl; + +import com.querydsl.core.types.OrderSpecifier; +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.sparta.product.domain.model.Product; +import com.sparta.product.infrastructure.repository.ProductQueryDSLRepository; +import com.sparta.product.presentation.dto.request.SearchProductRequestDto; +import com.sparta.product.presentation.dto.response.SearchProductResponseDto; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; + +import static com.sparta.product.domain.model.QProduct.product; + +@RequiredArgsConstructor +public class ProductQueryDSLRepositoryImpl implements ProductQueryDSLRepository { + + private final JPAQueryFactory queryFactory; + + + @Override + public Page searchProducts(SearchProductRequestDto requestDto, Pageable pageable) { + + // 동적 정렬 조건 생성 + List> orderSpecifierList = dynamicOrder(pageable); + + // 유효한 페이지 크기 설정 + int pageSize = validatePageSize(pageable.getPageSize()); + + + // 동적 쿼리 생성 및 조회 + List resultList = queryFactory + .selectFrom(product) + .where( + nameContains(requestDto.name()), + descriptionContains(requestDto.description()), + companyIdEq(requestDto.companyId()), + hubIdEq(requestDto.hubId()) + ) + .orderBy(orderSpecifierList.toArray(new OrderSpecifier[0])) // 동적 정렬 + .offset(pageable.getOffset()) // 페이징 - 시작 인덱스 + .limit(pageSize) // 페이징 - 페이지 크기 + .distinct() // 중복 제거 + .fetch(); + + + // 총 개수 조회 (count 쿼리 따로 실행) + Long totalCount = queryFactory + .select(product.count()) + .from(product) + .where( + nameContains(requestDto.name()), + descriptionContains(requestDto.description()), + companyIdEq(requestDto.companyId()), + hubIdEq(requestDto.hubId()) + ) + .fetchOne(); + + if (totalCount == null) { + totalCount = 0L; + } + + // Product -> ProductSearchResponseDto 변환 + List content = resultList.stream() + .map(SearchProductResponseDto::from) + .collect(Collectors.toList()); + + return new PageImpl<>(content, pageable, totalCount); + } + + + + private BooleanExpression nameContains(String name) { + return name != null ? product.name.containsIgnoreCase(name) : null; + } + + + private BooleanExpression descriptionContains(String description) { + return description != null ? product.description.containsIgnoreCase(description) : null; + } + + + private BooleanExpression companyIdEq(UUID companyId) { + return companyId != null ? product.companyId.eq(companyId) : null; + } + + + private BooleanExpression hubIdEq(UUID hubId) { + return hubId != null ? product.hubId.eq(hubId) : null; + } + + + /** + * 동적 정렬 조건 생성 메서드 + * @param pageable + * @return + */ + private List> dynamicOrder(Pageable pageable) { + + List> orderSpecifierList = new ArrayList<>(); + + if (pageable.getSort() != null) { + for (Sort.Order sortOrder : pageable.getSort()) { + com.querydsl.core.types.Order direction + = sortOrder.isAscending() ? com.querydsl.core.types.Order.ASC : com.querydsl.core.types.Order.DESC; + + switch (sortOrder.getProperty()) { + case "createdAt": // 상품 생성일 기준 정렬 + orderSpecifierList.add(new OrderSpecifier<>(direction, product.createdAt)); + break; + case "updatedAt": // 상품 업데이트 기준 정렬 + orderSpecifierList.add(new OrderSpecifier<>(direction, product.updatedAt)); + break; + default: // 잘못된 정렬 필드 처리 + throw new IllegalArgumentException( + "잘못된 정렬 필드입니다. : " + sortOrder.getProperty()); + } + } + } else { + // 기본 정렬: 오름차순, createdAt + orderSpecifierList.add(new OrderSpecifier<>(com.querydsl.core.types.Order.ASC, product.createdAt)); + } + return orderSpecifierList; + } + + + /** + * 유효한 페이지 크기 검증 및 설정 + * @param pageSize : 요청된 페이지 크기 + * @return int : 유효한 페이지 크기 + */ + private int validatePageSize(int pageSize) { + return Set.of(10, 30, 50).contains(pageSize) ? pageSize : 10; + } + + +} From dac9558a3ba52158a279a45534806a8af7706653 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Sat, 22 Mar 2025 16:20:51 +0900 Subject: [PATCH 180/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#123]=20:=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EA=B2=80=EC=83=89=20http=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- product-service/src/test/http/product.http | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/product-service/src/test/http/product.http b/product-service/src/test/http/product.http index 5c53bf5..65fbd4b 100644 --- a/product-service/src/test/http/product.http +++ b/product-service/src/test/http/product.http @@ -38,4 +38,22 @@ Content-Type: application/json ### 상품 삭제 DELETE http://localhost:8083/api/v1/products/225dc81a-7b96-4905-83b9-16945fef9a7d -X-User-Id: 12345 # 사용자 ID (Long 타입) \ No newline at end of file +X-User-Id: 12345 # 사용자 ID (Long 타입) + + + + +### 상품 검색 (상품 이름으로 검색) +GET http://localhost:8083/api/v1/products/search?name=치킨&page=0&size=10&sort=createdAt,asc + + +### 상품 검색 (상품 설명으로 검색) +GET http://localhost:8083/api/v1/products/search?description=치킨 입니다&page=0&size=10&sort=createdAt,asc + + +### 상품 검색 (허브 ID로 검색) +GET http://localhost:8083/api/v1/products/search?hubId=123e4567-e89b-12d3-a456-426614174002&page=0&size=10&sort=createdAt,asc + + +### 상품 검색 (업체 ID로 검색) +GET http://localhost:8083/api/v1/products/search?companyId=550e8400-e29b-41d4-a716-446655440001&page=0&size=10&sort=createdAt,asc \ No newline at end of file From 21b8608895d108baeede23bea66bcc92d66d6ae1 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Sat, 22 Mar 2025 17:05:11 +0900 Subject: [PATCH 181/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#134]=20:=20?= =?UTF-8?q?=EA=B3=B5=ED=86=B5=EB=AA=A8=EB=93=88=20AOP=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common-module/build.gradle | 2 + .../commonmodule/aop/AuthorizationAspect.java | 39 +++++++++++++++++++ .../sparta/commonmodule/aop/RoleCheck.java | 12 ++++++ .../user/application/service/AuthService.java | 2 +- 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 common-module/src/main/java/com/sparta/commonmodule/aop/AuthorizationAspect.java create mode 100644 common-module/src/main/java/com/sparta/commonmodule/aop/RoleCheck.java diff --git a/common-module/build.gradle b/common-module/build.gradle index 87daece..f51b4bb 100644 --- a/common-module/build.gradle +++ b/common-module/build.gradle @@ -6,6 +6,8 @@ dependencies { annotationProcessor 'com.querydsl:querydsl-apt:5.1.0:jakarta' annotationProcessor 'jakarta.annotation:jakarta.annotation-api' annotationProcessor 'jakarta.persistence:jakarta.persistence-api' + implementation 'org.springframework.boot:spring-boot-starter-aop' + implementation 'org.springframework.boot:spring-boot-starter-web' } // ✅ QueryDSL 자동 생성 디렉토리 설정 diff --git a/common-module/src/main/java/com/sparta/commonmodule/aop/AuthorizationAspect.java b/common-module/src/main/java/com/sparta/commonmodule/aop/AuthorizationAspect.java new file mode 100644 index 0000000..c2ef605 --- /dev/null +++ b/common-module/src/main/java/com/sparta/commonmodule/aop/AuthorizationAspect.java @@ -0,0 +1,39 @@ +package com.sparta.commonmodule.aop; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +@Aspect +@Component +@Slf4j +public class AuthorizationAspect { + + + @Before("@annotation(roleCheck)") // @RoleCheck 어노테이션을 가진 메서드에 AOP 적용 + public void checkPermission(JoinPoint joinPoint, RoleCheck roleCheck) throws Throwable { + // 요구되는 권한 (예: ROLE_MASTER) + String[] requiredRole = roleCheck.value().split(","); + + ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + HttpServletRequest request = requestAttributes.getRequest(); + String currentUserRole = request.getHeader("role");//현재 로그인한 사용자의 권한 + boolean check = false; + for (String requiredRoleName : requiredRole) { + if (requiredRoleName.equals(currentUserRole)) { + check = true; + } + } + if (!check) { + log.error("CurrentUserRole [{}] is not matched requiredRole [{}]", currentUserRole, requiredRole); + throw new RuntimeException("권한이 다릅니다."); + } + + } + +} diff --git a/common-module/src/main/java/com/sparta/commonmodule/aop/RoleCheck.java b/common-module/src/main/java/com/sparta/commonmodule/aop/RoleCheck.java new file mode 100644 index 0000000..de3a153 --- /dev/null +++ b/common-module/src/main/java/com/sparta/commonmodule/aop/RoleCheck.java @@ -0,0 +1,12 @@ +package com.sparta.commonmodule.aop; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) //생성한 어노테이션을 사용할 수 있는곳(적용대상) +@Retention(RetentionPolicy.RUNTIME) //어노테이션 적용 및 유지범위 +public @interface RoleCheck { + String value(); //@RoleCheck("ROLE_MASTER")형식으로 값을 입력할수있게 구현 +} diff --git a/user-service/src/main/java/com/sparta/user/application/service/AuthService.java b/user-service/src/main/java/com/sparta/user/application/service/AuthService.java index f3caa7e..cf56406 100644 --- a/user-service/src/main/java/com/sparta/user/application/service/AuthService.java +++ b/user-service/src/main/java/com/sparta/user/application/service/AuthService.java @@ -28,7 +28,7 @@ public String createAccessToken(UserSigninResponseDto responseDto) { return Jwts.builder() // 사용자 ID를 클레임으로 설정 .claim("user_id", responseDto.getId().toString()) - .claim("role", responseDto.getRole().toString()) + .claim("role", responseDto.getRole()) .claim("slack_name", responseDto.getSlackName()) // JWT 발행자를 설정(모듈명) .issuer(issuer) From 1611e3511bbb08327dce63ebc512241f9227e943 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Sat, 22 Mar 2025 17:06:26 +0900 Subject: [PATCH 182/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#134]=20:=20?= =?UTF-8?q?=EA=B3=B5=ED=86=B5=EB=AA=A8=EB=93=88=20AOP=20=EC=9E=91=EC=84=B1?= =?UTF-8?q?=20-=20AOP=20=EC=A0=81=EC=9A=A9=EC=9D=84=EC=9C=84=ED=95=B4=20?= =?UTF-8?q?=EA=B0=81=20=EC=84=9C=EB=B8=8C=EB=AA=A8=EB=93=88=EC=9D=98=20App?= =?UTF-8?q?lication=EC=97=90=20=EC=84=A4=EC=A0=95=EC=9D=84=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=96=88=EC=8A=B5=EB=8B=88=EB=8B=A4.=20-=20=EA=B3=B5?= =?UTF-8?q?=ED=86=B5=EB=AA=A8=EB=93=88=EC=97=90=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=EB=90=9C=20AOP=20=EB=A5=BC=20=EB=B9=88=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=EC=8B=9C=ED=82=A4=EA=B8=B0=EC=9C=84=ED=95=9C?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95=EC=9E=85=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api-http/user/user-service.http | 10 ++++++---- .../companyservice/CompanyServiceApplication.java | 2 +- .../com/sparta/hubservice/HubServiceApplication.java | 2 +- .../sparta/orderservice/OrderServiceApplication.java | 2 +- .../paymentservice/PaymentServiceApplication.java | 2 +- .../com/sparta/product/ProductServiceApplication.java | 2 +- .../shippingservice/ShippingServiceApplication.java | 2 +- slack-service/build.gradle | 2 ++ .../sparta/slackservice/SlackServiceApplication.java | 2 +- .../slackservice/presentation/SlackController.java | 3 +++ .../java/com/sparta/user/UserServiceApplication.java | 2 +- .../infastructure/repository/JpaUserRepository.java | 4 ---- 12 files changed, 19 insertions(+), 16 deletions(-) diff --git a/api-http/user/user-service.http b/api-http/user/user-service.http index 6b766d0..ce7f843 100644 --- a/api-http/user/user-service.http +++ b/api-http/user/user-service.http @@ -17,17 +17,19 @@ Content-Type: application/json "username": "asdf123", "password": "asdfgA12@" } - +> {% + client.global.set("access_token", response.headers.valueOf("Authorization")) +%} ### GET http://localhost:8080/api/v1/users -Authorization: 로그인하고 생성된 토큰 넣어주세요! +Authorization: {{access_token}} ### PUT http://localhost:8080/api/v1/users/update Content-Type: application/json -Authorization: 로그인하고 생성된 토큰 넣어주세요! +Authorization: {{access_token}} { "username": "afdsjhsd24", @@ -40,4 +42,4 @@ Authorization: 로그인하고 생성된 토큰 넣어주세요! DELETE http://localhost:8080/api/v1/users Content-Type: application/json -Authorization: 로그인하고 생성된 토큰 넣어주세요! \ No newline at end of file +Authorization: {{access_token}} \ No newline at end of file diff --git a/company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java b/company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java index f13005e..7430580 100644 --- a/company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java +++ b/company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java @@ -6,7 +6,7 @@ import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Import; -@SpringBootApplication +@SpringBootApplication(scanBasePackages = "com.sparta") @EnableFeignClients(basePackages = "com.sparta") @Import(SwaggerConfig.class) public class CompanyServiceApplication { diff --git a/hub-service/src/main/java/com/sparta/hubservice/HubServiceApplication.java b/hub-service/src/main/java/com/sparta/hubservice/HubServiceApplication.java index ff177f7..9739ba7 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/HubServiceApplication.java +++ b/hub-service/src/main/java/com/sparta/hubservice/HubServiceApplication.java @@ -3,7 +3,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication +@SpringBootApplication(scanBasePackages = "com.sparta") public class HubServiceApplication { public static void main(String[] args) { diff --git a/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java b/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java index 30ecb04..b670ad6 100644 --- a/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java +++ b/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java @@ -5,7 +5,7 @@ import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @EnableJpaAuditing -@SpringBootApplication +@SpringBootApplication(scanBasePackages = "com.sparta") public class OrderServiceApplication { public static void main(String[] args) { diff --git a/payment-service/src/main/java/com/sparta/paymentservice/PaymentServiceApplication.java b/payment-service/src/main/java/com/sparta/paymentservice/PaymentServiceApplication.java index 9e7875d..e4589a0 100644 --- a/payment-service/src/main/java/com/sparta/paymentservice/PaymentServiceApplication.java +++ b/payment-service/src/main/java/com/sparta/paymentservice/PaymentServiceApplication.java @@ -3,7 +3,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication +@SpringBootApplication(scanBasePackages = "com.sparta") public class PaymentServiceApplication { public static void main(String[] args) { diff --git a/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java b/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java index b4a1049..42fba21 100644 --- a/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java +++ b/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java @@ -5,7 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Import; -@SpringBootApplication +@SpringBootApplication(scanBasePackages = "com.sparta") @Import(SwaggerConfig.class) public class ProductServiceApplication { diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java b/shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java index 1146de6..43e1725 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java @@ -3,7 +3,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication +@SpringBootApplication(scanBasePackages = "com.sparta") public class ShippingServiceApplication { public static void main(String[] args) { SpringApplication.run(ShippingServiceApplication.class, args); diff --git a/slack-service/build.gradle b/slack-service/build.gradle index cedd907..8d3e8c9 100644 --- a/slack-service/build.gradle +++ b/slack-service/build.gradle @@ -5,6 +5,8 @@ ext { dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation project(':common-module') } diff --git a/slack-service/src/main/java/com/sparta/slackservice/SlackServiceApplication.java b/slack-service/src/main/java/com/sparta/slackservice/SlackServiceApplication.java index 6011911..da22a24 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/SlackServiceApplication.java +++ b/slack-service/src/main/java/com/sparta/slackservice/SlackServiceApplication.java @@ -3,7 +3,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication +@SpringBootApplication(scanBasePackages = "com.sparta") public class SlackServiceApplication { public static void main(String[] args) { diff --git a/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java b/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java index 51ed0fe..4aa7c37 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java +++ b/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java @@ -1,5 +1,6 @@ package com.sparta.slackservice.presentation; +import com.sparta.commonmodule.aop.RoleCheck; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -7,6 +8,8 @@ @RestController @RequestMapping("/api/v1/slacks") public class SlackController { + + @RoleCheck("ROLE_MASTER,ROLE_COMPANY") @GetMapping("/test") public String getSlack() { return "Hello World"; diff --git a/user-service/src/main/java/com/sparta/user/UserServiceApplication.java b/user-service/src/main/java/com/sparta/user/UserServiceApplication.java index 24fb3ab..4b1578d 100644 --- a/user-service/src/main/java/com/sparta/user/UserServiceApplication.java +++ b/user-service/src/main/java/com/sparta/user/UserServiceApplication.java @@ -5,7 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Import; -@SpringBootApplication +@SpringBootApplication(scanBasePackages = "com.sparta") @Import(SwaggerConfig.class) public class UserServiceApplication { diff --git a/user-service/src/main/java/com/sparta/user/infastructure/repository/JpaUserRepository.java b/user-service/src/main/java/com/sparta/user/infastructure/repository/JpaUserRepository.java index 276cb25..fae1b16 100644 --- a/user-service/src/main/java/com/sparta/user/infastructure/repository/JpaUserRepository.java +++ b/user-service/src/main/java/com/sparta/user/infastructure/repository/JpaUserRepository.java @@ -3,12 +3,8 @@ import com.sparta.user.domain.model.User; import com.sparta.user.domain.repository.UserRepository; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import java.util.Optional; - @Repository public interface JpaUserRepository extends JpaRepository , UserRepository { } From a70e436f2dd789b80288cdd11754bdd19eb548c6 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sat, 22 Mar 2025 22:11:45 +0900 Subject: [PATCH 183/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20JGraphT=20?= =?UTF-8?q?=EB=A5=BC=20=EC=9D=B4=EC=9A=A9=ED=95=9C=20Dijkstra=20=EC=95=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=EC=A6=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dijkstra/JGraphTPathFinder.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/JGraphTPathFinder.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/JGraphTPathFinder.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/JGraphTPathFinder.java new file mode 100644 index 0000000..363502a --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/JGraphTPathFinder.java @@ -0,0 +1,45 @@ +package com.sparta.hubservice.hub_route.application.dijkstra; + +import com.sparta.hubservice.hub.domain.model.Hub; +import com.sparta.hubservice.hub_route.domain.model.HubRoute; +import java.util.List; +import java.util.Map; +import org.jgrapht.Graph; +import org.jgrapht.GraphPath; +import org.jgrapht.alg.shortestpath.DijkstraShortestPath; +import org.jgrapht.graph.DefaultDirectedWeightedGraph; + +public class JGraphTPathFinder implements PathFinder { + + private final Graph graph; // Graph + + public JGraphTPathFinder(Map> graphMap) { + + Graph graph = new DefaultDirectedWeightedGraph<>(HubRoute.class); + + for(Hub fromHub : graphMap.keySet()) { + // from 꼭짓점 추가 + graph.addVertex(fromHub); + List routes = graphMap.get(fromHub); + + for(HubRoute route : routes) { + // to 꼭짓점 추가 + graph.addVertex(route.getToHub()); + // graph(fromV, toV, e) + graph.addEdge(fromHub, route.getToHub(), route); + // e 에 대한 가중치 설정 + graph.setEdgeWeight(route, route.getDistance().doubleValue()); + } + } + + this.graph = graph; + } + + // 경로 시퀀스 + @Override + public List getShortPath(Hub start, Hub end){ + GraphPath path = new DijkstraShortestPath<>(graph).getPath(start, end); + return path.getVertexList(); + } + +} From 658e91b3d615464d5032bf1fa89bb2c458729e1d Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sat, 22 Mar 2025 22:11:56 +0900 Subject: [PATCH 184/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20Dijkstra=20?= =?UTF-8?q?=EC=95=8C=EA=B3=A0=EB=A6=AC=EC=A6=98=20=EC=A7=81=EC=A0=91=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dijkstra/DijkstraPathFinder.java | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/DijkstraPathFinder.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/DijkstraPathFinder.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/DijkstraPathFinder.java new file mode 100644 index 0000000..1eb383d --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/DijkstraPathFinder.java @@ -0,0 +1,90 @@ +package com.sparta.hubservice.hub_route.application.dijkstra; + +import com.sparta.hubservice.hub.domain.model.Hub; +import com.sparta.hubservice.hub_route.domain.model.HubRoute; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; +import lombok.Getter; + +@Getter +class HubNode implements Comparable { + private final Hub hub; + private final BigDecimal distance; + private final Hub beforeHub; + + public HubNode(Hub hub, BigDecimal distance, Hub beforeHub) { + this.hub = hub; + this.distance = distance; + this.beforeHub = beforeHub; + } + + @Override + public int compareTo(HubNode other) { + return this.distance.compareTo(other.distance); + } +} + +public class DijkstraPathFinder implements PathFinder { + + private Map> graph = new HashMap<>(); + + public DijkstraPathFinder(Map> graph) { + this.graph = graph; + } + + @Override + public List getShortPath(Hub start, Hub end) { + + Map distances = new HashMap<>(); + Map beforeHub = new HashMap<>(); + Set visited = new HashSet<>(); + PriorityQueue queue = new PriorityQueue<>(); + + distances.put(start, BigDecimal.ZERO); + queue.offer(new HubNode(start, BigDecimal.ZERO, null)); + + while (!queue.isEmpty()) { + HubNode currentNode = queue.poll(); + Hub currentHub = currentNode.getHub(); + + if (currentHub.equals(end)) break; + + if (visited.contains(currentHub)) continue; + visited.add(currentHub); + + // 현재 허브에서 연결된 모든 허브 경로 가져오기 + List routes = graph.get(currentHub); + + for (HubRoute route : routes) { + Hub nextHub = route.getToHub(); + BigDecimal newDistance = distances.get(currentHub).add(route.getDistance()); + + // nextHub의 거리정보가 없거나, 기존 경로보다 짧으면 값 변경 + if(!distances.containsKey(nextHub) || + newDistance.compareTo(distances.get(nextHub)) < 0){ + + distances.put(nextHub, newDistance); + beforeHub.put(nextHub, currentHub); + queue.offer(new HubNode(nextHub, newDistance, currentHub)); + + } + } + } + // 최단 경로 시퀀스 + List sequence = new LinkedList<>(); + Hub current = end; + while (current != null) { + sequence.add(0, current); + current = beforeHub.get(current); + } + + return sequence; + } + +} From 6ef78708f181d6aaa50056740e6cdade61fc7c11 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sat, 22 Mar 2025 22:12:39 +0900 Subject: [PATCH 185/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20Dijkstra=20?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=EB=9F=AC=EB=A6=AC=20or=20=EC=A7=81?= =?UTF-8?q?=EC=A0=91=EA=B5=AC=ED=98=84=20=EB=B9=84=EA=B5=90=20=EC=A0=84?= =?UTF-8?q?=EB=8B=AC=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dijkstra/PathCalculate.java | 71 +++++++++++++++++++ .../application/dijkstra/PathFinder.java | 9 +++ 2 files changed, 80 insertions(+) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathFinder.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java new file mode 100644 index 0000000..5940523 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java @@ -0,0 +1,71 @@ +package com.sparta.hubservice.hub_route.application.dijkstra; + +import com.sparta.commonmodule.exception.ResourceNotFoundException; +import com.sparta.hubservice.hub.domain.model.Hub; +import com.sparta.hubservice.hub.domain.repository.HubRepository; +import com.sparta.hubservice.hub_route.application.dto.serviceDto.PathValueDto; +import com.sparta.hubservice.hub_route.domain.model.HubRoute; +import com.sparta.hubservice.hub_route.domain.repository.HubRouteRepository; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Slf4j +public class PathCalculate { + + private final HubRouteRepository hubRouteRepository; + private final HubRepository hubRepository; + + public List getShortPath(Hub fromHub, Hub toHub, Long userId) { + + // 그래프 정의 + Map> graph = new HashMap<>(); + List hubs = hubRepository.findAll().orElseThrow(ResourceNotFoundException::new); + for(Hub hub : hubs){ + List routes = hubRouteRepository.findByFromHub(hub) + .orElseThrow(ResourceNotFoundException::new); + graph.put(hub, routes); + } + + // 직접 정의한 dijkstra를 이용한 체크포인트 리스트 생성 + DijkstraPathFinder dijkstraPathFinder = new DijkstraPathFinder(graph); + List sequencePathByDijkstra = dijkstraPathFinder.getShortPath(fromHub, toHub); + + // JGraphT 라이브러리를 사용한 체크포인트 리스트 생성 + JGraphTPathFinder jgraphT = new JGraphTPathFinder(graph); + List sequencePathByJGraphT = jgraphT.getShortPath(fromHub, toHub); + + if(sequencePathByDijkstra.equals(sequencePathByJGraphT)){ + log.info("Checking checkpoint path validity : dijkstraPath same JGraphT"); + return sequencePathByDijkstra; + } + + log.info("done checking checkpoint path validity"); + return sequencePathByJGraphT; + } + + public PathValueDto getValue(List shortPath){ + + BigDecimal totalDistance = BigDecimal.ZERO; + int totalDuration = 0; + + for(int i = 0; i < shortPath.size()-1; i++){ + Hub h1 = shortPath.get(i); + Hub h2 = shortPath.get(i+1); + HubRoute route = hubRouteRepository.findByFromHubAndToHub(h1, h2) + .orElseThrow(ResourceNotFoundException::new); + totalDistance = totalDistance.add(route.getDistance()); + totalDuration += route.getDuration(); + } + + return new PathValueDto(totalDistance, totalDuration); + } + + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathFinder.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathFinder.java new file mode 100644 index 0000000..f167426 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathFinder.java @@ -0,0 +1,9 @@ +package com.sparta.hubservice.hub_route.application.dijkstra; + +import com.sparta.hubservice.hub.domain.model.Hub; +import java.util.List; + +public interface PathFinder { + + List getShortPath(Hub from, Hub to); +} From d628f70a911a778b1d13b3569ff5e1e49a2b3243 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sat, 22 Mar 2025 22:13:51 +0900 Subject: [PATCH 186/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=B5=9C?= =?UTF-8?q?=EB=8B=A8=EA=B1=B0=EB=A6=AC=EC=99=80=20=EC=B5=9C=EB=8B=A8?= =?UTF-8?q?=EA=B1=B0=EB=A6=AC=EC=8B=9C=20=EA=B1=B8=EB=A6=AC=EB=8A=94=20?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=20=EC=A0=80=EC=9E=A5=20dto=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dijkstra/DijkstraPathFinder.java | 2 +- .../application/dto/serviceDto/PathValueDto.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/serviceDto/PathValueDto.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/DijkstraPathFinder.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/DijkstraPathFinder.java index 1eb383d..4efc4b5 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/DijkstraPathFinder.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/DijkstraPathFinder.java @@ -32,7 +32,7 @@ public int compareTo(HubNode other) { public class DijkstraPathFinder implements PathFinder { - private Map> graph = new HashMap<>(); + private final Map> graph; public DijkstraPathFinder(Map> graph) { this.graph = graph; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/serviceDto/PathValueDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/serviceDto/PathValueDto.java new file mode 100644 index 0000000..47b446a --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/serviceDto/PathValueDto.java @@ -0,0 +1,14 @@ +package com.sparta.hubservice.hub_route.application.dto.serviceDto; + +import java.math.BigDecimal; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class PathValueDto { + + private BigDecimal totalDistance; + private int totalDuration; + +} From 99300d26c73524b9488bbe188270a8ae6b1de053 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sat, 22 Mar 2025 22:15:37 +0900 Subject: [PATCH 187/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20spring=20web,=20?= =?UTF-8?q?webmvc=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=EB=9F=AC=EB=A6=AC=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 --- hub-service/build.gradle | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hub-service/build.gradle b/hub-service/build.gradle index eb9a4f7..a1e26c8 100644 --- a/hub-service/build.gradle +++ b/hub-service/build.gradle @@ -6,6 +6,11 @@ ext { dependencies { // 공통 모듈 implementation project(':common-module') + + + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' + implementation 'org.springframework.boot:spring-boot-starter-web' + // eureka client implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' // 유효성 검사 From 562400d43b68278afac9dbae38e297c351d2610b Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sat, 22 Mar 2025 22:21:06 +0900 Subject: [PATCH 188/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20equals,=20hashCo?= =?UTF-8?q?de=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80=20-=20Hub?= =?UTF-8?q?=20=EA=B0=9D=EC=B2=B4=EB=A5=BC=20Set,=20Map,=20JGraphT=EC=9D=98?= =?UTF-8?q?=20Graph=20=EC=97=90=20=EB=84=A3=EC=9D=84=EB=95=8C=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=98=EC=97=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sparta/hubservice/hub/domain/model/Hub.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/Hub.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/Hub.java index 9615a7a..8e1300a 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/Hub.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/Hub.java @@ -49,5 +49,18 @@ public void updateHub(String address, BigDecimal latitude, BigDecimal longitude, this.longitude = longitude; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Hub hub = (Hub) o; + return hubId.equals(hub.hubId); + } + + @Override + public int hashCode() { + return hubId.hashCode(); + } + } From d77966d9b4013a8c65ca57d22569574fb8cf164c Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sat, 22 Mar 2025 22:21:57 +0900 Subject: [PATCH 189/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EB=8B=A4?= =?UTF-8?q?=EC=9D=B4=EB=A0=89=ED=8A=B8=EB=A1=9C=20=EA=B0=80=EB=8A=94=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C,=20=EA=B2=BD=EC=9C=A0=20=ED=95=98=EB=8A=94?= =?UTF-8?q?=20=EA=B2=BD=EB=A1=9C=EC=9D=98=20=EC=B5=9C=EB=8B=A8=EA=B1=B0?= =?UTF-8?q?=EB=A6=AC=EC=8B=9C=20=EC=83=9D=EC=84=B1=EC=9E=90=20=EA=B5=AC?= =?UTF-8?q?=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub_route/domain/model/HubRoute.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRoute.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRoute.java index 422b020..446f8c8 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRoute.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRoute.java @@ -15,7 +15,6 @@ import jakarta.validation.constraints.Digits; import java.math.BigDecimal; import java.util.UUID; -import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -45,13 +44,22 @@ public class HubRoute extends BaseEntity { @Digits(integer = 10, fraction = 2) private BigDecimal distance; - @Builder - public HubRoute(Hub fromHub, Hub toHub, long userId) { + // 다이렉트로 가는 경로 생성시 + public HubRoute(Hub fromHub, Hub toHub, Long userId) { super(userId); this.fromHub = fromHub; this.toHub = toHub; - this.distance = calculateDistance(); - this.duration = calculateDuration(); + this.distance = this.calculateDistance(); + this.duration = this.calculateDuration(); + } + + // 체크포인트가 존재하는 최단 거리 생성시 + public HubRoute(Hub fromHub, Hub toHub, int duration, BigDecimal distance, Long userId) { + super(userId); + this.fromHub = fromHub; + this.toHub = toHub; + this.duration = duration; + this.distance = distance; } // 거리 계산 (km) @@ -65,5 +73,4 @@ private int calculateDuration(){ return (int) Math.round(this.distance.doubleValue() / speed); } - } From 2e080e2c2058fb7ba66a75c6f78b7a0ba6f3c74b Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sat, 22 Mar 2025 22:31:36 +0900 Subject: [PATCH 190/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20from->to=20?= =?UTF-8?q?=EC=B5=9C=EB=8B=A8=20=EA=B2=BD=EB=A1=9C=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?(path)=20Service=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/HubRouteService.java | 85 +++++++++++++------ 1 file changed, 61 insertions(+), 24 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java index d0f74c3..64db48c 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java @@ -3,12 +3,19 @@ import com.sparta.commonmodule.exception.ResourceNotFoundException; import com.sparta.hubservice.hub.domain.model.Hub; import com.sparta.hubservice.hub.domain.repository.HubRepository; -import com.sparta.hubservice.hub_route.application.dto.response.HubRouteCreateResponse; -import com.sparta.hubservice.hub_route.application.dto.response.HubRouteDeleteResponse; -import com.sparta.hubservice.hub_route.application.dto.response.HubRouteResponse; +import com.sparta.hubservice.hub_route.application.dijkstra.PathCalculate; +import com.sparta.hubservice.hub_route.application.dto.response.HubRouteCreateResponseDto; +import com.sparta.hubservice.hub_route.application.dto.response.HubRouteDeleteResponseDto; +import com.sparta.hubservice.hub_route.application.dto.response.HubRouteDetailsResponseDto; +import com.sparta.hubservice.hub_route.application.dto.response.HubRouteResponseDto; +import com.sparta.hubservice.hub_route.application.dto.serviceDto.PathValueDto; import com.sparta.hubservice.hub_route.domain.model.HubRoute; +import com.sparta.hubservice.hub_route.domain.model.HubRouteCheckpoint; import com.sparta.hubservice.hub_route.domain.repository.HubRouteCheckpointRepository; import com.sparta.hubservice.hub_route.domain.repository.HubRouteRepository; +import jakarta.persistence.EntityExistsException; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; import java.util.UUID; import lombok.RequiredArgsConstructor; @@ -26,54 +33,50 @@ public class HubRouteService { private final HubRouteRepository hubRouteRepository; private final HubRepository hubRepository; private final HubRouteCheckpointRepository checkpointRepository; + private final PathCalculate pathCalculate; // 전체 허브 간 경로 목록 조회 @Transactional(readOnly = true) - public Page getHubRoutes(Pageable pageable) { + public Page getHubRoutes(Pageable pageable) { Page hubRoutes = hubRouteRepository.findAllByIsDeletedFalse(pageable) .orElseThrow(ResourceNotFoundException::new); - return hubRoutes.map(HubRouteResponse::new); + return hubRoutes.map(HubRouteResponseDto::new); } // 특정 경로 ID 조회 - public HubRouteResponse getHubRoute(UUID hubRouteId) { + public HubRouteResponseDto getHubRoute(UUID hubRouteId) { HubRoute hubRoute = hubRouteRepository.findById(hubRouteId).orElseThrow(ResourceNotFoundException::new); - return new HubRouteResponse(hubRoute); + return new HubRouteResponseDto(hubRoute); } - // 출발 허브 -> 도착 허브 : 특정 경로 조회 + // 출발 허브 -> 도착 허브 : 특정 경로 조회 (direct) @Transactional(readOnly = true) - public HubRouteResponse getHubRouteFromHubToHub(UUID fromHubId, UUID toHubId) { + public HubRouteResponseDto getDirectHubRoute(UUID fromHubId, UUID toHubId) { Optional hubRoute = hubRouteRepository.findByFromHub_HubIdAndToHub_HubIdAndIsDeletedFalse(fromHubId, toHubId); if(hubRoute.isEmpty()){ throw new ResourceNotFoundException("Hub route not found"); } - return new HubRouteResponse(hubRoute.get()); + return new HubRouteResponseDto(hubRoute.get()); } - // 허브 간 경로 생성 + // 허브 간 경로 생성 (direct 연결) @Transactional - public HubRouteCreateResponse createHubRoute(Long userId, UUID fromHubId, UUID toHubId) { - Hub fromHub = hubRepository.findById(fromHubId).get(); - Hub toHub = hubRepository.findById(toHubId).get(); + public HubRouteCreateResponseDto createDirectHubRoute(Long userId, UUID fromHubId, UUID toHubId) { + Hub fromHub = hubRepository.findById(fromHubId).orElseThrow(ResourceNotFoundException::new); + Hub toHub = hubRepository.findById(toHubId).orElseThrow(ResourceNotFoundException::new); - HubRoute saveHubRoute = HubRoute.builder() - .fromHub(fromHub) - .toHub(toHub) - .userId(userId) - .build(); + HubRoute saveHubRoute = new HubRoute(fromHub, toHub, userId); - HubRoute hubRoute = hubRouteRepository.save(saveHubRoute) - .orElseThrow(ResourceNotFoundException::new); - return new HubRouteCreateResponse(hubRoute); + HubRoute hubRoute = hubRouteRepository.save(saveHubRoute); + return new HubRouteCreateResponseDto(hubRoute); } // 허브 간 경로 정보 삭제 (soft deleted) @Transactional - public HubRouteDeleteResponse deleteHubRoute(UUID hubRouteId, Long userId) { + public HubRouteDeleteResponseDto deleteHubRoute(UUID hubRouteId, Long userId) { HubRoute hubRoute = hubRouteRepository.findByHubRouteIdAndIsDeletedFalse(hubRouteId) .orElseThrow(ResourceNotFoundException::new); @@ -82,7 +85,41 @@ public HubRouteDeleteResponse deleteHubRoute(UUID hubRouteId, Long userId) { .forEach(checkpoint -> checkpoint.delete(userId)); hubRoute.delete(userId); - return new HubRouteDeleteResponse(hubRouteId, "Hub successfully deleted."); + return new HubRouteDeleteResponseDto(hubRouteId, "Hub successfully deleted."); + } + + // fromHub -> toHub 최단 경로 생성 + @Transactional + public HubRouteDetailsResponseDto createPathHubRoute(UUID fromHubId, UUID toHubId, Long userId) { + Hub fromHub = hubRepository.findById(fromHubId).orElseThrow(ResourceNotFoundException::new); + Hub toHub = hubRepository.findById(toHubId).orElseThrow(ResourceNotFoundException::new); + + List shortPath = pathCalculate.getShortPath(fromHub, toHub, userId); + PathValueDto vlaues = pathCalculate.getValue(shortPath); + + if(hubRouteRepository.findByFromHubAndToHub(fromHub, toHub).isPresent()){ + throw new EntityExistsException("Hub route already exists"); + } + + HubRoute route = new HubRoute(fromHub, toHub, vlaues.getTotalDuration(), vlaues.getTotalDistance(), userId); + route = hubRouteRepository.save(route); + + List checkpointList = new ArrayList<>(); + for(int i = 0; i < shortPath.size(); i++) { + HubRouteCheckpoint result = HubRouteCheckpoint.builder() + .checkpointHub(shortPath.get(i)) + .hubRoute(route) + .userId(userId) + .sequence(i) + .build(); + checkpointList.add(result); + } + checkpointRepository.saveAll(checkpointList); + + return new HubRouteDetailsResponseDto(route, checkpointList); } + // fromHub -> toHub 최단 경로 시퀀스 조회 + + } From 9be04de1c858aad3440da49458e829adef9630b8 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sat, 22 Mar 2025 22:32:14 +0900 Subject: [PATCH 191/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20from->to=20?= =?UTF-8?q?=EC=B5=9C=EB=8B=A8=20=EA=B2=BD=EB=A1=9C=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?(path)=20Controller=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HubRouteController.java | 46 ++++++++++++------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java index a50b757..69530e5 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java @@ -1,9 +1,10 @@ package com.sparta.hubservice.hub_route.presentation.controller; -import com.sparta.hubservice.hub_route.application.dto.response.HubRouteCreateResponse; -import com.sparta.hubservice.hub_route.application.dto.response.HubRouteDeleteResponse; -import com.sparta.hubservice.hub_route.application.dto.response.HubRouteResponse; +import com.sparta.hubservice.hub_route.application.dto.response.HubRouteCreateResponseDto; +import com.sparta.hubservice.hub_route.application.dto.response.HubRouteDeleteResponseDto; +import com.sparta.hubservice.hub_route.application.dto.response.HubRouteDetailsResponseDto; +import com.sparta.hubservice.hub_route.application.dto.response.HubRouteResponseDto; import com.sparta.hubservice.hub_route.application.service.HubRouteService; import java.util.UUID; import lombok.RequiredArgsConstructor; @@ -28,47 +29,60 @@ public class HubRouteController { // 전체 허브 간 경로 목록 조회 @GetMapping - public ResponseEntity> getHubRoutes( + public ResponseEntity> getHubRoutes( @PageableDefault(page = 0, size = 10, sort = "createdAt") Pageable pageable){ - Page responses = hubRouteService.getHubRoutes(pageable); + Page responses = hubRouteService.getHubRoutes(pageable); return ResponseEntity.ok(responses); } // 특정 경로 ID 조회 @GetMapping("/{hub_route_id}") - public ResponseEntity getHubRoute(@PathVariable("hub_route_id") UUID hubRouteId) { - HubRouteResponse response = hubRouteService.getHubRoute(hubRouteId); + public ResponseEntity getHubRoute(@PathVariable("hub_route_id") UUID hubRouteId) { + HubRouteResponseDto response = hubRouteService.getHubRoute(hubRouteId); return ResponseEntity.ok(response); } - // 특정 출발 허브 → 도착 허브 경로 조회 + // 특정 출발 허브 → 도착 허브 경로 조회 (direct) @GetMapping("/{from_hub_id}/{to_hub_id}") - public ResponseEntity getHubRoute( + public ResponseEntity getDirectHubRoute( @PathVariable("from_hub_id") String fromHubId, @PathVariable("to_hub_id") String toHubId) { - HubRouteResponse response = hubRouteService.getHubRouteFromHubToHub(UUID.fromString(fromHubId), UUID.fromString(toHubId)); + HubRouteResponseDto response = hubRouteService.getDirectHubRoute(UUID.fromString(fromHubId), UUID.fromString(toHubId)); return ResponseEntity.ok(response); } - // (정해진) 허브 간 경로 생성 - // Todo : 더미데이터 필요 (추후 중요한 경로만 주기적으로 naver api 실시간 거리 및 시간 반영 고려) + // (정해진) 허브 간 경로 생성 (direct) + // Todo : 더미데이터 필요 @PostMapping("/{from_hub_id}/{to_hub_id}") - public ResponseEntity createHubRoute( + public ResponseEntity createDirectHubRoute( @PathVariable("from_hub_id") String fromHubId, @PathVariable("to_hub_id") String toHubId, @RequestParam Long userId) { - HubRouteCreateResponse response = hubRouteService.createHubRoute(userId, UUID.fromString(fromHubId), UUID.fromString(toHubId)); + HubRouteCreateResponseDto response = hubRouteService.createDirectHubRoute(userId, UUID.fromString(fromHubId), UUID.fromString(toHubId)); return ResponseEntity.ok(response); } // 허브 간 경로 정보 삭제 @DeleteMapping("/{hub_route_id}") - public ResponseEntity deleteHubRoute( + public ResponseEntity deleteHubRoute( @PathVariable("hub_route_id") String hubRouteId, @RequestParam Long userId) { - HubRouteDeleteResponse response = hubRouteService.deleteHubRoute(UUID.fromString(hubRouteId), userId); + HubRouteDeleteResponseDto response = hubRouteService.deleteHubRoute(UUID.fromString(hubRouteId), userId); return ResponseEntity.ok(response); } + // form -> to 최단경로 생성 + @PostMapping("/{from_hub_id}/{to_hub_id}") + public ResponseEntity createPathHubRoute( + @PathVariable("from_hub_id") String fromHubId, + @PathVariable("to_hub_id") String toHubId, + @RequestParam Long userId + ){ + HubRouteDetailsResponseDto response = hubRouteService.createPathHubRoute(UUID.fromString(fromHubId), UUID.fromString(toHubId), userId); + return ResponseEntity.ok(response); + } + + // fromHub -> toHub 최단 경로 시퀀스 조회 + } From 61695004afc3c2f2b7d88696e845cf6f3f8fdb18 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sat, 22 Mar 2025 22:35:36 +0900 Subject: [PATCH 192/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20Class=20?= =?UTF-8?q?=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...outeCreateResponse.java => HubRouteCreateResponseDto.java} | 4 ++-- ...outeDeleteResponse.java => HubRouteDeleteResponseDto.java} | 4 ++-- .../{HubRouteResponse.java => HubRouteResponseDto.java} | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) rename hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/{HubRouteCreateResponse.java => HubRouteCreateResponseDto.java} (88%) rename hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/{HubRouteDeleteResponse.java => HubRouteDeleteResponseDto.java} (72%) rename hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/{HubRouteResponse.java => HubRouteResponseDto.java} (89%) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteCreateResponse.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteCreateResponseDto.java similarity index 88% rename from hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteCreateResponse.java rename to hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteCreateResponseDto.java index f4640e5..ca011bd 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteCreateResponse.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteCreateResponseDto.java @@ -10,7 +10,7 @@ @Getter @Builder @AllArgsConstructor -public class HubRouteCreateResponse { +public class HubRouteCreateResponseDto { private final UUID hubRouteId; private final UUID fromHubId; @@ -18,7 +18,7 @@ public class HubRouteCreateResponse { private final int duration; private final BigDecimal distance; - public HubRouteCreateResponse(HubRoute hubRoute) { + public HubRouteCreateResponseDto(HubRoute hubRoute) { this.hubRouteId = hubRoute.getHubRouteId(); this.fromHubId = hubRoute.getFromHub().getHubId(); this.toHubId = hubRoute.getToHub().getHubId(); diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDeleteResponse.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDeleteResponseDto.java similarity index 72% rename from hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDeleteResponse.java rename to hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDeleteResponseDto.java index 3dc77ca..7d3290c 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDeleteResponse.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDeleteResponseDto.java @@ -7,12 +7,12 @@ @Builder @Getter -public class HubRouteDeleteResponse { +public class HubRouteDeleteResponseDto { private final UUID hub_route_id; private final String message; - public HubRouteDeleteResponse(UUID hub_route_id, String message) { + public HubRouteDeleteResponseDto(UUID hub_route_id, String message) { this.hub_route_id = hub_route_id; this.message = message; } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteResponse.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteResponseDto.java similarity index 89% rename from hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteResponse.java rename to hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteResponseDto.java index 3dd0f57..1db952a 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteResponse.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteResponseDto.java @@ -10,7 +10,7 @@ @Getter @Builder @AllArgsConstructor -public class HubRouteResponse { +public class HubRouteResponseDto { private final UUID routeId; private final UUID fromHubId; @@ -18,7 +18,7 @@ public class HubRouteResponse { private final int duration; private final BigDecimal distance; - public HubRouteResponse(HubRoute hubRoute) { + public HubRouteResponseDto(HubRoute hubRoute) { this.routeId = hubRoute.getHubRouteId(); this.fromHubId = hubRoute.getFromHub().getHubId(); this.toHubId = hubRoute.getToHub().getHubId(); From 4d2a5f1dc47e11951d67e57b30a52d3ae44c9e72 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sat, 22 Mar 2025 22:38:19 +0900 Subject: [PATCH 193/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EB=B9=8C?= =?UTF-8?q?=EB=8D=94=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hubservice/hub_route/domain/model/HubRouteCheckpoint.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRouteCheckpoint.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRouteCheckpoint.java index 0a78c71..b1e1610 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRouteCheckpoint.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRouteCheckpoint.java @@ -12,6 +12,7 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import java.util.UUID; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -37,6 +38,7 @@ public class HubRouteCheckpoint extends BaseEntity { @Column(nullable = false) private int sequence; + @Builder public HubRouteCheckpoint(HubRoute hubRoute, Hub checkpointHub, int sequence, long userId) { super(userId); this.hubRouteId = hubRoute; From d864b6eb4635f694771d1093d1b4d75d9c84374d Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sat, 22 Mar 2025 22:38:38 +0900 Subject: [PATCH 194/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20Repository=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hubservice/hub/domain/repository/HubRepository.java | 2 ++ .../hub_route/domain/repository/HubRouteRepository.java | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java index 5049676..2bd08db 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java @@ -1,6 +1,7 @@ package com.sparta.hubservice.hub.domain.repository; import com.sparta.hubservice.hub.domain.model.Hub; +import java.util.List; import java.util.Optional; import java.util.UUID; import org.springframework.data.domain.Page; @@ -13,4 +14,5 @@ public interface HubRepository { S save(S hub); + Optional> findAll(); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java index 850ec1f..47cd530 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java @@ -1,6 +1,8 @@ package com.sparta.hubservice.hub_route.domain.repository; +import com.sparta.hubservice.hub.domain.model.Hub; import com.sparta.hubservice.hub_route.domain.model.HubRoute; +import java.util.List; import java.util.Optional; import java.util.UUID; import org.springframework.data.domain.Page; @@ -12,9 +14,13 @@ public interface HubRouteRepository { Optional findByHubRouteIdAndIsDeletedFalse(UUID hubRouteId); - Optional save(HubRoute saveHubRoute); + S save(S hubRoute); Optional> findAllByIsDeletedFalse(Pageable pageable); Optional findById(java.util.UUID hubRouteId); + + Optional> findByFromHub(Hub hub); + + Optional findByFromHubAndToHub(Hub fromHub, Hub toHub); } From a4bc88fced9a0be1685213d92c2a5b3546cbb82f Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sat, 22 Mar 2025 22:39:51 +0900 Subject: [PATCH 195/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20from->=20to=20?= =?UTF-8?q?=ED=97=88=EB=B8=8C=20=EC=B5=9C=EB=8B=A8=20=EA=B2=BD=EB=A1=9C=20?= =?UTF-8?q?=EB=AA=A8=EB=93=A0=20=EC=A0=95=EB=B3=B4=20Dto=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20-=20HubRoute=20=ED=8F=AC=ED=95=A8=20-=20List=20=ED=8F=AC=ED=95=A8=20(=EA=B2=BD=EC=9C=A0?= =?UTF-8?q?=EC=A7=80=20=EC=A0=95=EB=B3=B4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/HubRouteDetailsResponseDto.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDetailsResponseDto.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDetailsResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDetailsResponseDto.java new file mode 100644 index 0000000..0a4550f --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDetailsResponseDto.java @@ -0,0 +1,18 @@ +package com.sparta.hubservice.hub_route.application.dto.response; + +import com.sparta.hubservice.hub_route.domain.model.HubRoute; +import com.sparta.hubservice.hub_route.domain.model.HubRouteCheckpoint; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor +public class HubRouteDetailsResponseDto { + + private final HubRoute hubRoute; + private final List checkpointList; + +} From c934c3d4f4f5e2f255cd446f8a820c256f98fd85 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sat, 22 Mar 2025 22:40:14 +0900 Subject: [PATCH 196/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20Repository=20sav?= =?UTF-8?q?eAll=20=EB=A9=94=EC=84=9C=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 --- .../domain/repository/HubRouteCheckpointRepository.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java index 7d743bb..6c295e7 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java @@ -7,4 +7,6 @@ public interface HubRouteCheckpointRepository { List findAllByHubRouteId(UUID hubRouteId); + + void saveAll(List checkpointList); } From 945f9962d7ebce460d95b4c538fbc24a01ea749c Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Sat, 22 Mar 2025 22:41:07 +0900 Subject: [PATCH 197/389] =?UTF-8?q?=E2=9C=A8feat=20[#136]=20:=20Shipping?= =?UTF-8?q?=20Log=20=EC=A0=84=EC=B2=B4=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ShippingRouteService.java | 25 ------------------- .../application/service/ShippingService.java | 19 ++++++++++++-- .../presentation/ShippingController.java | 6 +++++ 3 files changed, 23 insertions(+), 27 deletions(-) delete mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingRouteService.java diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingRouteService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingRouteService.java deleted file mode 100644 index a049069..0000000 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingRouteService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.sparta.shippingservice.application.service; - -import com.sparta.shippingservice.application.dto.request.CreateRouteLogRequestDto; -import com.sparta.shippingservice.application.dto.response.ShippingRouteResponseDto; -import com.sparta.shippingservice.domain.model.ShippingRouteLog; -import com.sparta.shippingservice.domain.repository.ShippingRouteRepository; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -public class ShippingRouteService { - private final ShippingRouteRepository shippingRouteRepository; - - - @Transactional - public ShippingRouteResponseDto create(@Valid CreateRouteLogRequestDto request) { - ShippingRouteLog shippingRouteLog = request.of().toShippingRouteLog(); - shippingRouteRepository.save(shippingRouteLog); - return ShippingRouteResponseDto.from(shippingRouteLog); - } - -} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java index 1de4184..323101b 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -100,8 +100,23 @@ public ShippingRouteResponseDto getLogById(UUID shippingId, UUID shippingLogId){ } - - + @Transactional(readOnly = true) + public List getLogAll(){ + List result = shippingRouteRepository.findAll(); + return result.stream() + .map(shippingRouteLog->new ShippingRouteResponseDto( + shippingRouteLog.getId(), + shippingRouteLog.getStartHubId(), + shippingRouteLog.getEndHubId(), + shippingRouteLog.getSequence(), + shippingRouteLog.getEstimatedDistance(), + shippingRouteLog.getActualTime(), + shippingRouteLog.getActualDistance(), + shippingRouteLog.getEstimatedTime(), + shippingRouteLog.getShippingManagerId() + + )).collect(Collectors.toList()); + } private Shipping findShipping(UUID shippingId) { Shipping shipping = shippingRepository.findById(shippingId).orElseThrow( diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index de12bcb..13f99e8 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -6,6 +6,7 @@ import com.sparta.shippingservice.application.dto.response.ShippingRouteResponseDto; import com.sparta.shippingservice.application.dto.response.ShippingWithRouteResponseDto; import com.sparta.shippingservice.application.service.ShippingService; + import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -59,5 +60,10 @@ public ResponseEntity getLogById(@PathVariable("shippi return ResponseEntity.ok(responseDto); } + @GetMapping("/log") + public ResponseEntity> getAllLog() { + List allLog = shippingService.getLogAll(); + return ResponseEntity.ok(allLog); + } } From 1d95ddf2bcf412f2dc502a4afd8aa7b08ef13c84 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sat, 22 Mar 2025 23:00:16 +0900 Subject: [PATCH 198/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20:=20Lis?= =?UTF-8?q?t,=20Page=20=ED=83=80=EC=9E=85=20Optional=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sparta/hubservice/hub/application/service/HubService.java | 3 +-- .../hubservice/hub/domain/repository/HubRepository.java | 4 ++-- .../hub_route/application/dijkstra/PathCalculate.java | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java index bf630d1..69e7220 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java @@ -31,8 +31,7 @@ public class HubService { // 허브 목록 조회 @Transactional(readOnly = true) public Page getHubs(Pageable pageable) { - Page hubPages = hubRepository.findByIsDeletedFalse(pageable) - .orElseThrow(ResourceNotFoundException::new); + Page hubPages = hubRepository.findByIsDeletedFalse(pageable); return hubPages.map(HubResponseDto::new); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java index 2bd08db..c75e2e2 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java @@ -8,11 +8,11 @@ import org.springframework.data.domain.Pageable; public interface HubRepository { - Optional> findByIsDeletedFalse(Pageable pageable); + Page findByIsDeletedFalse(Pageable pageable); Optional findById(UUID hubId); S save(S hub); - Optional> findAll(); + List findAll(); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java index 5940523..f36ccfa 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java @@ -26,7 +26,7 @@ public List getShortPath(Hub fromHub, Hub toHub, Long userId) { // 그래프 정의 Map> graph = new HashMap<>(); - List hubs = hubRepository.findAll().orElseThrow(ResourceNotFoundException::new); + List hubs = hubRepository.findAll(); for(Hub hub : hubs){ List routes = hubRouteRepository.findByFromHub(hub) .orElseThrow(ResourceNotFoundException::new); From 07aa7a35041be769f864907a6ecc2c1967bbdceb Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sat, 22 Mar 2025 23:01:34 +0900 Subject: [PATCH 199/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20:=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=80=20?= =?UTF-8?q?=EB=A7=A4=EA=B0=9C=EB=B3=80=EC=88=98=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub_route/application/dijkstra/PathCalculate.java | 2 +- .../hub_route/application/service/HubRouteService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java index f36ccfa..99662a4 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java @@ -22,7 +22,7 @@ public class PathCalculate { private final HubRouteRepository hubRouteRepository; private final HubRepository hubRepository; - public List getShortPath(Hub fromHub, Hub toHub, Long userId) { + public List getShortPath(Hub fromHub, Hub toHub) { // 그래프 정의 Map> graph = new HashMap<>(); diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java index 64db48c..fcf58f5 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java @@ -94,7 +94,7 @@ public HubRouteDetailsResponseDto createPathHubRoute(UUID fromHubId, UUID toHubI Hub fromHub = hubRepository.findById(fromHubId).orElseThrow(ResourceNotFoundException::new); Hub toHub = hubRepository.findById(toHubId).orElseThrow(ResourceNotFoundException::new); - List shortPath = pathCalculate.getShortPath(fromHub, toHub, userId); + List shortPath = pathCalculate.getShortPath(fromHub, toHub); PathValueDto vlaues = pathCalculate.getValue(shortPath); if(hubRouteRepository.findByFromHubAndToHub(fromHub, toHub).isPresent()){ From 8edad4989952e929524497a8b7b141c3d4440580 Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Sun, 23 Mar 2025 01:22:02 +0900 Subject: [PATCH 200/389] =?UTF-8?q?=E2=9C=A8feat=20[#140]=20:=20Shipping?= =?UTF-8?q?=20ShippingLog=20=EC=96=91=EB=B0=A9=ED=96=A5=20=EB=A7=A4?= =?UTF-8?q?=ED=95=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/CreateRouteLogRequestDto.java | 3 +-- .../dto/request/CreateShippingRequestDto.java | 2 +- .../dto/request/UpdateShippingRequestDto.java | 3 +-- .../application/service/ShippingService.java | 10 ++++++++-- .../sparta/shippingservice/domain/model/Shipping.java | 5 +++++ .../domain/model/{ => trans}/RouteLogSelf.java | 2 +- .../domain/model/{ => trans}/ShippingSelf.java | 5 ++++- .../presentation/ShippingController.java | 2 ++ 8 files changed, 23 insertions(+), 9 deletions(-) rename shipping-service/src/main/java/com/sparta/shippingservice/domain/model/{ => trans}/RouteLogSelf.java (94%) rename shipping-service/src/main/java/com/sparta/shippingservice/domain/model/{ => trans}/ShippingSelf.java (75%) diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateRouteLogRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateRouteLogRequestDto.java index 2128a3b..2e3aa1d 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateRouteLogRequestDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateRouteLogRequestDto.java @@ -1,8 +1,7 @@ package com.sparta.shippingservice.application.dto.request; -import com.sparta.shippingservice.domain.model.RouteLogSelf; +import com.sparta.shippingservice.domain.model.trans.RouteLogSelf; import com.sparta.shippingservice.domain.model.Shipping; -import jakarta.validation.constraints.Digits; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java index e576e3a..4a5fec0 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java @@ -1,6 +1,6 @@ package com.sparta.shippingservice.application.dto.request; -import com.sparta.shippingservice.domain.model.ShippingSelf; +import com.sparta.shippingservice.domain.model.trans.ShippingSelf; import com.sparta.shippingservice.domain.model.ShippingStatus; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/UpdateShippingRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/UpdateShippingRequestDto.java index f796431..9072449 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/UpdateShippingRequestDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/UpdateShippingRequestDto.java @@ -1,9 +1,8 @@ package com.sparta.shippingservice.application.dto.request; -import com.sparta.shippingservice.domain.model.ShippingSelf; +import com.sparta.shippingservice.domain.model.trans.ShippingSelf; import com.sparta.shippingservice.domain.model.ShippingStatus; -import java.util.Optional; import java.util.UUID; diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java index 323101b..ea4cbe9 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -7,6 +7,7 @@ import com.sparta.shippingservice.application.dto.response.ShippingRouteResponseDto; import com.sparta.shippingservice.application.dto.response.ShippingWithRouteResponseDto; import com.sparta.shippingservice.domain.model.*; +import com.sparta.shippingservice.domain.model.trans.RouteLogSelf; import com.sparta.shippingservice.domain.repository.ShippingRepository; import com.sparta.commonmodule.exception.*; @@ -32,7 +33,7 @@ public class ShippingService { @Transactional public ShippingWithRouteResponseDto create(@Valid CreateShippingRequestDto request , @Valid CreateRouteLogRequestDto logDto) { Shipping shipping = request.of().toShipping(); - shippingRepository.save(shipping); //DB 저장 + RouteLogSelf routeLogSelf = new RouteLogSelf( shipping, logDto.startHubId(), @@ -46,7 +47,12 @@ public ShippingWithRouteResponseDto create(@Valid CreateShippingRequestDto reque ); ShippingRouteLog routeLog = routeLogSelf.toShippingRouteLog(); - shippingRouteRepository.save(routeLog); + + // 양방향 연관관계 설정 + routeLog.setShipping(shipping); + shipping.getRouteLogs().add(routeLog); + + shippingRepository.save(shipping); return ShippingWithRouteResponseDto.from(shipping,routeLog); } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java index 4fbb1a5..4f93aad 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java @@ -4,6 +4,8 @@ import jakarta.persistence.*; import lombok.*; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; @Entity @@ -29,6 +31,9 @@ public class Shipping extends BaseEntity { @Column(name = "shipping_manager_id", nullable = false) private UUID shippingManagerId; + @OneToMany(mappedBy = "shipping",cascade = CascadeType.PERSIST) + private List routeLogs = new ArrayList<>(); + @Enumerated(EnumType.STRING) @Column(name = "status", nullable = false, length = 50) private ShippingStatus status = ShippingStatus.PENDING; // 기본값 설정 diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/RouteLogSelf.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/RouteLogSelf.java similarity index 94% rename from shipping-service/src/main/java/com/sparta/shippingservice/domain/model/RouteLogSelf.java rename to shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/RouteLogSelf.java index 7156712..2c678e5 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/RouteLogSelf.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/RouteLogSelf.java @@ -1,4 +1,4 @@ -package com.sparta.shippingservice.domain.model; +package com.sparta.shippingservice.domain.model.trans; import com.sparta.shippingservice.domain.model.Shipping; import com.sparta.shippingservice.domain.model.ShippingRouteLog; diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingSelf.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/ShippingSelf.java similarity index 75% rename from shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingSelf.java rename to shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/ShippingSelf.java index d613cf8..d22343d 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingSelf.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/ShippingSelf.java @@ -1,4 +1,7 @@ -package com.sparta.shippingservice.domain.model; +package com.sparta.shippingservice.domain.model.trans; + +import com.sparta.shippingservice.domain.model.Shipping; +import com.sparta.shippingservice.domain.model.ShippingStatus; import java.util.UUID; diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index 13f99e8..7ad07ad 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -66,4 +66,6 @@ public ResponseEntity> getAllLog() { return ResponseEntity.ok(allLog); } +// +// @DeleteMapping("{}") } From 6955d99563b0a20ea48d2c82f730a2ede25006cc Mon Sep 17 00:00:00 2001 From: devdaeun Date: Sun, 23 Mar 2025 01:26:37 +0900 Subject: [PATCH 201/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#130]=20:=20Slack?= =?UTF-8?q?=20Crud=20=EC=9E=91=EC=84=B1=20-=20=EC=8A=AC=EB=9E=99=20?= =?UTF-8?q?=EB=A9=94=EC=84=B8=EC=A7=80=20CRUD=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=EB=A5=BC=20=EA=B5=AC=ED=98=84=ED=96=88=EC=8A=B5?= =?UTF-8?q?=EB=8B=88=EB=8B=A4=20-=20=EC=8A=AC=EB=9E=99=20API=EC=99=80=20?= =?UTF-8?q?=EC=97=B0=EB=8F=99=ED=95=98=EC=97=AC=20=EB=A9=94=EC=84=B8?= =?UTF-8?q?=EC=A7=80=20=EC=A0=84=EC=86=A1=EC=9D=B4=20=EA=B0=80=EB=8A=A5?= =?UTF-8?q?=ED=95=B4=EC=A1=8C=EC=8A=B5=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- slack-service/build.gradle | 2 + .../application/dto/SlackRequestDto.java | 21 +++++++ .../application/dto/SlackResponseDto.java | 27 +++++++++ .../application/service/SlackService.java | 58 +++++++++++++++++++ .../service/SlackWebhookService.java | 36 ++++++++++++ .../slackservice/domain/model/Slack.java | 56 ++++++++++++++++++ .../domain/repository/SlackRepository.java | 4 ++ .../infastructure/JpaSlackRepository.java | 11 ++++ .../presentation/SlackController.java | 49 +++++++++++++--- .../src/main/resources/application.yml | 6 +- user-service/docker-compose.yml | 18 ------ 11 files changed, 261 insertions(+), 27 deletions(-) create mode 100644 slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackRequestDto.java create mode 100644 slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackResponseDto.java create mode 100644 slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java create mode 100644 slack-service/src/main/java/com/sparta/slackservice/application/service/SlackWebhookService.java create mode 100644 slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java create mode 100644 slack-service/src/main/java/com/sparta/slackservice/domain/repository/SlackRepository.java create mode 100644 slack-service/src/main/java/com/sparta/slackservice/infastructure/JpaSlackRepository.java diff --git a/slack-service/build.gradle b/slack-service/build.gradle index 8d3e8c9..5ed7532 100644 --- a/slack-service/build.gradle +++ b/slack-service/build.gradle @@ -6,6 +6,8 @@ ext { dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'com.slack.api:slack-api-client:1.43.0' + runtimeOnly 'org.postgresql:postgresql' implementation project(':common-module') } diff --git a/slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackRequestDto.java b/slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackRequestDto.java new file mode 100644 index 0000000..686c183 --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackRequestDto.java @@ -0,0 +1,21 @@ +package com.sparta.slackservice.application.dto; + +import com.sparta.slackservice.domain.model.Slack; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class SlackRequestDto { + private String message; + private Long receiverId; + + + public Slack createSlack(String slack_name) { + return Slack.builder() + .slackName(slack_name) + .message(message) + .receiverId(receiverId) + .build(); + } +} diff --git a/slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackResponseDto.java b/slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackResponseDto.java new file mode 100644 index 0000000..129be78 --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackResponseDto.java @@ -0,0 +1,27 @@ +package com.sparta.slackservice.application.dto; + +import com.sparta.slackservice.domain.model.Slack; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Getter +@AllArgsConstructor +public class SlackResponseDto { + private UUID slackId; + private String slackName; + private String message; + private LocalDateTime sendedAt; + private boolean sendingStatus; + + + public SlackResponseDto(Slack slack) { + this.slackId = slack.getId(); + this.slackName = slack.getSlackName(); + this.message = slack.getMessage(); + this.sendedAt = slack.getSendedAt(); + this.sendingStatus = slack.isSendingStatus(); + } +} diff --git a/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java b/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java new file mode 100644 index 0000000..4d8a1b1 --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java @@ -0,0 +1,58 @@ +package com.sparta.slackservice.application.service; + +import com.sparta.slackservice.application.dto.SlackRequestDto; +import com.sparta.slackservice.application.dto.SlackResponseDto; +import com.sparta.slackservice.domain.model.Slack; +import com.sparta.slackservice.infastructure.JpaSlackRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.UUID; + +@Service +@RequiredArgsConstructor +@Transactional +public class SlackService { + + private final JpaSlackRepository slackRepository; + private final SlackWebhookService slackWebhookService; + + //슬랙 메세지 생성 + public SlackResponseDto createSlack(String slack_name, SlackRequestDto requestDto) { + Slack slack = slackRepository.save(requestDto.createSlack(slack_name)); + return new SlackResponseDto(slack); + } + + //메세지 전송 + public void sendSlack(UUID slackId) { + Slack slack = findingSlack(slackId); + slack.changeStatus(); + slackWebhookService.sendMessage(slack.getMessage()); + } + + //메세지 조회(단건) + @Transactional(readOnly = true) + public Slack getSlack(UUID slackId) { + return findingSlack(slackId); + } + + //메세지 수정 + public SlackResponseDto modifySlack(UUID slackId, SlackRequestDto requestDto) { + Slack slack = findingSlack(slackId); + slack.modifySlack(requestDto); + return new SlackResponseDto(slack); + } + + //메세지 삭제 + public void deleteSlack(UUID slackId, Long userId) { + Slack slack = findingSlack(slackId); + slack.delete(userId); + } + + private Slack findingSlack(UUID slackId) { + return slackRepository.findById(slackId).orElseThrow(() -> new RuntimeException("Slack not found")); + } + + +} diff --git a/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackWebhookService.java b/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackWebhookService.java new file mode 100644 index 0000000..13c22cc --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackWebhookService.java @@ -0,0 +1,36 @@ +package com.sparta.slackservice.application.service; + + +import com.slack.api.Slack; +import com.slack.api.webhook.Payload; +import com.slack.api.webhook.WebhookResponse; +import com.sparta.slackservice.infastructure.JpaSlackRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.IOException; + +@Service +@RequiredArgsConstructor +public class SlackWebhookService {//슬랙 api 메세지 전송 서비스 + @Value("${slack.webhook.url}") + private String slackWebhookUrl; //알림을 전송할 url + + private final Slack slack = Slack.getInstance(); + + private final JpaSlackRepository slackRepository; + + public WebhookResponse sendMessage(String message) { + Payload payload = Payload.builder().text(message).build(); + // WebhookResponse(code=200, message=OK, body=ok) + WebhookResponse response; + try { + response = slack.send(slackWebhookUrl, payload); + System.out.println(response); + return response; + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java b/slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java new file mode 100644 index 0000000..05a5291 --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java @@ -0,0 +1,56 @@ +package com.sparta.slackservice.domain.model; + +import com.sparta.commonmodule.entity.BaseEntity; +import com.sparta.slackservice.application.dto.SlackRequestDto; +import jakarta.persistence.*; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.Optional; +import java.util.UUID; + +@Entity +@Getter +@NoArgsConstructor +public class Slack extends BaseEntity { + + @Id + @Column(name = "slack_id", nullable = false) + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; + + @Column(name = "slack_name", nullable = false) + private String slackName; + + @Column(nullable = false) + private String message; + + @Column(name = "receiver_id", nullable = false) + private Long receiverId; + + @Column(name = "sended_at") + private LocalDateTime sendedAt; + + @Column(name = "sending_status") + private boolean sendingStatus = false; //기본 true? false? + + @Builder + public Slack(String slackName, String message, Long receiverId) { + this.slackName = slackName; + this.message = message; + this.receiverId = receiverId; + } + + public void changeStatus() { + this.sendingStatus = true; + this.sendedAt = LocalDateTime.now(); + } + + public void modifySlack(SlackRequestDto requestDto) { + Optional.ofNullable(requestDto.getMessage()).ifPresent(message -> this.message = message); + Optional.ofNullable(requestDto.getReceiverId()).ifPresent(receiverId -> this.receiverId = receiverId); + } + +} diff --git a/slack-service/src/main/java/com/sparta/slackservice/domain/repository/SlackRepository.java b/slack-service/src/main/java/com/sparta/slackservice/domain/repository/SlackRepository.java new file mode 100644 index 0000000..5bffbf6 --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/domain/repository/SlackRepository.java @@ -0,0 +1,4 @@ +package com.sparta.slackservice.domain.repository; + +public interface SlackRepository { +} diff --git a/slack-service/src/main/java/com/sparta/slackservice/infastructure/JpaSlackRepository.java b/slack-service/src/main/java/com/sparta/slackservice/infastructure/JpaSlackRepository.java new file mode 100644 index 0000000..f2a0d93 --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/infastructure/JpaSlackRepository.java @@ -0,0 +1,11 @@ +package com.sparta.slackservice.infastructure; +import com.sparta.slackservice.domain.model.Slack; +import com.sparta.slackservice.domain.repository.SlackRepository; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + +@Repository +public interface JpaSlackRepository extends JpaRepository, SlackRepository { +} diff --git a/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java b/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java index 4aa7c37..12f2edf 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java +++ b/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java @@ -1,17 +1,50 @@ package com.sparta.slackservice.presentation; -import com.sparta.commonmodule.aop.RoleCheck; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import com.sparta.slackservice.application.dto.SlackRequestDto; +import com.sparta.slackservice.application.dto.SlackResponseDto; +import com.sparta.slackservice.application.service.SlackService; +import com.sparta.slackservice.application.service.SlackWebhookService; +import com.sparta.slackservice.domain.model.Slack; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.UUID; @RestController @RequestMapping("/api/v1/slacks") +@RequiredArgsConstructor public class SlackController { - @RoleCheck("ROLE_MASTER,ROLE_COMPANY") - @GetMapping("/test") - public String getSlack() { - return "Hello World"; + private final SlackService slackService; + private final SlackWebhookService slackWebhookService; + + @PostMapping("/create") + public ResponseEntity createSlack(@RequestHeader("slack_name") String slack_name, @RequestBody SlackRequestDto requestDto) { + return ResponseEntity.ok(slackService.createSlack(slack_name, requestDto)); + } + + @GetMapping("/send/{id}") + public ResponseEntity sendSlack(@PathVariable("id") UUID slackId) { + slackService.sendSlack(slackId); + return ResponseEntity.ok("전송성공"); + } + + @GetMapping("{id}") + public ResponseEntity getSlack(@PathVariable("id") UUID slackId) { + return ResponseEntity.ok(slackService.getSlack(slackId)); } + + @PutMapping("/modify/{id}") + public ResponseEntity modifySlack(@PathVariable("id") UUID slackId, @RequestBody SlackRequestDto requestDto) { + slackService.modifySlack(slackId, requestDto); + return ResponseEntity.ok().build(); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteSlack(@PathVariable("id") UUID slackId, @RequestHeader("user_id") Long userId) { + slackService.deleteSlack(slackId, userId); + return ResponseEntity.noContent().build();//삭제 id, 메세지 출력 + } + } diff --git a/slack-service/src/main/resources/application.yml b/slack-service/src/main/resources/application.yml index ce6a6e9..adf89e0 100644 --- a/slack-service/src/main/resources/application.yml +++ b/slack-service/src/main/resources/application.yml @@ -11,4 +11,8 @@ eureka: register-with-eureka: true # Eureka? ??? ?? fetch-registry: true # Eureka?? ??? ?? ???? service-url: - defaultZone: http://localhost:8761/eureka/ \ No newline at end of file + defaultZone: http://localhost:8761/eureka/ + +slack: + webhook: + url: https://hooks.slack.com/services/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 \ No newline at end of file diff --git a/user-service/docker-compose.yml b/user-service/docker-compose.yml index 7b8cd98..096c630 100644 --- a/user-service/docker-compose.yml +++ b/user-service/docker-compose.yml @@ -13,24 +13,6 @@ services: - postgres_data:/var/lib/postgresql/data # 데이터가 유지될 경로 networks: - user-network # user 서비스와만 연결될 네트워크 - -# # User 서비스 -# user-service: -# build: -# context: . # user 서브모듈의 디렉토리 -# dockerfile: Dockerfile # Dockerfile 경로 -# container_name: user-service-submodule -# ports: -# - "8001:8080" # 외부에서 접속할 포트 -# environment: -# - SPRING_DATASOURCE_URL=jdbc:postgresql://postgres_user:5001/user_db # PostgreSQL DB 연결 -# - SPRING_DATASOURCE_USERNAME=postgres_user # DB 사용자명 -# - SPRING_DATASOURCE_PASSWORD=12345 # DB 비밀번호 -# networks: -# - user-network # user 서비스가 PostgreSQL과 연결될 네트워크 -# depends_on: -# - postgres # PostgreSQL이 먼저 실행되어야 함 - networks: user-network: driver: bridge # user 서비스와 PostgreSQL만 연결될 네트워크 From 1825c0be8069b8dd3029f5f1c52d305f3bcf9056 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 01:28:04 +0900 Subject: [PATCH 202/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20fromHub=20->=20t?= =?UTF-8?q?oHub=20=EC=B5=9C=EB=8B=A8=20=EA=B2=BD=EB=A1=9C=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20api=20=EA=B5=AC=ED=98=84=20-?= =?UTF-8?q?=20*=20direct=EB=8A=94=20=ED=95=AD=EC=83=81=20=EC=B5=9C?= =?UTF-8?q?=EB=8B=A8=20=EA=B2=BD=EB=A1=9C=EB=9D=BC=EB=8A=94=20=EA=B0=80?= =?UTF-8?q?=EC=A0=95=EC=9D=B4=20=EB=B6=99=EC=8A=B5=EB=8B=88=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/HubRouteService.java | 18 +++++++++++- .../HubRouteCheckpointRepository.java | 3 ++ .../controller/HubRouteController.java | 28 +++++++++++++------ 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java index fcf58f5..024ecbe 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Optional; import java.util.UUID; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -97,6 +98,7 @@ public HubRouteDetailsResponseDto createPathHubRoute(UUID fromHubId, UUID toHubI List shortPath = pathCalculate.getShortPath(fromHub, toHub); PathValueDto vlaues = pathCalculate.getValue(shortPath); + // 다이렉트는 이미 최단 경로 -> 이미 route 정보가 있다면 패스 if(hubRouteRepository.findByFromHubAndToHub(fromHub, toHub).isPresent()){ throw new EntityExistsException("Hub route already exists"); } @@ -119,7 +121,21 @@ public HubRouteDetailsResponseDto createPathHubRoute(UUID fromHubId, UUID toHubI return new HubRouteDetailsResponseDto(route, checkpointList); } - // fromHub -> toHub 최단 경로 시퀀스 조회 + // fromHub -> toHub 최단 경로 정보 조회 + @Transactional(readOnly = true) + public HubRouteDetailsResponseDto getPathHubRoute(UUID fromHubId, UUID toHubId) { + Hub fromHub = hubRepository.findById(fromHubId).orElseThrow(ResourceNotFoundException::new); + Hub toHub = hubRepository.findById(toHubId).orElseThrow(ResourceNotFoundException::new); + + HubRoute route = hubRouteRepository.findByFromHubAndToHub(fromHub, toHub) + .orElseThrow(ResourceNotFoundException::new); + + List checkpointList = + checkpointRepository.findAllByHubRouteIdOrderBySequenceAsc(route.getHubRouteId()); + + return new HubRouteDetailsResponseDto(route, checkpointList); + } + } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java index 6c295e7..000a687 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java @@ -1,5 +1,6 @@ package com.sparta.hubservice.hub_route.domain.repository; +import com.sparta.hubservice.hub_route.domain.model.HubRoute; import com.sparta.hubservice.hub_route.domain.model.HubRouteCheckpoint; import java.util.List; import java.util.UUID; @@ -9,4 +10,6 @@ public interface HubRouteCheckpointRepository { List findAllByHubRouteId(UUID hubRouteId); void saveAll(List checkpointList); + + List findAllByHubRouteIdOrderBySequenceAsc(UUID hubRouteId); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java index 69530e5..0dc9772 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java @@ -27,7 +27,7 @@ public class HubRouteController { private final HubRouteService hubRouteService; - // 전체 허브 간 경로 목록 조회 + // 전체 허브 간 경로 목록 조회 (direct) @GetMapping public ResponseEntity> getHubRoutes( @PageableDefault(page = 0, size = 10, sort = "createdAt") Pageable pageable){ @@ -43,7 +43,7 @@ public ResponseEntity getHubRoute(@PathVariable("hub_route_ } // 특정 출발 허브 → 도착 허브 경로 조회 (direct) - @GetMapping("/{from_hub_id}/{to_hub_id}") + @GetMapping("/{from_hub_id}/{to_hub_id}/direct") public ResponseEntity getDirectHubRoute( @PathVariable("from_hub_id") String fromHubId, @PathVariable("to_hub_id") String toHubId) { @@ -53,12 +53,13 @@ public ResponseEntity getDirectHubRoute( // (정해진) 허브 간 경로 생성 (direct) // Todo : 더미데이터 필요 - @PostMapping("/{from_hub_id}/{to_hub_id}") + @PostMapping("/{from_hub_id}/{to_hub_id}/direct") public ResponseEntity createDirectHubRoute( @PathVariable("from_hub_id") String fromHubId, @PathVariable("to_hub_id") String toHubId, @RequestParam Long userId) { - HubRouteCreateResponseDto response = hubRouteService.createDirectHubRoute(userId, UUID.fromString(fromHubId), UUID.fromString(toHubId)); + HubRouteCreateResponseDto response = + hubRouteService.createDirectHubRoute(userId, UUID.fromString(fromHubId), UUID.fromString(toHubId)); return ResponseEntity.ok(response); } @@ -71,18 +72,29 @@ public ResponseEntity deleteHubRoute( return ResponseEntity.ok(response); } - // form -> to 최단경로 생성 - @PostMapping("/{from_hub_id}/{to_hub_id}") + // form -> to 최단경로 생성 (다이렉트는 항상 최단경로) + // Todo : route 모두 생성 후 라우트체크포인트 한 번에 생성시키기 + @PostMapping("/{from_hub_id}/{to_hub_id}/path") public ResponseEntity createPathHubRoute( @PathVariable("from_hub_id") String fromHubId, @PathVariable("to_hub_id") String toHubId, @RequestParam Long userId ){ - HubRouteDetailsResponseDto response = hubRouteService.createPathHubRoute(UUID.fromString(fromHubId), UUID.fromString(toHubId), userId); + HubRouteDetailsResponseDto response = + hubRouteService.createPathHubRoute(UUID.fromString(fromHubId), UUID.fromString(toHubId), userId); return ResponseEntity.ok(response); } - // fromHub -> toHub 최단 경로 시퀀스 조회 + // fromHub -> toHub 최단 경로 정보 조회 + @GetMapping("/{from_hub_id}/{to_hub_id}/path") + public ResponseEntity getPathHubRoute( + @PathVariable("from_hub_id") String fromHubId, + @PathVariable("to_hub_id") String toHubId + ){ + HubRouteDetailsResponseDto responseDto = + hubRouteService.getPathHubRoute(UUID.fromString(fromHubId), UUID.fromString(toHubId)); + return ResponseEntity.ok(responseDto); + } } From 730e2bf0ce80173fa316998f17295286b74e1b8b Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 01:28:54 +0900 Subject: [PATCH 203/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20=EC=95=88?= =?UTF-8?q?=EC=93=B0=EB=8A=94=20import=EB=AC=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub_route/application/service/HubRouteService.java | 1 - .../domain/repository/HubRouteCheckpointRepository.java | 1 - 2 files changed, 2 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java index 024ecbe..96d633c 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java @@ -18,7 +18,6 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java index 000a687..ee9f993 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java @@ -1,6 +1,5 @@ package com.sparta.hubservice.hub_route.domain.repository; -import com.sparta.hubservice.hub_route.domain.model.HubRoute; import com.sparta.hubservice.hub_route.domain.model.HubRouteCheckpoint; import java.util.List; import java.util.UUID; From 0fcfd5a402fd1fecbef9bfac6f1e03a5279fc75f Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Sun, 23 Mar 2025 01:41:40 +0900 Subject: [PATCH 204/389] =?UTF-8?q?=E2=9C=A8feat=20[#140]=20:Shipping=20Lo?= =?UTF-8?q?g=20=EC=A1=B0=ED=9A=8C=EC=8B=9C=20=EB=B0=B0=EC=86=A1=20ID,=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20ID=20=EB=AA=A8=EB=91=90=20=EA=B2=80?= =?UTF-8?q?=EC=82=AC=ED=95=98=EB=8F=84=EB=A1=9D=20repository=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=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 --- .../application/dto/client/HubRouteInfoResponse.java | 11 +++++++++++ .../application/service/ShippingService.java | 7 ++----- .../domain/repository/ShippingRouteRepository.java | 1 + 3 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/application/dto/client/HubRouteInfoResponse.java diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/client/HubRouteInfoResponse.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/client/HubRouteInfoResponse.java new file mode 100644 index 0000000..b76b419 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/client/HubRouteInfoResponse.java @@ -0,0 +1,11 @@ +package com.sparta.shippingservice.application.dto.client; + +import java.math.BigDecimal; +import java.util.UUID; + +public record HubRouteInfoResponse( + UUID startHubId, + UUID endHubId, + BigDecimal estimatedDistance, + Integer estimatedTime +) {} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java index ea4cbe9..895fcf9 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -86,7 +86,6 @@ public ShippingResponseDto updateShipping(UUID shippingId, @Valid UpdateShipping } - @Transactional public ShippingResponseDto deleteShipping(UUID shippingId, long userId) { Shipping shipping = findShipping(shippingId); @@ -98,10 +97,8 @@ public ShippingResponseDto deleteShipping(UUID shippingId, long userId) { @Transactional(readOnly = true) public ShippingRouteResponseDto getLogById(UUID shippingId, UUID shippingLogId){ - ShippingRouteLog routeLog = shippingRouteRepository.findById(shippingLogId).orElseThrow(() -> new ResourceNotFoundException("찾을 수 없는 배송 로그 입니다.")); - if(!routeLog.getShipping().getId().equals(shippingId)) { - throw new ResourceNotFoundException("해당 배송 ID에 해당하는 배송 경로 로그가 아닙니다."); - } + ShippingRouteLog routeLog = shippingRouteRepository.findByIdAndShippingId(shippingLogId, shippingId) + .orElseThrow(() -> new ResourceNotFoundException("해당 배송에 속하지 않는 배송 경로 로그입니다.")); return ShippingRouteResponseDto.from(routeLog); } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRouteRepository.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRouteRepository.java index e3b278d..bc8d89f 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRouteRepository.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRouteRepository.java @@ -9,5 +9,6 @@ public interface ShippingRouteRepository { ShippingRouteLog save(ShippingRouteLog shippingRouteLog); Optional findById(UUID id); List findAll(); + Optional findByIdAndShippingId(UUID id, UUID shippingId); } From b6f8076f5d602f2bbf77b934d3edf8e8494b5dcb Mon Sep 17 00:00:00 2001 From: devdaeun Date: Sun, 23 Mar 2025 02:15:20 +0900 Subject: [PATCH 205/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#130]=20:=20Slack?= =?UTF-8?q?=20Crud=20=EC=9E=91=EC=84=B1=20-=20=EC=8A=AC=EB=9E=99=20crud?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=95=9C=20swagger=20=EC=97=B0=EA=B2=B0?= =?UTF-8?q?=20-=20user=EC=84=9C=EB=B9=84=EC=8A=A4=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=ED=95=9C=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=EB=A5=BC=20=EA=B0=99=EC=9D=B4?= =?UTF-8?q?=EC=93=B0=EB=8F=84=EB=A1=9D=20=EC=97=B0=EA=B2=B0=ED=95=B4?= =?UTF-8?q?=EB=91=90=EC=97=88=EC=8A=B5=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- slack-service/build.gradle | 1 + .../slackservice/SlackServiceApplication.java | 4 ++++ .../slackservice/domain/model/Slack.java | 1 + .../presentation/SlackController.java | 11 ++++++++-- .../src/main/resources/application.yml | 22 +++++++++++++++++-- user-service/build.gradle | 1 - 6 files changed, 35 insertions(+), 5 deletions(-) diff --git a/slack-service/build.gradle b/slack-service/build.gradle index 5ed7532..7da5cbc 100644 --- a/slack-service/build.gradle +++ b/slack-service/build.gradle @@ -5,6 +5,7 @@ ext { dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'com.slack.api:slack-api-client:1.43.0' runtimeOnly 'org.postgresql:postgresql' diff --git a/slack-service/src/main/java/com/sparta/slackservice/SlackServiceApplication.java b/slack-service/src/main/java/com/sparta/slackservice/SlackServiceApplication.java index da22a24..a5f8d4d 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/SlackServiceApplication.java +++ b/slack-service/src/main/java/com/sparta/slackservice/SlackServiceApplication.java @@ -1,9 +1,13 @@ package com.sparta.slackservice; +import com.sparta.commonmodule.config.SwaggerConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Import; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication(scanBasePackages = "com.sparta") +@Import(SwaggerConfig.class) public class SlackServiceApplication { public static void main(String[] args) { diff --git a/slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java b/slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java index 05a5291..6a9d338 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java +++ b/slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java @@ -13,6 +13,7 @@ @Entity @Getter +@Table(name = "p_slacks") @NoArgsConstructor public class Slack extends BaseEntity { diff --git a/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java b/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java index 12f2edf..bb4c560 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java +++ b/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java @@ -5,6 +5,8 @@ import com.sparta.slackservice.application.service.SlackService; import com.sparta.slackservice.application.service.SlackWebhookService; import com.sparta.slackservice.domain.model.Slack; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -14,33 +16,38 @@ @RestController @RequestMapping("/api/v1/slacks") @RequiredArgsConstructor +@Tag(name = "Slack Service", description = "슬랙 메세지 서비스 API") public class SlackController { private final SlackService slackService; private final SlackWebhookService slackWebhookService; + @Operation(summary = "메세지 생성", description = "메세지 생성 api입니다.") @PostMapping("/create") public ResponseEntity createSlack(@RequestHeader("slack_name") String slack_name, @RequestBody SlackRequestDto requestDto) { return ResponseEntity.ok(slackService.createSlack(slack_name, requestDto)); } + @Operation(summary = "메세지 전송", description = "메세지 전송 api입니다.") @GetMapping("/send/{id}") public ResponseEntity sendSlack(@PathVariable("id") UUID slackId) { slackService.sendSlack(slackId); return ResponseEntity.ok("전송성공"); } + @Operation(summary = "메세지 조회(단건)", description = "메세지 조회(단건) api입니다.") @GetMapping("{id}") public ResponseEntity getSlack(@PathVariable("id") UUID slackId) { return ResponseEntity.ok(slackService.getSlack(slackId)); } + @Operation(summary = "메세지 수정", description = "메세지 수정 api입니다.") @PutMapping("/modify/{id}") public ResponseEntity modifySlack(@PathVariable("id") UUID slackId, @RequestBody SlackRequestDto requestDto) { - slackService.modifySlack(slackId, requestDto); - return ResponseEntity.ok().build(); + return ResponseEntity.ok(slackService.modifySlack(slackId, requestDto)); } + @Operation(summary = "메세지 삭제", description = "메세지 삭제 api입니다.") @DeleteMapping("/{id}") public ResponseEntity deleteSlack(@PathVariable("id") UUID slackId, @RequestHeader("user_id") Long userId) { slackService.deleteSlack(slackId, userId); diff --git a/slack-service/src/main/resources/application.yml b/slack-service/src/main/resources/application.yml index adf89e0..f8cff42 100644 --- a/slack-service/src/main/resources/application.yml +++ b/slack-service/src/main/resources/application.yml @@ -1,8 +1,18 @@ spring: application: name: slack-service - autoconfigure: - exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration + datasource: + url: jdbc:postgresql://localhost:5001/user_db # Docker의 PostgreSQL 컨테이너의 IP 또는 호스트와 포트를 사용 + username: postgres_user # PostgreSQL 사용자 이름 + password: 12345 # PostgreSQL 비밀번호 + driver-class-name: org.postgresql.Driver + jpa: + hibernate: + ddl-auto: update + database-platform: org.hibernate.dialect.PostgreSQLDialect # PostgreSQL에 맞는 Hibernate Dialect 설정 + h2: + console: + enabled: false # H2 콘솔 비활성화 (PostgreSQL 사용 시) server: port: 8087 @@ -13,6 +23,14 @@ eureka: service-url: defaultZone: http://localhost:8761/eureka/ +springdoc: + api-docs: + version: openapi_3_1 + enabled: true + path: /slack-service/v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui.html slack: webhook: url: https://hooks.slack.com/services/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 \ No newline at end of file diff --git a/user-service/build.gradle b/user-service/build.gradle index e9cd229..4bd0e1d 100644 --- a/user-service/build.gradle +++ b/user-service/build.gradle @@ -7,7 +7,6 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'io.jsonwebtoken:jjwt:0.12.6' implementation 'org.springframework.boot:spring-boot-starter-actuator' -// implementation 'org.springframework.boot:spring-boot-starter-security' testImplementation 'org.springframework.security:spring-security-test' testImplementation 'io.projectreactor:reactor-test' runtimeOnly 'org.postgresql:postgresql' From ce29e5bdac90a01469d056949f716b39b2cc2f51 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 02:18:34 +0900 Subject: [PATCH 206/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20:=20rep?= =?UTF-8?q?ository=20=EA=B5=AC=EC=A1=B0=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub/application/service/HubService.java | 6 +- .../domain/repository/HubQueryRepository.java | 10 ---- .../hub/domain/repository/HubRepository.java | 2 + .../persistence/JPAHubRepository.java | 5 +- .../persistence/QueryDSLHubRepository.java | 7 +-- .../repository/HubRepositoryImpl.java | 47 ++++++++++++++++ .../JPAHubRouteCheckpointRepository.java | 7 ++- .../persistence/JPAHubRouteRepository.java | 16 +++++- .../HubRouteCheckpointRepositoryImpl.java | 31 ++++++++++ .../repository/HubRouteRepositoryImpl.java | 56 +++++++++++++++++++ 10 files changed, 163 insertions(+), 24 deletions(-) delete mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubQueryRepository.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/repository/HubRepositoryImpl.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteCheckpointRepositoryImpl.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteRepositoryImpl.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java index 69e7220..bcff0c7 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubService.java @@ -1,13 +1,12 @@ package com.sparta.hubservice.hub.application.service; import com.sparta.commonmodule.exception.ResourceNotFoundException; +import com.sparta.hubservice.hub.application.dto.request.HubRequestDto; import com.sparta.hubservice.hub.application.dto.response.HubCreateResponseDto; import com.sparta.hubservice.hub.application.dto.response.HubDeleteResponseDto; -import com.sparta.hubservice.hub.application.dto.request.HubRequestDto; import com.sparta.hubservice.hub.application.dto.response.HubResponseDto; import com.sparta.hubservice.hub.application.dto.response.HubUpdateResponseDto; import com.sparta.hubservice.hub.domain.model.Hub; -import com.sparta.hubservice.hub.domain.repository.HubQueryRepository; import com.sparta.hubservice.hub.domain.repository.HubRepository; import java.math.BigDecimal; import java.util.Map; @@ -26,7 +25,6 @@ public class HubService { private final GeocodeApiService geocodeApiService; private final HubRepository hubRepository; - private final HubQueryRepository hubQueryRepository; // 허브 목록 조회 @Transactional(readOnly = true) @@ -46,7 +44,7 @@ public HubResponseDto getHub(UUID hubId) { // 허브 검색 @Transactional(readOnly = true) public Page getSearchHubs(String name, String address, Pageable pageable) { - Page searchHubs = hubQueryRepository.searchByKeyword(name, address, pageable) + Page searchHubs = hubRepository.searchByKeyword(name, address, pageable) .orElseThrow(ResourceNotFoundException::new); return searchHubs.map(HubResponseDto::new); diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubQueryRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubQueryRepository.java deleted file mode 100644 index e365a4c..0000000 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubQueryRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.sparta.hubservice.hub.domain.repository; - -import com.sparta.hubservice.hub.domain.model.Hub; -import java.util.Optional; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; - -public interface HubQueryRepository { - Optional> searchByKeyword(String name, String address, Pageable pageable); -} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java index c75e2e2..8355332 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubRepository.java @@ -15,4 +15,6 @@ public interface HubRepository { S save(S hub); List findAll(); + + Optional> searchByKeyword(String name, String address, Pageable pageable); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/JPAHubRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/JPAHubRepository.java index 44ab2f7..e19ee2c 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/JPAHubRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/JPAHubRepository.java @@ -3,9 +3,12 @@ import com.sparta.hubservice.hub.domain.model.Hub; import com.sparta.hubservice.hub.domain.repository.HubRepository; import java.util.UUID; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository -public interface JPAHubRepository extends JpaRepository, HubRepository { +public interface JPAHubRepository extends JpaRepository { + Page findByIsDeletedFalse(Pageable pageable); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java index 866203d..19327c8 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/QueryDSLHubRepository.java @@ -4,7 +4,6 @@ import com.querydsl.jpa.impl.JPAQueryFactory; import com.sparta.hubservice.hub.domain.model.Hub; import com.sparta.hubservice.hub.domain.model.QHub; -import com.sparta.hubservice.hub.domain.repository.HubQueryRepository; import java.util.List; import java.util.Optional; import lombok.RequiredArgsConstructor; @@ -15,11 +14,10 @@ @Repository @RequiredArgsConstructor -public class QueryDSLHubRepository implements HubQueryRepository { +public class QueryDSLHubRepository{ private final JPAQueryFactory queryFactory; - @Override public Optional> searchByKeyword(String name, String address, Pageable pageable) { QHub hub = QHub.hub; @@ -48,8 +46,5 @@ public Optional> searchByKeyword(String name, String address, Pageable .fetchCount(); return Optional.of(new PageImpl<>(hubList, pageable, total)); - } - - } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/repository/HubRepositoryImpl.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/repository/HubRepositoryImpl.java new file mode 100644 index 0000000..9d7afdb --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/repository/HubRepositoryImpl.java @@ -0,0 +1,47 @@ +package com.sparta.hubservice.hub.infrastructure.repository; + +import com.sparta.hubservice.hub.application.service.HubService; +import com.sparta.hubservice.hub.domain.model.Hub; +import com.sparta.hubservice.hub.domain.repository.HubRepository; +import com.sparta.hubservice.hub.infrastructure.persistence.JPAHubRepository; +import com.sparta.hubservice.hub.infrastructure.persistence.QueryDSLHubRepository; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class HubRepositoryImpl implements HubRepository { + + private final JPAHubRepository jpaHubRepository; + private final QueryDSLHubRepository queryDSLHubRepository; + + @Override + public Page findByIsDeletedFalse(Pageable pageable) { + return jpaHubRepository.findByIsDeletedFalse(pageable); + } + + @Override + public Optional findById(UUID hubId) { + return jpaHubRepository.findById(hubId); + } + + @Override + public Hub save(Hub hub) { + return jpaHubRepository.save(hub); + } + + @Override + public List findAll() { + return jpaHubRepository.findAll(); + } + + @Override + public Optional> searchByKeyword(String name, String address, Pageable pageable) { + return queryDSLHubRepository.searchByKeyword(name, address, pageable); + } +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java index 0183bdc..8c79999 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java @@ -2,12 +2,15 @@ import com.sparta.hubservice.hub_route.domain.model.HubRouteCheckpoint; import com.sparta.hubservice.hub_route.domain.repository.HubRouteCheckpointRepository; +import java.util.List; +import java.util.UUID; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository -public interface JPAHubRouteCheckpointRepository extends JpaRepository, - HubRouteCheckpointRepository { +public interface JPAHubRouteCheckpointRepository extends JpaRepository{ + List findAllByHubRouteId(UUID hubRouteId); + List findAllByHubRouteIdOrderBySequenceAsc(UUID hubRouteId); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteRepository.java index 834170d..91466f7 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteRepository.java @@ -1,12 +1,26 @@ package com.sparta.hubservice.hub_route.infrastructure.persistence; +import com.sparta.hubservice.hub.domain.model.Hub; import com.sparta.hubservice.hub_route.domain.model.HubRoute; import com.sparta.hubservice.hub_route.domain.repository.HubRouteRepository; +import java.util.List; +import java.util.Optional; import java.util.UUID; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository -public interface JPAHubRouteRepository extends JpaRepository, HubRouteRepository { +public interface JPAHubRouteRepository extends JpaRepository { + Optional findByFromHub_HubIdAndToHub_HubIdAndIsDeletedFalse(UUID fromHubId, UUID toHubId); + + Optional findByHubRouteIdAndIsDeletedFalse(UUID hubRouteId); + + Optional> findAllByIsDeletedFalse(Pageable pageable); + + Optional> findByFromHub(Hub hub); + + Optional findByFromHubAndToHub(Hub fromHub, Hub toHub); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteCheckpointRepositoryImpl.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteCheckpointRepositoryImpl.java new file mode 100644 index 0000000..34a8e6a --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteCheckpointRepositoryImpl.java @@ -0,0 +1,31 @@ +package com.sparta.hubservice.hub_route.infrastructure.repository; + +import com.sparta.hubservice.hub_route.domain.model.HubRouteCheckpoint; +import com.sparta.hubservice.hub_route.domain.repository.HubRouteCheckpointRepository; +import com.sparta.hubservice.hub_route.infrastructure.persistence.JPAHubRouteCheckpointRepository; +import java.util.List; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class HubRouteCheckpointRepositoryImpl implements HubRouteCheckpointRepository { + + private final JPAHubRouteCheckpointRepository jpaHubRouteCheckpointRepository; + + @Override + public List findAllByHubRouteId(UUID hubRouteId) { + return jpaHubRouteCheckpointRepository.findAllByHubRouteId(hubRouteId); + } + + @Override + public void saveAll(List checkpointList) { + jpaHubRouteCheckpointRepository.saveAll(checkpointList); + } + + @Override + public List findAllByHubRouteIdOrderBySequenceAsc(UUID hubRouteId) { + return jpaHubRouteCheckpointRepository.findAllByHubRouteIdOrderBySequenceAsc(hubRouteId); + } +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteRepositoryImpl.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteRepositoryImpl.java new file mode 100644 index 0000000..2276e92 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteRepositoryImpl.java @@ -0,0 +1,56 @@ +package com.sparta.hubservice.hub_route.infrastructure.repository; + +import com.sparta.hubservice.hub.domain.model.Hub; +import com.sparta.hubservice.hub_route.domain.model.HubRoute; +import com.sparta.hubservice.hub_route.domain.repository.HubRouteRepository; +import com.sparta.hubservice.hub_route.infrastructure.persistence.JPAHubRouteRepository; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class HubRouteRepositoryImpl implements HubRouteRepository { + + private final JPAHubRouteRepository jpaHubRouteRepository; + + @Override + public Optional findByFromHub_HubIdAndToHub_HubIdAndIsDeletedFalse(UUID fromHubId, + UUID toHubId) { + return jpaHubRouteRepository.findByFromHub_HubIdAndToHub_HubIdAndIsDeletedFalse(fromHubId, toHubId); + } + + @Override + public Optional findByHubRouteIdAndIsDeletedFalse(UUID hubRouteId) { + return jpaHubRouteRepository.findByHubRouteIdAndIsDeletedFalse(hubRouteId); + } + + @Override + public HubRoute save(HubRoute hubRoute) { + return jpaHubRouteRepository.save(hubRoute); + } + + @Override + public Optional> findAllByIsDeletedFalse(Pageable pageable) { + return jpaHubRouteRepository.findAllByIsDeletedFalse(pageable); + } + + @Override + public Optional findById(UUID hubRouteId) { + return jpaHubRouteRepository.findById(hubRouteId); + } + + @Override + public Optional> findByFromHub(Hub hub) { + return jpaHubRouteRepository.findByFromHub(hub); + } + + @Override + public Optional findByFromHubAndToHub(Hub fromHub, Hub toHub) { + return jpaHubRouteRepository.findByFromHubAndToHub(fromHub, toHub); + } +} From 9ef6d436d23c77db85da5b65f00e57e2f27b6e42 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 02:37:50 +0900 Subject: [PATCH 207/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20UUID=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=EC=9C=BC=EB=A1=9C=20parameter=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HubRouteController.java | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java index 0dc9772..382fb1f 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java @@ -45,54 +45,52 @@ public ResponseEntity getHubRoute(@PathVariable("hub_route_ // 특정 출발 허브 → 도착 허브 경로 조회 (direct) @GetMapping("/{from_hub_id}/{to_hub_id}/direct") public ResponseEntity getDirectHubRoute( - @PathVariable("from_hub_id") String fromHubId, - @PathVariable("to_hub_id") String toHubId) { - HubRouteResponseDto response = hubRouteService.getDirectHubRoute(UUID.fromString(fromHubId), UUID.fromString(toHubId)); + @PathVariable("from_hub_id") UUID fromHubId, + @PathVariable("to_hub_id") UUID toHubId) { + HubRouteResponseDto response = hubRouteService.getDirectHubRoute(fromHubId, toHubId); return ResponseEntity.ok(response); } // (정해진) 허브 간 경로 생성 (direct) - // Todo : 더미데이터 필요 @PostMapping("/{from_hub_id}/{to_hub_id}/direct") public ResponseEntity createDirectHubRoute( - @PathVariable("from_hub_id") String fromHubId, - @PathVariable("to_hub_id") String toHubId, + @PathVariable("from_hub_id") UUID fromHubId, + @PathVariable("to_hub_id") UUID toHubId, @RequestParam Long userId) { HubRouteCreateResponseDto response = - hubRouteService.createDirectHubRoute(userId, UUID.fromString(fromHubId), UUID.fromString(toHubId)); + hubRouteService.createDirectHubRoute(userId, fromHubId, toHubId); return ResponseEntity.ok(response); } // 허브 간 경로 정보 삭제 @DeleteMapping("/{hub_route_id}") public ResponseEntity deleteHubRoute( - @PathVariable("hub_route_id") String hubRouteId, + @PathVariable("hub_route_id") UUID hubRouteId, @RequestParam Long userId) { - HubRouteDeleteResponseDto response = hubRouteService.deleteHubRoute(UUID.fromString(hubRouteId), userId); + HubRouteDeleteResponseDto response = hubRouteService.deleteHubRoute(hubRouteId, userId); return ResponseEntity.ok(response); } // form -> to 최단경로 생성 (다이렉트는 항상 최단경로) - // Todo : route 모두 생성 후 라우트체크포인트 한 번에 생성시키기 @PostMapping("/{from_hub_id}/{to_hub_id}/path") public ResponseEntity createPathHubRoute( - @PathVariable("from_hub_id") String fromHubId, - @PathVariable("to_hub_id") String toHubId, + @PathVariable("from_hub_id") UUID fromHubId, + @PathVariable("to_hub_id") UUID toHubId, @RequestParam Long userId ){ HubRouteDetailsResponseDto response = - hubRouteService.createPathHubRoute(UUID.fromString(fromHubId), UUID.fromString(toHubId), userId); + hubRouteService.createPathHubRoute(fromHubId, toHubId, userId); return ResponseEntity.ok(response); } // fromHub -> toHub 최단 경로 정보 조회 @GetMapping("/{from_hub_id}/{to_hub_id}/path") public ResponseEntity getPathHubRoute( - @PathVariable("from_hub_id") String fromHubId, - @PathVariable("to_hub_id") String toHubId + @PathVariable("from_hub_id") UUID fromHubId, + @PathVariable("to_hub_id") UUID toHubId ){ HubRouteDetailsResponseDto responseDto = - hubRouteService.getPathHubRoute(UUID.fromString(fromHubId), UUID.fromString(toHubId)); + hubRouteService.getPathHubRoute(fromHubId, toHubId); return ResponseEntity.ok(responseDto); } From 9d74dedc53dc74bb236581478e3c47122393cd19 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Sun, 23 Mar 2025 02:53:23 +0900 Subject: [PATCH 208/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#130]=20:=20Slack?= =?UTF-8?q?=20Crud=20=EC=9E=91=EC=84=B1=20-=20BaseEntity=EB=A5=BC=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=9C=20=EC=83=9D=EC=84=B1=EC=9E=90=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=EC=9E=90=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../slackservice/application/dto/SlackRequestDto.java | 2 +- .../slackservice/application/service/SlackService.java | 8 ++++---- .../java/com/sparta/slackservice/domain/model/Slack.java | 6 ++++-- .../sparta/slackservice/presentation/SlackController.java | 8 ++++---- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackRequestDto.java b/slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackRequestDto.java index 686c183..7fe3cee 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackRequestDto.java +++ b/slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackRequestDto.java @@ -11,7 +11,7 @@ public class SlackRequestDto { private Long receiverId; - public Slack createSlack(String slack_name) { + public Slack createSlack(String slack_name,Long userId) { return Slack.builder() .slackName(slack_name) .message(message) diff --git a/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java b/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java index 4d8a1b1..46a1a40 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java +++ b/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java @@ -19,8 +19,8 @@ public class SlackService { private final SlackWebhookService slackWebhookService; //슬랙 메세지 생성 - public SlackResponseDto createSlack(String slack_name, SlackRequestDto requestDto) { - Slack slack = slackRepository.save(requestDto.createSlack(slack_name)); + public SlackResponseDto createSlack(String slack_name, SlackRequestDto requestDto, Long userId) { + Slack slack = slackRepository.save(requestDto.createSlack(slack_name, userId)); return new SlackResponseDto(slack); } @@ -38,9 +38,9 @@ public Slack getSlack(UUID slackId) { } //메세지 수정 - public SlackResponseDto modifySlack(UUID slackId, SlackRequestDto requestDto) { + public SlackResponseDto modifySlack(UUID slackId, SlackRequestDto requestDto, Long userId) { Slack slack = findingSlack(slackId); - slack.modifySlack(requestDto); + slack.modifySlack(requestDto,userId); return new SlackResponseDto(slack); } diff --git a/slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java b/slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java index 6a9d338..de28748 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java +++ b/slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java @@ -38,7 +38,8 @@ public class Slack extends BaseEntity { private boolean sendingStatus = false; //기본 true? false? @Builder - public Slack(String slackName, String message, Long receiverId) { + public Slack(String slackName, String message, Long receiverId, Long userId) { + super(userId); this.slackName = slackName; this.message = message; this.receiverId = receiverId; @@ -49,7 +50,8 @@ public void changeStatus() { this.sendedAt = LocalDateTime.now(); } - public void modifySlack(SlackRequestDto requestDto) { + public void modifySlack(SlackRequestDto requestDto, Long userId) { + super.update(userId); Optional.ofNullable(requestDto.getMessage()).ifPresent(message -> this.message = message); Optional.ofNullable(requestDto.getReceiverId()).ifPresent(receiverId -> this.receiverId = receiverId); } diff --git a/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java b/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java index bb4c560..83686a9 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java +++ b/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java @@ -24,8 +24,8 @@ public class SlackController { @Operation(summary = "메세지 생성", description = "메세지 생성 api입니다.") @PostMapping("/create") - public ResponseEntity createSlack(@RequestHeader("slack_name") String slack_name, @RequestBody SlackRequestDto requestDto) { - return ResponseEntity.ok(slackService.createSlack(slack_name, requestDto)); + public ResponseEntity createSlack(@RequestHeader("user_id") Long userId, @RequestHeader("slack_name") String slack_name, @RequestBody SlackRequestDto requestDto) { + return ResponseEntity.ok(slackService.createSlack(slack_name, requestDto, userId)); } @Operation(summary = "메세지 전송", description = "메세지 전송 api입니다.") @@ -43,8 +43,8 @@ public ResponseEntity getSlack(@PathVariable("id") UUID slackId) { @Operation(summary = "메세지 수정", description = "메세지 수정 api입니다.") @PutMapping("/modify/{id}") - public ResponseEntity modifySlack(@PathVariable("id") UUID slackId, @RequestBody SlackRequestDto requestDto) { - return ResponseEntity.ok(slackService.modifySlack(slackId, requestDto)); + public ResponseEntity modifySlack(@RequestHeader("user_id") Long userId,@PathVariable("id") UUID slackId, @RequestBody SlackRequestDto requestDto) { + return ResponseEntity.ok(slackService.modifySlack(slackId, requestDto, userId)); } @Operation(summary = "메세지 삭제", description = "메세지 삭제 api입니다.") From b347e0413037fa4d4cc5d54bd52192380847dd6a Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Sun, 23 Mar 2025 02:56:01 +0900 Subject: [PATCH 209/389] =?UTF-8?q?=E2=9C=A8feat=20[#144]=20:Shipping=20Lo?= =?UTF-8?q?g=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/ShippingService.java | 14 +++++++++++++- .../domain/model/ShippingRouteLog.java | 3 ++- .../presentation/ShippingController.java | 15 ++++++++++++--- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java index 895fcf9..0b02b68 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -99,7 +99,7 @@ public ShippingResponseDto deleteShipping(UUID shippingId, long userId) { public ShippingRouteResponseDto getLogById(UUID shippingId, UUID shippingLogId){ ShippingRouteLog routeLog = shippingRouteRepository.findByIdAndShippingId(shippingLogId, shippingId) .orElseThrow(() -> new ResourceNotFoundException("해당 배송에 속하지 않는 배송 경로 로그입니다.")); - return ShippingRouteResponseDto.from(routeLog); + return ShippingRouteResponseDto.from(routeLog); // 예외 컨트롤러 단에서 잡기 } @@ -121,6 +121,18 @@ public List getLogAll(){ )).collect(Collectors.toList()); } + @Transactional + public ShippingRouteResponseDto deleteShippingLog(UUID shippingId,UUID shippingLogId, long userId) { + ShippingRouteLog routeLog = shippingRouteRepository.findByIdAndShippingId(shippingLogId, shippingId) + .orElseThrow(() -> new ResourceNotFoundException("해당 배송에 속하지 않는 배송 경로 로그입니다.")); + + routeLog.delete(userId); + shippingRouteRepository.save(routeLog); + return ShippingRouteResponseDto.from(routeLog); + } + + + private Shipping findShipping(UUID shippingId) { Shipping shipping = shippingRepository.findById(shippingId).orElseThrow( () -> new ResourceNotFoundException("찾을 수 없는 배송 정보 입니다.")); diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java index 00775c2..56010cb 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java @@ -1,6 +1,7 @@ package com.sparta.shippingservice.domain.model; +import com.sparta.commonmodule.entity.BaseEntity; import jakarta.persistence.*; import lombok.*; import java.math.BigDecimal; @@ -12,7 +13,7 @@ @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class ShippingRouteLog { +public class ShippingRouteLog extends BaseEntity { @Id @Column(name = "shipping_route_log_id", nullable = false, updatable = false) diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index 7ad07ad..aa22725 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -48,7 +48,7 @@ public ResponseEntity updateShipping(@PathVariable("shippin } @DeleteMapping("/{shippingId}") - public ResponseEntity deleteHub(@PathVariable("shippingId") UUID id, @RequestParam long userId) { + public ResponseEntity deleteShipping(@PathVariable("shippingId") UUID id, @RequestParam long userId) { ShippingResponseDto responseDto = shippingService.deleteShipping(id, userId); return ResponseEntity.ok(responseDto); } @@ -66,6 +66,15 @@ public ResponseEntity> getAllLog() { return ResponseEntity.ok(allLog); } -// -// @DeleteMapping("{}") + + + @DeleteMapping("/{shippingId}/{shippingLogId}") + public ResponseEntitydeleteShippingLog(@PathVariable("shippingId") UUID id, @PathVariable("shippingLogId") UUID logId ,@RequestParam Long userId){ + ShippingRouteResponseDto responseDto = shippingService.deleteShippingLog(id, logId, userId); + return ResponseEntity.ok(responseDto); + + } + + + } From f36d0e54b4484469959ac4a37cde69a3269a706c Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 03:09:48 +0900 Subject: [PATCH 210/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20repository=20p?= =?UTF-8?q?arameter=20UUID->HubRoute=20type=EC=9C=BC=EB=A1=9C=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 --- .../hub_route/application/service/HubRouteService.java | 4 ++-- .../hub_route/domain/model/HubRouteCheckpoint.java | 4 ++-- .../domain/repository/HubRouteCheckpointRepository.java | 5 +++-- .../persistence/JPAHubRouteCheckpointRepository.java | 5 +++-- .../repository/HubRouteCheckpointRepositoryImpl.java | 9 +++++---- 5 files changed, 15 insertions(+), 12 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java index 96d633c..24804f8 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java @@ -81,7 +81,7 @@ public HubRouteDeleteResponseDto deleteHubRoute(UUID hubRouteId, Long userId) { .orElseThrow(ResourceNotFoundException::new); // hubRouteId와 관련있는 hub_route_checkpoint 정보 삭제 - checkpointRepository.findAllByHubRouteId(hubRouteId) + checkpointRepository.findAllByHubRoute(hubRoute) .forEach(checkpoint -> checkpoint.delete(userId)); hubRoute.delete(userId); @@ -130,7 +130,7 @@ public HubRouteDetailsResponseDto getPathHubRoute(UUID fromHubId, UUID toHubId) .orElseThrow(ResourceNotFoundException::new); List checkpointList = - checkpointRepository.findAllByHubRouteIdOrderBySequenceAsc(route.getHubRouteId()); + checkpointRepository.findAllByHubRoute_OrderBySequenceAsc(route); return new HubRouteDetailsResponseDto(route, checkpointList); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRouteCheckpoint.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRouteCheckpoint.java index b1e1610..071f4aa 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRouteCheckpoint.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRouteCheckpoint.java @@ -29,7 +29,7 @@ public class HubRouteCheckpoint extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name ="hub_route_id", nullable = false) - private HubRoute hubRouteId; + private HubRoute hubRoute; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name ="checkpoint_hub_id", nullable = false) @@ -41,7 +41,7 @@ public class HubRouteCheckpoint extends BaseEntity { @Builder public HubRouteCheckpoint(HubRoute hubRoute, Hub checkpointHub, int sequence, long userId) { super(userId); - this.hubRouteId = hubRoute; + this.hubRoute = hubRoute; this.checkpointHubId = checkpointHub; this.sequence = sequence; } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java index ee9f993..65ee77b 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java @@ -1,14 +1,15 @@ package com.sparta.hubservice.hub_route.domain.repository; +import com.sparta.hubservice.hub_route.domain.model.HubRoute; import com.sparta.hubservice.hub_route.domain.model.HubRouteCheckpoint; import java.util.List; import java.util.UUID; public interface HubRouteCheckpointRepository { - List findAllByHubRouteId(UUID hubRouteId); + List findAllByHubRoute(HubRoute hubRoute); void saveAll(List checkpointList); - List findAllByHubRouteIdOrderBySequenceAsc(UUID hubRouteId); + List findAllByHubRoute_OrderBySequenceAsc(HubRoute hubRoute); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java index 8c79999..afca0ba 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java @@ -1,5 +1,6 @@ package com.sparta.hubservice.hub_route.infrastructure.persistence; +import com.sparta.hubservice.hub_route.domain.model.HubRoute; import com.sparta.hubservice.hub_route.domain.model.HubRouteCheckpoint; import com.sparta.hubservice.hub_route.domain.repository.HubRouteCheckpointRepository; import java.util.List; @@ -10,7 +11,7 @@ @Repository public interface JPAHubRouteCheckpointRepository extends JpaRepository{ - List findAllByHubRouteId(UUID hubRouteId); + List findAllByHubRoute(HubRoute hubRouteId); - List findAllByHubRouteIdOrderBySequenceAsc(UUID hubRouteId); + List findAllByHubRoute_OrderBySequenceAsc(HubRoute hubRoute); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteCheckpointRepositoryImpl.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteCheckpointRepositoryImpl.java index 34a8e6a..334239e 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteCheckpointRepositoryImpl.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteCheckpointRepositoryImpl.java @@ -1,5 +1,6 @@ package com.sparta.hubservice.hub_route.infrastructure.repository; +import com.sparta.hubservice.hub_route.domain.model.HubRoute; import com.sparta.hubservice.hub_route.domain.model.HubRouteCheckpoint; import com.sparta.hubservice.hub_route.domain.repository.HubRouteCheckpointRepository; import com.sparta.hubservice.hub_route.infrastructure.persistence.JPAHubRouteCheckpointRepository; @@ -15,8 +16,8 @@ public class HubRouteCheckpointRepositoryImpl implements HubRouteCheckpointRepos private final JPAHubRouteCheckpointRepository jpaHubRouteCheckpointRepository; @Override - public List findAllByHubRouteId(UUID hubRouteId) { - return jpaHubRouteCheckpointRepository.findAllByHubRouteId(hubRouteId); + public List findAllByHubRoute(HubRoute hubRoute) { + return jpaHubRouteCheckpointRepository.findAllByHubRoute(hubRoute); } @Override @@ -25,7 +26,7 @@ public void saveAll(List checkpointList) { } @Override - public List findAllByHubRouteIdOrderBySequenceAsc(UUID hubRouteId) { - return jpaHubRouteCheckpointRepository.findAllByHubRouteIdOrderBySequenceAsc(hubRouteId); + public List findAllByHubRoute_OrderBySequenceAsc(HubRoute hubRoute) { + return jpaHubRouteCheckpointRepository.findAllByHubRoute_OrderBySequenceAsc(hubRoute); } } From 6696ee0dcbd761a7316b154f82ab9a6edc401ee3 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 03:10:47 +0900 Subject: [PATCH 211/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http/hub-route-service-test.http | 39 +++++++++++++++++++ .../test/resources/http/hub-route-test.http | 0 .../test/resources/http/hub-service-test.http | 16 +++++++- 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 hub-service/src/test/resources/http/hub-route-service-test.http delete mode 100644 hub-service/src/test/resources/http/hub-route-test.http diff --git a/hub-service/src/test/resources/http/hub-route-service-test.http b/hub-service/src/test/resources/http/hub-route-service-test.http new file mode 100644 index 0000000..a272cf9 --- /dev/null +++ b/hub-service/src/test/resources/http/hub-route-service-test.http @@ -0,0 +1,39 @@ +### 🔹 전체 허브 경로 목록 조회 (페이징) +GET http://localhost:8082/api/v1/hub-routes?page=0&size=10 +Accept: application/json + +### + +### 🔹 특정 경로 ID 조회 +GET http://localhost:8082/api/v1/hub-routes/b2778763-7721-4bb2-a436-8104336c6a7d +Accept: application/json + +### + +### 🔹 특정 허브 간 다이렉트 경로 조회 +GET http://localhost:8082/api/v1/hub-routes/11111111-1111-1111-1111-111111111111/22222222-2222-2222-2222-222222222222/direct +Accept: application/json + +### + +### 🔹 허브 간 다이렉트 경로 생성 +POST http://localhost:8082/api/v1/hub-routes/11111111-1111-1111-1111-111111111111/22222222-2222-2222-2222-222222222222/direct?userId=123 +Accept: application/json + +### + +### 🔹 허브 간 경로 삭제 +DELETE http://localhost:8082/api/v1/hub-routes/b2778763-7721-4bb2-a436-8104336c6a7d?userId=123 +Accept: application/json + +### + +### 🔹 허브 간 최단 경로 생성 (Path 기반) +POST http://localhost:8082/api/v1/hub-routes/11111111-1111-1111-1111-111111111111/22222222-2222-2222-2222-222222222222/path?userId=123 +Accept: application/json + +### + +### 🔹 허브 간 최단 경로 조회 (Path 기반) +GET http://localhost:8082/api/v1/hub-routes/11111111-1111-1111-1111-111111111111/22222222-2222-2222-2222-222222222222/path +Accept: application/json diff --git a/hub-service/src/test/resources/http/hub-route-test.http b/hub-service/src/test/resources/http/hub-route-test.http deleted file mode 100644 index e69de29..0000000 diff --git a/hub-service/src/test/resources/http/hub-service-test.http b/hub-service/src/test/resources/http/hub-service-test.http index ef76a33..7002b75 100644 --- a/hub-service/src/test/resources/http/hub-service-test.http +++ b/hub-service/src/test/resources/http/hub-service-test.http @@ -1,12 +1,20 @@ -### 🔹 허브 목록 조회 (GET, 페이징) +### 🔹 허브 목록 조회 (페이징) GET http://localhost:8082/api/v1/hubs?page=0&size=10 +Accept: application/json + +### ### 🔹 특정 허브 조회 (GET, UUID 사용) GET http://localhost:8082/api/v1/hubs/b2778763-7721-4bb2-a436-8104336c6a7d +Accept: application/json + +### ### 🔹 허브 검색 GET http://localhost:8082/api/v1/hubs/search?address=강남구 +Accept: application/json +### ### 🔹 허브 생성 (POST) POST http://localhost:8082/api/v1/hubs?userId=123 @@ -17,8 +25,14 @@ Content-Type: application/json "address": "서울시 강남구" } +### + ### 🔹 허브 업데이트 (PUT, UUID 사용) PUT http://localhost:8082/api/v1/hubs/4eafa45b-3a1f-484c-8294-b6924025b86f?userId=123456789&address=서울시 강남구 +Accept: application/json + +### ### 🔹 허브 삭제 (DELETE, UUID 사용) DELETE http://localhost:8082/api/v1/hubs/b2778763-7721-4bb2-a436-8104336c6a7d?userId=123 +Accept: application/json From b0ef67c2050450f83c15a25c596283ad51abd7ee Mon Sep 17 00:00:00 2001 From: jiyun Date: Sat, 22 Mar 2025 02:47:18 +0900 Subject: [PATCH 212/389] =?UTF-8?q?=F0=9F=99=88=20gitfix=20=20[#114]=20:?= =?UTF-8?q?=20=EC=B6=A9=EB=8F=8C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- company-service/build.gradle | 28 +++++++++++++++++++ .../companyservice/config/QuerydslConfig.java | 18 ++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 company-service/src/main/java/com/sparta/companyservice/config/QuerydslConfig.java diff --git a/company-service/build.gradle b/company-service/build.gradle index c366ece..884699a 100644 --- a/company-service/build.gradle +++ b/company-service/build.gradle @@ -12,10 +12,38 @@ dependencies { implementation 'jakarta.validation:jakarta.validation-api:3.0.2' implementation 'org.hibernate.validator:hibernate-validator:8.0.0.Final' implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' + + // QueryDSL + implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' + annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta' + implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' + annotationProcessor 'jakarta.annotation:jakarta.annotation-api' + annotationProcessor 'jakarta.persistence:jakarta.persistence-api' } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } +} + +// QueryDSL 자동 생성 디렉토리 설정 +def querydslDir = "$buildDir/generated/querydsl" + +tasks.withType(JavaCompile).configureEach { + options.annotationProcessorGeneratedSourcesDirectory = file(querydslDir) +} + +// 자동 생성된 QueryDSL 클래스 경로 추가 +sourceSets { + main { + java { + srcDirs += querydslDir + } + } +} + +// clean 시 Q파일 삭제 +clean { + delete file(querydslDir) } \ No newline at end of file diff --git a/company-service/src/main/java/com/sparta/companyservice/config/QuerydslConfig.java b/company-service/src/main/java/com/sparta/companyservice/config/QuerydslConfig.java new file mode 100644 index 0000000..684fd97 --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/config/QuerydslConfig.java @@ -0,0 +1,18 @@ +package com.sparta.companyservice.config; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class QuerydslConfig { + @PersistenceContext + private EntityManager entityManager; + + @Bean + public JPAQueryFactory jpaQueryFactory() { + return new JPAQueryFactory(entityManager); + } +} From 14bb93b9e12bbcdc21966349a37d025e1b8a4166 Mon Sep 17 00:00:00 2001 From: jiyun Date: Sat, 22 Mar 2025 02:47:24 +0900 Subject: [PATCH 213/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#114]=20:=20Company?= =?UTF-8?q?=20querydsl=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/CompanySearchCondition.java | 4 + .../querydsl/CompanyQueryRepository.java | 10 ++ .../querydsl/CompanyQueryRepositoryImpl.java | 105 ++++++++++++++++++ .../repository/JpaCompanyRepository.java | 3 +- 4 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanySearchCondition.java create mode 100644 company-service/src/main/java/com/sparta/companyservice/infrastructure/querydsl/CompanyQueryRepository.java create mode 100644 company-service/src/main/java/com/sparta/companyservice/infrastructure/querydsl/CompanyQueryRepositoryImpl.java diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanySearchCondition.java b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanySearchCondition.java new file mode 100644 index 0000000..9645169 --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanySearchCondition.java @@ -0,0 +1,4 @@ +package com.sparta.companyservice.domain.repository; + +public class CompanySearchCondition { +} diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/querydsl/CompanyQueryRepository.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/querydsl/CompanyQueryRepository.java new file mode 100644 index 0000000..5add2fa --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/infrastructure/querydsl/CompanyQueryRepository.java @@ -0,0 +1,10 @@ +package com.sparta.companyservice.infrastructure.querydsl; + +import com.sparta.companyservice.domain.model.Company; +import com.sparta.companyservice.domain.model.CompanyType; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +public interface CompanyQueryRepository { + Page searchCompanies(String name, String address, CompanyType companyType, Pageable pageable); +} diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/querydsl/CompanyQueryRepositoryImpl.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/querydsl/CompanyQueryRepositoryImpl.java new file mode 100644 index 0000000..8b9c247 --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/infrastructure/querydsl/CompanyQueryRepositoryImpl.java @@ -0,0 +1,105 @@ +package com.sparta.companyservice.infrastructure.querydsl; + +import com.querydsl.core.BooleanBuilder; +import com.querydsl.core.types.Order; +import com.querydsl.core.types.OrderSpecifier; +import com.querydsl.core.types.dsl.PathBuilder; +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.sparta.companyservice.domain.model.Company; +import com.sparta.companyservice.domain.model.CompanyType; +import com.sparta.companyservice.domain.model.QCompany; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; + +import java.util.ArrayList; +import java.util.List; + +@RequiredArgsConstructor +public class CompanyQueryRepositoryImpl implements CompanyQueryRepository { + private final JPAQueryFactory queryFactory; + + @Override + public Page searchCompanies(String name, String address, CompanyType companyType, Pageable pageable) { + QCompany company = QCompany.company; + + // 조건 빌더 생성 + BooleanBuilder conditions = createConditions(company, name, address, companyType); + + // 결과 조회 + List results = queryFactory + .selectFrom(company) + .where(conditions) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .orderBy(getSortedColumn(pageable.getSort())) + .fetch(); + + // 전체 카운트 조회 + Long countResult = queryFactory + .select(company.count()) + .from(company) + .where(conditions) + .fetchOne(); + + long total = countResult != null ? countResult : 0L; + + return new PageImpl<>(results, pageable, total); + } + + /** + * 검색 조건 생성 + */ + private BooleanBuilder createConditions(QCompany company, String name, String address, CompanyType companyType) { + BooleanBuilder builder = new BooleanBuilder(); + + // 소프트 삭제 제외 + builder.and(company.deletedAt.isNull()); + + if (name != null && !name.isBlank()) { + builder.and(company.name.containsIgnoreCase(name)); + } + + if (address != null && !address.isBlank()) { + builder.and(company.address.containsIgnoreCase(address)); + } + + if (companyType != null) { + builder.and(company.type.eq(companyType)); + } + + return builder; + } + + /** + * 정렬 지정자 생성 + */ + private OrderSpecifier[] getSortedColumn(Sort sort) { + List> orderSpecifiers = new ArrayList<>(); + PathBuilder entityPath = new PathBuilder<>(Company.class, "company"); + + // Sort가 비어있지 않은 경우에만 처리 + if (sort != null && sort.isSorted()) { + for (Sort.Order order : sort) { + Order direction = order.isAscending() ? Order.ASC : Order.DESC; + String property = order.getProperty(); + + // 제네릭 타입의 OrderSpecifier 생성 + orderSpecifiers.add( + new OrderSpecifier(direction, entityPath.get(property)) + ); + } + } + + // 기본 정렬(ID 오름차순) 추가 + if (orderSpecifiers.isEmpty()) { + orderSpecifiers.add( + new OrderSpecifier(Order.ASC, entityPath.get("id")) + ); + } + + return orderSpecifiers.toArray(new OrderSpecifier[0]); + } +} \ No newline at end of file diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java index 4cad4d5..761b0d4 100644 --- a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java +++ b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java @@ -2,11 +2,12 @@ import com.sparta.companyservice.domain.model.Company; import com.sparta.companyservice.domain.repository.CompanyRepository; +import com.sparta.companyservice.infrastructure.querydsl.CompanyQueryRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.UUID; @Repository -public interface JpaCompanyRepository extends JpaRepository, CompanyRepository { +public interface JpaCompanyRepository extends JpaRepository, CompanyRepository, CompanyQueryRepository { } \ No newline at end of file From cbd5a0185f63f766afa30765186986eb0d1d4e0b Mon Sep 17 00:00:00 2001 From: jiyun Date: Sat, 22 Mar 2025 17:12:51 +0900 Subject: [PATCH 214/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#114]=20:=20?= =?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC,=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=EC=BD=94=EB=93=9C=EC=97=90=20querydsl=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/CompanyService.java | 14 ++++++++------ .../presentation/controller/CompanyController.java | 14 +++++++++++--- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java index 13fcb4e..a6539cb 100644 --- a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java +++ b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java @@ -5,14 +5,17 @@ import com.sparta.companyservice.application.dto.CompanyDto; import com.sparta.companyservice.application.dto.CompanyUpdateDto; import com.sparta.companyservice.domain.model.Company; +import com.sparta.companyservice.domain.model.CompanyType; import com.sparta.companyservice.domain.repository.CompanyRepository; import com.sparta.companyservice.infrastructure.client.HubClient; +import com.sparta.companyservice.infrastructure.querydsl.CompanyQueryRepository; import com.sparta.companyservice.presentation.response.CompanyDeleteResponse; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; import java.util.UUID; @Service @@ -20,6 +23,7 @@ public class CompanyService { private final CompanyRepository companyRepository; private final HubClient hubClient; + private final CompanyQueryRepository companyQueryRepository; long userId = 1L; // 실제로는 인증된 사용자 ID 가져와야 함 @@ -38,11 +42,9 @@ public CompanyDto createCompany(CompanyCreateDto dto) { } @Transactional(readOnly = true) // 전체 조회 - public List getAllCompanies() { - return companyRepository.findAllByDeletedAtIsNull() - .stream() - .map(CompanyDto::fromEntity) - .toList(); + public Page searchCompanies(String name, String address, CompanyType type, Pageable pageable) { + return companyQueryRepository.searchCompanies(name, address, type, pageable) + .map(CompanyDto::fromEntity); } @Transactional(readOnly = true) // 단일 조회 diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java index 9b9d390..8b6cfb1 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -2,6 +2,7 @@ import com.sparta.companyservice.application.dto.CompanyDto; import com.sparta.companyservice.application.service.CompanyService; +import com.sparta.companyservice.domain.model.CompanyType; import com.sparta.companyservice.presentation.request.CompanyCreateRequest; import com.sparta.companyservice.presentation.request.CompanyUpdateRequest; import com.sparta.companyservice.presentation.response.CompanyDeleteResponse; @@ -10,6 +11,8 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -35,9 +38,14 @@ public ResponseEntity createCompany(@Valid @RequestBody Company // 전체 조회 @Operation(summary = "Company 전체 조회", description = "Company 전체 조회 API") @GetMapping - public ResponseEntity> getAllCompanies() { - List companies = companyService.getAllCompanies(); - List responses = companies.stream().map(CompanyResponse::fromDto).toList(); + public ResponseEntity> searchCompanies( + @RequestParam(required = false) String name, + @RequestParam(required = false) String address, + @RequestParam(required = false) CompanyType type, + Pageable pageable + ) { + Page companies = companyService.searchCompanies(name, address, type, pageable); + Page responses = companies.map(CompanyResponse::fromDto); return ResponseEntity.ok(responses); } From 1fb0b430c1dadde7155d4303348d10709cd34fb5 Mon Sep 17 00:00:00 2001 From: jiyun Date: Sat, 22 Mar 2025 17:17:27 +0900 Subject: [PATCH 215/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20[#114]=20:=20?= =?UTF-8?q?=EB=A6=AC=ED=8F=AC=EC=A7=80=ED=86=A0=EB=A6=AC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../companyservice/domain/repository/CompanyRepository.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java index e7a8003..a72fda0 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java @@ -9,7 +9,5 @@ public interface CompanyRepository { Company save(Company company); - List findAllByDeletedAtIsNull(); - Optional findByIdAndDeletedAtIsNull(UUID id); } \ No newline at end of file From 70c9ca2aee1a40eb90f72c1c2f0e8bd48e8e3396 Mon Sep 17 00:00:00 2001 From: jiyun Date: Sat, 22 Mar 2025 18:10:35 +0900 Subject: [PATCH 216/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20[#114]=20:=20?= =?UTF-8?q?=EC=A0=95=EB=A0=AC=20=EB=94=94=ED=8F=B4=ED=8A=B8=20createdAt?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../querydsl/CompanyQueryRepositoryImpl.java | 54 +++++++++++-------- .../controller/CompanyController.java | 1 - 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/querydsl/CompanyQueryRepositoryImpl.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/querydsl/CompanyQueryRepositoryImpl.java index 8b9c247..b4da4aa 100644 --- a/company-service/src/main/java/com/sparta/companyservice/infrastructure/querydsl/CompanyQueryRepositoryImpl.java +++ b/company-service/src/main/java/com/sparta/companyservice/infrastructure/querydsl/CompanyQueryRepositoryImpl.java @@ -9,6 +9,7 @@ import com.sparta.companyservice.domain.model.CompanyType; import com.sparta.companyservice.domain.model.QCompany; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; @@ -17,6 +18,7 @@ import java.util.ArrayList; import java.util.List; +@Slf4j @RequiredArgsConstructor public class CompanyQueryRepositoryImpl implements CompanyQueryRepository { private final JPAQueryFactory queryFactory; @@ -25,28 +27,33 @@ public class CompanyQueryRepositoryImpl implements CompanyQueryRepository { public Page searchCompanies(String name, String address, CompanyType companyType, Pageable pageable) { QCompany company = QCompany.company; - // 조건 빌더 생성 - BooleanBuilder conditions = createConditions(company, name, address, companyType); - - // 결과 조회 - List results = queryFactory - .selectFrom(company) - .where(conditions) - .offset(pageable.getOffset()) - .limit(pageable.getPageSize()) - .orderBy(getSortedColumn(pageable.getSort())) - .fetch(); - - // 전체 카운트 조회 - Long countResult = queryFactory - .select(company.count()) - .from(company) - .where(conditions) - .fetchOne(); - - long total = countResult != null ? countResult : 0L; - - return new PageImpl<>(results, pageable, total); + try { + // 조건 빌더 생성 + BooleanBuilder conditions = createConditions(company, name, address, companyType); + + // 결과 조회 + List results = queryFactory + .selectFrom(company) + .where(conditions) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .orderBy(getSortedColumn(pageable.getSort())) + .fetch(); + + // 전체 카운트 조회 + Long countResult = queryFactory + .select(company.count()) + .from(company) + .where(conditions) + .fetchOne(); + + long total = countResult != null ? countResult : 0L; + + return new PageImpl<>(results, pageable, total); + } catch (Exception e) { + log.error("업체 검색 중 오류 발생: {}", e.getMessage(), e); + throw new RuntimeException("업체 검색 도중 오류가 발생했습니다."); + } } /** @@ -96,8 +103,9 @@ private OrderSpecifier[] getSortedColumn(Sort sort) { // 기본 정렬(ID 오름차순) 추가 if (orderSpecifiers.isEmpty()) { orderSpecifiers.add( - new OrderSpecifier(Order.ASC, entityPath.get("id")) + new OrderSpecifier(Order.DESC, entityPath.get("createdAt")) ); + } return orderSpecifiers.toArray(new OrderSpecifier[0]); diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java index 8b6cfb1..868ae84 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -16,7 +16,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.util.List; import java.util.UUID; @RestController From c7003d7400c0486ca4e39a878b3e66fceb917e86 Mon Sep 17 00:00:00 2001 From: jiyun Date: Sat, 22 Mar 2025 18:24:09 +0900 Subject: [PATCH 217/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20[#114]=20:=20?= =?UTF-8?q?=EC=B6=A9=EB=8F=8C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../companyservice/domain/repository/CompanyRepository.java | 1 - 1 file changed, 1 deletion(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java index a72fda0..82c48a4 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java @@ -2,7 +2,6 @@ import com.sparta.companyservice.domain.model.Company; -import java.util.List; import java.util.Optional; import java.util.UUID; From bc3d0a00485b1cc360dd3562532890373c2dd7e4 Mon Sep 17 00:00:00 2001 From: jiyun Date: Sat, 22 Mar 2025 23:07:19 +0900 Subject: [PATCH 218/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20[#114]=20:=20?= =?UTF-8?q?=EB=A6=AC=ED=8F=AC=EC=A7=80=ED=86=A0=EB=A6=AC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/repository/CompanyRepository.java | 5 ++ .../repository/CompanyRepositoryImpl.java | 36 +++++++++ .../CompanyQueryRepositoryImplTest.java | 77 +++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java create mode 100644 company-service/src/test/java/com/sparta/companyservice/CompanyQueryRepositoryImplTest.java diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java index 82c48a4..c58256b 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java @@ -1,6 +1,9 @@ package com.sparta.companyservice.domain.repository; import com.sparta.companyservice.domain.model.Company; +import com.sparta.companyservice.domain.model.CompanyType; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import java.util.Optional; import java.util.UUID; @@ -9,4 +12,6 @@ public interface CompanyRepository { Company save(Company company); Optional findByIdAndDeletedAtIsNull(UUID id); + + Page searchCompanies(String name, String address, CompanyType type, Pageable pageable); } \ No newline at end of file diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java new file mode 100644 index 0000000..f0988d2 --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java @@ -0,0 +1,36 @@ +package com.sparta.companyservice.infrastructure.repository; + +import com.sparta.companyservice.domain.model.Company; +import com.sparta.companyservice.domain.model.CompanyType; +import com.sparta.companyservice.domain.repository.CompanyRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Repository; + +import java.util.Optional; +import java.util.UUID; + +@Repository +@RequiredArgsConstructor +public class CompanyRepositoryImpl implements CompanyRepository { + + private final JpaCompanyRepository jpaCompanyRepository; + + @Override + public Company save(Company company) { + return jpaCompanyRepository.save(company); + } + + @Override + public Optional findByIdAndDeletedAtIsNull(UUID id) { + return jpaCompanyRepository.findById(id) + .filter(c -> c.getDeletedAt() == null); + } + + @Override + public Page searchCompanies(String name, String address, CompanyType type, Pageable pageable) { + return jpaCompanyRepository.searchCompanies(name, address, type, pageable); + } +} + diff --git a/company-service/src/test/java/com/sparta/companyservice/CompanyQueryRepositoryImplTest.java b/company-service/src/test/java/com/sparta/companyservice/CompanyQueryRepositoryImplTest.java new file mode 100644 index 0000000..4d2d297 --- /dev/null +++ b/company-service/src/test/java/com/sparta/companyservice/CompanyQueryRepositoryImplTest.java @@ -0,0 +1,77 @@ +package com.sparta.companyservice; + +import com.sparta.companyservice.domain.model.Company; +import com.sparta.companyservice.domain.model.CompanyType; +import com.sparta.companyservice.infrastructure.querydsl.CompanyQueryRepositoryImpl; +import com.sparta.companyservice.infrastructure.repository.JpaCompanyRepository; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.Import; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.test.context.ActiveProfiles; + +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; + +@ActiveProfiles("test") +@DataJpaTest +@Import(CompanyQueryRepositoryImpl.class) +public class CompanyQueryRepositoryImplTest { + + @Autowired + private CompanyQueryRepositoryImpl companyQueryRepository; + + @Autowired + private JpaCompanyRepository jpaCompanyRepository; + + @PersistenceContext + private EntityManager em; + + private final UUID hubId = UUID.randomUUID(); + + private Company c1, c2, c3, c4; + + @BeforeEach + public void setUp() throws InterruptedException { + long userId = 1L; + + c1 = Company.create("Alpha", "Seoul", hubId, CompanyType.PRODUCER, userId); + Thread.sleep(10); + c2 = Company.create("Beta", "Busan", hubId, CompanyType.RECEIVER, userId); + Thread.sleep(10); + c3 = Company.create("Gamma", "Seoul", hubId, CompanyType.PRODUCER, userId); + Thread.sleep(10); + c4 = Company.create("Delta", "Jeju", hubId, CompanyType.PRODUCER, userId); + + jpaCompanyRepository.save(c1); + jpaCompanyRepository.save(c2); + jpaCompanyRepository.save(c3); + jpaCompanyRepository.save(c4); + + Company deleted = Company.create("DeletedOne", "Seoul", hubId, CompanyType.RECEIVER, userId); + deleted.delete(userId); + jpaCompanyRepository.save(deleted); + + em.flush(); + em.clear(); + } + + @Test + @DisplayName("정렬 조건 없을 때 기본 정렬(createdAt DESC) 적용") + public void default_sorting_applies_createdAt_DESC() { + PageRequest pageable = PageRequest.of(0, 10); // 정렬 명시 안함 + + Page result = companyQueryRepository.searchCompanies(null, null, null, pageable); + + assertThat(result.getTotalElements()).isEqualTo(4); // soft deleted 제외 + assertThat(result.getContent().get(0).getName()).isEqualTo("Delta"); // 가장 마지막에 생성됨 + assertThat(result.getContent().get(3).getName()).isEqualTo("Alpha"); // 가장 먼저 생성됨 + } +} From 7851aa58e56adacb574eafa49de3101eeae25e5d Mon Sep 17 00:00:00 2001 From: jiyun Date: Sat, 22 Mar 2025 23:08:34 +0900 Subject: [PATCH 219/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#114]=20:=20?= =?UTF-8?q?=EC=B6=A9=EB=8F=8C=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- company-service/build.gradle | 3 ++- .../controller/CompanyController.java | 14 +++++----- .../src/main/resources/application.yml | 26 ++++++++----------- 3 files changed, 20 insertions(+), 23 deletions(-) diff --git a/company-service/build.gradle b/company-service/build.gradle index 884699a..71f7544 100644 --- a/company-service/build.gradle +++ b/company-service/build.gradle @@ -4,11 +4,12 @@ ext { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation project(':common-module') implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' - implementation 'org.postgresql:postgresql:42.6.0' + implementation 'org.postgresql:postgresql:42.7.3' implementation 'jakarta.validation:jakarta.validation-api:3.0.2' implementation 'org.hibernate.validator:hibernate-validator:8.0.0.Final' implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java index 868ae84..2a40b5d 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -21,21 +21,21 @@ @RestController @RequestMapping("/api/v1/companies") @RequiredArgsConstructor -@Tag(name = "Company Service", description = "업체 서비스 API") +@Tag(name = "Company Service", description = "Company Service API") public class CompanyController { private final CompanyService companyService; // 생성 - @Operation(summary = "Company 등록", description = "Company 등록 API") + @Operation(summary = "Company 등록", description = "Company 생성 api 입니다.") @PostMapping public ResponseEntity createCompany(@Valid @RequestBody CompanyCreateRequest request) { CompanyDto createdCompany = companyService.createCompany(request.toDto()); return ResponseEntity.ok(CompanyResponse.fromDto(createdCompany)); } - // 전체 조회 - @Operation(summary = "Company 전체 조회", description = "Company 전체 조회 API") + // 검색 + @Operation(summary = "Company 조회", description = "Company 조회 api 입니다.") @GetMapping public ResponseEntity> searchCompanies( @RequestParam(required = false) String name, @@ -49,7 +49,7 @@ public ResponseEntity> searchCompanies( } // 단일 조회 - @Operation(summary = "Company 단건 조회", description = "Company 단건 조회 API") + @Operation(summary = "Company 조회", description = "Company 단건 조회 api 입니다.") @GetMapping("/{companyId}") public ResponseEntity getCompanyById(@PathVariable UUID companyId) { CompanyDto oneCompany = companyService.getCompanyById(companyId); @@ -57,7 +57,7 @@ public ResponseEntity getCompanyById(@PathVariable UUID company } // 수정 - @Operation(summary = "Company 수정", description = "Company 수정 API") + @Operation(summary = "Company 수정", description = "Company 수정 api 입니다.") @PatchMapping("/{companyId}") public ResponseEntity updateCompany(@PathVariable UUID companyId, @Valid @RequestBody CompanyUpdateRequest request) { CompanyDto updatedCompany = companyService.updateCompany(companyId, request.toDto()); @@ -65,7 +65,7 @@ public ResponseEntity updateCompany(@PathVariable UUID companyI } // 삭제 - @Operation(summary = "Company 삭제", description = "Company 삭제 API") + @Operation(summary = "Company 삭제", description = "Company 삭제 api 입니다.") @DeleteMapping("/{companyId}") public ResponseEntity deleteCompany(@PathVariable UUID companyId) { CompanyDeleteResponse deletedCompany = companyService.deleteCompany(companyId); diff --git a/company-service/src/main/resources/application.yml b/company-service/src/main/resources/application.yml index 5b46c03..5c66149 100644 --- a/company-service/src/main/resources/application.yml +++ b/company-service/src/main/resources/application.yml @@ -9,12 +9,17 @@ spring: jpa: hibernate: ddl-auto: update - open-in-view: false - show-sql: true - properties: - hibernate: - format_sql: true - default_batch_fetch_size: 10 + show-sql: true # 실행되는 SQL 쿼리 출력 + database-platform: org.hibernate.dialect.PostgreSQLDialect + +springdoc: + api-docs: + version: openapi_3_1 + enabled: true + path: /company-service/v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui.html eureka: client: @@ -25,12 +30,3 @@ eureka: server: port: 8085 - -springdoc: - api-docs: - version: openapi_3_1 - enabled: true - path: /company-service/v3/api-docs - swagger-ui: - enabled: true - path: /swagger-ui.html From 549e35bd5dafa44b727893af283b3b22b0ee8da5 Mon Sep 17 00:00:00 2001 From: jiyun Date: Sat, 22 Mar 2025 23:10:01 +0900 Subject: [PATCH 220/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20[#114]=20:=20?= =?UTF-8?q?=EB=A6=AC=ED=8F=AC=EC=A7=80=ED=86=A0=EB=A6=AC=20=EC=88=98?= =?UTF-8?q?=EC=A0=952?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infrastructure/repository/JpaCompanyRepository.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java index 761b0d4..e168ddb 100644 --- a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java +++ b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java @@ -1,7 +1,6 @@ package com.sparta.companyservice.infrastructure.repository; import com.sparta.companyservice.domain.model.Company; -import com.sparta.companyservice.domain.repository.CompanyRepository; import com.sparta.companyservice.infrastructure.querydsl.CompanyQueryRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -9,5 +8,5 @@ import java.util.UUID; @Repository -public interface JpaCompanyRepository extends JpaRepository, CompanyRepository, CompanyQueryRepository { +public interface JpaCompanyRepository extends JpaRepository, CompanyQueryRepository { } \ No newline at end of file From adf1ff087f1867dc49cf451b9c0819abfd420f87 Mon Sep 17 00:00:00 2001 From: jiyun Date: Sat, 22 Mar 2025 23:25:38 +0900 Subject: [PATCH 221/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20[#114]=20:=20Compa?= =?UTF-8?q?ny=20feignclient=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/CompanyService.java | 9 +++++---- .../companyservice/infrastructure/client/HubClient.java | 5 +++-- .../infrastructure/client/dto/HubClientDto.java | 6 ++++++ 3 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 company-service/src/main/java/com/sparta/companyservice/infrastructure/client/dto/HubClientDto.java diff --git a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java index a6539cb..6882456 100644 --- a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java +++ b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java @@ -8,8 +8,8 @@ import com.sparta.companyservice.domain.model.CompanyType; import com.sparta.companyservice.domain.repository.CompanyRepository; import com.sparta.companyservice.infrastructure.client.HubClient; -import com.sparta.companyservice.infrastructure.querydsl.CompanyQueryRepository; import com.sparta.companyservice.presentation.response.CompanyDeleteResponse; +import feign.FeignException; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -23,7 +23,6 @@ public class CompanyService { private final CompanyRepository companyRepository; private final HubClient hubClient; - private final CompanyQueryRepository companyQueryRepository; long userId = 1L; // 실제로는 인증된 사용자 ID 가져와야 함 @@ -43,7 +42,7 @@ public CompanyDto createCompany(CompanyCreateDto dto) { @Transactional(readOnly = true) // 전체 조회 public Page searchCompanies(String name, String address, CompanyType type, Pageable pageable) { - return companyQueryRepository.searchCompanies(name, address, type, pageable) + return companyRepository.searchCompanies(name, address, type, pageable) .map(CompanyDto::fromEntity); } @@ -75,7 +74,9 @@ public CompanyDeleteResponse deleteCompany(UUID id) { /// ////////////////////////////////////////////////////////////////////////////////// private void validateHubExists(UUID hubId) { - if (!hubClient.existsById(hubId)) { + try { + hubClient.getHubById(hubId); + } catch (FeignException.NotFound e) { throw new ResourceNotFoundException("해당 허브가 존재하지 않습니다."); } } diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/client/HubClient.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/client/HubClient.java index 7d03a47..f91c40d 100644 --- a/company-service/src/main/java/com/sparta/companyservice/infrastructure/client/HubClient.java +++ b/company-service/src/main/java/com/sparta/companyservice/infrastructure/client/HubClient.java @@ -1,5 +1,6 @@ package com.sparta.companyservice.infrastructure.client; +import com.sparta.companyservice.infrastructure.client.dto.HubClientDto; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -9,6 +10,6 @@ @FeignClient(name = "hub-service") public interface HubClient { - @GetMapping("/api/v1/hubs/{id}/exists") - boolean existsById(@PathVariable("id") UUID id); + @GetMapping("/api/v1/hubs/{hub_id}") + HubClientDto getHubById(@PathVariable("hub_id") UUID hubId); } diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/client/dto/HubClientDto.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/client/dto/HubClientDto.java new file mode 100644 index 0000000..739daff --- /dev/null +++ b/company-service/src/main/java/com/sparta/companyservice/infrastructure/client/dto/HubClientDto.java @@ -0,0 +1,6 @@ +package com.sparta.companyservice.infrastructure.client.dto; + +import java.util.UUID; + +public record HubClientDto(UUID hubId, String name, String address) { +} From 55d7ee4ecd167635dbae367ca545992105d79d18 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 03:27:08 +0900 Subject: [PATCH 222/389] =?UTF-8?q?=F0=9F=99=88=20gitfix=20:.idea/dataSour?= =?UTF-8?q?ces.xml=20Git=20=EC=B6=94=EC=A0=81=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 311 +++++++----------------------------------- .idea/dataSources.xml | 17 --- 2 files changed, 50 insertions(+), 278 deletions(-) delete mode 100644 .idea/dataSources.xml diff --git a/.gitignore b/.gitignore index fc97a18..1b2f2b1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,298 +1,87 @@ -# Created by https://www.toptal.com/developers/gitignore/api/java,intellij,maven,kotlin,gradle,windows,macos -# Edit at https://www.toptal.com/developers/gitignore?templates=java,intellij,maven,kotlin,gradle,windows,macos - -### Intellij ### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# 보안 관련 키 및 인증 파일 -*.pem -*.key -*.crt -*.pfx - -# 시크릿키 보관 파일 -application-secret.yml - -# DB 및 로그 파일 -*.db -*.sqlite -*.h2.db -*.mv.db -*.pgdata/ -logs/ -*.log -log/ - -# IntelliJ 프로젝트 설정 파일 제외 -.idea/misc.xml -.idea/modules.xml -.idea/workspace.xml -.idea/compiler.xml -.idea/shelf/ -.idea/libraries/ -.idea/inspectionProfiles/ -.idea/artifacts/ -.idea/deployment.xml -.idea/httpRequests/ - -# Docker 빌드 중 생기는 파일 -.dockerignore -docker/data/ -docker/db-data/ +# -------------------- IDEA -------------------- +.idea/ +*.iml +*.iws +# 허용할 IntelliJ 설정 +!.idea/codeStyles/ +!.idea/inspectionProfiles/ -# User-specific stuff +# IDEA 자동 생성 불필요 파일 .idea/**/workspace.xml .idea/**/tasks.xml .idea/**/usage.statistics.xml .idea/**/dictionaries -.idea/**/shelf -.idea/modules/** -.idea/compiler.xml - -# AWS User-specific -.idea/**/aws.xml - -# Generated files -.idea/**/contentModel.xml - -# Sensitive or high-churn files -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.local.xml +.idea/**/shelf/ +.idea/**/dataSources* .idea/**/sqlDataSources.xml .idea/**/dynamic.xml -.idea/**/uiDesigner.xml .idea/**/dbnavigator.xml - -# Gradle +.idea/httpRequests/ +.idea/caches/ .idea/**/gradle.xml -.idea/**/libraries - -# Gradle and Maven with auto-import -# When using Gradle or Maven with auto-import, you should exclude module files, -# since they will be recreated, and may cause churn. Uncomment if using -# auto-import. -# .idea/artifacts -# .idea/compiler.xml -# .idea/jarRepositories.xml -# .idea/modules.xml -# .idea/*.iml -# .idea/modules -# *.iml -# *.ipr - -# CMake -cmake-build-*/ - -# Mongo Explorer plugin -.idea/**/mongoSettings.xml - -# File-based project format -*.iws - -# IntelliJ -out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Cursive Clojure plugin -.idea/replstate.xml - -# SonarLint plugin -.idea/sonarlint/ - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -# Editor-based Rest Client -.idea/httpRequests - -# Android studio 3.1+ serialized cache file -.idea/caches/build_file_checksums.ser - -### Intellij Patch ### -# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 - -# *.iml -# modules.xml -# .idea/misc.xml -# *.ipr - -# Sonarlint plugin -# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/libraries/ .idea/**/sonarlint/ - -# SonarQube Plugin -# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin .idea/**/sonarIssues.xml - -# Markdown Navigator plugin -# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced -.idea/**/markdown-navigator.xml -.idea/**/markdown-navigator-enh.xml -.idea/**/markdown-navigator/ - -# Cache file creation bug -# See https://youtrack.jetbrains.com/issue/JBR-2257 -.idea/$CACHE_FILE$ - -# CodeStream plugin -# https://plugins.jetbrains.com/plugin/12206-codestream -.idea/codestream.xml - -# Azure Toolkit for IntelliJ plugin -# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij +.idea/**/markdown-navigator* +.idea/**/aws.xml .idea/**/azureSettings.xml -### Java ### -# Compiled class file -*.class -# Log file +# -------------------- LOGS / DB -------------------- *.log +log/ +logs/ +*.db +*.sqlite +*.h2.db +*.mv.db +*.pgdata/ -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ +# -------------------- BUILD -------------------- +# build 전체는 무시하되, 필요한 파일은 다시 포함 +**/build/ +!**/build/resources/main/application.yml +!**/build/resources/test/http/*.http +!**/build/generated/**/*.java +!**/build/tmp/compiled_classes/**/resolvedMainClassName +!**/build/tmp/**/*.bin +!src/**/build/ -# Package Files # +# -------------------- GRADLE / MAVEN -------------------- +.gradle/ +out/ +target/ +*.class *.jar *.war -*.nar *.ear -*.zip -*.tar.gz -*.rar -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* -replay_pid* - -### Kotlin ### -# Compiled class file - -# Log file - -# BlueJ files - -# Mobile Tools for Java (J2ME) - -# Package Files # - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +.mvn/ +!gradle-wrapper.jar +!gradle-wrapper.properties -### macOS ### -# General +# -------------------- SYSTEM -------------------- +# macOS .DS_Store .AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 .fseventsd .Spotlight-V100 .TemporaryItems .Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items .apdisk - -### macOS Patch ### -# iCloud generated files *.icloud -### Maven ### -target/ -pom.xml.tag -pom.xml.releaseBackup -pom.xml.versionsBackup -pom.xml.next -release.properties -dependency-reduced-pom.xml -buildNumber.properties -.mvn/timing.properties -# https://github.com/takari/maven-wrapper#usage-without-binary-jar -.mvn/wrapper/maven-wrapper.jar - -# Eclipse m2e generated files -# Eclipse Core -.project -# JDT-specific (Eclipse Java Development Tools) -.classpath - -### Windows ### -# Windows thumbnail cache files +# Windows Thumbs.db -Thumbs.db:encryptable ehthumbs.db -ehthumbs_vista.db - -# Dump file -*.stackdump - -# Folder config file -[Dd]esktop.ini - -# Recycle Bin used on file shares +Desktop.ini $RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msix -*.msm -*.msp - -# Windows shortcuts *.lnk -### Gradle ### -.gradle -**/build/ -!src/**/build/ - -# Ignore Gradle GUI config -gradle-app.setting - -# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) -!gradle-wrapper.jar - -# Avoid ignore Gradle wrappper properties -!gradle-wrapper.properties - -# Cache of project -.gradletasknamecache - -# Eclipse Gradle plugin generated files -# Eclipse Core -# JDT-specific (Eclipse Java Development Tools) - -### Gradle Patch ### -# Java heap dump -*.hprof - -# End of https://www.toptal.com/developers/gitignore/api/java,intellij,maven,kotlin,gradle,windows,macos \ No newline at end of file +# -------------------- SECRETS -------------------- +application-secret.yml +*.key +*.pem +*.crt +*.pfx diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml deleted file mode 100644 index a0e2742..0000000 --- a/.idea/dataSources.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - postgresql - true - org.postgresql.Driver - jdbc:postgresql://localhost:5001/user_db - - - - - - $ProjectFileDir$ - - - \ No newline at end of file From 2fb85336a0c3040b65132fd3c15cfee908e03996 Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Sun, 23 Mar 2025 04:26:22 +0900 Subject: [PATCH 223/389] =?UTF-8?q?=E2=9C=A8feat=20[#149]=20:ShippingManag?= =?UTF-8?q?er=20Entity=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/model/ManagerType.java | 6 +++ .../domain/model/ShippingManager.java | 40 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ManagerType.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingManager.java diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ManagerType.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ManagerType.java new file mode 100644 index 0000000..b51139b --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ManagerType.java @@ -0,0 +1,6 @@ +package com.sparta.shippingservice.domain.model; + +public enum ManagerType { + HUB, // 허브 배송 담당자 + CARRIER // 업체 배송 담당자 +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingManager.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingManager.java new file mode 100644 index 0000000..8af9991 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingManager.java @@ -0,0 +1,40 @@ +package com.sparta.shippingservice.domain.model; + +import com.sparta.commonmodule.entity.BaseEntity; +import jakarta.persistence.*; +import lombok.*; + +import java.util.UUID; +@Entity +@Table(name = "p_shipping_managers") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ShippingManager extends BaseEntity { + + @Id + @Column(name = "shipping_manager_id", updatable = false, nullable = false) + private UUID id; + + @Column(nullable = false) + private UUID shippingManagerId; + + @Enumerated(EnumType.STRING) + @Column(nullable = false, length = 20) + private ManagerType managerType; + + @Column(nullable = false) + private Integer shippingOrder; + + +} + + + + + + + + + + + From dd6df955bbad0bb330badf5585e5a9c41ddd2f30 Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Sun, 23 Mar 2025 09:20:01 +0900 Subject: [PATCH 224/389] =?UTF-8?q?=E2=9C=A8feat=20[#149]=20:ShippingManag?= =?UTF-8?q?er=20Entity=20=EC=83=9D=EC=84=B1=20=EA=B3=BC=20=EB=B0=B0?= =?UTF-8?q?=EC=86=A1=20=EB=8B=B4=EB=8B=B9=EC=9E=90=20=ED=95=A0=EB=8B=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shipping-service/build.gradle | 1 + .../response/ShippingManagerResponseDto.java | 18 +++++++ .../service/ShippingManagerService.java | 47 +++++++++++++++++++ .../domain/model/ManagerType.java | 2 +- .../domain/model/ShippingManager.java | 13 ++++- .../repository/ShippingManagerRepository.java | 16 +++++++ .../infrastructure/JpaManagerRepository.java | 27 +++++++++++ .../ShippingManagerController.java | 22 +++++++++ .../ShippingServiceApplication.java | 13 +++++ .../client/ShippingManagerResponseDto.java | 11 +++++ .../dto/request/CreateShippingRequestDto.java | 5 +- .../application/service/ShippingService.java | 12 ++++- .../client/ShippingManagerClient.java | 17 +++++++ .../src/main/resources/application.yaml | 5 ++ 14 files changed, 202 insertions(+), 7 deletions(-) create mode 100644 shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/response/ShippingManagerResponseDto.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java rename shipping-service/src/main/java/com/sparta/{shippingservice => shippingmanager}/domain/model/ManagerType.java (67%) rename shipping-service/src/main/java/com/sparta/{shippingservice => shippingmanager}/domain/model/ShippingManager.java (66%) create mode 100644 shipping-service/src/main/java/com/sparta/shippingmanager/domain/repository/ShippingManagerRepository.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingmanager/infrastructure/JpaManagerRepository.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/application/dto/client/ShippingManagerResponseDto.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/client/ShippingManagerClient.java diff --git a/shipping-service/build.gradle b/shipping-service/build.gradle index a8046cc..d8ee975 100644 --- a/shipping-service/build.gradle +++ b/shipping-service/build.gradle @@ -8,6 +8,7 @@ dependencies { implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' implementation 'org.hibernate:hibernate-core:6.3.1.Final' implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' implementation project(':common-module') implementation("org.postgresql:postgresql:42.7.2") runtimeOnly 'com.h2database:h2' diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/response/ShippingManagerResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/response/ShippingManagerResponseDto.java new file mode 100644 index 0000000..7205039 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/response/ShippingManagerResponseDto.java @@ -0,0 +1,18 @@ +package com.sparta.shippingmanager.application.dto.response; + +import com.sparta.shippingmanager.domain.model.ManagerType; +import com.sparta.shippingmanager.domain.model.ShippingManager; + +import java.util.UUID; + +public record ShippingManagerResponseDto( + UUID id, + ManagerType managerType +) { + public static ShippingManagerResponseDto from(ShippingManager manager) { + return new ShippingManagerResponseDto( + manager.getId(), + manager.getManagerType() + ); + } +} \ No newline at end of file diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java b/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java new file mode 100644 index 0000000..d2fd9ae --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java @@ -0,0 +1,47 @@ +package com.sparta.shippingmanager.application.service; + +import com.sparta.commonmodule.exception.ResourceNotFoundException; +import com.sparta.shippingmanager.domain.model.ShippingManager; +import com.sparta.shippingmanager.domain.repository.ShippingManagerRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +@Service +@RequiredArgsConstructor +public class ShippingManagerService { + + private final ShippingManagerRepository repository; + + private static final int MAX_ORDER = 10; + + @Transactional + public ShippingManager assign() { + ShippingManager manager = repository.findNextManagerWithLock() + .stream(). + findFirst(). + orElseThrow(() -> new ResourceNotFoundException(" 배정 가능한 담당자가 없습니다.")); + + manager.increaseCount(); + + nextManagerOrder(manager.getShippingOrder()); + + return manager; + + } + + private void nextManagerOrder(int currentOrder) { + int nextOrder; + if (currentOrder + 1 > MAX_ORDER) { + nextOrder = 1; + } else { + nextOrder = currentOrder + 1; + } + repository.updateAllManagerOrders(nextOrder); + + + } + + +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ManagerType.java b/shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/ManagerType.java similarity index 67% rename from shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ManagerType.java rename to shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/ManagerType.java index b51139b..9f013d4 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ManagerType.java +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/ManagerType.java @@ -1,4 +1,4 @@ -package com.sparta.shippingservice.domain.model; +package com.sparta.shippingmanager.domain.model; public enum ManagerType { HUB, // 허브 배송 담당자 diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingManager.java b/shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/ShippingManager.java similarity index 66% rename from shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingManager.java rename to shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/ShippingManager.java index 8af9991..ecbf287 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingManager.java +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/ShippingManager.java @@ -1,4 +1,4 @@ -package com.sparta.shippingservice.domain.model; +package com.sparta.shippingmanager.domain.model; import com.sparta.commonmodule.entity.BaseEntity; import jakarta.persistence.*; @@ -12,7 +12,7 @@ public class ShippingManager extends BaseEntity { @Id - @Column(name = "shipping_manager_id", updatable = false, nullable = false) + @Column(name = "shipping_managers_id", updatable = false, nullable = false) private UUID id; @Column(nullable = false) @@ -25,6 +25,15 @@ public class ShippingManager extends BaseEntity { @Column(nullable = false) private Integer shippingOrder; + @Column(nullable = false) + private Boolean isActive; + + private Integer count =0; + + public void increaseCount(){ + this.count++; + } + } diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/domain/repository/ShippingManagerRepository.java b/shipping-service/src/main/java/com/sparta/shippingmanager/domain/repository/ShippingManagerRepository.java new file mode 100644 index 0000000..f9fdc53 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/domain/repository/ShippingManagerRepository.java @@ -0,0 +1,16 @@ +package com.sparta.shippingmanager.domain.repository; +import com.sparta.shippingmanager.domain.model.ShippingManager; + + +import java.util.List; +import java.util.Optional; + + +public interface ShippingManagerRepository { + + // 가장 낮은 순서의 활성화된 담당자 찾기 + void updateAllManagerOrders(int max); + + List findNextManagerWithLock(); + +} diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/infrastructure/JpaManagerRepository.java b/shipping-service/src/main/java/com/sparta/shippingmanager/infrastructure/JpaManagerRepository.java new file mode 100644 index 0000000..2655eb2 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/infrastructure/JpaManagerRepository.java @@ -0,0 +1,27 @@ +package com.sparta.shippingmanager.infrastructure; + +import com.sparta.shippingmanager.domain.model.ShippingManager; +import com.sparta.shippingmanager.domain.repository.ShippingManagerRepository; +import jakarta.persistence.LockModeType; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Lock; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.UUID; + +@Repository +public interface JpaManagerRepository extends JpaRepository, ShippingManagerRepository { + + @Modifying + @Query("UPDATE ShippingManager m SET m.shippingOrder = CASE" + + " WHEN m.shippingOrder =:max THEN 1 ELSE m.shippingOrder + 1 END") + void updateAllManagerOrders(@Param("max") int max); + + @Lock(LockModeType.PESSIMISTIC_WRITE) + @Query("SELECT m FROM ShippingManager m WHERE m.isActive = true ORDER BY m.shippingOrder ASC") + List findNextManagerWithLock(); +} diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java b/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java new file mode 100644 index 0000000..18566c1 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java @@ -0,0 +1,22 @@ +package com.sparta.shippingmanager.presentation; + +import com.sparta.shippingmanager.application.service.ShippingManagerService; +import com.sparta.shippingmanager.domain.model.ShippingManager; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/shipping-managers") +@RequiredArgsConstructor +public class ShippingManagerController { + + private final ShippingManagerService shippingManagerService; + + @GetMapping("/assign") + public ShippingManager assignManager(){ + return shippingManagerService.assign(); + } + +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java b/shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java index 43e1725..03cbe37 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java @@ -2,8 +2,21 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication(scanBasePackages = "com.sparta") +@EnableFeignClients(basePackages = "com.sparta") +@EnableJpaRepositories(basePackages = "com.sparta") +@EntityScan(basePackages = "com.sparta") + + + + + + + public class ShippingServiceApplication { public static void main(String[] args) { SpringApplication.run(ShippingServiceApplication.class, args); diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/client/ShippingManagerResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/client/ShippingManagerResponseDto.java new file mode 100644 index 0000000..08237e7 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/client/ShippingManagerResponseDto.java @@ -0,0 +1,11 @@ +package com.sparta.shippingservice.application.dto.client; + +import com.sparta.shippingmanager.domain.model.ManagerType; + +import java.util.UUID; + +public record ShippingManagerResponseDto( + UUID id, + String name, + ManagerType managerType +) {} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java index 4a5fec0..613ede2 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateShippingRequestDto.java @@ -21,18 +21,17 @@ public record CreateShippingRequestDto( @Size(min = 2, max = 100, message = "수령인 이름은 2~100자 사이여야 합니다.") String receiverName, - UUID shippingManagerId, @NotNull(message = "배송 상태는 필수입니다.") ShippingStatus status ) { - public ShippingSelf of(){ + public ShippingSelf of( UUID managerId){ return new ShippingSelf( this.orderId(), this.shippingAddress(), this.receiverName(), - this.shippingManagerId(), + managerId, //외부에서 받아온 값 주입 this.status() ); diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java index 0b02b68..414b564 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -1,5 +1,8 @@ package com.sparta.shippingservice.application.service; +import com.sparta.shippingmanager.domain.model.ManagerType; +import com.sparta.shippingmanager.domain.model.ShippingManager; +import com.sparta.shippingservice.application.dto.client.ShippingManagerResponseDto; import com.sparta.shippingservice.application.dto.request.CreateRouteLogRequestDto; import com.sparta.shippingservice.application.dto.request.CreateShippingRequestDto; import com.sparta.shippingservice.application.dto.request.UpdateShippingRequestDto; @@ -12,6 +15,7 @@ import com.sparta.commonmodule.exception.*; import com.sparta.shippingservice.domain.repository.ShippingRouteRepository; +import com.sparta.shippingservice.infrastructure.client.ShippingManagerClient; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -28,11 +32,17 @@ public class ShippingService { private final ShippingRepository shippingRepository; private final ShippingRouteRepository shippingRouteRepository; + private final ShippingManagerClient shippingManagerClient; @Transactional public ShippingWithRouteResponseDto create(@Valid CreateShippingRequestDto request , @Valid CreateRouteLogRequestDto logDto) { - Shipping shipping = request.of().toShipping(); + ShippingManagerResponseDto manager = shippingManagerClient.assignManager(); + if(manager.managerType() != ManagerType.CARRIER){ + throw new InvalidParameterException("배송 담당자는 업체 소속이어야 합니다."); + } + + Shipping shipping = request.of(manager.id()).toShipping(); RouteLogSelf routeLogSelf = new RouteLogSelf( shipping, diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/client/ShippingManagerClient.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/client/ShippingManagerClient.java new file mode 100644 index 0000000..d511144 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/client/ShippingManagerClient.java @@ -0,0 +1,17 @@ +package com.sparta.shippingservice.infrastructure.client; + +import com.sparta.shippingservice.application.dto.client.ShippingManagerResponseDto; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.UUID; + +@FeignClient(name="shipping-manager-service",url ="${feign.client.config.shipping-manager-service.url}") +public interface ShippingManagerClient { + + @GetMapping("/api/shipping-managers/assign") + ShippingManagerResponseDto assignManager(); + + +} diff --git a/shipping-service/src/main/resources/application.yaml b/shipping-service/src/main/resources/application.yaml index b452be1..192593e 100644 --- a/shipping-service/src/main/resources/application.yaml +++ b/shipping-service/src/main/resources/application.yaml @@ -23,3 +23,8 @@ eureka: service-url: defaultZone: http://localhost:8761/eureka/ +feign: + client: + config: + shipping-manager-service: + url: http://localhost:8088 \ No newline at end of file From f09ede69fa23104d4695db24494a42a6645eb76b Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 13:27:25 +0900 Subject: [PATCH 225/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20feign=20client?= =?UTF-8?q?=20=EC=B4=88=EA=B8=B0=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hub-service/build.gradle | 4 +++- .../java/com/sparta/hubservice/HubServiceApplication.java | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/hub-service/build.gradle b/hub-service/build.gradle index a1e26c8..6b82eaf 100644 --- a/hub-service/build.gradle +++ b/hub-service/build.gradle @@ -7,12 +7,14 @@ dependencies { // 공통 모듈 implementation project(':common-module') - + // Swagger 에 필요한 의존성 implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' implementation 'org.springframework.boot:spring-boot-starter-web' // eureka client implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' + // feign client + implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' // 유효성 검사 implementation 'org.springframework.boot:spring-boot-starter-validation' // Spring Boot 및 JPA 관련 의존성 diff --git a/hub-service/src/main/java/com/sparta/hubservice/HubServiceApplication.java b/hub-service/src/main/java/com/sparta/hubservice/HubServiceApplication.java index 9739ba7..bc59935 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/HubServiceApplication.java +++ b/hub-service/src/main/java/com/sparta/hubservice/HubServiceApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication(scanBasePackages = "com.sparta") +@EnableFeignClients public class HubServiceApplication { public static void main(String[] args) { From 635d81ac9f538b4eb82cd24aa988df109c92f56f Mon Sep 17 00:00:00 2001 From: jiyun Date: Sun, 23 Mar 2025 13:27:38 +0900 Subject: [PATCH 226/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#148]=20:=20Product?= =?UTF-8?q?->Company=20Id=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=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 --- .../companyservice/application/service/CompanyService.java | 5 +++++ .../domain/repository/CompanyRepository.java | 2 ++ .../infrastructure/repository/CompanyRepositoryImpl.java | 7 +++++++ .../infrastructure/repository/JpaCompanyRepository.java | 1 + .../presentation/controller/CompanyController.java | 6 ++++++ 5 files changed, 21 insertions(+) diff --git a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java index 6882456..dd0787f 100644 --- a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java +++ b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java @@ -26,6 +26,11 @@ public class CompanyService { long userId = 1L; // 실제로는 인증된 사용자 ID 가져와야 함 + @Transactional(readOnly = true) + public boolean existsById(UUID id) { // 업체 존재 확인 + return companyRepository.existsByIdAndDeletedAtIsNull(id); + } + @Transactional // 생성 public CompanyDto createCompany(CompanyCreateDto dto) { validateHubExists(dto.hubId()); diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java index c58256b..0a5cc8c 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java @@ -14,4 +14,6 @@ public interface CompanyRepository { Optional findByIdAndDeletedAtIsNull(UUID id); Page searchCompanies(String name, String address, CompanyType type, Pageable pageable); + + boolean existsByIdAndDeletedAtIsNull(UUID id); } \ No newline at end of file diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java index f0988d2..3cf99fe 100644 --- a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java +++ b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/CompanyRepositoryImpl.java @@ -32,5 +32,12 @@ public Optional findByIdAndDeletedAtIsNull(UUID id) { public Page searchCompanies(String name, String address, CompanyType type, Pageable pageable) { return jpaCompanyRepository.searchCompanies(name, address, type, pageable); } + + @Override + public boolean existsByIdAndDeletedAtIsNull(UUID id) { + return jpaCompanyRepository.existsByIdAndDeletedAtIsNull(id); + } + + } diff --git a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java index e168ddb..499461a 100644 --- a/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java +++ b/company-service/src/main/java/com/sparta/companyservice/infrastructure/repository/JpaCompanyRepository.java @@ -9,4 +9,5 @@ @Repository public interface JpaCompanyRepository extends JpaRepository, CompanyQueryRepository { + boolean existsByIdAndDeletedAtIsNull(UUID id); } \ No newline at end of file diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java index 2a40b5d..61b6190 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -26,6 +26,12 @@ public class CompanyController { private final CompanyService companyService; + // 업체 존재 확인 + @GetMapping("/{id}/exists") + public boolean existsById(@PathVariable UUID id) { + return companyService.existsById(id); + } + // 생성 @Operation(summary = "Company 등록", description = "Company 생성 api 입니다.") @PostMapping From 4ec522608d84af0c3fdb11ecc1071abfeddb5265 Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Sun, 23 Mar 2025 14:38:23 +0900 Subject: [PATCH 227/389] =?UTF-8?q?=E2=9C=A8feat=20[#151]=20:ShippingManag?= =?UTF-8?q?er=20=EC=83=9D=EC=84=B1=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ShippingManagerCreateRequestDto.java | 25 +++++++++++++++++ .../response/ShippingManagerResponseDto.java | 10 ++++--- .../service/ShippingManagerService.java | 15 ++++++++--- .../domain/model/ShippingManager.java | 24 +++++++++++++++-- .../model/trnas/ShippingManagerSelf.java | 27 +++++++++++++++++++ .../repository/ShippingManagerRepository.java | 2 +- .../ShippingManagerController.java | 17 +++++++++--- .../application/service/ShippingService.java | 5 +--- 8 files changed, 107 insertions(+), 18 deletions(-) create mode 100644 shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/request/ShippingManagerCreateRequestDto.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/trnas/ShippingManagerSelf.java diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/request/ShippingManagerCreateRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/request/ShippingManagerCreateRequestDto.java new file mode 100644 index 0000000..5082dae --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/request/ShippingManagerCreateRequestDto.java @@ -0,0 +1,25 @@ +package com.sparta.shippingmanager.application.dto.request; + +import com.sparta.shippingmanager.domain.model.ManagerType; +import com.sparta.shippingmanager.domain.model.ShippingManager; +import com.sparta.shippingmanager.domain.model.trnas.ShippingManagerSelf; + +import java.util.UUID; + +public record ShippingManagerCreateRequestDto( + UUID shippingManagerId, + ManagerType managerType, + Boolean isActive, + Integer count +) { + public ShippingManagerSelf of (){ + return new ShippingManagerSelf( + this.shippingManagerId(), + this.managerType(), + this.isActive(), + this.count() + + ); + } + +} diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/response/ShippingManagerResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/response/ShippingManagerResponseDto.java index 7205039..85e0be3 100644 --- a/shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/response/ShippingManagerResponseDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/response/ShippingManagerResponseDto.java @@ -6,13 +6,15 @@ import java.util.UUID; public record ShippingManagerResponseDto( - UUID id, - ManagerType managerType + ManagerType managerType, + UUID shippingManagerId, + Integer shippingOrder ) { public static ShippingManagerResponseDto from(ShippingManager manager) { return new ShippingManagerResponseDto( - manager.getId(), - manager.getManagerType() + manager.getManagerType(), + manager.getShippingManagerId(), + manager.getShippingOrder() ); } } \ No newline at end of file diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java b/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java index d2fd9ae..87eaf24 100644 --- a/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java @@ -1,8 +1,10 @@ package com.sparta.shippingmanager.application.service; import com.sparta.commonmodule.exception.ResourceNotFoundException; +import com.sparta.shippingmanager.application.dto.request.ShippingManagerCreateRequestDto; import com.sparta.shippingmanager.domain.model.ShippingManager; import com.sparta.shippingmanager.domain.repository.ShippingManagerRepository; +import com.sparta.shippingmanager.application.dto.response.ShippingManagerResponseDto; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -15,6 +17,7 @@ public class ShippingManagerService { private final ShippingManagerRepository repository; private static final int MAX_ORDER = 10; + private static int MIN_ORDER =0; @Transactional public ShippingManager assign() { @@ -23,7 +26,7 @@ public ShippingManager assign() { findFirst(). orElseThrow(() -> new ResourceNotFoundException(" 배정 가능한 담당자가 없습니다.")); - manager.increaseCount(); + manager.increaseCount(MIN_ORDER); nextManagerOrder(manager.getShippingOrder()); @@ -31,6 +34,14 @@ public ShippingManager assign() { } + public ShippingManagerResponseDto create(ShippingManagerCreateRequestDto request,Long userId){ + ShippingManager shippingManager = request.of().toShippingManager(userId); + repository.save(shippingManager); + return ShippingManagerResponseDto.from(shippingManager); + + } + + private void nextManagerOrder(int currentOrder) { int nextOrder; if (currentOrder + 1 > MAX_ORDER) { @@ -40,8 +51,6 @@ private void nextManagerOrder(int currentOrder) { } repository.updateAllManagerOrders(nextOrder); - } - } diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/ShippingManager.java b/shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/ShippingManager.java index ecbf287..d61276c 100644 --- a/shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/ShippingManager.java +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/ShippingManager.java @@ -30,10 +30,30 @@ public class ShippingManager extends BaseEntity { private Integer count =0; - public void increaseCount(){ - this.count++; + + public ShippingManager(Long userId, UUID shippingManagerId, ManagerType managerType, Boolean isActive, Integer count) { + super(userId); + this.shippingManagerId = shippingManagerId; + this.managerType = managerType; + this.isActive = isActive; + this.count = count; + } + + @PrePersist + public void prePersist(){ + if(this.id == null){ + this.id = UUID.randomUUID(); + } } + public Integer increaseCount(int count){ + if (count <10) { + count++; + }else{ + count = 0; + } + return this.shippingOrder = count; + } } diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/trnas/ShippingManagerSelf.java b/shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/trnas/ShippingManagerSelf.java new file mode 100644 index 0000000..8569b72 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/trnas/ShippingManagerSelf.java @@ -0,0 +1,27 @@ +package com.sparta.shippingmanager.domain.model.trnas; + +import com.sparta.shippingmanager.domain.model.ManagerType; +import com.sparta.shippingmanager.domain.model.ShippingManager; + +import java.util.UUID; + +public record ShippingManagerSelf( + UUID shippingManagerId, + ManagerType managerType, + Boolean isActive, + Integer count +) +{ + public ShippingManager toShippingManager(Long userId){ + ShippingManager manager = new ShippingManager( + userId, + this.shippingManagerId, + this.managerType, + this.isActive, + this.count + + ); + manager.increaseCount(1); + return manager; + } + } diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/domain/repository/ShippingManagerRepository.java b/shipping-service/src/main/java/com/sparta/shippingmanager/domain/repository/ShippingManagerRepository.java index f9fdc53..e1f03c8 100644 --- a/shipping-service/src/main/java/com/sparta/shippingmanager/domain/repository/ShippingManagerRepository.java +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/domain/repository/ShippingManagerRepository.java @@ -3,7 +3,6 @@ import java.util.List; -import java.util.Optional; public interface ShippingManagerRepository { @@ -12,5 +11,6 @@ public interface ShippingManagerRepository { void updateAllManagerOrders(int max); List findNextManagerWithLock(); + ShippingManager save(ShippingManager shippingManager); } diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java b/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java index 18566c1..d25b6a3 100644 --- a/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java @@ -1,11 +1,13 @@ package com.sparta.shippingmanager.presentation; +import com.sparta.shippingmanager.application.dto.request.ShippingManagerCreateRequestDto; import com.sparta.shippingmanager.application.service.ShippingManagerService; import com.sparta.shippingmanager.domain.model.ShippingManager; +import com.sparta.shippingmanager.application.dto.response.ShippingManagerResponseDto; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/shipping-managers") @@ -14,9 +16,16 @@ public class ShippingManagerController { private final ShippingManagerService shippingManagerService; - @GetMapping("/assign") + @GetMapping("/assign") // 배송 담당자 할당 public ShippingManager assignManager(){ return shippingManagerService.assign(); } + @PostMapping() + public ResponseEntity create(@Valid @RequestBody ShippingManagerCreateRequestDto request, @RequestHeader("userId") Long userId){ + ShippingManagerResponseDto response = shippingManagerService.create(request, userId); + return ResponseEntity.ok(response); + } + + } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java index 414b564..d837aaa 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -34,8 +34,7 @@ public class ShippingService { private final ShippingRouteRepository shippingRouteRepository; private final ShippingManagerClient shippingManagerClient; - - @Transactional +//각 허브에 10명 / 업체에 10명 public ShippingWithRouteResponseDto create(@Valid CreateShippingRequestDto request , @Valid CreateRouteLogRequestDto logDto) { ShippingManagerResponseDto manager = shippingManagerClient.assignManager(); if(manager.managerType() != ManagerType.CARRIER){ @@ -96,7 +95,6 @@ public ShippingResponseDto updateShipping(UUID shippingId, @Valid UpdateShipping } - @Transactional public ShippingResponseDto deleteShipping(UUID shippingId, long userId) { Shipping shipping = findShipping(shippingId); shipping.delete(userId); @@ -131,7 +129,6 @@ public List getLogAll(){ )).collect(Collectors.toList()); } - @Transactional public ShippingRouteResponseDto deleteShippingLog(UUID shippingId,UUID shippingLogId, long userId) { ShippingRouteLog routeLog = shippingRouteRepository.findByIdAndShippingId(shippingLogId, shippingId) .orElseThrow(() -> new ResourceNotFoundException("해당 배송에 속하지 않는 배송 경로 로그입니다.")); From d33b50b72d5af49bd18e3f1db585daf48a973915 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Sun, 23 Mar 2025 15:36:12 +0900 Subject: [PATCH 228/389] =?UTF-8?q?=F0=9F=8D=BB=20test=20[#152]=20:=20User?= =?UTF-8?q?=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=9E=91=EC=84=B1=20-=20CRUD?= =?UTF-8?q?=20=ED=86=B5=ED=95=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- user-service/build.gradle | 3 + .../user/application/service/UserService.java | 12 +-- .../user/presentation/UserController.java | 6 +- .../user/presentation/UserControllerTest.java | 87 +++++++++++++++++++ 4 files changed, 99 insertions(+), 9 deletions(-) create mode 100644 user-service/src/test/java/com/sparta/user/presentation/UserControllerTest.java diff --git a/user-service/build.gradle b/user-service/build.gradle index 4bd0e1d..b800c01 100644 --- a/user-service/build.gradle +++ b/user-service/build.gradle @@ -20,3 +20,6 @@ dependencyManagement { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } } +test { + useJUnitPlatform() // JUnit 5 사용 시 필요 +} diff --git a/user-service/src/main/java/com/sparta/user/application/service/UserService.java b/user-service/src/main/java/com/sparta/user/application/service/UserService.java index 5ceb07a..086537f 100644 --- a/user-service/src/main/java/com/sparta/user/application/service/UserService.java +++ b/user-service/src/main/java/com/sparta/user/application/service/UserService.java @@ -46,13 +46,13 @@ public String signIn(UserSigninReqeustDto reqeustDto) throws AuthenticationExcep //회원정보 조회(본인) @Transactional(readOnly = true) - public UserInfoResponseDto getUserInfo(String userId) { + public UserInfoResponseDto getUserInfo(Long userId) { User user = findUserInfo(userId); return new UserInfoResponseDto(user); } //회원정보 수정 - public void updateUser(UserUpdateRequestDto requestDto, String userId) { + public void updateUser(UserUpdateRequestDto requestDto, Long userId) { User user = findUserInfo(userId); UserRoleEnum userRole = checkUserRole(requestDto.getTokenValue()); user.updateUser(encryptPassword(requestDto.getPassword()), requestDto, userRole.getAuthority()); @@ -60,9 +60,9 @@ public void updateUser(UserUpdateRequestDto requestDto, String userId) { userRepository.save(user); } //회원정보 삭제 - public void deleteUser(String userId) { + public void deleteUser(Long userId) { User user = findUserInfo(userId); - user.delete(Long.parseLong(userId)); + user.delete(userId); userRepository.save(user); } @@ -100,8 +100,8 @@ private void validDuplicatedNames(UserSignupRequestDto requestDto) throws Illega } } //회원 존재여부 - private User findUserInfo(String userId) { - return userRepository.findById(Long.parseLong(userId)) + private User findUserInfo(Long userId) { + return userRepository.findById(userId) .orElseThrow(()->new IllegalArgumentException("존재하지않는 회원입니다.")); } diff --git a/user-service/src/main/java/com/sparta/user/presentation/UserController.java b/user-service/src/main/java/com/sparta/user/presentation/UserController.java index ef88596..760addb 100644 --- a/user-service/src/main/java/com/sparta/user/presentation/UserController.java +++ b/user-service/src/main/java/com/sparta/user/presentation/UserController.java @@ -55,20 +55,20 @@ public ResponseEntity signIn(@Valid @RequestBody UserSigninReqeustDto requ } @GetMapping - public ResponseEntity getUserInfo(@RequestHeader("user_id") String userId) { + public ResponseEntity getUserInfo(@RequestHeader("user_id") Long userId) { UserInfoResponseDto userInfoResponseDto = userService.getUserInfo(userId); return ResponseEntity.ok(userInfoResponseDto); } @PutMapping("/update") - public ResponseEntity updateUser(@Valid @RequestBody UserUpdateRequestDto requestDto, @RequestHeader("user_id") String userId) { + public ResponseEntity updateUser(@Valid @RequestBody UserUpdateRequestDto requestDto, @RequestHeader("user_id") Long userId) { userService.updateUser(requestDto, userId); return ResponseEntity.ok().build(); } @DeleteMapping - public ResponseEntity deleteUser(@RequestHeader("user_id") String userId) { + public ResponseEntity deleteUser(@RequestHeader("user_id") Long userId) { userService.deleteUser(userId); return ResponseEntity.noContent().build(); } diff --git a/user-service/src/test/java/com/sparta/user/presentation/UserControllerTest.java b/user-service/src/test/java/com/sparta/user/presentation/UserControllerTest.java new file mode 100644 index 0000000..0c97544 --- /dev/null +++ b/user-service/src/test/java/com/sparta/user/presentation/UserControllerTest.java @@ -0,0 +1,87 @@ +package com.sparta.user.presentation; + +import com.sparta.user.application.service.UserService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@AutoConfigureMockMvc +class UserControllerTest { + @Autowired + private MockMvc mockMvc; + + @Autowired + private UserService userService; + + private String jwtToken; + + @Test + void signUp() throws Exception { + mockMvc.perform(post("/api/v1/users/sign-up") + .contentType(MediaType.APPLICATION_JSON) + .content("{" + + "\"username\":\"asdfg123\"," + + "\"password\":\"asdf3gA12@\"," + + "\"email\":\"asdafv@naver.com\"," + + "\"slackName\":\"as3dgggv\"" + + "}") + ) + .andExpect(status().isCreated()); + } + + @Test + void signIn() throws Exception { + mockMvc.perform(post("/api/v1/users/sign-in") + .contentType(MediaType.APPLICATION_JSON) + .content("{" + + "\"username\":\"asdfg123\"," + + "\"password\":\"asdf3gA12@\"" + + "}") + ) + .andExpect(status().isOk()) + .andReturn().getResponse().getHeader("Authorization"); + } + + @Test + void getUserInfo() throws Exception { + mockMvc.perform(get("/api/v1/users") + .contentType(MediaType.APPLICATION_JSON) + .header("user_id", 1) + ) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.username").value("asdfg123")) + .andExpect(jsonPath("$.email").value("asdafv@naver.com")) + .andExpect(jsonPath("$.slackName").value("as3dgggv")) + .andExpect(jsonPath("$.role").value("ROLE_COMPANY")); + } + + @Test + void updateUser() throws Exception{ + mockMvc.perform(put("/api/v1/users/update") + .contentType(MediaType.APPLICATION_JSON) + .header("user_id", 1) + .content("{" + + "\"username\":\"asdf225s3\"," + + "\"password\":\"asdhdgA12@\"" + + "}") + ) + .andExpect(status().isOk()); + } + + @Test + void deleteUser() throws Exception{ + mockMvc.perform(delete("/api/v1/users") + .contentType(MediaType.APPLICATION_JSON) + .header("user_id", 1) + ) + .andExpect(status().isNoContent()); + } +} \ No newline at end of file From 0cbca0586c28e91e2198037acd189e12bf0ecd1d Mon Sep 17 00:00:00 2001 From: devdaeun Date: Sun, 23 Mar 2025 15:43:04 +0900 Subject: [PATCH 229/389] =?UTF-8?q?=F0=9F=8D=BB=20test=20[#152]=20:=20User?= =?UTF-8?q?=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=9E=91=EC=84=B1=20-=20user?= =?UTF-8?q?=20=EC=97=94=ED=8B=B0=ED=8B=B0=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/sparta/user/domain/model/User.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user-service/src/main/java/com/sparta/user/domain/model/User.java b/user-service/src/main/java/com/sparta/user/domain/model/User.java index b4ec79a..bc231dc 100644 --- a/user-service/src/main/java/com/sparta/user/domain/model/User.java +++ b/user-service/src/main/java/com/sparta/user/domain/model/User.java @@ -30,7 +30,7 @@ public class User extends BaseEntity { @Column(length = 30, nullable = false) private String email; - @Column(name = "slack_name", length = 30, nullable = false) + @Column(name = "slack_name", length = 30) private String slackName; @Column(nullable = false) From 8a5777e233e06d8a7ede51a800f25ec7cf700788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=EC=9D=80=E2=98=98?= <138298079+devdaeun@users.noreply.github.com> Date: Sun, 23 Mar 2025 16:14:55 +0900 Subject: [PATCH 230/389] Create README.md --- README.md | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..d1a1542 --- /dev/null +++ b/README.md @@ -0,0 +1,143 @@ +Logistics-delivery + === + + # 프로젝트 소개 + + > 물류 관리 시스템이 달성해야 하는 기술적 목표와, 우리팀이 집중한 구현 목표를 포함한 간략한 개요 + ## 핵심기술 목표 + +### 1. MSA 기반 시스템 설계 및 구현 +- 각 기능을 독립적인 서비스로 분리하여 마이크로서비스 아키텍처(MSA)로 구성합니다. +- 각 서비스는 독립적으로 배포, 확장, 유지보수가 가능하도록 설계됩니다. + +### 2. RESTful API 및 커뮤니케이션 +- 서비스 간 통신을 위한 RESTful API 설계를 통해 상호작용이 이루어집니다. +- API Gateway를 사용하여 외부와의 통신을 단일 진입점으로 처리하고, 각 서비스는 자체적으로 API를 제공합니다. + +### 3. 서비스 간 데이터 공유 및 동기화 +- 각 서비스는 독립적이지만, 데이터의 일관성 있는 처리를 위해 이벤트 기반 메시징 시스템을 도입하여 실시간 데이터 동기화 및 상태 변경을 처리합니다. +- 예를 들어, 주문 발생 이벤트가 발생하면 재고 관리 서비스, 물류 서비스, 배송 서비스가 실시간으로 상태를 갱신하고 처리합니다. +- +### 4. 권한 관리 및 보안 +- 시스템은 **역할 기반 접근 제어(RBAC)**를 통해 각 사용자와 관리자의 권한을 세분화하고, 민감한 데이터를 보호합니다. +- **JWT(JSON Web Token)**을 활용한 인증 및 인가 체계를 구현하여 외부와의 보안을 유지합니다. + +### 5. 배포 및 확장성 +- 시스템은 클라우드 기반에서 배포되며, 각 서비스는 필요에 따라 확장 가능합니다. +- **컨테이너화(Docker)**와 오케스트레이션(Kubernetes) 기술을 활용하여 시스템의 배포와 관리가 용이하도록 설계됩니다. + +### 6. 사용자 경험 개선 +- 실시간 알림 기능을 통해 각 사용자에게 중요 정보를 즉시 제공하여 업무 흐름을 원활하게 유지합니다. + + + ## 구현 목표 +### 1. MSA 기반 아키텍처 & 커뮤니케이션 +- 멀티모듈 프로젝트 구조로 각 기능을 독립적인 마이크로서비스로 분리하여 개발진행. +- 서비스 간 통신은 REST API를 통해 이루어지며, 다른 서브모듈 간의 통신은 FeignClient 사용. +- Spring Cloud Eureka를 이용한 서비스 디스커버리 및 Spring Cloud Gateway를 통한 API 라우팅. + +### 2. 서비스 확장성 및 유연성 +- 각 마이크로서비스는 수평 확장이 가능하며, 필요한 경우 독립적인 배포 및 유지보수. +- Layered Architecture로 클린 코드 유지 및 DDD를 통한 도메인 기반 설계. + +### 3. 권한관리 및 보안 +- JWT 인증: 사용자 인증 및 권한 관리를 위해 JWT를 사용하며, 각 요청에서 JWT 토큰을 검증하여 인증된 사용자만 접근하도록 처리. +- GateWay의 WebFluxSecurity: API Gateway에서 WebFluxSecurity를 이용해 JWT 토큰을 검증하고, 권한에 따라 요청에 대한 접근을 인가 처리. +- AOP를 통한 권한 인가: 서브모듈에서 세부 API별로 AOP를 활용해 권한 인가를 처리, 각 API에 맞는 권한 검사를 자동화 +- 비밀번호 암호화는 BCrypt 해시 알고리즘을 사용. +- 데이터 유효성 검사 및 Spring Validator로 서버 측 검증. + +### 4. 사용자 경험 개선 +- 슬랙 API 연동: 슬랙 API와 연동하여 메시지 발송 시 실시간 알림 기능을 구현, 사용자에게 빠르게 알림을 제공하여 업무 효율성을 향상. + +### 5. API 문서화 및 개발 지원 +-Swagger를 사용하여 API 문서 자동화 및 개발자 지원. + + # 개발 환경 소개 + + > 프로젝트 개발을 위해 채택한 기술과 용도 및 선택 근거를 포함한 간략한 설명 + ### 개발환경 + + - spring boot 3.4.3 + - Gradle + - java 17 + - Docker + + + ### 기술스택 + | 분류 | 상세 | + |----------------|:---------------------------------------------------------| + | Framework | Spring Boot,Spring Cloud (Eureka, Gateway), AOP(사용자 권한 인가), QueryDSL (동적 쿼리 생성) | + | Database | PostgreSQL | + | Security | Spring Security(인증,인가), JWT (토큰 기반 인증) | + | Documentation | Swagger (API 문서화) | + # 프로젝트 실행 방법 + + + - Local 환경에서 필요한 .env 양식 + - Docker Compose 등 실행에 필요한 환경 + + + # 설계 산출물 + + + - [[도메인 다이어그램]] + - [[테이블 설계서]] + - [[ERD]] + - [[API 명세서]] + - [[인프라 설계서]] + - [[Conventions]] : 우리 조의 개발 규칙 + - [[Commit Message Conventions]] + - [[Java Code Style]] + - [[Git-flow]] + - [[Package Structure]] + + + # 개발 산출물 + + + - [[트러블 슈팅]] : 우리조의 기술적 고민과 원인 해결 과정 + - [[트러블 슈팅 #1]] : + - 문제 현상 + - 원인 파악 과정 + - 해결을 위해 시도했던 다양한 기술적 접근 + - 해결 과정 + - 개선 효과 + - [[트러블 슈팅 #2]] + - [[트러블 슈팅 #3]] + - [[트러블 슈팅 #4]] + - [[트러블 슈팅 #5]] + - [[공통 관심 사항]] + - 공통 관심 사항 구성 요소 및 다른 마이크로서비스에 가이드 방법 + - [[공통 관심 사항 #1]] + - [[공통 관심 사항 #2]] + - [[공통 관심 사항 #3]] + - [[설계 대비 API 구현률]] : 이건 제가 드릴게요~!, 설계 API 수만 적어주세요 + - [[개발 측면에서 우리 조가 잘한 것들]] + - 소통/협업 + - 자동화 + - 트러블슈팅 + + + # 시스템을 발전 시키기 위해 더 해본다면? + + + - 현재 시스템의 문제점 인지 -> 개선을 위한 기술적 계획 및 접근 + + + # 협업 시 우리조가 잘한 것들 + + + # 협업 시 아쉽거나 부족했던 부분들 + + + # 팀원 소개 및 담당역할 +| **역할** | **담당자** | **세부 업무** | +|-------------------------|:---------------------:|------------------------------------| +| **인증인가,
사용자API** | 신다은
(팀장) | - 회원가입,로그인 등의 사용자 정보CRUD 구현
- 로그인 성공 시 JWT 토큰을 생성하여 사용자에게 전달되도록 함
- JWT 토큰을 사용하여 회원정보를 인증, 내부payload값을 추출하여 서브모듈에서 사용가능하도록 구현
- 인증된 정보를 바탕으로 사용자의 권한이 요청 url에 접근가능한지 gateway에서 우선적으로 인가처리를 할 수 있도록 구현
- 세부 API 기능별로 AOP에서 인가처리를 추가적으로 진행하도록 구현| +|**슬랙API**|신다은
(팀장) | - 슬랙 메세지 관리 CRUD 구현
- 슬랙 외부 API를 연동하여 메세지 발송 시 실제 슬랙 사이트로 알림메세지가 전송되도록 함.
- Base Entity를 사용한 생성,수정,삭제 기록 저장 및 SoftDelete 구현| +|**허브API**|이소현
(테크리드) | - | +|**상품API**|서진영
(테크리드) | - | +|**배송API**|권길남 | - | +|**업체API**|원지윤 | - | +|**주문API**|이용재 | - | From 8985baef90c1ba7d16115251c39766406e2b1115 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Sun, 23 Mar 2025 17:41:38 +0900 Subject: [PATCH 231/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#99]?= =?UTF-8?q?=20:=20User=20=EC=BD=94=EB=93=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81=20-=20BaseEntity=20=EC=A0=81=EC=9A=A9=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sparta/user/application/service/UserService.java | 6 ++---- .../src/main/java/com/sparta/user/domain/model/User.java | 8 +++++++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/user-service/src/main/java/com/sparta/user/application/service/UserService.java b/user-service/src/main/java/com/sparta/user/application/service/UserService.java index 086537f..8e1ed1d 100644 --- a/user-service/src/main/java/com/sparta/user/application/service/UserService.java +++ b/user-service/src/main/java/com/sparta/user/application/service/UserService.java @@ -20,6 +20,7 @@ @Service @RequiredArgsConstructor +@Transactional public class UserService { private final JpaUserRepository userRepository; @@ -55,15 +56,12 @@ public UserInfoResponseDto getUserInfo(Long userId) { public void updateUser(UserUpdateRequestDto requestDto, Long userId) { User user = findUserInfo(userId); UserRoleEnum userRole = checkUserRole(requestDto.getTokenValue()); - user.updateUser(encryptPassword(requestDto.getPassword()), requestDto, userRole.getAuthority()); - - userRepository.save(user); + user.updateUser(encryptPassword(requestDto.getPassword()), requestDto, userRole.getAuthority(), userId); } //회원정보 삭제 public void deleteUser(Long userId) { User user = findUserInfo(userId); user.delete(userId); - userRepository.save(user); } //비밀번호 인증 diff --git a/user-service/src/main/java/com/sparta/user/domain/model/User.java b/user-service/src/main/java/com/sparta/user/domain/model/User.java index bc231dc..56aa845 100644 --- a/user-service/src/main/java/com/sparta/user/domain/model/User.java +++ b/user-service/src/main/java/com/sparta/user/domain/model/User.java @@ -8,6 +8,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; import java.util.Optional; @Getter @@ -44,6 +45,8 @@ public User(String username, String password, String email, String slackName, St this.email = email; this.slackName = slackName; this.role = role; + setCreatedBy(getId()); + setCreatedAt(LocalDateTime.now()); } @Builder @@ -55,11 +58,14 @@ public User(String username, String password, String email, String slackName) { } - public void updateUser(String encryptedpassword, UserUpdateRequestDto requestDto, String userRole) { + public void updateUser(String encryptedpassword, UserUpdateRequestDto requestDto, String userRole, Long userId) { + super.update(userId); + setUpdatedAt(LocalDateTime.now()); Optional.ofNullable(requestDto.getUsername()).ifPresent(username -> this.username = username); Optional.ofNullable(encryptedpassword).ifPresent(password -> this.password = encryptedpassword); Optional.ofNullable(requestDto.getEmail()).ifPresent(email -> this.email = email); Optional.ofNullable(requestDto.getSlackName()).ifPresent(slackName -> this.slackName = slackName); Optional.ofNullable(userRole).ifPresent(role -> this.role = userRole); } + } From 3274f3459704e3635310c31dee81a652a3d94554 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Sun, 23 Mar 2025 17:49:15 +0900 Subject: [PATCH 232/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20QueryDSL=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=B0=8F=20=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EC=A3=BC=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- order-service/build.gradle | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/order-service/build.gradle b/order-service/build.gradle index 15efdc9..e1e28bd 100644 --- a/order-service/build.gradle +++ b/order-service/build.gradle @@ -7,9 +7,15 @@ dependencies { implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' implementation 'org.postgresql:postgresql:42.6.0' implementation 'org.springframework.boot:spring-boot-starter-validation' - implementation 'org.springframework.bootp:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' + + //QueryDSL + implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta' + annotationProcessor 'com.querydsl:querydsl-apt:5.1.0:jakarta' + annotationProcessor 'jakarta.persistence:jakarta.persistence-api' + annotationProcessor 'jakarta.annotation:jakarta.annotation-api' } dependencyManagement { @@ -17,3 +23,19 @@ dependencyManagement { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } } + + +// querydsl 설정 +def querydslDir = "$buildDir/generated/querydsl" + +tasks.withType(JavaCompile).configureEach { + options.annotationProcessorGeneratedSourcesDirectory = file(querydslDir) +} + +sourceSets { + main { + java { + srcDirs += querydslDir + } + } +} From cd43fabd7a1e5e808b25757a34443362e11c2c2f Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Sun, 23 Mar 2025 17:49:58 +0900 Subject: [PATCH 233/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20OrderQueryDSLRep?= =?UTF-8?q?ository=20=EC=83=81=EC=86=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infrastructure/repository/JpaOrderRepository.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/order-service/src/main/java/com/sparta/orderservice/infrastructure/repository/JpaOrderRepository.java b/order-service/src/main/java/com/sparta/orderservice/infrastructure/repository/JpaOrderRepository.java index 2b42eea..64d9015 100644 --- a/order-service/src/main/java/com/sparta/orderservice/infrastructure/repository/JpaOrderRepository.java +++ b/order-service/src/main/java/com/sparta/orderservice/infrastructure/repository/JpaOrderRepository.java @@ -1,6 +1,7 @@ package com.sparta.orderservice.infrastructure.repository; import com.sparta.orderservice.domain.model.Order; +import com.sparta.orderservice.domain.repository.OrderQueryDSLRepository; import com.sparta.orderservice.domain.repository.OrderRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -8,6 +9,6 @@ import java.util.UUID; @Repository -public interface JpaOrderRepository extends OrderRepository, JpaRepository { +public interface JpaOrderRepository extends OrderRepository, JpaRepository, OrderQueryDSLRepository { } From 0aaff2a3620b4620a0de5d263fd03fcb26c58f41 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Sun, 23 Mar 2025 17:50:17 +0900 Subject: [PATCH 234/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20@QueryEntity=20?= =?UTF-8?q?=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/sparta/orderservice/domain/model/Order.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java b/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java index 90d1058..ad4aad5 100644 --- a/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java +++ b/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java @@ -1,5 +1,6 @@ package com.sparta.orderservice.domain.model; +import com.querydsl.core.annotations.QueryEntity; import com.sparta.commonmodule.entity.BaseEntity; import jakarta.persistence.*; import lombok.*; @@ -9,6 +10,7 @@ import java.util.List; import java.util.UUID; +@QueryEntity @Entity @Table(name = "p_order") @Getter From 9588b43392d43f1963aec66ea2c758104db4610a Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Sun, 23 Mar 2025 17:50:38 +0900 Subject: [PATCH 235/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=A3=BC?= =?UTF-8?q?=EB=AC=B8=20=EA=B2=80=EC=83=89=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/OrderService.java | 11 +++++++++++ .../presentation/controller/OrderController.java | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java index c37f848..0c98cb0 100644 --- a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java +++ b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java @@ -6,6 +6,7 @@ import com.sparta.orderservice.application.dto.OrderResponseDto; import com.sparta.orderservice.domain.model.Order; import com.sparta.orderservice.domain.model.OrderStatus; +import com.sparta.orderservice.domain.repository.OrderQueryDSLRepository; import com.sparta.orderservice.domain.repository.OrderRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -19,7 +20,9 @@ @Service @RequiredArgsConstructor public class OrderService { + private final OrderRepository orderRepository; + private final OrderQueryDSLRepository orderQueryDSLRepository; //주문 생성 @@ -97,4 +100,12 @@ public OrderResponseDto cancelOrder(UUID orderId, String cancelReason) { return OrderResponseDto.fromEntity(order); } + // 검색 + @Transactional(readOnly = true) + public List searchOrders(String name, OrderStatus status) { + List result = orderQueryDSLRepository.searchOrders(name, status); + return result.stream() + .map(OrderResponseDto::fromEntity) + .collect(Collectors.toList()); + } } diff --git a/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java b/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java index b630f5b..3bcc291 100644 --- a/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java +++ b/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java @@ -3,6 +3,7 @@ import com.sparta.orderservice.application.dto.OrderRequestDto; import com.sparta.orderservice.application.dto.OrderResponseDto; import com.sparta.orderservice.application.service.OrderService; +import com.sparta.orderservice.domain.model.OrderStatus; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; @@ -71,5 +72,15 @@ public ResponseEntity cancelOrder( return ResponseEntity.ok(orderService.cancelOrder(id, cancelReason)); } + // 주문 검색 + @GetMapping("/search") + @Operation(summary = "Order 검색", description = "Order 검색 api 입니다.") + public ResponseEntity> searchOrders( + @RequestParam(required = false) String name, + @RequestParam(required = false) OrderStatus status + ) { + return ResponseEntity.ok(orderService.searchOrders(name, status)); + } + } From 5364fa6bc305707e2d048696e72f424297b1dd8f Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Sun, 23 Mar 2025 17:52:21 +0900 Subject: [PATCH 236/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=A3=BC?= =?UTF-8?q?=EB=AC=B8=20=EA=B2=80=EC=83=89=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20QueryDSL=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orderservice/config/QueryDslConfig.java | 19 +++++++++ .../repository/OrderQueryDSLRepository.java | 10 +++++ .../OrderQueryDSLRepositoryImpl.java | 39 +++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 order-service/src/main/java/com/sparta/orderservice/config/QueryDslConfig.java create mode 100644 order-service/src/main/java/com/sparta/orderservice/domain/repository/OrderQueryDSLRepository.java create mode 100644 order-service/src/main/java/com/sparta/orderservice/infrastructure/repository/OrderQueryDSLRepositoryImpl.java diff --git a/order-service/src/main/java/com/sparta/orderservice/config/QueryDslConfig.java b/order-service/src/main/java/com/sparta/orderservice/config/QueryDslConfig.java new file mode 100644 index 0000000..4589559 --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/config/QueryDslConfig.java @@ -0,0 +1,19 @@ +package com.sparta.orderservice.config; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class QueryDslConfig { + + @PersistenceContext + private EntityManager entityManager; + + @Bean + public JPAQueryFactory jpaQueryFactory() { + return new JPAQueryFactory(entityManager); + } +} \ No newline at end of file diff --git a/order-service/src/main/java/com/sparta/orderservice/domain/repository/OrderQueryDSLRepository.java b/order-service/src/main/java/com/sparta/orderservice/domain/repository/OrderQueryDSLRepository.java new file mode 100644 index 0000000..c350f69 --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/domain/repository/OrderQueryDSLRepository.java @@ -0,0 +1,10 @@ +package com.sparta.orderservice.domain.repository; + +import com.sparta.orderservice.domain.model.Order; +import com.sparta.orderservice.domain.model.OrderStatus; + +import java.util.List; + +public interface OrderQueryDSLRepository { + List searchOrders(String name, OrderStatus status); +} \ No newline at end of file diff --git a/order-service/src/main/java/com/sparta/orderservice/infrastructure/repository/OrderQueryDSLRepositoryImpl.java b/order-service/src/main/java/com/sparta/orderservice/infrastructure/repository/OrderQueryDSLRepositoryImpl.java new file mode 100644 index 0000000..536fe7a --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/infrastructure/repository/OrderQueryDSLRepositoryImpl.java @@ -0,0 +1,39 @@ +package com.sparta.orderservice.infrastructure.repository; + + +import com.querydsl.core.BooleanBuilder; +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.sparta.orderservice.domain.model.Order; +import com.sparta.orderservice.domain.model.OrderStatus; +import com.sparta.orderservice.domain.repository.OrderQueryDSLRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import com.sparta.orderservice.domain.model.QOrder; + + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class OrderQueryDSLRepositoryImpl implements OrderQueryDSLRepository { + + private final JPAQueryFactory queryFactory; + + @Override + public List searchOrders(String name, OrderStatus status) { + QOrder order = QOrder.order; + BooleanBuilder builder = new BooleanBuilder(); + + if (name != null && !name.isBlank()) { + builder.and(order.name.containsIgnoreCase(name)); + } + + if (status != null) { + builder.and(order.status.eq(status)); + } + + return queryFactory.selectFrom(order) + .where(builder) + .fetch(); + } +} From e4be2a37fd3a6f4d6a4b60ae50169259d0223100 Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Sun, 23 Mar 2025 18:16:27 +0900 Subject: [PATCH 237/389] =?UTF-8?q?=E2=9C=A8feat=20[#160]=20:ShippingManag?= =?UTF-8?q?er=20=EB=8B=A8=EA=B1=B4=20=EC=A1=B0=ED=9A=8C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/ShippingManagerService.java | 9 ++++++++- .../shippingmanager/domain/model/ShippingManager.java | 2 +- .../domain/model/trnas/ShippingManagerSelf.java | 2 +- .../domain/repository/ShippingManagerRepository.java | 4 ++++ .../presentation/ShippingManagerController.java | 8 ++++++++ .../shippingservice/ShippingServiceApplication.java | 6 ------ 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java b/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java index 87eaf24..ecac4d5 100644 --- a/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java @@ -9,6 +9,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.UUID; + @Service @RequiredArgsConstructor @@ -26,7 +28,7 @@ public ShippingManager assign() { findFirst(). orElseThrow(() -> new ResourceNotFoundException(" 배정 가능한 담당자가 없습니다.")); - manager.increaseCount(MIN_ORDER); + //manager.increaseCount(MIN_ORDER); nextManagerOrder(manager.getShippingOrder()); @@ -41,6 +43,11 @@ public ShippingManagerResponseDto create(ShippingManagerCreateRequestDto request } + public ShippingManagerResponseDto getById(UUID managerId){ + ShippingManager manager = repository.findById(managerId).orElseThrow(() -> new ResourceNotFoundException("해당 ID의 배송자는 존재하지 않습니다.")); + return ShippingManagerResponseDto.from(manager); + } + private void nextManagerOrder(int currentOrder) { int nextOrder; diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/ShippingManager.java b/shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/ShippingManager.java index d61276c..54cec73 100644 --- a/shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/ShippingManager.java +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/ShippingManager.java @@ -46,7 +46,7 @@ public void prePersist(){ } } - public Integer increaseCount(int count){ + public Integer increaseCount(){ if (count <10) { count++; }else{ diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/trnas/ShippingManagerSelf.java b/shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/trnas/ShippingManagerSelf.java index 8569b72..03a335c 100644 --- a/shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/trnas/ShippingManagerSelf.java +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/domain/model/trnas/ShippingManagerSelf.java @@ -21,7 +21,7 @@ public ShippingManager toShippingManager(Long userId){ this.count ); - manager.increaseCount(1); + // manager.increaseCount(); return manager; } } diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/domain/repository/ShippingManagerRepository.java b/shipping-service/src/main/java/com/sparta/shippingmanager/domain/repository/ShippingManagerRepository.java index e1f03c8..ebbf4bf 100644 --- a/shipping-service/src/main/java/com/sparta/shippingmanager/domain/repository/ShippingManagerRepository.java +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/domain/repository/ShippingManagerRepository.java @@ -3,6 +3,8 @@ import java.util.List; +import java.util.Optional; +import java.util.UUID; public interface ShippingManagerRepository { @@ -13,4 +15,6 @@ public interface ShippingManagerRepository { List findNextManagerWithLock(); ShippingManager save(ShippingManager shippingManager); + Optional findById(UUID id); + } diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java b/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java index d25b6a3..a810e26 100644 --- a/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java @@ -9,6 +9,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.UUID; + @RestController @RequestMapping("/api/shipping-managers") @RequiredArgsConstructor @@ -27,5 +29,11 @@ public ResponseEntity create(@Valid @RequestBody Shi return ResponseEntity.ok(response); } + @GetMapping("/{id}") + public ResponseEntity getById(@PathVariable("id") UUID id){ + ShippingManagerResponseDto response = shippingManagerService.getById(id); + return ResponseEntity.ok(response); + } + } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java b/shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java index 03cbe37..59aede2 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java @@ -11,12 +11,6 @@ @EnableJpaRepositories(basePackages = "com.sparta") @EntityScan(basePackages = "com.sparta") - - - - - - public class ShippingServiceApplication { public static void main(String[] args) { SpringApplication.run(ShippingServiceApplication.class, args); From 7aa88ab4238bccc676f9fece448c367226f8a19e Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 18:35:49 +0900 Subject: [PATCH 238/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=9E=85?= =?UTF-8?q?=EA=B3=A0=20=EC=B2=98=EB=A6=AC=20=EA=B4=80=EB=A0=A8=20Dto=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/InboundStatusRequestDto.java | 28 +++++++++++++++++++ .../dto/InboundStatusResponseDto.java | 23 +++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/InboundStatusRequestDto.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/InboundStatusResponseDto.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/InboundStatusRequestDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/InboundStatusRequestDto.java new file mode 100644 index 0000000..236009c --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/InboundStatusRequestDto.java @@ -0,0 +1,28 @@ +package com.sparta.hubservice.hub.infrastructure.feignclient.dto; + +import com.sparta.hubservice.hub.domain.model.HubShippingScanLog; +import com.sparta.hubservice.hub.domain.model.HubShippingScanLog.ShippingStatus; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class InboundStatusRequestDto { + + private UUID hubId; + private ShippingStatus status; + private LocalDateTime timestamp; + + public InboundStatusRequestDto(HubShippingScanLog hubShippingScanLog) { + this.hubId = hubShippingScanLog.getHub().getHubId(); + this.status = hubShippingScanLog.getStatus(); + this.timestamp = hubShippingScanLog.getTimestamp(); + } + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/InboundStatusResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/InboundStatusResponseDto.java new file mode 100644 index 0000000..db40ca9 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/InboundStatusResponseDto.java @@ -0,0 +1,23 @@ +package com.sparta.hubservice.hub.infrastructure.feignclient.dto; + +import com.sparta.hubservice.hub.domain.model.HubShippingScanLog; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class InboundStatusResponseDto { + + private String message; + private UUID hubId; + private UUID shippingId; + private LocalDateTime timestamp; + + +} From 2132a973948e07a2ec4a71fd186fd2abef09f3db Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 18:35:54 +0900 Subject: [PATCH 239/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=B6=9C?= =?UTF-8?q?=EA=B3=A0=20=EC=B2=98=EB=A6=AC=20=EA=B4=80=EB=A0=A8=20Dto=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/OutboundStatusRequestDto.java | 23 +++++++++++++++++++ .../dto/OutboundStatusResponseDto.java | 22 ++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/OutboundStatusRequestDto.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/OutboundStatusResponseDto.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/OutboundStatusRequestDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/OutboundStatusRequestDto.java new file mode 100644 index 0000000..03c829b --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/OutboundStatusRequestDto.java @@ -0,0 +1,23 @@ +package com.sparta.hubservice.hub.infrastructure.feignclient.dto; + +import com.sparta.hubservice.hub.domain.model.HubShippingScanLog.ShippingStatus; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class OutboundStatusRequestDto { + + private UUID hubId; + private ShippingStatus shippingStatus; + private LocalDateTime timestamp; + private UUID nextHubId; + + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/OutboundStatusResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/OutboundStatusResponseDto.java new file mode 100644 index 0000000..9c8b2e1 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/OutboundStatusResponseDto.java @@ -0,0 +1,22 @@ +package com.sparta.hubservice.hub.infrastructure.feignclient.dto; + +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class OutboundStatusResponseDto { + + private String message; + private UUID hubId; + private UUID shippingId; + private LocalDateTime timestamp; + private UUID nextHubId; + +} From ca3cc11302938461838bdc6279dc8ef407cf414e Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 18:36:26 +0900 Subject: [PATCH 240/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20Feign=20client?= =?UTF-8?q?=20=ED=98=B8=EC=B6=9C=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feignclient/ShippingFeignClient.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/ShippingFeignClient.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/ShippingFeignClient.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/ShippingFeignClient.java new file mode 100644 index 0000000..e1b5e95 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/ShippingFeignClient.java @@ -0,0 +1,28 @@ +package com.sparta.hubservice.hub.infrastructure.feignclient; + +import com.sparta.hubservice.hub.infrastructure.feignclient.dto.InboundStatusRequestDto; +import com.sparta.hubservice.hub.infrastructure.feignclient.dto.InboundStatusResponseDto; +import com.sparta.hubservice.hub.infrastructure.feignclient.dto.OutboundStatusRequestDto; +import com.sparta.hubservice.hub.infrastructure.feignclient.dto.OutboundStatusResponseDto; +import java.util.UUID; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@FeignClient(name ="shipping-service", url="${shipping.service.url}") +public interface ShippingFeignClient { + + // 입고 처리 + @PostMapping("/api/v1/shippings/{shipping_id}/inbound") + InboundStatusResponseDto inboundStatus( + @PathVariable("shipping_id") UUID shippingId, + @RequestBody InboundStatusRequestDto inboundStatusRequestDto); + + // 출고 처리 + @PostMapping("/api/v1/shippings/{shipping_id}/outbound") + OutboundStatusResponseDto outboundStatus( + @PathVariable("shipping_id") UUID shippingId, + @RequestBody OutboundStatusRequestDto outboundStatusRequestDto); + +} From acce2e10a48c4640b091270d257c189617e1a2ce Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 18:37:09 +0900 Subject: [PATCH 241/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=9E=85?= =?UTF-8?q?=EA=B3=A0=EC=B2=98=EB=A6=AC=20=EC=A0=80=EC=9E=A5=20=EB=B0=8F=20?= =?UTF-8?q?ShippingService=20=ED=98=B8=EC=B6=9C=EC=8B=9C=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20Service=20Class=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/HubShippingScanService.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubShippingScanService.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubShippingScanService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubShippingScanService.java new file mode 100644 index 0000000..5795dcb --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubShippingScanService.java @@ -0,0 +1,38 @@ +package com.sparta.hubservice.hub.application.service; + +import com.sparta.commonmodule.exception.ResourceNotFoundException; +import com.sparta.hubservice.hub.application.service.shipping.ShippingService; +import com.sparta.hubservice.hub.domain.model.Hub; +import com.sparta.hubservice.hub.domain.model.HubShippingScanLog; +import com.sparta.hubservice.hub.domain.repository.HubRepository; +import com.sparta.hubservice.hub.domain.repository.HubShippingScanRepository; +import com.sparta.hubservice.hub.infrastructure.feignclient.dto.InboundStatusResponseDto; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@RequiredArgsConstructor +@Service +@Slf4j(topic = "HubShippingScanService") +public class HubShippingScanService { + + private final HubShippingScanRepository hubShippingScanRepository; + private final HubRepository hubRepository; + private final ShippingService shippingService; + + @Transactional + public InboundStatusResponseDto createInbound(UUID hubId, UUID shippingId, Long userId) { + Hub hub = hubRepository.findById(hubId).orElseThrow(ResourceNotFoundException::new); + + HubShippingScanLog hubShippingScanLog = + HubShippingScanLog.createInboundLog(hub, shippingId, userId); + + hubShippingScanRepository.save(hubShippingScanLog); + log.info("Success save hubShippingScanLog - HubShippingScanLog: {}", hubShippingScanLog); + + return shippingService.inboundStatus(hubShippingScanLog); + } + +} From 8f130bf65e67fb4348fb471ed561f5db8ed6a535 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 18:37:42 +0900 Subject: [PATCH 242/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20feign=20client?= =?UTF-8?q?=20Controller=20=ED=98=B8=EC=B6=9C=EC=8B=9C=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20Service=20Class=20=EB=B6=84=EB=A6=AC=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/shipping/ShippingService.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/application/service/shipping/ShippingService.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/shipping/ShippingService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/shipping/ShippingService.java new file mode 100644 index 0000000..27e3c48 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/shipping/ShippingService.java @@ -0,0 +1,23 @@ +package com.sparta.hubservice.hub.application.service.shipping; + +import com.sparta.hubservice.hub.domain.model.HubShippingScanLog; +import com.sparta.hubservice.hub.infrastructure.feignclient.ShippingFeignClient; +import com.sparta.hubservice.hub.infrastructure.feignclient.dto.InboundStatusRequestDto; +import com.sparta.hubservice.hub.infrastructure.feignclient.dto.InboundStatusResponseDto; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +@Slf4j(topic = "ShippingService : call shippingFeignClient") +public class ShippingService { + + private final ShippingFeignClient shippingFeignClient; + + public InboundStatusResponseDto inboundStatus(HubShippingScanLog log){ + // Todo: feign client 호출 응답값에 대한 예외 처리 (common.exception 코드도 추가) + return shippingFeignClient.inboundStatus(log.getShippingId(), new InboundStatusRequestDto(log)); + } + +} From 407ca9d914fb09638f7ab646d6dc412faffc91b3 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 18:38:12 +0900 Subject: [PATCH 243/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20feign=20client?= =?UTF-8?q?=20=EA=B4=80=EB=A0=A8=20repository=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=B0=8F=20=EC=9E=85=EA=B3=A0=EC=B2=98=EB=A6=AC=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/HubShippingScanRepository.java | 8 +++++++ .../JPAHubShippingScanRepository.java | 11 ++++++++++ .../HubShippingScanRepositoryImpl.java | 21 +++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubShippingScanRepository.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/JPAHubShippingScanRepository.java create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/repository/HubShippingScanRepositoryImpl.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubShippingScanRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubShippingScanRepository.java new file mode 100644 index 0000000..3b86fcd --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/repository/HubShippingScanRepository.java @@ -0,0 +1,8 @@ +package com.sparta.hubservice.hub.domain.repository; + +import com.sparta.hubservice.hub.domain.model.HubShippingScanLog; + +public interface HubShippingScanRepository { + + void save(HubShippingScanLog hubShippingScanLog); +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/JPAHubShippingScanRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/JPAHubShippingScanRepository.java new file mode 100644 index 0000000..2e3e516 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/persistence/JPAHubShippingScanRepository.java @@ -0,0 +1,11 @@ +package com.sparta.hubservice.hub.infrastructure.persistence; + +import com.sparta.hubservice.hub.domain.model.HubShippingScanLog; +import java.util.UUID; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface JPAHubShippingScanRepository extends JpaRepository { + +} diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/repository/HubShippingScanRepositoryImpl.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/repository/HubShippingScanRepositoryImpl.java new file mode 100644 index 0000000..bea36db --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/repository/HubShippingScanRepositoryImpl.java @@ -0,0 +1,21 @@ +package com.sparta.hubservice.hub.infrastructure.repository; + +import com.sparta.hubservice.hub.domain.model.HubShippingScanLog; +import com.sparta.hubservice.hub.domain.repository.HubShippingScanRepository; +import com.sparta.hubservice.hub.infrastructure.persistence.JPAHubShippingScanRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class HubShippingScanRepositoryImpl implements HubShippingScanRepository { + + private final JPAHubShippingScanRepository jpaHubShippingScanRepository; + + @Override + public void save(HubShippingScanLog hubShippingScanLog) { + jpaHubShippingScanRepository.save(hubShippingScanLog); + } + + +} From db4b1e8220f7b3038ae4429ef992a3f0362fb8f9 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 18:38:36 +0900 Subject: [PATCH 244/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=9E=85?= =?UTF-8?q?=EC=B6=9C=EA=B3=A0=20=EC=B2=98=EB=A6=AC=EC=97=90=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20Entity=20class=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub/domain/model/HubShippingScanLog.java | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubShippingScanLog.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubShippingScanLog.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubShippingScanLog.java new file mode 100644 index 0000000..eb0c7dd --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubShippingScanLog.java @@ -0,0 +1,76 @@ +package com.sparta.hubservice.hub.domain.model; + +import com.sparta.commonmodule.entity.BaseEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; + +@Entity +@Getter +@NoArgsConstructor +@Table(name = "p_hub_shipping_scan_log") +public class HubShippingScanLog extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(name = "hub_shipping_scan_log_id") + private Long hubShippingScanLogId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name ="hub_id", nullable = false) + private Hub hub; + + @Column(name = "shipping_id", nullable = false) + private UUID shippingId; + + @CreatedDate + @Column(nullable = false, updatable = false) + private LocalDateTime timestamp; + + @Column(nullable = false) + private ShippingStatus status; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "next_hub_id", nullable = true) + private Hub nextHub; + + public HubShippingScanLog(Hub hub,UUID shippingId, ShippingStatus status, Long userId) { + super(userId); + this.hub = hub; + this.shippingId = shippingId; + this.status = status; + } + + public HubShippingScanLog(Hub hub,UUID shippingId, ShippingStatus status, Hub nextHub, Long userId) { + super(userId); + this.hub = hub; + this.shippingId = shippingId; + this.status = status; + this.nextHub = nextHub; + } + + public static HubShippingScanLog createInboundLog(Hub hub, UUID shippingId, Long userId) { + return new HubShippingScanLog(hub,shippingId, ShippingStatus.INBOUND, userId); + } + + public static HubShippingScanLog createOutboundLog(Hub hub, UUID shippingId, Hub nextHub, Long userId) { + return new HubShippingScanLog(hub, shippingId, ShippingStatus.OUTBOUND, nextHub, userId); + } + + + public enum ShippingStatus { + INBOUND, OUTBOUND + } + +} From 07f95ce3c4c30e01a3eb677ccde9816777f2764c Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 18:38:53 +0900 Subject: [PATCH 245/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=9E=85?= =?UTF-8?q?=EC=B6=9C=EA=B3=A0=20=EC=B2=98=EB=A6=AC=EC=97=90=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HubShippingScanController.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java new file mode 100644 index 0000000..197dee1 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java @@ -0,0 +1,36 @@ +package com.sparta.hubservice.hub.presentation.controller; + +import com.sparta.hubservice.hub.application.service.HubShippingScanService; +import com.sparta.hubservice.hub.infrastructure.feignclient.dto.InboundStatusResponseDto; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v1/shipping-scan") +public class HubShippingScanController { + + private final HubShippingScanService hubShippingScanService; + + @PostMapping("/{hub_id}/{shipping_id}/inbound-log") + public ResponseEntity inboundStatus( + @PathVariable("hub_id") UUID hubId, + @PathVariable("shipping_id") UUID shippingId, + @RequestParam("user_id") Long userId){ + + InboundStatusResponseDto responseDto = + hubShippingScanService.createInbound(hubId, shippingId, userId); + + return ResponseEntity.ok(responseDto); + } + + // 출고 처리 + + +} From cd7288411a93342113c0f64c5c7860b4b06dd04c Mon Sep 17 00:00:00 2001 From: devdaeun Date: Sun, 23 Mar 2025 18:47:05 +0900 Subject: [PATCH 246/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#158]=20:=20Slack?= =?UTF-8?q?=20search=EC=B6=94=EA=B0=80=20-=20querydsl=ED=99=9C=EC=9A=A9?= =?UTF-8?q?=ED=95=9C=20=EA=B2=80=EC=83=89=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- slack-service/build.gradle | 7 ++ .../dto/SlackSearchRequestDto.java | 13 ++++ .../application/service/SlackService.java | 11 +++ .../domain/repository/SlackRepository.java | 10 +++ .../infastructure/JpaSlackRepository.java | 2 +- .../SlackQueryDSLRepository.java | 11 +++ .../SlackQueryDSLRepositoryImpl.java | 67 +++++++++++++++++++ .../presentation/SlackController.java | 13 ++++ 8 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackSearchRequestDto.java create mode 100644 slack-service/src/main/java/com/sparta/slackservice/infastructure/SlackQueryDSLRepository.java create mode 100644 slack-service/src/main/java/com/sparta/slackservice/infastructure/SlackQueryDSLRepositoryImpl.java diff --git a/slack-service/build.gradle b/slack-service/build.gradle index 7da5cbc..a6b967e 100644 --- a/slack-service/build.gradle +++ b/slack-service/build.gradle @@ -6,8 +6,15 @@ ext { dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'com.slack.api:slack-api-client:1.43.0' + + implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta' + annotationProcessor 'com.querydsl:querydsl-apt:5.1.0:jakarta' + annotationProcessor 'jakarta.annotation:jakarta.annotation-api' + annotationProcessor 'jakarta.persistence:jakarta.persistence-api' + runtimeOnly 'org.postgresql:postgresql' implementation project(':common-module') diff --git a/slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackSearchRequestDto.java b/slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackSearchRequestDto.java new file mode 100644 index 0000000..2ccbab4 --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackSearchRequestDto.java @@ -0,0 +1,13 @@ +package com.sparta.slackservice.application.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class SlackSearchRequestDto { + private String message; + private Long receiverId; + private String slackName; +} diff --git a/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java b/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java index 46a1a40..f4f3438 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java +++ b/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java @@ -1,10 +1,14 @@ package com.sparta.slackservice.application.service; +import com.sparta.commonmodule.exception.ResourceNotFoundException; import com.sparta.slackservice.application.dto.SlackRequestDto; import com.sparta.slackservice.application.dto.SlackResponseDto; +import com.sparta.slackservice.application.dto.SlackSearchRequestDto; import com.sparta.slackservice.domain.model.Slack; import com.sparta.slackservice.infastructure.JpaSlackRepository; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -37,6 +41,12 @@ public Slack getSlack(UUID slackId) { return findingSlack(slackId); } + //메세지 조회(전체) + @Transactional(readOnly = true) + public Page searchSlack(SlackSearchRequestDto requestDto, Pageable pageable) { + return slackRepository.searchSlack(requestDto,pageable); + } + //메세지 수정 public SlackResponseDto modifySlack(UUID slackId, SlackRequestDto requestDto, Long userId) { Slack slack = findingSlack(slackId); @@ -55,4 +65,5 @@ private Slack findingSlack(UUID slackId) { } + } diff --git a/slack-service/src/main/java/com/sparta/slackservice/domain/repository/SlackRepository.java b/slack-service/src/main/java/com/sparta/slackservice/domain/repository/SlackRepository.java index 5bffbf6..0465faf 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/domain/repository/SlackRepository.java +++ b/slack-service/src/main/java/com/sparta/slackservice/domain/repository/SlackRepository.java @@ -1,4 +1,14 @@ package com.sparta.slackservice.domain.repository; +import com.sparta.slackservice.application.dto.SlackResponseDto; +import com.sparta.slackservice.application.dto.SlackSearchRequestDto; +import com.sparta.slackservice.domain.model.Slack; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import java.util.Optional; + public interface SlackRepository { + Page searchSlack(SlackSearchRequestDto requestDto, Pageable pageable); + } diff --git a/slack-service/src/main/java/com/sparta/slackservice/infastructure/JpaSlackRepository.java b/slack-service/src/main/java/com/sparta/slackservice/infastructure/JpaSlackRepository.java index f2a0d93..6876a17 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/infastructure/JpaSlackRepository.java +++ b/slack-service/src/main/java/com/sparta/slackservice/infastructure/JpaSlackRepository.java @@ -7,5 +7,5 @@ import java.util.UUID; @Repository -public interface JpaSlackRepository extends JpaRepository, SlackRepository { +public interface JpaSlackRepository extends JpaRepository, SlackRepository, SlackQueryDSLRepository { } diff --git a/slack-service/src/main/java/com/sparta/slackservice/infastructure/SlackQueryDSLRepository.java b/slack-service/src/main/java/com/sparta/slackservice/infastructure/SlackQueryDSLRepository.java new file mode 100644 index 0000000..f9614e9 --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/infastructure/SlackQueryDSLRepository.java @@ -0,0 +1,11 @@ +package com.sparta.slackservice.infastructure; + +import com.sparta.slackservice.application.dto.SlackRequestDto; +import com.sparta.slackservice.application.dto.SlackResponseDto; +import com.sparta.slackservice.application.dto.SlackSearchRequestDto; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +public interface SlackQueryDSLRepository { + Page searchSlack(SlackSearchRequestDto requestDto, Pageable pageable); +} diff --git a/slack-service/src/main/java/com/sparta/slackservice/infastructure/SlackQueryDSLRepositoryImpl.java b/slack-service/src/main/java/com/sparta/slackservice/infastructure/SlackQueryDSLRepositoryImpl.java new file mode 100644 index 0000000..390cbe0 --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/infastructure/SlackQueryDSLRepositoryImpl.java @@ -0,0 +1,67 @@ +package com.sparta.slackservice.infastructure; + +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.sparta.slackservice.application.dto.SlackRequestDto; +import com.sparta.slackservice.application.dto.SlackResponseDto; +import com.sparta.slackservice.application.dto.SlackSearchRequestDto; +import com.sparta.slackservice.domain.model.QSlack; +import com.sparta.slackservice.domain.model.Slack; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; + +import java.util.List; + +public class SlackQueryDSLRepositoryImpl implements SlackQueryDSLRepository { + + @PersistenceContext + private EntityManager entityManager; + + @Override + public Page searchSlack(SlackSearchRequestDto requestDto, Pageable pageable) { + QSlack qSlack = QSlack.slack; // Querydsl의 Q 클래스를 사용 + + // 검색 조건을 작성할 BooleanExpression을 초기화 + BooleanExpression predicate = qSlack.isNotNull(); // 기본 조건 (모든 레코드를 가져오는 기본 조건) + + // 요청된 조건을 바탕으로 동적으로 조건을 추가 + if (requestDto.getSlackName() != null && !requestDto.getSlackName().isEmpty()) { + predicate = predicate.and(qSlack.slackName.containsIgnoreCase(requestDto.getSlackName())); + } + + if (requestDto.getMessage() != null && !requestDto.getMessage().isEmpty()) { + predicate = predicate.and(qSlack.message.containsIgnoreCase(requestDto.getMessage())); + } + + if (requestDto.getReceiverId() != null && !requestDto.getReceiverId().describeConstable().isEmpty()) { + predicate = predicate.and(qSlack.receiverId.stringValue().containsIgnoreCase(String.valueOf(requestDto.getReceiverId()))); + } + + // JPAQueryFactory를 통해 쿼리 실행 + JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager); + + // 실제 쿼리 실행 (페이징 적용) + List result = queryFactory + .selectFrom(qSlack) + .where(predicate) + .offset(pageable.getOffset()) // 페이지네이션 처리 + .limit(pageable.getPageSize()) // 페이지네이션 처리 + .fetch(); + + // 전체 데이터 개수 가져오기 (페이징 처리를 위한 전체 개수) + long totalCount = queryFactory + .selectFrom(qSlack) + .where(predicate) + .fetchCount(); + + // 결과를 Page 객체로 반환 (SlackResponseDto로 변환) + List responseDtos = result.stream() + .map(SlackResponseDto::new) + .toList(); + + return new PageImpl<>(responseDtos, pageable, totalCount); + } +} diff --git a/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java b/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java index 83686a9..550bc65 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java +++ b/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java @@ -2,12 +2,16 @@ import com.sparta.slackservice.application.dto.SlackRequestDto; import com.sparta.slackservice.application.dto.SlackResponseDto; +import com.sparta.slackservice.application.dto.SlackSearchRequestDto; import com.sparta.slackservice.application.service.SlackService; import com.sparta.slackservice.application.service.SlackWebhookService; import com.sparta.slackservice.domain.model.Slack; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -41,6 +45,15 @@ public ResponseEntity getSlack(@PathVariable("id") UUID slackId) { return ResponseEntity.ok(slackService.getSlack(slackId)); } + @Operation(summary = "메세지 조회(전체)", description = "메세지 조회(전체) api입니다.") + @PostMapping("/search") + public ResponseEntity> searchSlack( + @RequestBody SlackSearchRequestDto requestDto, + @PageableDefault(page = 0, size = 10, sort = "createdAt") Pageable pageable) { + Page responseDto= slackService.searchSlack(requestDto,pageable); + return ResponseEntity.ok(responseDto); + } + @Operation(summary = "메세지 수정", description = "메세지 수정 api입니다.") @PutMapping("/modify/{id}") public ResponseEntity modifySlack(@RequestHeader("user_id") Long userId,@PathVariable("id") UUID slackId, @RequestBody SlackRequestDto requestDto) { From 9c12c50469bb4cac713a9b287f5c95e890a7bf2d Mon Sep 17 00:00:00 2001 From: jiyun Date: Sun, 23 Mar 2025 13:44:22 +0900 Subject: [PATCH 247/389] =?UTF-8?q?=F0=9F=94=A5=20del=20[#154]=20:=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CompanyQueryRepositoryImplTest.java | 77 ------------------- 1 file changed, 77 deletions(-) delete mode 100644 company-service/src/test/java/com/sparta/companyservice/CompanyQueryRepositoryImplTest.java diff --git a/company-service/src/test/java/com/sparta/companyservice/CompanyQueryRepositoryImplTest.java b/company-service/src/test/java/com/sparta/companyservice/CompanyQueryRepositoryImplTest.java deleted file mode 100644 index 4d2d297..0000000 --- a/company-service/src/test/java/com/sparta/companyservice/CompanyQueryRepositoryImplTest.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.sparta.companyservice; - -import com.sparta.companyservice.domain.model.Company; -import com.sparta.companyservice.domain.model.CompanyType; -import com.sparta.companyservice.infrastructure.querydsl.CompanyQueryRepositoryImpl; -import com.sparta.companyservice.infrastructure.repository.JpaCompanyRepository; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.context.annotation.Import; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.test.context.ActiveProfiles; - -import java.util.UUID; - -import static org.assertj.core.api.Assertions.assertThat; - -@ActiveProfiles("test") -@DataJpaTest -@Import(CompanyQueryRepositoryImpl.class) -public class CompanyQueryRepositoryImplTest { - - @Autowired - private CompanyQueryRepositoryImpl companyQueryRepository; - - @Autowired - private JpaCompanyRepository jpaCompanyRepository; - - @PersistenceContext - private EntityManager em; - - private final UUID hubId = UUID.randomUUID(); - - private Company c1, c2, c3, c4; - - @BeforeEach - public void setUp() throws InterruptedException { - long userId = 1L; - - c1 = Company.create("Alpha", "Seoul", hubId, CompanyType.PRODUCER, userId); - Thread.sleep(10); - c2 = Company.create("Beta", "Busan", hubId, CompanyType.RECEIVER, userId); - Thread.sleep(10); - c3 = Company.create("Gamma", "Seoul", hubId, CompanyType.PRODUCER, userId); - Thread.sleep(10); - c4 = Company.create("Delta", "Jeju", hubId, CompanyType.PRODUCER, userId); - - jpaCompanyRepository.save(c1); - jpaCompanyRepository.save(c2); - jpaCompanyRepository.save(c3); - jpaCompanyRepository.save(c4); - - Company deleted = Company.create("DeletedOne", "Seoul", hubId, CompanyType.RECEIVER, userId); - deleted.delete(userId); - jpaCompanyRepository.save(deleted); - - em.flush(); - em.clear(); - } - - @Test - @DisplayName("정렬 조건 없을 때 기본 정렬(createdAt DESC) 적용") - public void default_sorting_applies_createdAt_DESC() { - PageRequest pageable = PageRequest.of(0, 10); // 정렬 명시 안함 - - Page result = companyQueryRepository.searchCompanies(null, null, null, pageable); - - assertThat(result.getTotalElements()).isEqualTo(4); // soft deleted 제외 - assertThat(result.getContent().get(0).getName()).isEqualTo("Delta"); // 가장 마지막에 생성됨 - assertThat(result.getContent().get(3).getName()).isEqualTo("Alpha"); // 가장 먼저 생성됨 - } -} From 9ee6dc110f15ec1e82c9bf59aad1b58febadde1d Mon Sep 17 00:00:00 2001 From: jiyun Date: Sun, 23 Mar 2025 21:02:49 +0900 Subject: [PATCH 248/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#154]?= =?UTF-8?q?=20=EC=9D=B8=EC=A6=9D=EB=90=9C=20userId=20=EB=B0=9B=EC=95=84?= =?UTF-8?q?=EC=98=A4=EB=8A=94=20=EA=B2=83=EC=9C=BC=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/CompanyService.java | 8 +++----- .../presentation/controller/CompanyController.java | 14 +++++++------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java index dd0787f..532f020 100644 --- a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java +++ b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java @@ -24,15 +24,13 @@ public class CompanyService { private final CompanyRepository companyRepository; private final HubClient hubClient; - long userId = 1L; // 실제로는 인증된 사용자 ID 가져와야 함 - @Transactional(readOnly = true) public boolean existsById(UUID id) { // 업체 존재 확인 return companyRepository.existsByIdAndDeletedAtIsNull(id); } @Transactional // 생성 - public CompanyDto createCompany(CompanyCreateDto dto) { + public CompanyDto createCompany(CompanyCreateDto dto, long userId) { validateHubExists(dto.hubId()); Company company = Company.create( dto.name(), @@ -57,7 +55,7 @@ public CompanyDto getCompanyById(UUID id) { } @Transactional // 수정 - public CompanyDto updateCompany(UUID id, CompanyUpdateDto dto) { + public CompanyDto updateCompany(UUID id, CompanyUpdateDto dto, long userId) { Company company = findCompany(id); // hubId가 변경된 경우 유효한 허브Id인지 유효성 검사 @@ -70,7 +68,7 @@ public CompanyDto updateCompany(UUID id, CompanyUpdateDto dto) { } @Transactional // 삭제 - public CompanyDeleteResponse deleteCompany(UUID id) { + public CompanyDeleteResponse deleteCompany(UUID id, long userId) { Company company = findCompany(id); company.delete(userId); return CompanyDeleteResponse.of(id); diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java index 61b6190..2426755 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -35,12 +35,12 @@ public boolean existsById(@PathVariable UUID id) { // 생성 @Operation(summary = "Company 등록", description = "Company 생성 api 입니다.") @PostMapping - public ResponseEntity createCompany(@Valid @RequestBody CompanyCreateRequest request) { - CompanyDto createdCompany = companyService.createCompany(request.toDto()); + public ResponseEntity createCompany(@Valid @RequestBody CompanyCreateRequest request, @RequestHeader("user_id") Long userId) { + CompanyDto createdCompany = companyService.createCompany(request.toDto(), userId); return ResponseEntity.ok(CompanyResponse.fromDto(createdCompany)); } - // 검색 + // 전체 목록 조회 & 검색 @Operation(summary = "Company 조회", description = "Company 조회 api 입니다.") @GetMapping public ResponseEntity> searchCompanies( @@ -65,16 +65,16 @@ public ResponseEntity getCompanyById(@PathVariable UUID company // 수정 @Operation(summary = "Company 수정", description = "Company 수정 api 입니다.") @PatchMapping("/{companyId}") - public ResponseEntity updateCompany(@PathVariable UUID companyId, @Valid @RequestBody CompanyUpdateRequest request) { - CompanyDto updatedCompany = companyService.updateCompany(companyId, request.toDto()); + public ResponseEntity updateCompany(@PathVariable UUID companyId, @Valid @RequestBody CompanyUpdateRequest request, @RequestHeader("user_id") Long userId) { + CompanyDto updatedCompany = companyService.updateCompany(companyId, request.toDto(), userId); return ResponseEntity.ok(CompanyResponse.fromDto(updatedCompany)); } // 삭제 @Operation(summary = "Company 삭제", description = "Company 삭제 api 입니다.") @DeleteMapping("/{companyId}") - public ResponseEntity deleteCompany(@PathVariable UUID companyId) { - CompanyDeleteResponse deletedCompany = companyService.deleteCompany(companyId); + public ResponseEntity deleteCompany(@PathVariable UUID companyId, @RequestHeader("user_id") Long userId) { + CompanyDeleteResponse deletedCompany = companyService.deleteCompany(companyId, userId); return ResponseEntity.ok(deletedCompany); } From b03e92d0493db29acf314ae6556a43cccc0cb32c Mon Sep 17 00:00:00 2001 From: jiyun Date: Sun, 23 Mar 2025 21:11:44 +0900 Subject: [PATCH 249/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#154]?= =?UTF-8?q?=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B6=8C=ED=95=9C=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/controller/CompanyController.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java index 2426755..c61b937 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -1,5 +1,6 @@ package com.sparta.companyservice.presentation.controller; +import com.sparta.commonmodule.aop.RoleCheck; import com.sparta.companyservice.application.dto.CompanyDto; import com.sparta.companyservice.application.service.CompanyService; import com.sparta.companyservice.domain.model.CompanyType; @@ -34,6 +35,7 @@ public boolean existsById(@PathVariable UUID id) { // 생성 @Operation(summary = "Company 등록", description = "Company 생성 api 입니다.") + @RoleCheck("ROLE_MASTER, ROLE_HUB_MANAGER") @PostMapping public ResponseEntity createCompany(@Valid @RequestBody CompanyCreateRequest request, @RequestHeader("user_id") Long userId) { CompanyDto createdCompany = companyService.createCompany(request.toDto(), userId); @@ -64,6 +66,7 @@ public ResponseEntity getCompanyById(@PathVariable UUID company // 수정 @Operation(summary = "Company 수정", description = "Company 수정 api 입니다.") + @RoleCheck("ROLE_MASTER, ROLE_HUB_MANAGER, ROLE_COMPANY_MANAGER") @PatchMapping("/{companyId}") public ResponseEntity updateCompany(@PathVariable UUID companyId, @Valid @RequestBody CompanyUpdateRequest request, @RequestHeader("user_id") Long userId) { CompanyDto updatedCompany = companyService.updateCompany(companyId, request.toDto(), userId); @@ -72,6 +75,7 @@ public ResponseEntity updateCompany(@PathVariable UUID companyI // 삭제 @Operation(summary = "Company 삭제", description = "Company 삭제 api 입니다.") + @RoleCheck("ROLE_MASTER, ROLE_HUB_MANAGER") @DeleteMapping("/{companyId}") public ResponseEntity deleteCompany(@PathVariable UUID companyId, @RequestHeader("user_id") Long userId) { CompanyDeleteResponse deletedCompany = companyService.deleteCompany(companyId, userId); From 2747fe1f2664a9b6962cfff5fb7d6af36c1fdc68 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Sun, 23 Mar 2025 21:16:22 +0900 Subject: [PATCH 250/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#139]=20:=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EC=88=98=EC=A0=95(=EC=9E=AC=EA=B3=A0=20?= =?UTF-8?q?=EA=B0=90=EC=86=8C)=20api=20=EB=B0=8F=20dto=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...reaseProductQuantityServiceRequestDto.java | 23 +++++++++++++ .../presentation/ProductController.java | 18 +++++++--- .../DecreaseProductQuantityRequestDto.java | 11 +++++++ .../DecreaseProductQuantityResponseDto.java | 33 +++++++++++++++++++ 4 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 product-service/src/main/java/com/sparta/product/application/dto/DecreaseProductQuantityServiceRequestDto.java create mode 100644 product-service/src/main/java/com/sparta/product/presentation/dto/request/DecreaseProductQuantityRequestDto.java create mode 100644 product-service/src/main/java/com/sparta/product/presentation/dto/response/DecreaseProductQuantityResponseDto.java diff --git a/product-service/src/main/java/com/sparta/product/application/dto/DecreaseProductQuantityServiceRequestDto.java b/product-service/src/main/java/com/sparta/product/application/dto/DecreaseProductQuantityServiceRequestDto.java new file mode 100644 index 0000000..e88fc27 --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/application/dto/DecreaseProductQuantityServiceRequestDto.java @@ -0,0 +1,23 @@ +package com.sparta.product.application.dto; + +import com.sparta.product.presentation.dto.request.DecreaseProductQuantityRequestDto; +import lombok.Builder; + +import java.util.UUID; + +@Builder +public record DecreaseProductQuantityServiceRequestDto(UUID productId, + UUID companyId, + UUID hubId, + Integer quantity) { + + // 요청 DTO -> 서비스 DTO 변환 메서드 + public static DecreaseProductQuantityServiceRequestDto of(DecreaseProductQuantityRequestDto request, UUID productId) { + return DecreaseProductQuantityServiceRequestDto.builder() + .productId(productId) + .companyId(request.companyId()) + .hubId(request.hubId()) + .quantity(request.quantity()) + .build(); + } +} diff --git a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java index 97ae668..78a658c 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java +++ b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java @@ -1,15 +1,14 @@ package com.sparta.product.presentation; import com.sparta.product.application.dto.DeleteProductServiceRequestDto; +import com.sparta.product.application.dto.DecreaseProductQuantityServiceRequestDto; import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.application.service.ProductServiceImpl; import com.sparta.product.presentation.dto.request.CreateProductRequestDto; +import com.sparta.product.presentation.dto.request.DecreaseProductQuantityRequestDto; import com.sparta.product.presentation.dto.request.SearchProductRequestDto; import com.sparta.product.presentation.dto.request.UpdateProductRequestDto; -import com.sparta.product.presentation.dto.response.CreateProductResponseDto; -import com.sparta.product.presentation.dto.response.ReadProductResponseDto; -import com.sparta.product.presentation.dto.response.SearchProductResponseDto; -import com.sparta.product.presentation.dto.response.UpdateProductResponseDto; +import com.sparta.product.presentation.dto.response.*; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -91,4 +90,15 @@ public ResponseEntity> searchProducts(@ModelAttri return ResponseEntity.ok(productServiceImpl.searchProducts(requestDto, pageable)); } + + /** + * 상품 수정(재고 감소) + */ + @PutMapping("/{productId}/decrease") + public ResponseEntity decreaseProductQuantity(@PathVariable UUID productId, + @RequestBody DecreaseProductQuantityRequestDto requestDto) { + return ResponseEntity.ok(productServiceImpl.decreaseProductQuantity( + DecreaseProductQuantityServiceRequestDto.of(requestDto, productId))); + } + } diff --git a/product-service/src/main/java/com/sparta/product/presentation/dto/request/DecreaseProductQuantityRequestDto.java b/product-service/src/main/java/com/sparta/product/presentation/dto/request/DecreaseProductQuantityRequestDto.java new file mode 100644 index 0000000..9893ca4 --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/presentation/dto/request/DecreaseProductQuantityRequestDto.java @@ -0,0 +1,11 @@ +package com.sparta.product.presentation.dto.request; + +import java.util.UUID; + +public record DecreaseProductQuantityRequestDto(UUID companyId, + UUID hubId, + Integer quantity +) { + + +} diff --git a/product-service/src/main/java/com/sparta/product/presentation/dto/response/DecreaseProductQuantityResponseDto.java b/product-service/src/main/java/com/sparta/product/presentation/dto/response/DecreaseProductQuantityResponseDto.java new file mode 100644 index 0000000..7383c38 --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/presentation/dto/response/DecreaseProductQuantityResponseDto.java @@ -0,0 +1,33 @@ +package com.sparta.product.presentation.dto.response; + +import com.sparta.product.domain.model.Product; +import lombok.Builder; + +import java.util.UUID; + +@Builder +public record DecreaseProductQuantityResponseDto(UUID productId, // 재고 감소 상품 + Boolean isSuccess, // 재고 감소 성공 여부 + Integer decreasedQuantity, // 실제 차감된 수량 + String message) { // 성공 or 실패 메세지 + // Entity -> DTO 변환 메서드 + // 성공 응답 + public static DecreaseProductQuantityResponseDto success(Product product, int decreasedQuantity) { + return DecreaseProductQuantityResponseDto.builder() + .productId(product.getId()) + .isSuccess(true) + .decreasedQuantity(decreasedQuantity) + .message("재고 감소 성공.") + .build(); + } + + // 실패 응답 + public static DecreaseProductQuantityResponseDto failure(Product product) { + return DecreaseProductQuantityResponseDto.builder() + .productId(product.getId()) + .isSuccess(false) + .decreasedQuantity(0) + .message("재고 감소 실패.") + .build(); + } +} From 513d281981b63a0cf57bca4f40a4be5fcce30142 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Sun, 23 Mar 2025 21:17:32 +0900 Subject: [PATCH 251/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#139]=20:=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EC=88=98=EC=A0=95(=EC=9E=AC=EA=B3=A0=20?= =?UTF-8?q?=EA=B0=90=EC=86=8C)=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/ProductService.java | 8 +++--- .../service/ProductServiceImpl.java | 26 ++++++++++++++++--- .../sparta/product/domain/model/Product.java | 26 ++++++++++++++++++- .../domain/repository/ProductRepository.java | 2 ++ 4 files changed, 53 insertions(+), 9 deletions(-) diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductService.java b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java index 8b1116b..54cfa19 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductService.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java @@ -1,13 +1,11 @@ package com.sparta.product.application.service; import com.sparta.product.application.dto.DeleteProductServiceRequestDto; +import com.sparta.product.application.dto.DecreaseProductQuantityServiceRequestDto; import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.presentation.dto.request.CreateProductRequestDto; import com.sparta.product.presentation.dto.request.SearchProductRequestDto; -import com.sparta.product.presentation.dto.response.CreateProductResponseDto; -import com.sparta.product.presentation.dto.response.ReadProductResponseDto; -import com.sparta.product.presentation.dto.response.SearchProductResponseDto; -import com.sparta.product.presentation.dto.response.UpdateProductResponseDto; +import com.sparta.product.presentation.dto.response.*; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -28,4 +26,6 @@ public interface ProductService { void deleteProduct(DeleteProductServiceRequestDto serviceDto); Page searchProducts(SearchProductRequestDto requestDto, Pageable pageable); + + DecreaseProductQuantityResponseDto decreaseProductQuantity(DecreaseProductQuantityServiceRequestDto serviceDto); } diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java index 3b3278d..2e36a2d 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java @@ -2,6 +2,7 @@ import com.sparta.commonmodule.exception.ResourceNotFoundException; import com.sparta.product.application.dto.DeleteProductServiceRequestDto; +import com.sparta.product.application.dto.DecreaseProductQuantityServiceRequestDto; import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.domain.model.Product; import com.sparta.product.domain.repository.ProductRepository; @@ -9,10 +10,7 @@ import com.sparta.product.infrastructure.client.HubClient; import com.sparta.product.presentation.dto.request.CreateProductRequestDto; import com.sparta.product.presentation.dto.request.SearchProductRequestDto; -import com.sparta.product.presentation.dto.response.CreateProductResponseDto; -import com.sparta.product.presentation.dto.response.ReadProductResponseDto; -import com.sparta.product.presentation.dto.response.SearchProductResponseDto; -import com.sparta.product.presentation.dto.response.UpdateProductResponseDto; +import com.sparta.product.presentation.dto.response.*; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -102,6 +100,26 @@ public Page searchProducts(SearchProductRequestDto req } + /** + * 상품 수정(재고 감소) + */ + @Override + public DecreaseProductQuantityResponseDto decreaseProductQuantity(DecreaseProductQuantityServiceRequestDto serviceDto) { + Product product = productRepository.findByIdAndHubId(serviceDto.productId(), serviceDto.hubId()) + .orElseThrow(() -> new ResourceNotFoundException("해당 허브에 상품이 존재하지 않습니다.")); + + try { + // 재고 감소 성공 + product.decreaseQuantity(serviceDto.quantity()); + return DecreaseProductQuantityResponseDto.success(product, serviceDto.quantity()); + } catch (IllegalArgumentException | IllegalStateException e) { + // 재고 감소 실패 (재고 부족, 최소 수량 미만 등) + return DecreaseProductQuantityResponseDto.failure(product); + } + } + + + // 업체 존재 검증 메서드 private void validateCompanyExists(UUID companyId) { if (!companyClient.existsById(companyId)) { diff --git a/product-service/src/main/java/com/sparta/product/domain/model/Product.java b/product-service/src/main/java/com/sparta/product/domain/model/Product.java index b1eb777..c65a884 100644 --- a/product-service/src/main/java/com/sparta/product/domain/model/Product.java +++ b/product-service/src/main/java/com/sparta/product/domain/model/Product.java @@ -74,7 +74,29 @@ public Product updateProduct(UpdateProductServiceRequestDto serviceDto) { return this; } - + + /** + * 상품 수정(재고 감소) + */ + public void decreaseQuantity(Integer quantity) { + validateDecreaseQuantity(quantity); + this.quantity = this.quantity - quantity; + } + + + + private void validateDecreaseQuantity(Integer quantity) { + if (quantity == null || quantity < 30) { + throw new IllegalArgumentException("최소 30개 이상 요청해야 합니다."); + } + if (this.quantity < quantity) { + throw new IllegalStateException("재고가 부족합니다."); + } + } + + + + // DTO -> Entity 변환 메서드 public static Product of(CreateProductResponseDto responseDto) { return Product.builder() @@ -87,4 +109,6 @@ public static Product of(CreateProductResponseDto responseDto) { .hubId(responseDto.hubId()) .build(); } + + } \ No newline at end of file diff --git a/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java b/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java index a00f561..7b0e96f 100644 --- a/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java +++ b/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java @@ -16,6 +16,8 @@ public interface ProductRepository { Optional findById(UUID productId); + Optional findByIdAndHubId(UUID productId, UUID hubId); + List findAll(); Page searchProducts(SearchProductRequestDto requestDto, Pageable pageable); From 8bb0e6e1f5327c7bc735665dc59ea45862f6a8f9 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Sun, 23 Mar 2025 21:18:12 +0900 Subject: [PATCH 252/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#139]=20:=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EC=88=98=EC=A0=95(=EC=9E=AC=EA=B3=A0=20?= =?UTF-8?q?=EA=B0=90=EC=86=8C)=20http=20=ED=85=8C=EC=8A=A4=ED=8A=B8=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 --- product-service/src/test/http/product.http | 29 +++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/product-service/src/test/http/product.http b/product-service/src/test/http/product.http index 65fbd4b..866bcc7 100644 --- a/product-service/src/test/http/product.http +++ b/product-service/src/test/http/product.http @@ -36,6 +36,28 @@ Content-Type: application/json } +### 상품 수정(재고 감소 성공) +PUT http://localhost:8083/api/v1/products/fabd981b-844a-47f9-a15c-60ae362c2eb7/decrease +Content-Type: application/json + +{ + "companyId": "550e8400-e29b-41d4-a716-446655440000", + "hubId": "123e4567-e89b-12d3-a456-426614174000", + "quantity": 30 +} + + +### 상품 수정(재고 감소 실패) +PUT http://localhost:8083/api/v1/products/fabd981b-844a-47f9-a15c-60ae362c2eb7/decrease +Content-Type: application/json + +{ + "companyId": "550e8400-e29b-41d4-a716-446655440000", + "hubId": "123e4567-e89b-12d3-a456-426614174000", + "quantity": 100 +} + + ### 상품 삭제 DELETE http://localhost:8083/api/v1/products/225dc81a-7b96-4905-83b9-16945fef9a7d X-User-Id: 12345 # 사용자 ID (Long 타입) @@ -56,4 +78,9 @@ GET http://localhost:8083/api/v1/products/search?hubId=123e4567-e89b-12d3-a456-4 ### 상품 검색 (업체 ID로 검색) -GET http://localhost:8083/api/v1/products/search?companyId=550e8400-e29b-41d4-a716-446655440001&page=0&size=10&sort=createdAt,asc \ No newline at end of file +GET http://localhost:8083/api/v1/products/search?companyId=550e8400-e29b-41d4-a716-446655440001&page=0&size=10&sort=createdAt,asc + + + + + From a108499af08842a70938d7804a9d728a21aadd81 Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Sun, 23 Mar 2025 22:41:10 +0900 Subject: [PATCH 253/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#164]?= =?UTF-8?q?=20:userId=20=ED=97=A4=EB=8D=94=EC=97=90=EC=84=9C=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=99=80=EC=84=9C=20createdby,updateby=20=EA=B0=92=20?= =?UTF-8?q?=EB=8C=80=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/ShippingService.java | 8 ++++---- .../sparta/shippingservice/domain/model/Shipping.java | 6 ++++-- .../domain/model/trans/ShippingSelf.java | 3 ++- .../presentation/ShippingController.java | 11 ++++++----- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java index d837aaa..11ad6c2 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -35,13 +35,13 @@ public class ShippingService { private final ShippingManagerClient shippingManagerClient; //각 허브에 10명 / 업체에 10명 - public ShippingWithRouteResponseDto create(@Valid CreateShippingRequestDto request , @Valid CreateRouteLogRequestDto logDto) { + public ShippingWithRouteResponseDto create(@Valid CreateShippingRequestDto request , @Valid CreateRouteLogRequestDto logDto,Long userId) { ShippingManagerResponseDto manager = shippingManagerClient.assignManager(); if(manager.managerType() != ManagerType.CARRIER){ throw new InvalidParameterException("배송 담당자는 업체 소속이어야 합니다."); } - Shipping shipping = request.of(manager.id()).toShipping(); + Shipping shipping = request.of(manager.id()).toShipping(userId); RouteLogSelf routeLogSelf = new RouteLogSelf( shipping, @@ -88,9 +88,9 @@ public List getAllShipping() { } @Transactional - public ShippingResponseDto updateShipping(UUID shippingId, @Valid UpdateShippingRequestDto request) { + public ShippingResponseDto updateShipping(UUID shippingId, @Valid UpdateShippingRequestDto request ,Long userId) { Shipping shipping = findShipping(shippingId); - shipping.updateShipping(request.of().toShipping()); + shipping.updateShipping(request.of().toShipping(userId),userId); return ShippingResponseDto.from(shipping); } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java index 4f93aad..8f16402 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java @@ -38,7 +38,8 @@ public class Shipping extends BaseEntity { @Column(name = "status", nullable = false, length = 50) private ShippingStatus status = ShippingStatus.PENDING; // 기본값 설정 - public Shipping(UUID orderId, String shippingAddress, String receiverName, UUID shippingManagerId, ShippingStatus status) { + public Shipping(Long userId,UUID orderId, String shippingAddress, String receiverName, UUID shippingManagerId, ShippingStatus status) { + super(userId); this.orderId = orderId; this.shippingAddress = shippingAddress; this.receiverName = receiverName; @@ -47,7 +48,8 @@ public Shipping(UUID orderId, String shippingAddress, String receiverName, UUID } - public Shipping updateShipping(Shipping shipping) { + public Shipping updateShipping(Shipping shipping,Long userId) { + super.update(userId); if (this.status == ShippingStatus.DELIVERED) { throw new IllegalStateException("배송이 완료된 후에는 정보를 변경할 수 없습니다."); } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/ShippingSelf.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/ShippingSelf.java index d22343d..bb79452 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/ShippingSelf.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/ShippingSelf.java @@ -10,8 +10,9 @@ public record ShippingSelf(UUID orderId, String receiverName, UUID shippingManagerId, ShippingStatus status) { - public Shipping toShipping(){ // DTO - > entity 전환 + public Shipping toShipping(Long userId){ // DTO - > entity 전환 return new Shipping( + userId, this.orderId, this.shippingAddress, this.receiverName, diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index aa22725..8634217 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -22,8 +22,9 @@ public class ShippingController { private final ShippingService shippingService; @PostMapping() // 배송 생성 - public ResponseEntity Shipping(@Valid @RequestBody CreateShippingWithRouteRequestDto request) { - ShippingWithRouteResponseDto responseDto = shippingService.create(request.shipping(), request.routeLog()); + public ResponseEntity create (@Valid @RequestBody CreateShippingWithRouteRequestDto request, + @RequestHeader("userId")Long userId) { + ShippingWithRouteResponseDto responseDto = shippingService.create(request.shipping(), request.routeLog(),userId); return ResponseEntity.ok(responseDto); } @@ -42,13 +43,13 @@ public ResponseEntity> getAllShipping() { @PatchMapping("/{shippingId}") // 배송 내역 수정 - public ResponseEntity updateShipping(@PathVariable("shippingId") UUID id, @Valid @RequestBody UpdateShippingRequestDto request) { - ShippingResponseDto ResponseDto = shippingService.updateShipping(id, request); + public ResponseEntity updateShipping(@PathVariable("shippingId") UUID id, @Valid @RequestBody UpdateShippingRequestDto request, @RequestHeader("userId") Long userId ) { + ShippingResponseDto ResponseDto = shippingService.updateShipping(id, request,userId); return ResponseEntity.ok(ResponseDto); } @DeleteMapping("/{shippingId}") - public ResponseEntity deleteShipping(@PathVariable("shippingId") UUID id, @RequestParam long userId) { + public ResponseEntity deleteShipping(@PathVariable("shippingId") UUID id, @RequestHeader("userId") long userId) { ShippingResponseDto responseDto = shippingService.deleteShipping(id, userId); return ResponseEntity.ok(responseDto); } From cb33537ca52b32c7de38948898b43db655802ee9 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 23:31:34 +0900 Subject: [PATCH 254/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20=ED=97=88?= =?UTF-8?q?=EB=B8=8C=EB=9D=BC=EC=9A=B0=ED=8A=B8=20=EB=94=94=ED=85=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=A0=95=EB=B3=B4=20=EC=88=9C=EC=88=98=20=EA=B0=92?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/HubRouteDetailsResponseDto.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDetailsResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDetailsResponseDto.java index 0a4550f..a5d2760 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDetailsResponseDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/HubRouteDetailsResponseDto.java @@ -1,8 +1,9 @@ package com.sparta.hubservice.hub_route.application.dto.response; import com.sparta.hubservice.hub_route.domain.model.HubRoute; -import com.sparta.hubservice.hub_route.domain.model.HubRouteCheckpoint; +import java.math.BigDecimal; import java.util.List; +import java.util.UUID; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -12,7 +13,19 @@ @AllArgsConstructor public class HubRouteDetailsResponseDto { - private final HubRoute hubRoute; - private final List checkpointList; + private final UUID hubRouteId; + private final UUID fromHubId; + private final UUID toHubId; + private final int duration; + private final BigDecimal distance; + private final List checkpoints; + public HubRouteDetailsResponseDto(HubRoute hubRoute, List checkpoints) { + this.hubRouteId = hubRoute.getHubRouteId(); + this.fromHubId = hubRoute.getFromHub().getHubId(); + this.toHubId = hubRoute.getToHub().getHubId(); + this.duration = hubRoute.getDuration(); + this.distance = hubRoute.getDistance(); + this.checkpoints = checkpoints; + } } From 09df1249662ed8ea95a7c0cadc64f56d3eec7a64 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 23:32:12 +0900 Subject: [PATCH 255/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20CheckpointRespon?= =?UTF-8?q?seDto=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/CheckpointResponseDto.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/CheckpointResponseDto.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/CheckpointResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/CheckpointResponseDto.java new file mode 100644 index 0000000..671184f --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dto/response/CheckpointResponseDto.java @@ -0,0 +1,25 @@ +package com.sparta.hubservice.hub_route.application.dto.response; + +import com.sparta.hubservice.hub_route.domain.model.HubRouteCheckpoint; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@AllArgsConstructor +@Builder +public class CheckpointResponseDto { + + private final UUID hubRouteCheckpointId; + private final UUID hubRouteId; + private final UUID checkpointHubId; + private final int sequence; + + public CheckpointResponseDto(HubRouteCheckpoint checkpoint) { + hubRouteCheckpointId = checkpoint.getHubRouteCheckpointId(); + hubRouteId = checkpoint.getHubRoute().getHubRouteId(); + sequence = checkpoint.getSequence(); + checkpointHubId = checkpoint.getCheckpointHubId().getHubId(); + } +} From 62375c4b517bf9504042c2dce95e79553a598782 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 23:35:50 +0900 Subject: [PATCH 256/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20Feign=20Client?= =?UTF-8?q?=EC=9D=84=20=EA=B4=80=EB=A6=AC=ED=95=98=EB=8A=94=20Controller?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HubRouteFeignController.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteFeignController.java diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteFeignController.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteFeignController.java new file mode 100644 index 0000000..e392bb7 --- /dev/null +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteFeignController.java @@ -0,0 +1,28 @@ +package com.sparta.hubservice.hub_route.presentation.controller; + +import com.sparta.hubservice.hub_route.application.dto.response.HubRouteDetailsResponseDto; +import com.sparta.hubservice.hub_route.application.service.HubRouteService; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v1/hub-route/feign") +public class HubRouteFeignController { + + private final HubRouteService hubRouteService; + + @GetMapping("/{from_id}/{to_id}/path") + public ResponseEntity getHubRouteDetails( + @PathVariable("from_id") UUID fromId, + @PathVariable("to_id") UUID toId + ){ + HubRouteDetailsResponseDto responseDto = hubRouteService.getPathHubRoute(fromId, toId); + return ResponseEntity.ok(responseDto); + } +} From 905c60ea10b9e2df23978448e81d6a725ccfd466 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Sun, 23 Mar 2025 23:36:05 +0900 Subject: [PATCH 257/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=20=ED=83=80=EC=9E=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/HubRouteService.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java index 24804f8..a9f3cf7 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java @@ -4,6 +4,7 @@ import com.sparta.hubservice.hub.domain.model.Hub; import com.sparta.hubservice.hub.domain.repository.HubRepository; import com.sparta.hubservice.hub_route.application.dijkstra.PathCalculate; +import com.sparta.hubservice.hub_route.application.dto.response.CheckpointResponseDto; import com.sparta.hubservice.hub_route.application.dto.response.HubRouteCreateResponseDto; import com.sparta.hubservice.hub_route.application.dto.response.HubRouteDeleteResponseDto; import com.sparta.hubservice.hub_route.application.dto.response.HubRouteDetailsResponseDto; @@ -117,7 +118,10 @@ public HubRouteDetailsResponseDto createPathHubRoute(UUID fromHubId, UUID toHubI } checkpointRepository.saveAll(checkpointList); - return new HubRouteDetailsResponseDto(route, checkpointList); + List checkpoints = + checkpointList.stream().map(CheckpointResponseDto::new).toList(); + + return new HubRouteDetailsResponseDto(route, checkpoints); } // fromHub -> toHub 최단 경로 정보 조회 @@ -129,12 +133,11 @@ public HubRouteDetailsResponseDto getPathHubRoute(UUID fromHubId, UUID toHubId) HubRoute route = hubRouteRepository.findByFromHubAndToHub(fromHub, toHub) .orElseThrow(ResourceNotFoundException::new); - List checkpointList = - checkpointRepository.findAllByHubRoute_OrderBySequenceAsc(route); + List checkpoints = + checkpointRepository.findAllByHubRoute_OrderBySequenceAsc(route) + .stream().map(CheckpointResponseDto::new).toList(); - return new HubRouteDetailsResponseDto(route, checkpointList); + return new HubRouteDetailsResponseDto(route, checkpoints); } - - } From c8e6bf22eafcd326b31c40c989d7921a793f4fb0 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 00:01:05 +0900 Subject: [PATCH 258/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=B6=9C?= =?UTF-8?q?=EA=B3=A0=EC=B2=98=EB=A6=AC=20feign=20client=20controller=20?= =?UTF-8?q?=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 --- .../controller/HubShippingScanController.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java index 197dee1..435b2e1 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java @@ -2,6 +2,7 @@ import com.sparta.hubservice.hub.application.service.HubShippingScanService; import com.sparta.hubservice.hub.infrastructure.feignclient.dto.InboundStatusResponseDto; +import com.sparta.hubservice.hub.infrastructure.feignclient.dto.OutboundStatusResponseDto; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -18,6 +19,7 @@ public class HubShippingScanController { private final HubShippingScanService hubShippingScanService; + // 입고 처리 @PostMapping("/{hub_id}/{shipping_id}/inbound-log") public ResponseEntity inboundStatus( @PathVariable("hub_id") UUID hubId, @@ -31,6 +33,17 @@ public ResponseEntity inboundStatus( } // 출고 처리 + @PostMapping("/{hub_id}/{shipping_id}/outbound-log") + public ResponseEntity outboundStatus( + @PathVariable("hub_id") UUID hubId, + @PathVariable("shipping_id") UUID shippingId, + @RequestParam("user_id") Long userId, + @RequestParam("next_hub_id") UUID nextHubId + ){ + OutboundStatusResponseDto responseDto = + hubShippingScanService.createOutbound(hubId, shippingId, nextHubId, userId); + return ResponseEntity.ok(responseDto); + } } From 68ba4e4a67e24b4dca62371090643e625a922699 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 00:01:38 +0900 Subject: [PATCH 259/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=B6=9C?= =?UTF-8?q?=EA=B3=A0=EC=B2=98=EB=A6=AC=20Service=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/HubShippingScanService.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubShippingScanService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubShippingScanService.java index 5795dcb..4986677 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubShippingScanService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubShippingScanService.java @@ -7,6 +7,7 @@ import com.sparta.hubservice.hub.domain.repository.HubRepository; import com.sparta.hubservice.hub.domain.repository.HubShippingScanRepository; import com.sparta.hubservice.hub.infrastructure.feignclient.dto.InboundStatusResponseDto; +import com.sparta.hubservice.hub.infrastructure.feignclient.dto.OutboundStatusResponseDto; import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -30,9 +31,22 @@ public InboundStatusResponseDto createInbound(UUID hubId, UUID shippingId, Long HubShippingScanLog.createInboundLog(hub, shippingId, userId); hubShippingScanRepository.save(hubShippingScanLog); - log.info("Success save hubShippingScanLog - HubShippingScanLog: {}", hubShippingScanLog); + log.info("Success Save InboundLog - HubShippingScanLog: {}", hubShippingScanLog); return shippingService.inboundStatus(hubShippingScanLog); } + @Transactional + public OutboundStatusResponseDto createOutbound(UUID hubId, UUID shippingId, UUID nextHubId, Long userId) { + Hub hub = hubRepository.findById(hubId).orElseThrow(ResourceNotFoundException::new); + Hub nextHub = hubRepository.findById(nextHubId).orElseThrow(ResourceNotFoundException::new); + + HubShippingScanLog hubShippingScanLog = + HubShippingScanLog.createOutboundLog(hub, shippingId, nextHub, userId); + + hubShippingScanRepository.save(hubShippingScanLog); + log.info("Success Save OutboundLog - HubShippingScanLog: {}", hubShippingScanLog); + + return shippingService.outboundStatus(hubShippingScanLog); + } } From 79f6304649d846e914de197df720548c5de1180c Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 00:02:12 +0900 Subject: [PATCH 260/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20outboundstatusRe?= =?UTF-8?q?questDto=20=EC=83=9D=EC=84=B1=EC=82=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feignclient/dto/OutboundStatusRequestDto.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/OutboundStatusRequestDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/OutboundStatusRequestDto.java index 03c829b..467613a 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/OutboundStatusRequestDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/OutboundStatusRequestDto.java @@ -1,5 +1,6 @@ package com.sparta.hubservice.hub.infrastructure.feignclient.dto; +import com.sparta.hubservice.hub.domain.model.HubShippingScanLog; import com.sparta.hubservice.hub.domain.model.HubShippingScanLog.ShippingStatus; import java.time.LocalDateTime; import java.util.UUID; @@ -19,5 +20,10 @@ public class OutboundStatusRequestDto { private LocalDateTime timestamp; private UUID nextHubId; - + public OutboundStatusRequestDto(HubShippingScanLog log) { + this.hubId = log.getHub().getHubId(); + this.shippingStatus = log.getStatus(); + this.timestamp = log.getTimestamp(); + this.nextHubId = log.getNextHub().getHubId(); + } } From 244a6272c126d50f1c5611b01ed23d4f28a248a7 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 00:03:01 +0900 Subject: [PATCH 261/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20feign=20client?= =?UTF-8?q?=EB=A5=BC=20=EC=A7=81=EC=A0=91=20=ED=98=B8=EC=B6=9C=20=ED=95=A0?= =?UTF-8?q?=20Service=20Class=20=EC=97=90=EC=84=9C=EC=9D=98=20=EC=B6=9C?= =?UTF-8?q?=EA=B3=A0=20=EC=B2=98=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub/application/service/shipping/ShippingService.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/shipping/ShippingService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/shipping/ShippingService.java index 27e3c48..7d67fab 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/shipping/ShippingService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/shipping/ShippingService.java @@ -4,6 +4,8 @@ import com.sparta.hubservice.hub.infrastructure.feignclient.ShippingFeignClient; import com.sparta.hubservice.hub.infrastructure.feignclient.dto.InboundStatusRequestDto; import com.sparta.hubservice.hub.infrastructure.feignclient.dto.InboundStatusResponseDto; +import com.sparta.hubservice.hub.infrastructure.feignclient.dto.OutboundStatusRequestDto; +import com.sparta.hubservice.hub.infrastructure.feignclient.dto.OutboundStatusResponseDto; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -20,4 +22,7 @@ public InboundStatusResponseDto inboundStatus(HubShippingScanLog log){ return shippingFeignClient.inboundStatus(log.getShippingId(), new InboundStatusRequestDto(log)); } + public OutboundStatusResponseDto outboundStatus(HubShippingScanLog log) { + return shippingFeignClient.outboundStatus(log.getShippingId(), new OutboundStatusRequestDto(log)); + } } From c87fcd6a1e9cc130c738cdb146ab310570687bdf Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 24 Mar 2025 00:20:08 +0900 Subject: [PATCH 262/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20FeignClient=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- order-service/build.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/order-service/build.gradle b/order-service/build.gradle index e1e28bd..d6bc977 100644 --- a/order-service/build.gradle +++ b/order-service/build.gradle @@ -11,11 +11,13 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' - //QueryDSL + // QueryDSL implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta' annotationProcessor 'com.querydsl:querydsl-apt:5.1.0:jakarta' annotationProcessor 'jakarta.persistence:jakarta.persistence-api' annotationProcessor 'jakarta.annotation:jakarta.annotation-api' + + implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' } dependencyManagement { From b162d901afcf73274eeb28220e1aeda832489939 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 24 Mar 2025 00:20:46 +0900 Subject: [PATCH 263/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=9E=AC?= =?UTF-8?q?=EA=B3=A0=20=EA=B0=90=EC=86=8C=20ResponseDto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DecreaseProductQuantityResponseDto.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/response/DecreaseProductQuantityResponseDto.java diff --git a/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/response/DecreaseProductQuantityResponseDto.java b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/response/DecreaseProductQuantityResponseDto.java new file mode 100644 index 0000000..acd5747 --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/response/DecreaseProductQuantityResponseDto.java @@ -0,0 +1,22 @@ +package com.sparta.orderservice.infrastructure.client.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +//Product 서비스에서 재고 차감 요청 후 반환되는 응답 DTO + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DecreaseProductQuantityResponseDto { + + private UUID productId; // 재고 감소 상품 ID + private Boolean isSuccess; // 재고 감소 성공 여부 + private Integer decreasedQuantity; // 실제 차감된 수량 + private String message; // 성공/실패 메시지 +} From fa980a5351501f93c80f2c1225e124a6ac681b28 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 24 Mar 2025 00:20:53 +0900 Subject: [PATCH 264/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=9E=AC?= =?UTF-8?q?=EA=B3=A0=20=EA=B0=90=EC=86=8C=20RequestDto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...DecreaseProductQuantityServiceRequestDto.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/request/DecreaseProductQuantityServiceRequestDto.java diff --git a/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/request/DecreaseProductQuantityServiceRequestDto.java b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/request/DecreaseProductQuantityServiceRequestDto.java new file mode 100644 index 0000000..8e74d35 --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/request/DecreaseProductQuantityServiceRequestDto.java @@ -0,0 +1,16 @@ +package com.sparta.orderservice.infrastructure.client.dto.request; + +import lombok.Builder; +import lombok.Getter; + +import java.util.UUID; + +@Getter +@Builder +public class DecreaseProductQuantityServiceRequestDto { + + private UUID productId; + private UUID companyId; + private UUID hubId; + private Integer quantity; +} \ No newline at end of file From 060cb2e8d7febb109f3e79a0b03eb68a64a0031b Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 24 Mar 2025 00:21:16 +0900 Subject: [PATCH 265/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20quantity=20?= =?UTF-8?q?=ED=95=84=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 --- .../sparta/orderservice/application/dto/OrderRequestDto.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/order-service/src/main/java/com/sparta/orderservice/application/dto/OrderRequestDto.java b/order-service/src/main/java/com/sparta/orderservice/application/dto/OrderRequestDto.java index 1f4f290..59cba32 100644 --- a/order-service/src/main/java/com/sparta/orderservice/application/dto/OrderRequestDto.java +++ b/order-service/src/main/java/com/sparta/orderservice/application/dto/OrderRequestDto.java @@ -31,4 +31,7 @@ public class OrderRequestDto { private BigDecimal totalPrice; private String requestDetail; + + @NotNull(message = "quantity는 필수입니다.") // + private Integer quantity; } From 97ccfc6043f05a9f0ff6304dbc3a3f880c316d4f Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 24 Mar 2025 00:21:30 +0900 Subject: [PATCH 266/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20FeignClient=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sparta/orderservice/OrderServiceApplication.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java b/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java index 91fda79..ac7b366 100644 --- a/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java +++ b/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java @@ -3,9 +3,11 @@ import com.sparta.commonmodule.config.SwaggerConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Import; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +@EnableFeignClients(basePackages = "com.sparta.orderservice.infrastructure.client") @EnableJpaAuditing @SpringBootApplication(scanBasePackages = "com.sparta") @Import(SwaggerConfig.class) From f9fd9f287c2b923614805a19c50884715d961233 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 24 Mar 2025 00:21:49 +0900 Subject: [PATCH 267/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EC=9E=AC?= =?UTF-8?q?=EA=B3=A0=20=EA=B0=90=EC=86=8C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/OrderService.java | 34 +++++++++++++++++-- .../infrastructure/client/ProductClient.java | 20 +++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 order-service/src/main/java/com/sparta/orderservice/infrastructure/client/ProductClient.java diff --git a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java index 0c98cb0..0d39e2d 100644 --- a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java +++ b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java @@ -8,7 +8,11 @@ import com.sparta.orderservice.domain.model.OrderStatus; import com.sparta.orderservice.domain.repository.OrderQueryDSLRepository; import com.sparta.orderservice.domain.repository.OrderRepository; +import com.sparta.orderservice.infrastructure.client.ProductClient; +import com.sparta.orderservice.infrastructure.client.dto.response.DecreaseProductQuantityResponseDto; +import com.sparta.orderservice.infrastructure.client.dto.request.DecreaseProductQuantityServiceRequestDto; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,12 +26,37 @@ public class OrderService { private final OrderRepository orderRepository; + @Qualifier("orderQueryDSLRepositoryImpl") private final OrderQueryDSLRepository orderQueryDSLRepository; + private final ProductClient productClient; +// private final ProductClient productClient; //주문 생성 @Transactional public OrderResponseDto createOrder(OrderRequestDto requestDto) { + + // 1. 재고 차감 요청 DTO 생성 + DecreaseProductQuantityServiceRequestDto reduceRequest = + DecreaseProductQuantityServiceRequestDto.builder() + .productId(requestDto.getProductId()) + .companyId(requestDto.getSupplierId()) // supplierId → companyId + .hubId(requestDto.getReceiverId()) // receiverId → hubId + .quantity(1) // 기본 수량 예시 + .build(); + + // 2. FeignClient로 재고 차감 요청 + UUID productId = reduceRequest.getProductId(); + + DecreaseProductQuantityResponseDto response = + productClient.decreaseProductQuantity(productId, reduceRequest); + + + // 3. 실패 시 예외 발생 + if (!response.getIsSuccess()) { + throw new OperationNotAllowedException("재고 차감에 실패하여 주문을 생성할 수 없습니다."); + } + Order order = Order.builder() .name(requestDto.getName()) .supplierId(requestDto.getSupplierId()) @@ -47,15 +76,16 @@ public OrderResponseDto createOrder(OrderRequestDto requestDto) { // 주문 전체 조회 @Transactional(readOnly = true) - public List getALlOrders(){ + public List getALlOrders() { List orders = orderRepository.findAll(); return orders.stream() .map(OrderResponseDto::fromEntity) .collect(Collectors.toList()); } + // 주문 단일 조회 @Transactional(readOnly = true) - public OrderResponseDto getOrderById(UUID orderId){ + public OrderResponseDto getOrderById(UUID orderId) { Order order = orderRepository.findById(orderId) .orElseThrow(() -> new ResourceNotFoundException("해당 주문을 찾을 수 없습니다.")); return OrderResponseDto.fromEntity(order); diff --git a/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/ProductClient.java b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/ProductClient.java new file mode 100644 index 0000000..725169b --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/ProductClient.java @@ -0,0 +1,20 @@ +package com.sparta.orderservice.infrastructure.client; + +import com.sparta.orderservice.infrastructure.client.dto.response.DecreaseProductQuantityResponseDto; +import com.sparta.orderservice.infrastructure.client.dto.request.DecreaseProductQuantityServiceRequestDto; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.UUID; + + @FeignClient(name = "product-service", path = "/api/v1/products") + public interface ProductClient { + + @PutMapping("/{productId}/decrease") + DecreaseProductQuantityResponseDto decreaseProductQuantity( + @PathVariable("productId") UUID productId, + @RequestBody DecreaseProductQuantityServiceRequestDto requestDto + ); + } From 0fd708b9b6d110b8fc99b89cd5a0e1f92ad14616 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Mon, 24 Mar 2025 01:17:33 +0900 Subject: [PATCH 268/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#168]=20:=20Auditor?= =?UTF-8?q?AwareImpl=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 객체 생성시 created_at, created_by, updated_at, updated_by 값이 자동 생성 되도록 설정 --- .../config/JpaAuditingConfig.java | 9 ++++ .../commonmodule/entity/AuditorAwareImpl.java | 51 +++++++++++++++++++ .../product/ProductServiceApplication.java | 3 +- 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 common-module/src/main/java/com/sparta/commonmodule/config/JpaAuditingConfig.java create mode 100644 common-module/src/main/java/com/sparta/commonmodule/entity/AuditorAwareImpl.java diff --git a/common-module/src/main/java/com/sparta/commonmodule/config/JpaAuditingConfig.java b/common-module/src/main/java/com/sparta/commonmodule/config/JpaAuditingConfig.java new file mode 100644 index 0000000..e83d6bc --- /dev/null +++ b/common-module/src/main/java/com/sparta/commonmodule/config/JpaAuditingConfig.java @@ -0,0 +1,9 @@ +package com.sparta.commonmodule.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +@Configuration +@EnableJpaAuditing +public class JpaAuditingConfig { +} diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/AuditorAwareImpl.java b/common-module/src/main/java/com/sparta/commonmodule/entity/AuditorAwareImpl.java new file mode 100644 index 0000000..f16538d --- /dev/null +++ b/common-module/src/main/java/com/sparta/commonmodule/entity/AuditorAwareImpl.java @@ -0,0 +1,51 @@ +package com.sparta.commonmodule.entity; + +import org.springframework.data.domain.AuditorAware; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import jakarta.servlet.http.HttpServletRequest; +import java.util.Optional; + +/** + * Spring Data JPA의 AuditorAware 구현체 + * HTTP 요청의 `X-User-Id` 헤더 값을 기반으로 @CreatedBy, @LastModifiedBy 값을 자동 설정 + */ +@Component +public class AuditorAwareImpl implements AuditorAware { + + /** + * 현재 요청을 보낸 사용자의 ID를 반환 (Auditing 기능에서 호출됨) + * @return Optional - 요청에서 추출한 사용자 ID (없으면 null) + */ + @Override + public Optional getCurrentAuditor() { + Long userId = getUserIdFromHeader(); + return Optional.ofNullable(userId); + } + + /** + * HTTP 요청에서 'X-User-Id' 헤더 값을 가져와 Long 타입으로 변환 + * @return Long - 변환된 사용자 ID (없으면 null) + */ + private Long getUserIdFromHeader() { + // 현재 요청의 정보를 가져옴 + ServletRequestAttributes attributes = + (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + + if (attributes != null) { + HttpServletRequest request = attributes.getRequest(); + String userIdHeader = request.getHeader("user_id"); // 헤더에서 사용자 ID 가져오기 + + if (userIdHeader != null) { + try { + return Long.parseLong(userIdHeader); // String → Long 변환 + } catch (NumberFormatException e) { + return null; + } + } + } + return null; + } +} diff --git a/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java b/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java index 844498f..8fbdd84 100644 --- a/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java +++ b/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java @@ -1,5 +1,6 @@ package com.sparta.product; +import com.sparta.commonmodule.config.JpaAuditingConfig; import com.sparta.commonmodule.config.SwaggerConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -8,7 +9,7 @@ @SpringBootApplication(scanBasePackages = "com.sparta") @EnableFeignClients -@Import(SwaggerConfig.class) +@Import({SwaggerConfig.class, JpaAuditingConfig.class}) public class ProductServiceApplication { public static void main(String[] args) { From 4baa7af31bf9e1de365a1f639c566bc889bb4649 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 01:18:25 +0900 Subject: [PATCH 269/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20feign=20client?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/HubShippingScanService.java | 16 ++++++++++++---- .../hub/domain/model/HubShippingScanLog.java | 7 +++++-- .../feignclient/ShippingFeignClient.java | 5 ++--- .../dto/InboundStatusResponseDto.java | 3 ++- .../dto/OutboundStatusResponseDto.java | 2 ++ .../controller/HubShippingScanController.java | 9 ++++----- 6 files changed, 27 insertions(+), 15 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubShippingScanService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubShippingScanService.java index 4986677..10ddf9f 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubShippingScanService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubShippingScanService.java @@ -23,6 +23,7 @@ public class HubShippingScanService { private final HubRepository hubRepository; private final ShippingService shippingService; + // 입고 처리 로그 저장 feign client 호출 @Transactional public InboundStatusResponseDto createInbound(UUID hubId, UUID shippingId, Long userId) { Hub hub = hubRepository.findById(hubId).orElseThrow(ResourceNotFoundException::new); @@ -36,17 +37,24 @@ public InboundStatusResponseDto createInbound(UUID hubId, UUID shippingId, Long return shippingService.inboundStatus(hubShippingScanLog); } + // 출고 처리 로그 저장 후 feign client 호출 @Transactional - public OutboundStatusResponseDto createOutbound(UUID hubId, UUID shippingId, UUID nextHubId, Long userId) { + public OutboundStatusResponseDto createOutbound(UUID hubId, UUID shippingId, Long userId) { Hub hub = hubRepository.findById(hubId).orElseThrow(ResourceNotFoundException::new); - Hub nextHub = hubRepository.findById(nextHubId).orElseThrow(ResourceNotFoundException::new); HubShippingScanLog hubShippingScanLog = - HubShippingScanLog.createOutboundLog(hub, shippingId, nextHub, userId); + HubShippingScanLog.createOutboundLog(hub, shippingId, userId); hubShippingScanRepository.save(hubShippingScanLog); log.info("Success Save OutboundLog - HubShippingScanLog: {}", hubShippingScanLog); - return shippingService.outboundStatus(hubShippingScanLog); + // feign client + OutboundStatusResponseDto responseDto = shippingService.outboundStatus(hubShippingScanLog); + + // 받아온 정보로 nextHub 값 update + Hub nextHub = hubRepository.findById(responseDto.getNextHubId()).orElseThrow(ResourceNotFoundException::new); + hubShippingScanLog.updateNextHub(nextHub); + + return responseDto; } } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubShippingScanLog.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubShippingScanLog.java index eb0c7dd..7137270 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubShippingScanLog.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubShippingScanLog.java @@ -64,10 +64,13 @@ public static HubShippingScanLog createInboundLog(Hub hub, UUID shippingId, Long return new HubShippingScanLog(hub,shippingId, ShippingStatus.INBOUND, userId); } - public static HubShippingScanLog createOutboundLog(Hub hub, UUID shippingId, Hub nextHub, Long userId) { - return new HubShippingScanLog(hub, shippingId, ShippingStatus.OUTBOUND, nextHub, userId); + public static HubShippingScanLog createOutboundLog(Hub hub, UUID shippingId, Long userId) { + return new HubShippingScanLog(hub, shippingId, ShippingStatus.OUTBOUND, userId); } + public void updateNextHub(Hub nextHub) { + this.nextHub = nextHub; + } public enum ShippingStatus { INBOUND, OUTBOUND diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/ShippingFeignClient.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/ShippingFeignClient.java index e1b5e95..b61a6ae 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/ShippingFeignClient.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/ShippingFeignClient.java @@ -13,16 +13,15 @@ @FeignClient(name ="shipping-service", url="${shipping.service.url}") public interface ShippingFeignClient { - // 입고 처리 + // 입고 처리 내용 전달 @PostMapping("/api/v1/shippings/{shipping_id}/inbound") InboundStatusResponseDto inboundStatus( @PathVariable("shipping_id") UUID shippingId, @RequestBody InboundStatusRequestDto inboundStatusRequestDto); - // 출고 처리 + // 출고 처리 내용 전달 @PostMapping("/api/v1/shippings/{shipping_id}/outbound") OutboundStatusResponseDto outboundStatus( @PathVariable("shipping_id") UUID shippingId, @RequestBody OutboundStatusRequestDto outboundStatusRequestDto); - } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/InboundStatusResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/InboundStatusResponseDto.java index db40ca9..9c39c6c 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/InboundStatusResponseDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/InboundStatusResponseDto.java @@ -1,6 +1,6 @@ package com.sparta.hubservice.hub.infrastructure.feignclient.dto; -import com.sparta.hubservice.hub.domain.model.HubShippingScanLog; +import com.sparta.hubservice.hub.domain.model.HubShippingScanLog.ShippingStatus; import java.time.LocalDateTime; import java.util.UUID; import lombok.AllArgsConstructor; @@ -17,6 +17,7 @@ public class InboundStatusResponseDto { private String message; private UUID hubId; private UUID shippingId; + private ShippingStatus shippingStatus; private LocalDateTime timestamp; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/OutboundStatusResponseDto.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/OutboundStatusResponseDto.java index 9c8b2e1..ca36dbc 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/OutboundStatusResponseDto.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/dto/OutboundStatusResponseDto.java @@ -1,5 +1,6 @@ package com.sparta.hubservice.hub.infrastructure.feignclient.dto; +import com.sparta.hubservice.hub.domain.model.HubShippingScanLog.ShippingStatus; import java.time.LocalDateTime; import java.util.UUID; import lombok.AllArgsConstructor; @@ -16,6 +17,7 @@ public class OutboundStatusResponseDto { private String message; private UUID hubId; private UUID shippingId; + private ShippingStatus shippingStatus; private LocalDateTime timestamp; private UUID nextHubId; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java index 435b2e1..b8ec5ef 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java @@ -19,7 +19,7 @@ public class HubShippingScanController { private final HubShippingScanService hubShippingScanService; - // 입고 처리 + // 입고 처리 저장 @PostMapping("/{hub_id}/{shipping_id}/inbound-log") public ResponseEntity inboundStatus( @PathVariable("hub_id") UUID hubId, @@ -32,16 +32,15 @@ public ResponseEntity inboundStatus( return ResponseEntity.ok(responseDto); } - // 출고 처리 + // 출고 처리 저장 @PostMapping("/{hub_id}/{shipping_id}/outbound-log") public ResponseEntity outboundStatus( @PathVariable("hub_id") UUID hubId, @PathVariable("shipping_id") UUID shippingId, - @RequestParam("user_id") Long userId, - @RequestParam("next_hub_id") UUID nextHubId + @RequestParam("user_id") Long userId ){ OutboundStatusResponseDto responseDto = - hubShippingScanService.createOutbound(hubId, shippingId, nextHubId, userId); + hubShippingScanService.createOutbound(hubId, shippingId, userId); return ResponseEntity.ok(responseDto); } From bb59cb0bc5a2a48aa6bccaaf087bf119ebf48d2c Mon Sep 17 00:00:00 2001 From: jin2304 Date: Mon, 24 Mar 2025 01:29:52 +0900 Subject: [PATCH 270/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#168]:=20BaseEntity?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20@SQLRestriction=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Product 엔티티에 @SQLRestriction("is_deleted IS FALSE") 적용 - 논리적으로 삭제된 데이터는 자동으로 조회에서 제외되도록 설정 - 쿼리 실행 시 Hibernate가 WHERE is_deleted IS FALSE 조건을 자동 추가함 - ex) SELECT * FROM product WHERE is_deleted IS FALSE --- .../main/java/com/sparta/commonmodule/entity/BaseEntity.java | 2 +- .../src/main/java/com/sparta/product/domain/model/Product.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java b/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java index 0f1d8c2..7cdb4b0 100644 --- a/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java +++ b/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java @@ -43,7 +43,7 @@ public class BaseEntity { @Column(name = "is_deleted") @ColumnDefault("FALSE") - private Boolean isDeleted; + private Boolean isDeleted = false; @Column(name = "deleted_at", nullable = true) diff --git a/product-service/src/main/java/com/sparta/product/domain/model/Product.java b/product-service/src/main/java/com/sparta/product/domain/model/Product.java index b1eb777..dcacb2b 100644 --- a/product-service/src/main/java/com/sparta/product/domain/model/Product.java +++ b/product-service/src/main/java/com/sparta/product/domain/model/Product.java @@ -7,6 +7,7 @@ import com.sparta.product.presentation.dto.response.CreateProductResponseDto; import jakarta.persistence.*; import lombok.*; +import org.hibernate.annotations.SQLRestriction; import java.math.BigDecimal; import java.util.UUID; @@ -18,6 +19,7 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PRIVATE) @Builder(access = AccessLevel.PRIVATE) +@SQLRestriction("is_deleted IS FALSE") public class Product extends BaseEntity { @Id From f27ba6d24442c1e4d80a89cb7ebf0bad4e73d346 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 01:59:55 +0900 Subject: [PATCH 271/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20feign=20client?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20url=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub/infrastructure/feignclient/ShippingFeignClient.java | 6 +++--- hub-service/src/main/resources/application.yml | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/ShippingFeignClient.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/ShippingFeignClient.java index b61a6ae..c1104e4 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/ShippingFeignClient.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/ShippingFeignClient.java @@ -14,14 +14,14 @@ public interface ShippingFeignClient { // 입고 처리 내용 전달 - @PostMapping("/api/v1/shippings/{shipping_id}/inbound") + @PostMapping("/{shipping_id}/inbound") InboundStatusResponseDto inboundStatus( @PathVariable("shipping_id") UUID shippingId, @RequestBody InboundStatusRequestDto inboundStatusRequestDto); // 출고 처리 내용 전달 - @PostMapping("/api/v1/shippings/{shipping_id}/outbound") + @PostMapping("/{shipping_id}/outbound") OutboundStatusResponseDto outboundStatus( @PathVariable("shipping_id") UUID shippingId, @RequestBody OutboundStatusRequestDto outboundStatusRequestDto); -} +} \ No newline at end of file diff --git a/hub-service/src/main/resources/application.yml b/hub-service/src/main/resources/application.yml index b29a17c..dc88b9e 100644 --- a/hub-service/src/main/resources/application.yml +++ b/hub-service/src/main/resources/application.yml @@ -32,3 +32,6 @@ security: basic: enabled: false +shipping: + service: + url: http://localhost:8081/api/v1/shippings From 282fa11253f4275de40697f44c950ced9250e782 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 02:00:24 +0900 Subject: [PATCH 272/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20=EC=A4=84?= =?UTF-8?q?=EB=B0=94=EA=BF=88=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub_route/application/service/HubRouteService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java index a9f3cf7..2085947 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java @@ -139,5 +139,4 @@ public HubRouteDetailsResponseDto getPathHubRoute(UUID fromHubId, UUID toHubId) return new HubRouteDetailsResponseDto(route, checkpoints); } - -} +} \ No newline at end of file From 82af3c7233f49799ed1e3f96f6be76274fcd98b0 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 02:00:41 +0900 Subject: [PATCH 273/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20=EC=9E=98?= =?UTF-8?q?=EB=AA=BB=EB=90=9C=20=EC=BB=AC=EB=9F=BC=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sparta/hubservice/hub/domain/model/HubShippingScanLog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubShippingScanLog.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubShippingScanLog.java index 7137270..826d201 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubShippingScanLog.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/HubShippingScanLog.java @@ -25,7 +25,7 @@ public class HubShippingScanLog extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.UUID) @Column(name = "hub_shipping_scan_log_id") - private Long hubShippingScanLogId; + private UUID hubShippingScanLogId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name ="hub_id", nullable = false) From d5c286253a9fb9887e531952301a6c2dbdf8c1c7 Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Mon, 24 Mar 2025 02:40:50 +0900 Subject: [PATCH 274/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#169]=20:search=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shipping-service/build.gradle | 18 ++++++++++----- .../service/ShippingManagerService.java | 4 ++-- .../dto/request/CreateRouteLogRequestDto.java | 2 -- .../dto/response/ShippingResponseDto.java | 3 +++ .../response/ShippingRouteResponseDto.java | 3 ++- .../application/service/ShippingService.java | 22 +++++++++++++++++- .../domain/model/Shipping.java | 22 ------------------ .../domain/model/ShippingRouteLog.java | 4 ++-- .../domain/model/trans/RouteLogSelf.java | 3 +-- .../infrastructure/config/QueryDslConfig.java | 23 +++++++++++++++++++ .../JpaShippingRepository.java | 2 +- .../JpaShippingRouteRepository.java | 2 +- .../presentation/ShippingController.java | 9 ++++++++ 13 files changed, 77 insertions(+), 40 deletions(-) create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/config/QueryDslConfig.java rename shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/{ => repository}/JpaShippingRepository.java (85%) rename shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/{ => repository}/JpaShippingRouteRepository.java (86%) diff --git a/shipping-service/build.gradle b/shipping-service/build.gradle index d8ee975..a975afc 100644 --- a/shipping-service/build.gradle +++ b/shipping-service/build.gradle @@ -2,18 +2,24 @@ ext { set('springCloudVersion', "2024.0.0") } dependencies { - implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' - implementation 'org.springframework.boot:spring-boot-starter-validation' - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' - implementation 'org.hibernate:hibernate-core:6.3.1.Final' + + implementation "com.querydsl:querydsl-jpa:5.1.0:jakarta" + annotationProcessor "com.querydsl:querydsl-apt:5.1.0:jakarta" + annotationProcessor "jakarta.persistence:jakarta.persistence-api:3.1.0" + annotationProcessor "jakarta.annotation:jakarta.annotation-api:2.1.1" implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' + implementation 'org.hibernate:hibernate-core:6.3.1.Final' + implementation "org.postgresql:postgresql:42.7.2" implementation project(':common-module') - implementation("org.postgresql:postgresql:42.7.2") runtimeOnly 'com.h2database:h2' } + + dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java b/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java index ecac4d5..be4813b 100644 --- a/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java @@ -35,14 +35,14 @@ public ShippingManager assign() { return manager; } - + @Transactional public ShippingManagerResponseDto create(ShippingManagerCreateRequestDto request,Long userId){ ShippingManager shippingManager = request.of().toShippingManager(userId); repository.save(shippingManager); return ShippingManagerResponseDto.from(shippingManager); } - + @Transactional(readOnly = true) public ShippingManagerResponseDto getById(UUID managerId){ ShippingManager manager = repository.findById(managerId).orElseThrow(() -> new ResourceNotFoundException("해당 ID의 배송자는 존재하지 않습니다.")); return ShippingManagerResponseDto.from(manager); diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateRouteLogRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateRouteLogRequestDto.java index 2e3aa1d..fa25a34 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateRouteLogRequestDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateRouteLogRequestDto.java @@ -20,7 +20,6 @@ public record CreateRouteLogRequestDto( UUID endHubId, @NotNull(message = "배송 순번은 필수입니다.") - @Min(value = 1, message = "배송 순번은 1 이상이어야 합니다.") Integer sequence, @@ -40,7 +39,6 @@ public record CreateRouteLogRequestDto( ) { public RouteLogSelf of() { return new RouteLogSelf( - this.shipping(), this.startHubId(), this.endHubId(), this.sequence(), diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingResponseDto.java index 34cdfc5..a0a6e5f 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingResponseDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingResponseDto.java @@ -1,10 +1,13 @@ package com.sparta.shippingservice.application.dto.response; +import com.fasterxml.jackson.annotation.JsonInclude; import com.sparta.shippingservice.domain.model.Shipping; import com.sparta.shippingservice.domain.model.ShippingStatus; import java.util.UUID; + +@JsonInclude(JsonInclude.Include.NON_NULL) public record ShippingResponseDto( UUID shippingId, String shippingAddress, diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingRouteResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingRouteResponseDto.java index cf4dba2..cb5aee0 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingRouteResponseDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingRouteResponseDto.java @@ -14,7 +14,8 @@ public record ShippingRouteResponseDto( Integer estimatedTime, BigDecimal actualDistance, Integer actualTime, - UUID shippingManagerId) { + UUID shippingManagerId +) { public static ShippingRouteResponseDto from(ShippingRouteLog shippingRouteLog) { return new ShippingRouteResponseDto( shippingRouteLog.getId(), diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java index 11ad6c2..2c76f80 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -5,9 +5,11 @@ import com.sparta.shippingservice.application.dto.client.ShippingManagerResponseDto; import com.sparta.shippingservice.application.dto.request.CreateRouteLogRequestDto; import com.sparta.shippingservice.application.dto.request.CreateShippingRequestDto; +import com.sparta.shippingservice.application.dto.request.ShippingSearchCondition; import com.sparta.shippingservice.application.dto.request.UpdateShippingRequestDto; import com.sparta.shippingservice.application.dto.response.ShippingResponseDto; import com.sparta.shippingservice.application.dto.response.ShippingRouteResponseDto; +import com.sparta.shippingservice.application.dto.response.ShippingSearchResult; import com.sparta.shippingservice.application.dto.response.ShippingWithRouteResponseDto; import com.sparta.shippingservice.domain.model.*; import com.sparta.shippingservice.domain.model.trans.RouteLogSelf; @@ -16,8 +18,12 @@ import com.sparta.shippingservice.domain.repository.ShippingRouteRepository; import com.sparta.shippingservice.infrastructure.client.ShippingManagerClient; +import com.sparta.shippingservice.infrastructure.repository.ShippingSearchRepository; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -33,9 +39,13 @@ public class ShippingService { private final ShippingRepository shippingRepository; private final ShippingRouteRepository shippingRouteRepository; private final ShippingManagerClient shippingManagerClient; + private final ShippingSearchRepository searchRepository; //각 허브에 10명 / 업체에 10명 + + @Transactional public ShippingWithRouteResponseDto create(@Valid CreateShippingRequestDto request , @Valid CreateRouteLogRequestDto logDto,Long userId) { + ShippingManagerResponseDto manager = shippingManagerClient.assignManager(); if(manager.managerType() != ManagerType.CARRIER){ throw new InvalidParameterException("배송 담당자는 업체 소속이어야 합니다."); @@ -44,7 +54,6 @@ public ShippingWithRouteResponseDto create(@Valid CreateShippingRequestDto reque Shipping shipping = request.of(manager.id()).toShipping(userId); RouteLogSelf routeLogSelf = new RouteLogSelf( - shipping, logDto.startHubId(), logDto.endHubId(), logDto.sequence(), @@ -95,6 +104,7 @@ public ShippingResponseDto updateShipping(UUID shippingId, @Valid UpdateShipping } + @Transactional public ShippingResponseDto deleteShipping(UUID shippingId, long userId) { Shipping shipping = findShipping(shippingId); shipping.delete(userId); @@ -103,6 +113,15 @@ public ShippingResponseDto deleteShipping(UUID shippingId, long userId) { return ShippingResponseDto.from(shipping); } + public Page searchShipping(ShippingSearchCondition condition) { + ShippingSearchResult result = searchRepository.search(condition); + return new PageImpl<>( + result.getContent(), + PageRequest.of(result.getPage(), result.getPageSize()), + result.getTotalCount() + ); + } + @Transactional(readOnly = true) public ShippingRouteResponseDto getLogById(UUID shippingId, UUID shippingLogId){ ShippingRouteLog routeLog = shippingRouteRepository.findByIdAndShippingId(shippingLogId, shippingId) @@ -129,6 +148,7 @@ public List getLogAll(){ )).collect(Collectors.toList()); } + @Transactional public ShippingRouteResponseDto deleteShippingLog(UUID shippingId,UUID shippingLogId, long userId) { ShippingRouteLog routeLog = shippingRouteRepository.findByIdAndShippingId(shippingLogId, shippingId) .orElseThrow(() -> new ResourceNotFoundException("해당 배송에 속하지 않는 배송 경로 로그입니다.")); diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java index 8f16402..0a080fc 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java @@ -57,7 +57,6 @@ public Shipping updateShipping(Shipping shipping,Long userId) { if(shipping.getOrderId()!=null) this.orderId = shipping.getOrderId(); if(shipping.getShippingAddress()!=null) this.shippingAddress=shipping.getShippingAddress(); if(shipping.getReceiverName()!=null) this.receiverName = shipping.getReceiverName(); - if(shipping.getStatus()!=null) this.status=shipping.getStatus(); return this; } @@ -71,25 +70,4 @@ public void prePersist(){ } - - - - -// public void updateShippingAddress(String newAddress) { -// if (this.status == ShippingStatus.DELIVERED) { -// throw new IllegalStateException("배송이 완료된 후에는 주소를 변경할 수 없습니다."); -// } -// this.shippingAddress = newAddress; -// } -// -// public void updateReceiverName(String newReceiverName) { -// if (this.status == ShippingStatus.DELIVERED) { -// throw new IllegalStateException("배송이 완료된 후에는 수령인 정보를 변경할 수 없습니다."); -// } -// this.receiverName = newReceiverName; -// } -// -// public void markAsDelivered() { -// this.status = ShippingStatus.DELIVERED; -// } } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java index 56010cb..9328dec 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java @@ -47,8 +47,8 @@ public class ShippingRouteLog extends BaseEntity { @Column(name = "shipping_manager_id", nullable = false) private UUID shippingManagerId; - public ShippingRouteLog(Shipping shipping,UUID startHubId, UUID endHubId, Integer sequence, BigDecimal estimatedDistance, Integer estimatedTime, BigDecimal actualDistance, Integer actualTime, UUID shippingManagerId) { - this.shipping=shipping; + public ShippingRouteLog(UUID startHubId, UUID endHubId, Integer sequence, BigDecimal estimatedDistance, Integer estimatedTime, BigDecimal actualDistance, Integer actualTime, UUID shippingManagerId) { + this.startHubId = startHubId; this.endHubId = endHubId; this.sequence = sequence; diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/RouteLogSelf.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/RouteLogSelf.java index 2c678e5..31b34ce 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/RouteLogSelf.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/RouteLogSelf.java @@ -7,7 +7,7 @@ import java.util.UUID; public record RouteLogSelf( - Shipping shipping, + UUID startHubId, UUID endHubId, Integer sequence, @@ -19,7 +19,6 @@ public record RouteLogSelf( ) { public ShippingRouteLog toShippingRouteLog() { return new ShippingRouteLog( - this.shipping, this.startHubId, this.endHubId, this.sequence, diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/config/QueryDslConfig.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/config/QueryDslConfig.java new file mode 100644 index 0000000..e284274 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/config/QueryDslConfig.java @@ -0,0 +1,23 @@ +package com.sparta.shippingservice.infrastructure.config; + + +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@RequiredArgsConstructor +public class QueryDslConfig { + + // @PersistenceContext + private final EntityManager em; + + + @Bean + public JPAQueryFactory jpaQueryFactory() { + return new JPAQueryFactory(em); + } + +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/JpaShippingRepository.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/JpaShippingRepository.java similarity index 85% rename from shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/JpaShippingRepository.java rename to shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/JpaShippingRepository.java index 83abf90..dc4f88d 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/JpaShippingRepository.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/JpaShippingRepository.java @@ -1,4 +1,4 @@ -package com.sparta.shippingservice.infrastructure; +package com.sparta.shippingservice.infrastructure.repository; import com.sparta.shippingservice.domain.model.Shipping; import com.sparta.shippingservice.domain.repository.ShippingRepository; diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/JpaShippingRouteRepository.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/JpaShippingRouteRepository.java similarity index 86% rename from shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/JpaShippingRouteRepository.java rename to shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/JpaShippingRouteRepository.java index b5a0de7..c2a73bf 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/JpaShippingRouteRepository.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/JpaShippingRouteRepository.java @@ -1,4 +1,4 @@ -package com.sparta.shippingservice.infrastructure; +package com.sparta.shippingservice.infrastructure.repository; import com.sparta.shippingservice.domain.model.ShippingRouteLog; import com.sparta.shippingservice.domain.repository.ShippingRouteRepository; diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index 8634217..106ad1e 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -1,14 +1,17 @@ package com.sparta.shippingservice.presentation; import com.sparta.shippingservice.application.dto.request.CreateShippingWithRouteRequestDto; +import com.sparta.shippingservice.application.dto.request.ShippingSearchCondition; import com.sparta.shippingservice.application.dto.request.UpdateShippingRequestDto; import com.sparta.shippingservice.application.dto.response.ShippingResponseDto; import com.sparta.shippingservice.application.dto.response.ShippingRouteResponseDto; import com.sparta.shippingservice.application.dto.response.ShippingWithRouteResponseDto; import com.sparta.shippingservice.application.service.ShippingService; +import com.sparta.shippingservice.domain.model.Shipping; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -48,6 +51,12 @@ public ResponseEntity updateShipping(@PathVariable("shippin return ResponseEntity.ok(ResponseDto); } + @GetMapping("/search") + public ResponseEntity> searchShippings(@ModelAttribute ShippingSearchCondition condition) { + Page result = shippingService.searchShipping(condition); + return ResponseEntity.ok(result); + } + @DeleteMapping("/{shippingId}") public ResponseEntity deleteShipping(@PathVariable("shippingId") UUID id, @RequestHeader("userId") long userId) { ShippingResponseDto responseDto = shippingService.deleteShipping(id, userId); From d99600260f331c690ef3b3bf008431dd348b818d Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Mon, 24 Mar 2025 02:41:24 +0900 Subject: [PATCH 275/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#169]=20:search=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/ShippingSearchCondition.java | 34 ++++++ .../dto/response/ShippingSearchResult.java | 20 ++++ .../repository/ShippingSearchRepository.java | 104 ++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/ShippingSearchCondition.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingSearchResult.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingSearchRepository.java diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/ShippingSearchCondition.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/ShippingSearchCondition.java new file mode 100644 index 0000000..d053991 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/ShippingSearchCondition.java @@ -0,0 +1,34 @@ +package com.sparta.shippingservice.application.dto.request; + +import com.sparta.shippingservice.domain.model.ShippingStatus; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.UUID; + + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ShippingSearchCondition { + private String shippingAddress; + private String receiverName; + private ShippingStatus status; + private String sortBy; // "createdAt", "modifiedAt" + private int pageSize; // 10, 30, 50만 허용 + private int page; // 0부터 시작 +} + + + + + + + + + + + diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingSearchResult.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingSearchResult.java new file mode 100644 index 0000000..b203a48 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingSearchResult.java @@ -0,0 +1,20 @@ +package com.sparta.shippingservice.application.dto.response; + +import com.sparta.shippingservice.domain.model.Shipping; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ShippingSearchResult { + private List content; + private int page; // 현재 페이지 번호 + private int pageSize; // 한 페이지에 몇 건 + private long totalCount; // 전체 개수 +} \ No newline at end of file diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingSearchRepository.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingSearchRepository.java new file mode 100644 index 0000000..85efb8b --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingSearchRepository.java @@ -0,0 +1,104 @@ +package com.sparta.shippingservice.infrastructure.repository; + +import com.querydsl.core.types.OrderSpecifier; +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.sparta.shippingservice.application.dto.request.ShippingSearchCondition; +import com.sparta.shippingservice.application.dto.response.ShippingSearchResult; +import com.sparta.shippingservice.domain.model.Shipping; +import com.sparta.shippingservice.domain.model.ShippingStatus; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import org.springframework.util.StringUtils; + +import java.util.List; + +import static com.sparta.shippingservice.domain.model.QShipping.shipping; + +@Repository +@RequiredArgsConstructor +public class ShippingSearchRepository { + private final JPAQueryFactory queryFactory; + + + public ShippingSearchResult search(ShippingSearchCondition condition) { + int validPageSize = switch (condition.getPageSize()) { + case 10, 30, 50 -> condition.getPageSize(); + default -> 10; + }; + int page = condition.getPage(); + List content = queryFactory + .selectFrom(shipping) + .where( + containsShippingAddress(condition.getShippingAddress()), + containsReceiverName(condition.getReceiverName()), + eqStatus(condition.getStatus()) + ) + .orderBy(resolveSort(condition.getSortBy())) + .offset((long) page * validPageSize) + .limit(validPageSize) + .fetch(); + Long total = queryFactory + .select(shipping.count()) + .from(shipping) + .where( + containsShippingAddress(condition.getShippingAddress()), + containsReceiverName(condition.getReceiverName()), + eqStatus(condition.getStatus()) + ) + .fetchOne(); + return ShippingSearchResult.builder() + .content(content) + .page(page) + .pageSize(validPageSize) + .totalCount(total) + .build(); + } + + + + private BooleanExpression containsShippingAddress(String address) { + return StringUtils.hasText(address) ? shipping.shippingAddress.containsIgnoreCase(address) : null; + } + private BooleanExpression containsReceiverName(String name) { + return StringUtils.hasText(name) ? shipping.receiverName.eq(name) : null; + } + + private BooleanExpression eqStatus(ShippingStatus status) { + return status != null ? shipping.status.eq(status) : null; + } + private OrderSpecifier resolveSort(String sortBy) { + if ("modifiedAt".equalsIgnoreCase(sortBy)) { + return shipping.updatedAt.desc(); + } + return shipping.createdAt.desc(); // default + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + From bf1a09bcc82429ef746918554524091e88262b21 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 02:55:20 +0900 Subject: [PATCH 276/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20BaseEntity=20?= =?UTF-8?q?=EC=97=90=EC=84=9C=20@~Date=20=EA=B4=80=EB=A0=A8=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=9E=91=EB=8F=99?= =?UTF-8?q?=ED=95=A0=20=EC=88=98=20=EC=9E=88=EA=B2=8C=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20-=20JpaAuditingConfig=20=ED=8C=8C=EC=9D=BC=EC=9D=84=20?= =?UTF-8?q?=ED=86=B5=ED=95=B4=20=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EC=85=98=20=ED=99=9C=EC=84=B1=ED=99=94=20-=20AuditorAwareImpl.?= =?UTF-8?q?java=20=ED=8C=8C=EC=9D=BC=EC=9D=80=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=20=20=E3=84=B4=20=EB=AA=A8=EB=93=A0=20?= =?UTF-8?q?=EB=AA=A8=EB=93=88=20=EC=8B=9C=ED=81=90=EB=A6=AC=ED=8B=B0=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9=EC=8B=9C=EC=97=90=EB=A7=8C=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=20=EA=B0=80=EB=8A=A5=20(=ED=98=84=EC=9E=AC=EB=8A=94?= =?UTF-8?q?=20=EC=A3=BC=EC=84=9D=20=ED=92=80=EB=A9=B4=20=EC=97=90=EB=9F=AC?= =?UTF-8?q?)=20=20=20=E3=84=B4=20=EC=82=AC=EC=9A=A9=EC=8B=9C=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=9E=90,=20update=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=ED=95=84=EC=9A=94=EC=97=86=EC=9D=B4=20=EC=9E=90=EB=8F=99?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20~by=20=EA=B0=92=20=EC=A3=BC=EC=9E=85=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commonmodule/config/AuditorAwareImpl.java | 33 +++++++++++++++++++ .../config/JpaAuditingConfig.java | 10 ++++++ .../commonmodule/entity/BaseEntity.java | 7 ++-- 3 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 common-module/src/main/java/com/sparta/commonmodule/config/AuditorAwareImpl.java create mode 100644 common-module/src/main/java/com/sparta/commonmodule/config/JpaAuditingConfig.java diff --git a/common-module/src/main/java/com/sparta/commonmodule/config/AuditorAwareImpl.java b/common-module/src/main/java/com/sparta/commonmodule/config/AuditorAwareImpl.java new file mode 100644 index 0000000..e35e4f9 --- /dev/null +++ b/common-module/src/main/java/com/sparta/commonmodule/config/AuditorAwareImpl.java @@ -0,0 +1,33 @@ +//package com.sparta.commonmodule.config; +// +//import java.util.Optional; +//import org.springframework.data.domain.AuditorAware; +//import org.springframework.security.core.Authentication; +//import org.springframework.security.core.context.SecurityContextHolder; +// + +// 각 모듈에 시큐리티 적용 후 적용 예정 + +//public class AuditorAwareImpl implements AuditorAware { +// +// @Override +// public Optional getCurrentAuditor() { +// Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); +// if (authentication == null || !authentication.isAuthenticated()) { +// return Optional.empty(); +// } +// Object principal = authentication.getPrincipal(); +// +// if (principal instanceof String idStr) { +// try { +// return Optional.of(Long.parseLong(idStr)); +// } catch (NumberFormatException e) { +// return Optional.empty(); +// } +// } else if (principal instanceof Long idLong) { +// return Optional.of(idLong); +// } +// +// return Optional.empty(); +// } +//} diff --git a/common-module/src/main/java/com/sparta/commonmodule/config/JpaAuditingConfig.java b/common-module/src/main/java/com/sparta/commonmodule/config/JpaAuditingConfig.java new file mode 100644 index 0000000..c908bcc --- /dev/null +++ b/common-module/src/main/java/com/sparta/commonmodule/config/JpaAuditingConfig.java @@ -0,0 +1,10 @@ +package com.sparta.commonmodule.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +@Configuration +@EnableJpaAuditing(auditorAwareRef = "auditorAwareImpl") +public class JpaAuditingConfig { + +} diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java b/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java index 0f1d8c2..8eef6ac 100644 --- a/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java +++ b/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java @@ -2,11 +2,8 @@ import jakarta.persistence.Column; import jakarta.persistence.EntityListeners; -import jakarta.persistence.JoinColumn; import jakarta.persistence.MappedSuperclass; - import java.time.LocalDateTime; - import lombok.Data; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -33,11 +30,11 @@ public class BaseEntity { private Long createdBy; @LastModifiedDate - @Column(name = "updated_at", nullable = true) + @Column(name = "updated_at") private LocalDateTime updatedAt; @LastModifiedBy - @Column(name = "updated_by", nullable = true) + @Column(name = "updated_by") private Long updatedBy; From de1a33bae63e1bb6825eb809498245f8707d301a Mon Sep 17 00:00:00 2001 From: jin2304 Date: Mon, 24 Mar 2025 02:57:47 +0900 Subject: [PATCH 277/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#139]?= =?UTF-8?q?=20:=20=EC=83=81=ED=92=88=20=EC=83=9D=EC=84=B1/=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20api=20=EB=B0=8F=20HTTP=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/presentation/ProductController.java | 5 +++-- product-service/src/test/http/product.http | 11 ++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java index 97ae668..cb78bdf 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java +++ b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java @@ -1,5 +1,6 @@ package com.sparta.product.presentation; +import com.sparta.commonmodule.aop.RoleCheck; import com.sparta.product.application.dto.DeleteProductServiceRequestDto; import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.application.service.ProductServiceImpl; @@ -35,7 +36,7 @@ public class ProductController { @Operation(summary = "Product 등록", description = "Product 생성 api 입니다.") @PostMapping public ResponseEntity createProduct(@RequestBody CreateProductRequestDto requestDto, - @RequestHeader(value = "X-User-Id", required = true) Long userId) { + @RequestHeader(value = "user_id", required = true) Long userId) { return ResponseEntity.ok(productServiceImpl.createProduct(requestDto, userId)); } @@ -75,7 +76,7 @@ public ResponseEntity updateProduct(@PathVariable UUID */ @DeleteMapping("/{productId}") public ResponseEntity deleteProduct(@PathVariable UUID productId, - @RequestHeader(value = "X-User-Id", required = true) Long userId) { + @RequestHeader(value = "user_id", required = true) Long userId) { productServiceImpl.deleteProduct( DeleteProductServiceRequestDto.of(userId, productId)); return ResponseEntity.noContent().build(); diff --git a/product-service/src/test/http/product.http b/product-service/src/test/http/product.http index 65fbd4b..77a1f01 100644 --- a/product-service/src/test/http/product.http +++ b/product-service/src/test/http/product.http @@ -1,7 +1,7 @@ ### 상품 생성 -POST http://localhost:8083/api/v1/products +POST http://localhost:8080/api/v1/products Content-Type: application/json -X-User-Id: 12345 # 사용자 ID (Long 타입) +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMyIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2cyMzA0IiwiaXNzIjoidXNlci1zZXJ2aWNlIiwiaWF0IjoxNzQyNzUyMzc0LCJleHAiOjE3NDI3NTU5NzR9.66__SMvFE-Ig1EHxPTKCgSW8TZVsfoLcuvqYfc4Orb2S7YOYYvL7fUm0b-He6y3jhN6GHbenHEB6Ndcycbhx0A { "name": "마른오징어3", @@ -15,7 +15,8 @@ X-User-Id: 12345 # 사용자 ID (Long 타입) ### 상품 단일 조회 -GET http://localhost:8083/api/v1/products/a8fe0567-e857-4427-a612-555328391a36 +GET http://localhost:8080/api/v1/products/46264445-3961-4e20-bb06-e009f9f9d62e +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMyIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2cyMzA0IiwiaXNzIjoidXNlci1zZXJ2aWNlIiwiaWF0IjoxNzQyNzQ1Mzg1LCJleHAiOjE3NDI3NDg5ODV9.asqBMEXnv_y044peyuX4peGHdcZXCqyrkWFyu8oEHGC_FoJjLjdpr-mYkjdeEbEYJdUkfhpBs8NWzaLPGq6mLw Content-Type: application/json @@ -37,8 +38,8 @@ Content-Type: application/json ### 상품 삭제 -DELETE http://localhost:8083/api/v1/products/225dc81a-7b96-4905-83b9-16945fef9a7d -X-User-Id: 12345 # 사용자 ID (Long 타입) +DELETE http://localhost:8080/api/v1/products/64597bbf-a016-4343-8a5c-f39cf122a4be +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMyIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2cyMzA0IiwiaXNzIjoidXNlci1zZXJ2aWNlIiwiaWF0IjoxNzQyNzUyNTM0LCJleHAiOjE3NDI3NTYxMzR9.DHkrq9nWvvvSJkCbnOyqQo85FuNBhA2kA6lCYpsWG-F4mDLxHZJ73goCDGUcywNMtDdpmW0Iv-cSV3fOg6BpWQ From 3bee02a4771f99151d921019fcc7247364dfc489 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Mon, 24 Mar 2025 02:58:48 +0900 Subject: [PATCH 278/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#139]?= =?UTF-8?q?=20:=20=EC=83=81=ED=92=88=20api=20=EA=B6=8C=ED=95=9C=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 --- .../com/sparta/product/presentation/ProductController.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java index cb78bdf..01a3877 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java +++ b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java @@ -34,6 +34,7 @@ public class ProductController { * 상품 생성 */ @Operation(summary = "Product 등록", description = "Product 생성 api 입니다.") + @RoleCheck("ROLE_MASTER, ROLE_HUB, ROLE_COMPANY") @PostMapping public ResponseEntity createProduct(@RequestBody CreateProductRequestDto requestDto, @RequestHeader(value = "user_id", required = true) Long userId) { @@ -45,6 +46,7 @@ public ResponseEntity createProduct(@RequestBody Creat * 상품 단일 조회 */ @Operation(summary = "Product 단일 조회", description = "Product 단일 조회 api 입니다.") + @RoleCheck("ROLE_MASTER, ROLE_HUB, ROLE_COMPANY, ROLE_SHIPPING") @GetMapping("/{productId}") public ResponseEntity readProduct(@PathVariable UUID productId) { return ResponseEntity.ok(productServiceImpl.readProduct(productId)); @@ -54,6 +56,7 @@ public ResponseEntity readProduct(@PathVariable UUID pro /** * 상품 목록 조회 */ + @RoleCheck("ROLE_MASTER, ROLE_HUB, ROLE_COMPANY, ROLE_SHIPPING") @GetMapping public ResponseEntity> readAllProduct() { return ResponseEntity.ok(productServiceImpl.readAllProduct()); @@ -64,6 +67,7 @@ public ResponseEntity> readAllProduct() { * 상품 수정 */ @PutMapping("/{productId}") + @RoleCheck("ROLE_MASTER, ROLE_HUB, ROLE_COMPANY") public ResponseEntity updateProduct(@PathVariable UUID productId, @RequestBody UpdateProductRequestDto requestDto) { return ResponseEntity.ok(productServiceImpl.updateProduct( @@ -75,6 +79,7 @@ public ResponseEntity updateProduct(@PathVariable UUID * 상품 삭제 */ @DeleteMapping("/{productId}") + @RoleCheck("ROLE_MASTER, ROLE_HUB") public ResponseEntity deleteProduct(@PathVariable UUID productId, @RequestHeader(value = "user_id", required = true) Long userId) { productServiceImpl.deleteProduct( @@ -87,6 +92,7 @@ public ResponseEntity deleteProduct(@PathVariable UUID productId, * 상품 검색 */ @GetMapping("/search") + @RoleCheck("ROLE_MASTER, ROLE_HUB, ROLE_COMPANY, ROLE_SHIPPING") public ResponseEntity> searchProducts(@ModelAttribute SearchProductRequestDto requestDto, Pageable pageable) { return ResponseEntity.ok(productServiceImpl.searchProducts(requestDto, pageable)); From 6943389c3db8542b8a6f6f47a9fe73c641b8cede Mon Sep 17 00:00:00 2001 From: jin2304 Date: Mon, 24 Mar 2025 03:14:19 +0900 Subject: [PATCH 279/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#139]?= =?UTF-8?q?=20:=20BaseEntity=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/sparta/commonmodule/entity/BaseEntity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java b/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java index 7cdb4b0..c9bc332 100644 --- a/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java +++ b/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java @@ -33,11 +33,11 @@ public class BaseEntity { private Long createdBy; @LastModifiedDate - @Column(name = "updated_at", nullable = true) + @Column(name = "updated_at") private LocalDateTime updatedAt; @LastModifiedBy - @Column(name = "updated_by", nullable = true) + @Column(name = "updated_by") private Long updatedBy; From e2117c731e848c9e6a7f08dab323d13e4be280b4 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 24 Mar 2025 11:04:22 +0900 Subject: [PATCH 280/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EB=B0=B0?= =?UTF-8?q?=EC=86=A1=20=EC=83=9D=EC=84=B1=20=EC=9A=94=EC=B2=AD=20DTO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/CreateShippingRequestDto.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/request/CreateShippingRequestDto.java diff --git a/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/request/CreateShippingRequestDto.java b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/request/CreateShippingRequestDto.java new file mode 100644 index 0000000..f0a76c4 --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/request/CreateShippingRequestDto.java @@ -0,0 +1,22 @@ +package com.sparta.orderservice.infrastructure.client.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +// 배송 생성 요청 DTO +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CreateShippingRequestDto { + + private UUID orderId; // 주문 ID + private UUID productId; // 상품 ID + private UUID supplierId; // 출발지 (공급업체 ID) + private UUID receiverId; // 도착지 (수령업체 ID) + private Integer quantity; // 수량 +} From 418d41a157987a2f0e6131a9841bb89830baf1a2 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 24 Mar 2025 11:04:30 +0900 Subject: [PATCH 281/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EB=B0=B0?= =?UTF-8?q?=EC=86=A1=20=EC=83=9D=EC=84=B1=20=EC=9D=91=EB=8B=B5=20DTO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/CreateShippingResponseDto.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/response/CreateShippingResponseDto.java diff --git a/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/response/CreateShippingResponseDto.java b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/response/CreateShippingResponseDto.java new file mode 100644 index 0000000..89ea6ed --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/response/CreateShippingResponseDto.java @@ -0,0 +1,20 @@ +package com.sparta.orderservice.infrastructure.client.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +//배송 생성 응답 DTO +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CreateShippingResponseDto { + + private UUID shippingId; // 생성된 배송 ID + private String status; // 배송 상태 (예: READY, SHIPPING 등) + private String message; // 성공/실패 메시지 +} From d02c7d28c56bb603bda480ba7f01a9149bf43666 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 24 Mar 2025 11:04:56 +0900 Subject: [PATCH 282/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EB=B0=B0?= =?UTF-8?q?=EC=86=A1=20=EC=83=9D=EC=84=B1=20FeignClient?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/OrderService.java | 22 ++++++++++++++++++- .../infrastructure/client/ShippingClient.java | 14 ++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 order-service/src/main/java/com/sparta/orderservice/infrastructure/client/ShippingClient.java diff --git a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java index 0d39e2d..88df036 100644 --- a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java +++ b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java @@ -9,6 +9,9 @@ import com.sparta.orderservice.domain.repository.OrderQueryDSLRepository; import com.sparta.orderservice.domain.repository.OrderRepository; import com.sparta.orderservice.infrastructure.client.ProductClient; +import com.sparta.orderservice.infrastructure.client.ShippingClient; +import com.sparta.orderservice.infrastructure.client.dto.request.CreateShippingRequestDto; +import com.sparta.orderservice.infrastructure.client.dto.response.CreateShippingResponseDto; import com.sparta.orderservice.infrastructure.client.dto.response.DecreaseProductQuantityResponseDto; import com.sparta.orderservice.infrastructure.client.dto.request.DecreaseProductQuantityServiceRequestDto; import lombok.RequiredArgsConstructor; @@ -29,6 +32,7 @@ public class OrderService { @Qualifier("orderQueryDSLRepositoryImpl") private final OrderQueryDSLRepository orderQueryDSLRepository; private final ProductClient productClient; + private final ShippingClient shippingClient; // private final ProductClient productClient; @@ -68,9 +72,25 @@ public OrderResponseDto createOrder(OrderRequestDto requestDto) { .build(); order.setCreatedBy(0L); // createdBy 기본값 설정 (BaseEntity 상속으로 인해 필요) - orderRepository.save(order); + // 5. 배송 요청 DTO 생성 + CreateShippingRequestDto shippingRequest = CreateShippingRequestDto.builder() + .orderId(order.getOrderId()) + .productId(order.getProductId()) + .supplierId(order.getSupplierId()) + .receiverId(order.getReceiverId()) + .quantity(1) + .build(); + + // 6. FeignClient로 배송 요청 + CreateShippingResponseDto shippingResponse = shippingClient.createShipping(shippingRequest); + + // 7. 배송 실패 시 예외 + if (!"READY".equals(shippingResponse.getStatus())) { + throw new OperationNotAllowedException("배송 생성 실패로 주문 생성 중단"); + } + return new OrderResponseDto(order); } diff --git a/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/ShippingClient.java b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/ShippingClient.java new file mode 100644 index 0000000..0771a58 --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/ShippingClient.java @@ -0,0 +1,14 @@ +package com.sparta.orderservice.infrastructure.client; + +import com.sparta.orderservice.infrastructure.client.dto.request.CreateShippingRequestDto; +import com.sparta.orderservice.infrastructure.client.dto.response.CreateShippingResponseDto; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@FeignClient(name = "shipping-service", path = "/api/v1/shippings") +public interface ShippingClient { + + @PostMapping + CreateShippingResponseDto createShipping(@RequestBody CreateShippingRequestDto request); +} From 8b00422f3ff1fff8516a3adb1b5d94d978fea7d4 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 24 Mar 2025 11:05:31 +0900 Subject: [PATCH 283/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20:=20?= =?UTF-8?q?=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infrastructure/repository/JpaOrderRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/order-service/src/main/java/com/sparta/orderservice/infrastructure/repository/JpaOrderRepository.java b/order-service/src/main/java/com/sparta/orderservice/infrastructure/repository/JpaOrderRepository.java index 64d9015..df77e87 100644 --- a/order-service/src/main/java/com/sparta/orderservice/infrastructure/repository/JpaOrderRepository.java +++ b/order-service/src/main/java/com/sparta/orderservice/infrastructure/repository/JpaOrderRepository.java @@ -9,6 +9,6 @@ import java.util.UUID; @Repository -public interface JpaOrderRepository extends OrderRepository, JpaRepository, OrderQueryDSLRepository { +public interface JpaOrderRepository extends OrderRepository, JpaRepository{ } From f3613d3448f899661538547e0297e0da9213428f Mon Sep 17 00:00:00 2001 From: devdaeun Date: Mon, 24 Mar 2025 11:52:16 +0900 Subject: [PATCH 284/389] =?UTF-8?q?=F0=9F=8D=BB=20test=20[#163]=20:=20Slac?= =?UTF-8?q?k=20test=EC=B6=94=EA=B0=80=20-=20=ED=86=B5=ED=95=A9=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/SlackResponseDto.java | 2 + .../presentation/SlackControllerTest.java | 95 +++++++++++++++++++ .../user/presentation/UserControllerTest.java | 2 - 3 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 slack-service/src/test/java/com/sparta/slackservice/presentation/SlackControllerTest.java diff --git a/slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackResponseDto.java b/slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackResponseDto.java index 129be78..af5d801 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackResponseDto.java +++ b/slack-service/src/main/java/com/sparta/slackservice/application/dto/SlackResponseDto.java @@ -11,6 +11,7 @@ @AllArgsConstructor public class SlackResponseDto { private UUID slackId; + private Long receiverId; private String slackName; private String message; private LocalDateTime sendedAt; @@ -20,6 +21,7 @@ public class SlackResponseDto { public SlackResponseDto(Slack slack) { this.slackId = slack.getId(); this.slackName = slack.getSlackName(); + this.receiverId = slack.getReceiverId(); this.message = slack.getMessage(); this.sendedAt = slack.getSendedAt(); this.sendingStatus = slack.isSendingStatus(); diff --git a/slack-service/src/test/java/com/sparta/slackservice/presentation/SlackControllerTest.java b/slack-service/src/test/java/com/sparta/slackservice/presentation/SlackControllerTest.java new file mode 100644 index 0000000..45644d8 --- /dev/null +++ b/slack-service/src/test/java/com/sparta/slackservice/presentation/SlackControllerTest.java @@ -0,0 +1,95 @@ +package com.sparta.slackservice.presentation; + +import com.sparta.slackservice.application.service.SlackService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@SpringBootTest +@AutoConfigureMockMvc +class SlackControllerTest { + @Autowired + private MockMvc mockMvc; + + @Autowired + private SlackService slackService; + + @Test + void createSlack() throws Exception{ + mockMvc.perform(post("/api/v1/slacks/create") + .contentType(MediaType.APPLICATION_JSON) + .content("{" + + "\"message\":\"안녕하세요!\"," + + "\"receiverId\":3" + + "}") + .header("user_id", 2) + .header("slack_name","sampleName") + ) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.slackName").value("sampleName")) + .andExpect(jsonPath("$.message").value("안녕하세요!")) + .andExpect(jsonPath("$.receiverId").value(3)); + } + + @Test + void sendSlack() throws Exception { + mockMvc.perform(get("/api/v1/slacks/send/{id}", "3dce1425-958c-4c07-bbbb-785a2c9e81d4") + ).andExpect(status().isOk()) + .andExpect(content().string("전송성공")); + } + + @Test + void getSlack() throws Exception{ + mockMvc.perform(get("/api/v1/slacks/{id}", "4acbaa09-473f-4737-a107-5b085a0dbb23") + ).andExpect(status().isOk()) + .andExpect(jsonPath("$.slackName").value("sampleName")) + .andExpect(jsonPath("$.message").value("안녕하세요!")) + .andExpect(jsonPath("$.receiverId").value(3)); + + } + + @Test + void searchSlack() throws Exception { + mockMvc.perform(get("/api/v1/slacks/search") + .contentType(MediaType.APPLICATION_JSON) + .content("{" + + "\"receiverId\":3"+ + "}") + ).andExpect(status().isOk()) + .andExpect(jsonPath("$.slackName").value("sampleName")) + .andExpect(jsonPath("$.message").value("안녕하세요!")) + .andExpect(jsonPath("$.receiverId").value(3)); + } + + @Test + void modifySlack() throws Exception { + mockMvc.perform(put("/api/v1/slacks/modify/{id}", "4acbaa09-473f-4737-a107-5b085a0dbb23") + .contentType(MediaType.APPLICATION_JSON) + .content("{" + + "\"message\":\"감사합니다!\"," + + "\"receiverId\":3" + + "}") + .header("user_id", 2) + .header("slack_name","sampleName") + ) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.slackName").value("sampleName")) + .andExpect(jsonPath("$.message").value("감사합니다!")) + .andExpect(jsonPath("$.receiverId").value(3)); + } + + @Test + void deleteSlack() throws Exception { + mockMvc.perform(delete("/api/v1/slacks/{id}", "4acbaa09-473f-4737-a107-5b085a0dbb23") + .contentType(MediaType.APPLICATION_JSON) + .header("user_id", 2) + ).andExpect(status().isNoContent()); + } +} \ No newline at end of file diff --git a/user-service/src/test/java/com/sparta/user/presentation/UserControllerTest.java b/user-service/src/test/java/com/sparta/user/presentation/UserControllerTest.java index 0c97544..9277198 100644 --- a/user-service/src/test/java/com/sparta/user/presentation/UserControllerTest.java +++ b/user-service/src/test/java/com/sparta/user/presentation/UserControllerTest.java @@ -21,8 +21,6 @@ class UserControllerTest { @Autowired private UserService userService; - private String jwtToken; - @Test void signUp() throws Exception { mockMvc.perform(post("/api/v1/users/sign-up") From 980fbea9fc39f8f1855ed9ae4807c352307dd2b9 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 12:39:51 +0900 Subject: [PATCH 285/389] =?UTF-8?q?=E2=9C=A8=20feat:=20hub=20create=20api?= =?UTF-8?q?=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/test/resources/http/create-hub.http | 154 ++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 hub-service/src/test/resources/http/create-hub.http diff --git a/hub-service/src/test/resources/http/create-hub.http b/hub-service/src/test/resources/http/create-hub.http new file mode 100644 index 0000000..6611e24 --- /dev/null +++ b/hub-service/src/test/resources/http/create-hub.http @@ -0,0 +1,154 @@ +### 👩🏻‍💻 Hub 테이블 더미데이터에 필요한 코드 + +### - 서울특별시 센터 : 서울특별시 송파구 송파대로 55 +POST http://localhost:8082/api/v1/hubs?userId=123 +Content-Type: application/json + +{ + "name": "서울특별시 센터", + "address": "서울특별시 송파구 송파대로 55" +} + +### - 경기 북부 센터 : 경기도 고양시 덕양구 권율대로 570 +POST http://localhost:8082/api/v1/hubs?userId=123 +Content-Type: application/json + +{ + "name": "경기 북부 센터", + "address": "경기도 고양시 덕양구 권율대로 570" +} + +### - 경기 남부 센터 : 경기도 이천시 덕평로 257-21 +POST http://localhost:8082/api/v1/hubs?userId=123 +Content-Type: application/json + +{ + "name": "경기 남부 센터", + "address": "경기도 이천시 덕평로 257-21" +} + +### - 부산광역시 센터 : 부산 동구 중앙대로 206 +POST http://localhost:8082/api/v1/hubs?userId=123 +Content-Type: application/json + +{ + "name": "부산광역시 센터", + "address": "부산 동구 중앙대로 206" +} + +### - 대구광역시 센터 : 대구 북구 태평로 161 +POST http://localhost:8082/api/v1/hubs?userId=123 +Content-Type: application/json + +{ + "name": "대구광역시 센터", + "address": "대구 북구 태평로 161" +} + +### - 인천광역시 센터 : 인천 남동구 정각로 29 +POST http://localhost:8082/api/v1/hubs?userId=123 +Content-Type: application/json + +{ + "name": "인천광역시 센터", + "address": "인천 남동구 정각로 29" +} + +### - 광주광역시 센터 : 광주 서구 내방로 111 +POST http://localhost:8082/api/v1/hubs?userId=123 +Content-Type: application/json + +{ + "name": "광주광역시 센터", + "address": "광주 서구 내방로 111" +} + +### - 대전광역시 센터 : 대전 서구 둔산로 100 +POST http://localhost:8082/api/v1/hubs?userId=123 +Content-Type: application/json + +{ + "name": "대전광역시 센터", + "address": "대전 서구 둔산로 100" +} + +### - 울산광역시 센터 : 울산 남구 중앙로 201 +POST http://localhost:8082/api/v1/hubs?userId=123 +Content-Type: application/json + +{ + "name": "울산광역시 센터", + "address": "울산 남구 중앙로 201" +} + +### - 세종특별자치시 센터 : 세종특별자치시 한누리대로 2130 +POST http://localhost:8082/api/v1/hubs?userId=123 +Content-Type: application/json + +{ + "name": "세종특별자치시 센터", + "address": "세종특별자치시 한누리대로 2130" +} + +### - 강원특별자치도 센터 : 강원특별자치도 춘천시 중앙로 1 +POST http://localhost:8082/api/v1/hubs?userId=123 +Content-Type: application/json + +{ + "name": "강원특별자치도 센터", + "address": "강원특별자치도 춘천시 중앙로 1" +} + +### - 충청북도 센터 : 충북 청주시 상당구 상당로 82 +POST http://localhost:8082/api/v1/hubs?userId=123 +Content-Type: application/json + +{ + "name": "충청북도 센터", + "address": "충북 청주시 상당구 상당로 82" +} + +### - 충청남도 센터 : 충남 홍성군 홍북읍 충남대로 21 +POST http://localhost:8082/api/v1/hubs?userId=123 +Content-Type: application/json + +{ + "name": "충청남도 센터", + "address": "충남 홍성군 홍북읍 충남대로 21" +} + +### - 전북특별자치도 센터 : 전북특별자치도 전주시 완산구 효자로 225 +POST http://localhost:8082/api/v1/hubs?userId=123 +Content-Type: application/json + +{ + "name": "전북특별자치도 센터", + "address": "전북특별자치도 전주시 완산구 효자로 225" +} + +### - 전라남도 센터 : 전남 무안군 삼향읍 오룡길 1 +POST http://localhost:8082/api/v1/hubs?userId=123 +Content-Type: application/json + +{ + "name": "전라남도 센터", + "address": "전남 무안군 삼향읍 오룡길 1" +} + +### - 경상북도 센터 : 경북 안동시 풍천면 도청대로 455 +POST http://localhost:8082/api/v1/hubs?userId=123 +Content-Type: application/json + +{ + "name": "경상북도 센터", + "address": "경북 안동시 풍천면 도청대로 455" +} + +### - 경상남도 센터 : 경남 창원시 의창구 중앙대로 300 +POST http://localhost:8082/api/v1/hubs?userId=123 +Content-Type: application/json + +{ + "name": "경상남도 센터", + "address": "경남 창원시 의창구 중앙대로 300" +} \ No newline at end of file From c38762aeda43ff2cee4ee14334c0b42c11cb33f1 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 12:39:59 +0900 Subject: [PATCH 286/389] =?UTF-8?q?=E2=9C=A8=20feat:=20hub=20route=20creat?= =?UTF-8?q?e=20api=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/http/create-hub-routes.http | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 hub-service/src/test/resources/http/create-hub-routes.http diff --git a/hub-service/src/test/resources/http/create-hub-routes.http b/hub-service/src/test/resources/http/create-hub-routes.http new file mode 100644 index 0000000..6ad8841 --- /dev/null +++ b/hub-service/src/test/resources/http/create-hub-routes.http @@ -0,0 +1,88 @@ +### 👩🏻‍💻 Hub Route 테이블의 더미데이터에 필요한 코드 + +### + +### 경기 남부 센터 연결 (경기북부, 서울, 인천, 강원도, 경상북도, 대전, 대구) +POST http://localhost:8082/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/c1984014-c71d-4c55-a3b6-8568d7d1f897/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/eff77800-604d-441d-a736-63f1f7d25e51/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/f95653a0-edb1-4bb4-8d2e-814e4638639a/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/d6a865bd-b172-433c-b49f-dcd5ff9ee428/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/c27c2ba8-4011-4d68-991e-19315c19a192/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/c1f6e270-bc15-4816-bc25-a1b71070b751/direct?userId=123 + +### 경기 남부 센터 연결 역방향 +POST http://localhost:8082/api/v1/hub-routes/c1984014-c71d-4c55-a3b6-8568d7d1f897/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/eff77800-604d-441d-a736-63f1f7d25e51/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/f95653a0-edb1-4bb4-8d2e-814e4638639a/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/d6a865bd-b172-433c-b49f-dcd5ff9ee428/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/c27c2ba8-4011-4d68-991e-19315c19a192/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/c1f6e270-bc15-4816-bc25-a1b71070b751/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct?userId=123 + + + +### 대전 센터 연결 (충남, 충북, 세종, 전북, 광주, 전남, 경기남부, 대구) +POST http://localhost:8082/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/b252fddc-a4b1-420e-94c2-9a91bebee41a/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/031973c0-944d-4c53-803b-27ad45fbfb38/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/854d3f6d-c150-4471-a75c-06248c64daef/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/d073a70d-e200-4301-af35-4c1a87798427/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/9984a080-0ecb-45d6-a92f-0a67cfb63592/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/dfba0f7b-ce3b-4d11-aa8f-40ac398028f9/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/c1f6e270-bc15-4816-bc25-a1b71070b751/direct?userId=123 + +### 대전 센터 연결 역방향 +POST http://localhost:8082/api/v1/hub-routes/b252fddc-a4b1-420e-94c2-9a91bebee41a/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/031973c0-944d-4c53-803b-27ad45fbfb38/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/854d3f6d-c150-4471-a75c-06248c64daef/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/d073a70d-e200-4301-af35-4c1a87798427/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/9984a080-0ecb-45d6-a92f-0a67cfb63592/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/dfba0f7b-ce3b-4d11-aa8f-40ac398028f9/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/c1f6e270-bc15-4816-bc25-a1b71070b751/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct?userId=123 + + + +### 대구 센터 연결 (경북, 경남, 부산, 울산, 경기남부, 대전) +POST http://localhost:8082/api/v1/hub-routes/c1f6e270-bc15-4816-bc25-a1b71070b751/c27c2ba8-4011-4d68-991e-19315c19a192/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/c1f6e270-bc15-4816-bc25-a1b71070b751/d57d3022-46a7-4997-902f-0fc122cacd92/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/c1f6e270-bc15-4816-bc25-a1b71070b751/ac20c293-6951-4916-bd0f-d32f6b3b815b/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/c1f6e270-bc15-4816-bc25-a1b71070b751/d03faa5d-afdc-4ed0-b61c-aa7d1b97ba48/direct?userId=123 + + +### 대구 센터 연결 역방향 +POST http://localhost:8082/api/v1/hub-routes/c27c2ba8-4011-4d68-991e-19315c19a192/c1f6e270-bc15-4816-bc25-a1b71070b751/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/d57d3022-46a7-4997-902f-0fc122cacd92/c1f6e270-bc15-4816-bc25-a1b71070b751/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/ac20c293-6951-4916-bd0f-d32f6b3b815b/c1f6e270-bc15-4816-bc25-a1b71070b751/direct?userId=123 +### +POST http://localhost:8082/api/v1/hub-routes/d03faa5d-afdc-4ed0-b61c-aa7d1b97ba48/c1f6e270-bc15-4816-bc25-a1b71070b751/direct?userId=123 + +### 나머지는 위에서 중복되는 데이터임 \ No newline at end of file From fe6b4f7c5e7a966fb683e3ea69507935cc391865 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 12:40:08 +0900 Subject: [PATCH 287/389] =?UTF-8?q?=E2=9C=A8=20feat:=20hub=20route=20check?= =?UTF-8?q?point=20create=20api=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/resources/http/create-hub-route-checkpoints.http | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 hub-service/src/test/resources/http/create-hub-route-checkpoints.http diff --git a/hub-service/src/test/resources/http/create-hub-route-checkpoints.http b/hub-service/src/test/resources/http/create-hub-route-checkpoints.http new file mode 100644 index 0000000..057f4a0 --- /dev/null +++ b/hub-service/src/test/resources/http/create-hub-route-checkpoints.http @@ -0,0 +1,8 @@ +### 👩🏻‍💻 Hub Route Checkpoint 테이블 더미데이터에 필요한 코드 -> 중복 있는 상태 +### + +### 서울 -> 부산 +POST http://localhost:8082/api/v1/hub-routes/eff77800-604d-441d-a736-63f1f7d25e51/ac20c293-6951-4916-bd0f-d32f6b3b815b/path?userId=123 + +### 대전 -> 경상북도 +POST http://localhost:8082/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/c27c2ba8-4011-4d68-991e-19315c19a192/path?userId=123 From 3a78f80c8f79a302eed51685e5103011e50f8bf4 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 12:40:34 +0900 Subject: [PATCH 288/389] =?UTF-8?q?=E2=9C=A8=20feat:=20hub=20api=20total?= =?UTF-8?q?=20test=20code=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/resources/http/hub-service-test.http | 38 ------------------- .../test/resources/http/hub-total-test.http | 23 +++++++++++ 2 files changed, 23 insertions(+), 38 deletions(-) delete mode 100644 hub-service/src/test/resources/http/hub-service-test.http create mode 100644 hub-service/src/test/resources/http/hub-total-test.http diff --git a/hub-service/src/test/resources/http/hub-service-test.http b/hub-service/src/test/resources/http/hub-service-test.http deleted file mode 100644 index 7002b75..0000000 --- a/hub-service/src/test/resources/http/hub-service-test.http +++ /dev/null @@ -1,38 +0,0 @@ -### 🔹 허브 목록 조회 (페이징) -GET http://localhost:8082/api/v1/hubs?page=0&size=10 -Accept: application/json - -### - -### 🔹 특정 허브 조회 (GET, UUID 사용) -GET http://localhost:8082/api/v1/hubs/b2778763-7721-4bb2-a436-8104336c6a7d -Accept: application/json - -### - -### 🔹 허브 검색 -GET http://localhost:8082/api/v1/hubs/search?address=강남구 -Accept: application/json - -### - -### 🔹 허브 생성 (POST) -POST http://localhost:8082/api/v1/hubs?userId=123 -Content-Type: application/json - -{ - "name": "test02", - "address": "서울시 강남구" -} - -### - -### 🔹 허브 업데이트 (PUT, UUID 사용) -PUT http://localhost:8082/api/v1/hubs/4eafa45b-3a1f-484c-8294-b6924025b86f?userId=123456789&address=서울시 강남구 -Accept: application/json - -### - -### 🔹 허브 삭제 (DELETE, UUID 사용) -DELETE http://localhost:8082/api/v1/hubs/b2778763-7721-4bb2-a436-8104336c6a7d?userId=123 -Accept: application/json diff --git a/hub-service/src/test/resources/http/hub-total-test.http b/hub-service/src/test/resources/http/hub-total-test.http new file mode 100644 index 0000000..ff01742 --- /dev/null +++ b/hub-service/src/test/resources/http/hub-total-test.http @@ -0,0 +1,23 @@ + +### 🔹 허브 목록 조회 (페이징) +GET http://localhost:8082/api/v1/hubs +Accept: application/json + +### 🔹 특정 허브 조회 (GET, UUID 사용) +GET http://localhost:8082/api/v1/hubs/b252fddc-a4b1-420e-94c2-9a91bebee41a +Accept: application/json + +### 🔹 허브 생성 (POST) -> ✨ create-hub.http 에서 테스트 및 더미데이터 생성 + +### 🔹 허브 검색 (해당 단어 포함하는 모든 주소, 이름 검색 가능) +GET http://localhost:8082/api/v1/hubs/search?address=서울특별시 송파구 +Accept: application/json + +### 🔹 허브 업데이트 (PUT, UUID 사용) +PUT http://localhost:8082/api/v1/hubs/b252fddc-a4b1-420e-94c2-9a91bebee41a?userId=123&address=충남 홍성군 홍북읍 충남대로 21 +Accept: application/json + + +### 🔹 허브 삭제 (DELETE, UUID 사용) +DELETE http://localhost:8082/api/v1/hubs/984feadc-b1db-43c5-81bc-a24ec5001ddc?userId=123 +Accept: application/json From 6d143ddddd1c94e8f54de637187c9b5c1c4cc464 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 12:40:42 +0900 Subject: [PATCH 289/389] =?UTF-8?q?=E2=9C=A8=20feat:=20hub=20route=20api?= =?UTF-8?q?=20total=20test=20code=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http/hub-route-service-test.http | 39 ------------------- .../resources/http/hub-route-total-test.http | 30 ++++++++++++++ 2 files changed, 30 insertions(+), 39 deletions(-) delete mode 100644 hub-service/src/test/resources/http/hub-route-service-test.http create mode 100644 hub-service/src/test/resources/http/hub-route-total-test.http diff --git a/hub-service/src/test/resources/http/hub-route-service-test.http b/hub-service/src/test/resources/http/hub-route-service-test.http deleted file mode 100644 index a272cf9..0000000 --- a/hub-service/src/test/resources/http/hub-route-service-test.http +++ /dev/null @@ -1,39 +0,0 @@ -### 🔹 전체 허브 경로 목록 조회 (페이징) -GET http://localhost:8082/api/v1/hub-routes?page=0&size=10 -Accept: application/json - -### - -### 🔹 특정 경로 ID 조회 -GET http://localhost:8082/api/v1/hub-routes/b2778763-7721-4bb2-a436-8104336c6a7d -Accept: application/json - -### - -### 🔹 특정 허브 간 다이렉트 경로 조회 -GET http://localhost:8082/api/v1/hub-routes/11111111-1111-1111-1111-111111111111/22222222-2222-2222-2222-222222222222/direct -Accept: application/json - -### - -### 🔹 허브 간 다이렉트 경로 생성 -POST http://localhost:8082/api/v1/hub-routes/11111111-1111-1111-1111-111111111111/22222222-2222-2222-2222-222222222222/direct?userId=123 -Accept: application/json - -### - -### 🔹 허브 간 경로 삭제 -DELETE http://localhost:8082/api/v1/hub-routes/b2778763-7721-4bb2-a436-8104336c6a7d?userId=123 -Accept: application/json - -### - -### 🔹 허브 간 최단 경로 생성 (Path 기반) -POST http://localhost:8082/api/v1/hub-routes/11111111-1111-1111-1111-111111111111/22222222-2222-2222-2222-222222222222/path?userId=123 -Accept: application/json - -### - -### 🔹 허브 간 최단 경로 조회 (Path 기반) -GET http://localhost:8082/api/v1/hub-routes/11111111-1111-1111-1111-111111111111/22222222-2222-2222-2222-222222222222/path -Accept: application/json diff --git a/hub-service/src/test/resources/http/hub-route-total-test.http b/hub-service/src/test/resources/http/hub-route-total-test.http new file mode 100644 index 0000000..9635068 --- /dev/null +++ b/hub-service/src/test/resources/http/hub-route-total-test.http @@ -0,0 +1,30 @@ +### 🔹 전체 허브 경로 목록 조회 (페이징) +GET http://localhost:8082/api/v1/hub-routes +Accept: application/json + + +### 🔹 특정 경로 ID 조회 +GET http://localhost:8082/api/v1/hub-routes/898a53ef-21f4-4a8f-ae1d-5d9c4db9bdf5 +Accept: application/json + + +### 🔹 특정 허브 간 다이렉트 경로 조회 +GET http://localhost:8082/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/d073a70d-e200-4301-af35-4c1a87798427/direct +Accept: application/json + + +### 🔹 허브 간 다이렉트 경로 생성 -> ✨ create-hub-routes.http 에서 테스트 및 더미데이터 생성 + + +### 🔹 허브 간 경로 삭제 +DELETE http://localhost:8082/api/v1/hub-routes/898a53ef-21f4-4a8f-ae1d-5d9c4db9bdf5?userId=123 +Accept: application/json + + +### 🔹 허브 간 최단 경로 생성 (Path 기반) -> ✨create-hub-route-checkpoint.http 에서 테스트 및 더미데이터 생성 + + +### 🔹 허브 간 최단 경로 조회 (Path 기반) * +GET http://localhost:8082/api/v1/hub-routes/eff77800-604d-441d-a736-63f1f7d25e51/ac20c293-6951-4916-bd0f-d32f6b3b815b/path +Accept: application/json + From 6b0117711556568b6e3f097e7d4c41c8172367e0 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 12:41:34 +0900 Subject: [PATCH 290/389] =?UTF-8?q?=E2=9C=A8=20feat:=20hub=20route=20check?= =?UTF-8?q?point=20create=20=EA=B4=80=EB=A0=A8=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hubservice/hub/domain/model/Hub.java | 11 +++-- .../controller/HubController.java | 4 +- .../dijkstra/DijkstraPathFinder.java | 3 +- .../dijkstra/JGraphTPathFinder.java | 7 +++ .../application/dijkstra/PathCalculate.java | 45 ++++++++++++++++--- .../application/service/HubRouteService.java | 13 +++--- .../hub_route/domain/model/HubRoute.java | 10 +++-- .../HubRouteCheckpointRepository.java | 3 +- .../domain/repository/HubRouteRepository.java | 4 +- .../JPAHubRouteCheckpointRepository.java | 7 ++- .../persistence/JPAHubRouteRepository.java | 5 ++- .../HubRouteCheckpointRepositoryImpl.java | 7 ++- .../repository/HubRouteRepositoryImpl.java | 4 +- .../controller/HubRouteController.java | 2 +- 14 files changed, 93 insertions(+), 32 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/Hub.java b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/Hub.java index 8e1300a..3474230 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/Hub.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/domain/model/Hub.java @@ -1,9 +1,12 @@ package com.sparta.hubservice.hub.domain.model; +import static org.springframework.data.jpa.domain.AbstractPersistable_.id; + import com.sparta.commonmodule.entity.BaseEntity; import jakarta.persistence.*; import jakarta.validation.constraints.Digits; import java.math.BigDecimal; +import java.util.Objects; import java.util.UUID; import lombok.Builder; import lombok.Getter; @@ -52,14 +55,14 @@ public void updateHub(String address, BigDecimal latitude, BigDecimal longitude, @Override public boolean equals(Object o) { if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Hub hub = (Hub) o; - return hubId.equals(hub.hubId); + if (!(o instanceof Hub)) return false; + Hub other = (Hub) o; + return Objects.equals(this.hubId, other.hubId); // 또는 비즈니스 키 } @Override public int hashCode() { - return hubId.hashCode(); + return Objects.hash(hubId); // id 기반으로 } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java index aca6d1a..1ff6866 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java @@ -33,7 +33,7 @@ public class HubController { // 허브 목록 검색 @GetMapping public ResponseEntity> getHubs( - @PageableDefault(page = 0, size = 10, sort = "createdAt") Pageable pageable) { + @PageableDefault(page = 0, size = 30, sort = "createdAt") Pageable pageable) { Page responseDtos = hubService.getHubs(pageable); return ResponseEntity.ok(responseDtos); } @@ -50,7 +50,7 @@ public ResponseEntity getHubById(@PathVariable("hub_id") UUID hu public ResponseEntity> getSearchHubs( @RequestParam(required = false) String name, @RequestParam(required = false) String address, - @PageableDefault(page = 0, size = 10, sort = "createdAt") Pageable pageable){ + @PageableDefault(page = 0, size = 30, sort = "createdAt") Pageable pageable){ Page responseDto = hubService.getSearchHubs(name, address, pageable); return ResponseEntity.ok(responseDto); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/DijkstraPathFinder.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/DijkstraPathFinder.java index 4efc4b5..6a0c4d2 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/DijkstraPathFinder.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/DijkstraPathFinder.java @@ -59,7 +59,8 @@ public List getShortPath(Hub start, Hub end) { visited.add(currentHub); // 현재 허브에서 연결된 모든 허브 경로 가져오기 - List routes = graph.get(currentHub); + List routes = graph.getOrDefault(currentHub, List.of()); + for (HubRoute route : routes) { Hub nextHub = route.getToHub(); diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/JGraphTPathFinder.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/JGraphTPathFinder.java index 363502a..9253d9b 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/JGraphTPathFinder.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/JGraphTPathFinder.java @@ -39,6 +39,13 @@ public JGraphTPathFinder(Map> graphMap) { @Override public List getShortPath(Hub start, Hub end){ GraphPath path = new DijkstraShortestPath<>(graph).getPath(start, end); + + if (path == null) { + throw new IllegalArgumentException(String.format( + "허브 간 최단 경로가 존재하지 않습니다 : %s → %s", start.getName(), end.getName() + )); + } + return path.getVertexList(); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java index 99662a4..3761426 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java @@ -7,6 +7,8 @@ import com.sparta.hubservice.hub_route.domain.model.HubRoute; import com.sparta.hubservice.hub_route.domain.repository.HubRouteRepository; import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -27,16 +29,47 @@ public List getShortPath(Hub fromHub, Hub toHub) { // 그래프 정의 Map> graph = new HashMap<>(); List hubs = hubRepository.findAll(); - for(Hub hub : hubs){ + for (Hub hub : hubs) { List routes = hubRouteRepository.findByFromHub(hub) - .orElseThrow(ResourceNotFoundException::new); - graph.put(hub, routes); + .orElse(Collections.emptyList()); + + graph.putIfAbsent(hub, new ArrayList<>()); + graph.get(hub).addAll(routes); + + for (HubRoute route : routes) { + Hub to = route.getToHub(); + graph.putIfAbsent(to, new ArrayList<>()); + + HubRoute reversed = hubRouteRepository.findShortestRouteByFromAndTo(to, route.getFromHub()).orElse(null); + graph.get(to).add(reversed); + } + } + +/* + // 그래프 정의 + Map> graph = new HashMap<>(); + List hubs = hubRepository.findAll(); + for (Hub hub : hubs) { + List routes = hubRouteRepository.findByFromHub(hub) + .orElse(Collections.emptyList()); + + graph.putIfAbsent(hub, new ArrayList<>()); + graph.get(hub).addAll(routes); + + for (HubRoute route : routes) { + Hub to = route.getToHub(); + graph.putIfAbsent(to, new ArrayList<>()); // ★ 중요! + HubRoute reversed = new HubRoute(to, route.getFromHub(), userId); + graph.get(to).add(reversed); + } } + */ + // 직접 정의한 dijkstra를 이용한 체크포인트 리스트 생성 DijkstraPathFinder dijkstraPathFinder = new DijkstraPathFinder(graph); List sequencePathByDijkstra = dijkstraPathFinder.getShortPath(fromHub, toHub); - +/* // JGraphT 라이브러리를 사용한 체크포인트 리스트 생성 JGraphTPathFinder jgraphT = new JGraphTPathFinder(graph); List sequencePathByJGraphT = jgraphT.getShortPath(fromHub, toHub); @@ -48,6 +81,8 @@ public List getShortPath(Hub fromHub, Hub toHub) { log.info("done checking checkpoint path validity"); return sequencePathByJGraphT; +*/ + return sequencePathByDijkstra; } public PathValueDto getValue(List shortPath){ @@ -58,7 +93,7 @@ public PathValueDto getValue(List shortPath){ for(int i = 0; i < shortPath.size()-1; i++){ Hub h1 = shortPath.get(i); Hub h2 = shortPath.get(i+1); - HubRoute route = hubRouteRepository.findByFromHubAndToHub(h1, h2) + HubRoute route = hubRouteRepository.findShortestRouteByFromAndTo(h1, h2) .orElseThrow(ResourceNotFoundException::new); totalDistance = totalDistance.add(route.getDistance()); totalDuration += route.getDuration(); diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java index 2085947..712c8f0 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java @@ -99,15 +99,13 @@ public HubRouteDetailsResponseDto createPathHubRoute(UUID fromHubId, UUID toHubI PathValueDto vlaues = pathCalculate.getValue(shortPath); // 다이렉트는 이미 최단 경로 -> 이미 route 정보가 있다면 패스 - if(hubRouteRepository.findByFromHubAndToHub(fromHub, toHub).isPresent()){ - throw new EntityExistsException("Hub route already exists"); - } + //hubRouteRepository.findShortestRouteByFromAndTo(fromHub, toHub).orElseThrow(EntityExistsException::new); HubRoute route = new HubRoute(fromHub, toHub, vlaues.getTotalDuration(), vlaues.getTotalDistance(), userId); - route = hubRouteRepository.save(route); + hubRouteRepository.save(route); List checkpointList = new ArrayList<>(); - for(int i = 0; i < shortPath.size(); i++) { + for(int i = 1; i < shortPath.size()-1; i++) { HubRouteCheckpoint result = HubRouteCheckpoint.builder() .checkpointHub(shortPath.get(i)) .hubRoute(route) @@ -115,8 +113,9 @@ public HubRouteDetailsResponseDto createPathHubRoute(UUID fromHubId, UUID toHubI .sequence(i) .build(); checkpointList.add(result); + log.info("Creating checkpoint for hub route id " + route.getHubRouteId() + ", checkpoint : " + result); + checkpointRepository.save(result); } - checkpointRepository.saveAll(checkpointList); List checkpoints = checkpointList.stream().map(CheckpointResponseDto::new).toList(); @@ -130,7 +129,7 @@ public HubRouteDetailsResponseDto getPathHubRoute(UUID fromHubId, UUID toHubId) Hub fromHub = hubRepository.findById(fromHubId).orElseThrow(ResourceNotFoundException::new); Hub toHub = hubRepository.findById(toHubId).orElseThrow(ResourceNotFoundException::new); - HubRoute route = hubRouteRepository.findByFromHubAndToHub(fromHub, toHub) + HubRoute route = hubRouteRepository.findShortestRouteByFromAndTo(fromHub, toHub) .orElseThrow(ResourceNotFoundException::new); List checkpoints = diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRoute.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRoute.java index 446f8c8..2df3af0 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRoute.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/model/HubRoute.java @@ -14,6 +14,7 @@ import jakarta.persistence.Table; import jakarta.validation.constraints.Digits; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.UUID; import lombok.Getter; import lombok.NoArgsConstructor; @@ -41,7 +42,7 @@ public class HubRoute extends BaseEntity { private int duration; @Column(nullable = false) - @Digits(integer = 10, fraction = 2) + @Digits(integer = 8, fraction = 2) private BigDecimal distance; // 다이렉트로 가는 경로 생성시 @@ -59,15 +60,16 @@ public HubRoute(Hub fromHub, Hub toHub, int duration, BigDecimal distance, Long this.fromHub = fromHub; this.toHub = toHub; this.duration = duration; - this.distance = distance; + this.distance = distance.setScale(2, RoundingMode.HALF_UP); } // 거리 계산 (km) private BigDecimal calculateDistance() { - return BigDecimal.valueOf(HaversineCalculator.haversineDistance(fromHub, toHub)); + return BigDecimal.valueOf(HaversineCalculator.haversineDistance(fromHub, toHub)) + .setScale(2, RoundingMode.HALF_UP); } - // 시간 계산 (분) + // 시간 계산 (시) private int calculateDuration(){ double speed = 60.0; return (int) Math.round(this.distance.doubleValue() / speed); diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java index 65ee77b..be67d08 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteCheckpointRepository.java @@ -3,7 +3,6 @@ import com.sparta.hubservice.hub_route.domain.model.HubRoute; import com.sparta.hubservice.hub_route.domain.model.HubRouteCheckpoint; import java.util.List; -import java.util.UUID; public interface HubRouteCheckpointRepository { @@ -12,4 +11,6 @@ public interface HubRouteCheckpointRepository { void saveAll(List checkpointList); List findAllByHubRoute_OrderBySequenceAsc(HubRoute hubRoute); + + void save(HubRouteCheckpoint result); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java index 47cd530..2c1cb3c 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java @@ -2,11 +2,13 @@ import com.sparta.hubservice.hub.domain.model.Hub; import com.sparta.hubservice.hub_route.domain.model.HubRoute; +import feign.Param; import java.util.List; import java.util.Optional; import java.util.UUID; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.Query; public interface HubRouteRepository { @@ -22,5 +24,5 @@ public interface HubRouteRepository { Optional> findByFromHub(Hub hub); - Optional findByFromHubAndToHub(Hub fromHub, Hub toHub); + Optional findShortestRouteByFromAndTo(Hub fromHub, Hub toHub); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java index afca0ba..b906463 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java @@ -1,11 +1,13 @@ package com.sparta.hubservice.hub_route.infrastructure.persistence; +import com.sparta.hubservice.hub.domain.model.Hub; import com.sparta.hubservice.hub_route.domain.model.HubRoute; import com.sparta.hubservice.hub_route.domain.model.HubRouteCheckpoint; -import com.sparta.hubservice.hub_route.domain.repository.HubRouteCheckpointRepository; +import feign.Param; import java.util.List; -import java.util.UUID; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; @Repository @@ -14,4 +16,5 @@ public interface JPAHubRouteCheckpointRepository extends JpaRepository findAllByHubRoute(HubRoute hubRouteId); List findAllByHubRoute_OrderBySequenceAsc(HubRoute hubRoute); + } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteRepository.java index 91466f7..ef75e88 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteRepository.java @@ -3,12 +3,14 @@ import com.sparta.hubservice.hub.domain.model.Hub; import com.sparta.hubservice.hub_route.domain.model.HubRoute; import com.sparta.hubservice.hub_route.domain.repository.HubRouteRepository; +import feign.Param; import java.util.List; import java.util.Optional; import java.util.UUID; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; @Repository @@ -22,5 +24,6 @@ public interface JPAHubRouteRepository extends JpaRepository { Optional> findByFromHub(Hub hub); - Optional findByFromHubAndToHub(Hub fromHub, Hub toHub); + @Query("SELECT h FROM HubRoute h WHERE h.fromHub = :from AND h.toHub = :to AND h.isDeleted = false ORDER BY h.distance ASC LIMIT 1") + Optional findShortestRouteByFromAndTo(@Param("from") Hub from, @Param("to") Hub to); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteCheckpointRepositoryImpl.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteCheckpointRepositoryImpl.java index 334239e..2d85ed1 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteCheckpointRepositoryImpl.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteCheckpointRepositoryImpl.java @@ -5,7 +5,6 @@ import com.sparta.hubservice.hub_route.domain.repository.HubRouteCheckpointRepository; import com.sparta.hubservice.hub_route.infrastructure.persistence.JPAHubRouteCheckpointRepository; import java.util.List; -import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -29,4 +28,10 @@ public void saveAll(List checkpointList) { public List findAllByHubRoute_OrderBySequenceAsc(HubRoute hubRoute) { return jpaHubRouteCheckpointRepository.findAllByHubRoute_OrderBySequenceAsc(hubRoute); } + + @Override + public void save(HubRouteCheckpoint result) { + jpaHubRouteCheckpointRepository.save(result); + } + } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteRepositoryImpl.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteRepositoryImpl.java index 2276e92..caf2b23 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteRepositoryImpl.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/repository/HubRouteRepositoryImpl.java @@ -50,7 +50,7 @@ public Optional> findByFromHub(Hub hub) { } @Override - public Optional findByFromHubAndToHub(Hub fromHub, Hub toHub) { - return jpaHubRouteRepository.findByFromHubAndToHub(fromHub, toHub); + public Optional findShortestRouteByFromAndTo(Hub fromHub, Hub toHub) { + return jpaHubRouteRepository.findShortestRouteByFromAndTo(fromHub, toHub); } } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java index 382fb1f..aa58fbd 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java @@ -30,7 +30,7 @@ public class HubRouteController { // 전체 허브 간 경로 목록 조회 (direct) @GetMapping public ResponseEntity> getHubRoutes( - @PageableDefault(page = 0, size = 10, sort = "createdAt") Pageable pageable){ + @PageableDefault(page = 0, size = 30, sort = "createdAt") Pageable pageable){ Page responses = hubRouteService.getHubRoutes(pageable); return ResponseEntity.ok(responses); } From 36aa6aaed7444091a72e78f4a76ba5600fca962b Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 12:48:55 +0900 Subject: [PATCH 291/389] =?UTF-8?q?=F0=9F=A9=B9=20fix:=20=EC=95=88?= =?UTF-8?q?=EC=93=B0=EB=8A=94=20import=EB=AC=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub_route/application/service/HubRouteService.java | 1 - .../hub_route/domain/repository/HubRouteRepository.java | 2 -- .../persistence/JPAHubRouteCheckpointRepository.java | 4 ---- .../infrastructure/persistence/JPAHubRouteRepository.java | 1 - 4 files changed, 8 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java index 712c8f0..066b5f3 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/service/HubRouteService.java @@ -14,7 +14,6 @@ import com.sparta.hubservice.hub_route.domain.model.HubRouteCheckpoint; import com.sparta.hubservice.hub_route.domain.repository.HubRouteCheckpointRepository; import com.sparta.hubservice.hub_route.domain.repository.HubRouteRepository; -import jakarta.persistence.EntityExistsException; import java.util.ArrayList; import java.util.List; import java.util.Optional; diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java index 2c1cb3c..b2c2546 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/domain/repository/HubRouteRepository.java @@ -2,13 +2,11 @@ import com.sparta.hubservice.hub.domain.model.Hub; import com.sparta.hubservice.hub_route.domain.model.HubRoute; -import feign.Param; import java.util.List; import java.util.Optional; import java.util.UUID; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.Query; public interface HubRouteRepository { diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java index b906463..207ef06 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteCheckpointRepository.java @@ -1,13 +1,9 @@ package com.sparta.hubservice.hub_route.infrastructure.persistence; -import com.sparta.hubservice.hub.domain.model.Hub; import com.sparta.hubservice.hub_route.domain.model.HubRoute; import com.sparta.hubservice.hub_route.domain.model.HubRouteCheckpoint; -import feign.Param; import java.util.List; -import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; @Repository diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteRepository.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteRepository.java index ef75e88..d333359 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteRepository.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/infrastructure/persistence/JPAHubRouteRepository.java @@ -2,7 +2,6 @@ import com.sparta.hubservice.hub.domain.model.Hub; import com.sparta.hubservice.hub_route.domain.model.HubRoute; -import com.sparta.hubservice.hub_route.domain.repository.HubRouteRepository; import feign.Param; import java.util.List; import java.util.Optional; From bad390c336b03bcce968bc56f67501b4746e9398 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Mon, 24 Mar 2025 12:52:36 +0900 Subject: [PATCH 292/389] =?UTF-8?q?=F0=9F=8D=BB=20test=20[#163]=20:=20Slac?= =?UTF-8?q?k=20test=EC=B6=94=EA=B0=80=20-=20http=20client=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20-=20application=EC=97=90=20JpaAuditingConfig.class?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api-http/slack/slack-service.http | 51 +++++++++++++++++++ .../slackservice/SlackServiceApplication.java | 3 +- .../application/service/SlackService.java | 2 +- .../slackservice/domain/model/Slack.java | 6 +-- .../presentation/SlackController.java | 7 ++- 5 files changed, 62 insertions(+), 7 deletions(-) create mode 100644 api-http/slack/slack-service.http diff --git a/api-http/slack/slack-service.http b/api-http/slack/slack-service.http new file mode 100644 index 0000000..e4cd8df --- /dev/null +++ b/api-http/slack/slack-service.http @@ -0,0 +1,51 @@ +POST http://localhost:8080/api/v1/users/sign-in +Content-Type: application/json + +{ + "username": "asdf123", + "password": "asdfgA12@" +} +> {% + client.global.set("access_token", response.headers.valueOf("Authorization")) +%} +### + +POST http://localhost:8080/api/v1/slacks/create +Content-Type: application/json +Authorization: {{access_token}} + +{ + "message":"반가워요!", + "receiverId":3 +} + +### + +GET http://localhost:8080/api/v1/slacks/b08bd42a-6b0e-497d-831f-a9f5b4fa63db +Authorization: {{access_token}} + +#### + +POST http://localhost:8080/api/v1/slacks/search +Content-Type: application/json +Authorization: {{access_token}} + +{ + "receiverId": 3 +} + +### + +PUT http://localhost:8080/api/v1/slacks/modify/b08bd42a-6b0e-497d-831f-a9f5b4fa63db +Content-Type: application/json +Authorization: {{access_token}} + +{ + "message": "변경메세지", + "receiverId": 1 +} + +### + +DELETE http://localhost:8080/api/v1/slacks/b08bd42a-6b0e-497d-831f-a9f5b4fa63db +Authorization: {{access_token}} \ No newline at end of file diff --git a/slack-service/src/main/java/com/sparta/slackservice/SlackServiceApplication.java b/slack-service/src/main/java/com/sparta/slackservice/SlackServiceApplication.java index a5f8d4d..403feec 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/SlackServiceApplication.java +++ b/slack-service/src/main/java/com/sparta/slackservice/SlackServiceApplication.java @@ -1,5 +1,6 @@ package com.sparta.slackservice; +import com.sparta.commonmodule.config.JpaAuditingConfig; import com.sparta.commonmodule.config.SwaggerConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -7,7 +8,7 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication(scanBasePackages = "com.sparta") -@Import(SwaggerConfig.class) +@Import({SwaggerConfig.class, JpaAuditingConfig.class}) public class SlackServiceApplication { public static void main(String[] args) { diff --git a/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java b/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java index f4f3438..df694de 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java +++ b/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java @@ -50,7 +50,7 @@ public Page searchSlack(SlackSearchRequestDto requestDto, Page //메세지 수정 public SlackResponseDto modifySlack(UUID slackId, SlackRequestDto requestDto, Long userId) { Slack slack = findingSlack(slackId); - slack.modifySlack(requestDto,userId); + slack.modifySlack(requestDto); return new SlackResponseDto(slack); } diff --git a/slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java b/slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java index de28748..6a9d338 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java +++ b/slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java @@ -38,8 +38,7 @@ public class Slack extends BaseEntity { private boolean sendingStatus = false; //기본 true? false? @Builder - public Slack(String slackName, String message, Long receiverId, Long userId) { - super(userId); + public Slack(String slackName, String message, Long receiverId) { this.slackName = slackName; this.message = message; this.receiverId = receiverId; @@ -50,8 +49,7 @@ public void changeStatus() { this.sendedAt = LocalDateTime.now(); } - public void modifySlack(SlackRequestDto requestDto, Long userId) { - super.update(userId); + public void modifySlack(SlackRequestDto requestDto) { Optional.ofNullable(requestDto.getMessage()).ifPresent(message -> this.message = message); Optional.ofNullable(requestDto.getReceiverId()).ifPresent(receiverId -> this.receiverId = receiverId); } diff --git a/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java b/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java index 550bc65..79dd72f 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java +++ b/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java @@ -1,5 +1,6 @@ package com.sparta.slackservice.presentation; +import com.sparta.commonmodule.aop.RoleCheck; import com.sparta.slackservice.application.dto.SlackRequestDto; import com.sparta.slackservice.application.dto.SlackResponseDto; import com.sparta.slackservice.application.dto.SlackSearchRequestDto; @@ -39,12 +40,14 @@ public ResponseEntity sendSlack(@PathVariable("id") UUID slackId) { return ResponseEntity.ok("전송성공"); } + @RoleCheck("ROLE_MASTER") @Operation(summary = "메세지 조회(단건)", description = "메세지 조회(단건) api입니다.") - @GetMapping("{id}") + @GetMapping("/{id}") public ResponseEntity getSlack(@PathVariable("id") UUID slackId) { return ResponseEntity.ok(slackService.getSlack(slackId)); } + @RoleCheck("ROLE_MASTER") @Operation(summary = "메세지 조회(전체)", description = "메세지 조회(전체) api입니다.") @PostMapping("/search") public ResponseEntity> searchSlack( @@ -54,12 +57,14 @@ public ResponseEntity> searchSlack( return ResponseEntity.ok(responseDto); } + @RoleCheck("ROLE_MASTER") @Operation(summary = "메세지 수정", description = "메세지 수정 api입니다.") @PutMapping("/modify/{id}") public ResponseEntity modifySlack(@RequestHeader("user_id") Long userId,@PathVariable("id") UUID slackId, @RequestBody SlackRequestDto requestDto) { return ResponseEntity.ok(slackService.modifySlack(slackId, requestDto, userId)); } + @RoleCheck("ROLE_MASTER") @Operation(summary = "메세지 삭제", description = "메세지 삭제 api입니다.") @DeleteMapping("/{id}") public ResponseEntity deleteSlack(@PathVariable("id") UUID slackId, @RequestHeader("user_id") Long userId) { From 7e2cf3b2a132e0d963ca4ce407409caf7ef61843 Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Mon, 24 Mar 2025 14:19:38 +0900 Subject: [PATCH 293/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#179]=20:search=20?= =?UTF-8?q?=EC=88=9C=ED=99=98=EC=B0=B8=EC=A1=B0=20=EC=A0=9C=EA=B1=B0=20?= =?UTF-8?q?=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/ShippingSearchCondition.java | 7 ++----- .../dto/response/ShippingResponseDto.java | 10 +++++----- .../dto/response/ShippingSearchResult.java | 7 ++----- .../application/service/ShippingService.java | 4 ++-- .../domain/repository/ShippingRepository.java | 1 + .../repository/ShippingSearchRepository.java | 17 +++++++++++++---- .../presentation/ShippingController.java | 10 +++++++--- 7 files changed, 32 insertions(+), 24 deletions(-) diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/ShippingSearchCondition.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/ShippingSearchCondition.java index d053991..891a13c 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/ShippingSearchCondition.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/ShippingSearchCondition.java @@ -1,14 +1,11 @@ package com.sparta.shippingservice.application.dto.request; import com.sparta.shippingservice.domain.model.ShippingStatus; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import java.util.UUID; - +@Setter @Getter @Builder @NoArgsConstructor diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingResponseDto.java index a0a6e5f..89f396d 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingResponseDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingResponseDto.java @@ -1,26 +1,26 @@ package com.sparta.shippingservice.application.dto.response; import com.fasterxml.jackson.annotation.JsonInclude; +import com.querydsl.core.annotations.QueryProjection; import com.sparta.shippingservice.domain.model.Shipping; import com.sparta.shippingservice.domain.model.ShippingStatus; import java.util.UUID; -@JsonInclude(JsonInclude.Include.NON_NULL) + + public record ShippingResponseDto( UUID shippingId, - String shippingAddress, String receiverName, - UUID shippingManagerId, + String shippingAddress, ShippingStatus status ){ public static ShippingResponseDto from (Shipping shipping) { return new ShippingResponseDto( shipping.getId(), - shipping.getShippingAddress(), shipping.getReceiverName(), - shipping.getShippingManagerId(), + shipping.getShippingAddress(), shipping.getStatus()); } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingSearchResult.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingSearchResult.java index b203a48..652ca87 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingSearchResult.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingSearchResult.java @@ -1,10 +1,7 @@ package com.sparta.shippingservice.application.dto.response; import com.sparta.shippingservice.domain.model.Shipping; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import java.util.List; @@ -13,7 +10,7 @@ @AllArgsConstructor @NoArgsConstructor public class ShippingSearchResult { - private List content; + private List content; private int page; // 현재 페이지 번호 private int pageSize; // 한 페이지에 몇 건 private long totalCount; // 전체 개수 diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java index 2c76f80..cbc2c41 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -18,6 +18,7 @@ import com.sparta.shippingservice.domain.repository.ShippingRouteRepository; import com.sparta.shippingservice.infrastructure.client.ShippingManagerClient; +//import com.sparta.shippingservice.infrastructure.repository.ShippingSearchRepository; import com.sparta.shippingservice.infrastructure.repository.ShippingSearchRepository; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -90,7 +91,6 @@ public List getAllShipping() { shipping.getId(), shipping.getShippingAddress(), shipping.getReceiverName(), - shipping.getShippingManagerId(), shipping.getStatus() )) .collect(Collectors.toList()); @@ -113,7 +113,7 @@ public ShippingResponseDto deleteShipping(UUID shippingId, long userId) { return ShippingResponseDto.from(shipping); } - public Page searchShipping(ShippingSearchCondition condition) { + public Page searchShipping(ShippingSearchCondition condition) { ShippingSearchResult result = searchRepository.search(condition); return new PageImpl<>( result.getContent(), diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRepository.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRepository.java index fdb7815..4aa5d35 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRepository.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRepository.java @@ -1,6 +1,7 @@ package com.sparta.shippingservice.domain.repository; +import com.sparta.shippingservice.application.dto.response.ShippingResponseDto; import com.sparta.shippingservice.domain.model.Shipping; import org.springframework.stereotype.Repository; diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingSearchRepository.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingSearchRepository.java index 85efb8b..006ccfc 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingSearchRepository.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingSearchRepository.java @@ -1,11 +1,12 @@ package com.sparta.shippingservice.infrastructure.repository; import com.querydsl.core.types.OrderSpecifier; +import com.querydsl.core.types.Projections; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import com.sparta.shippingservice.application.dto.request.ShippingSearchCondition; +import com.sparta.shippingservice.application.dto.response.ShippingResponseDto; import com.sparta.shippingservice.application.dto.response.ShippingSearchResult; -import com.sparta.shippingservice.domain.model.Shipping; import com.sparta.shippingservice.domain.model.ShippingStatus; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -15,6 +16,8 @@ import static com.sparta.shippingservice.domain.model.QShipping.shipping; + + @Repository @RequiredArgsConstructor public class ShippingSearchRepository { @@ -27,8 +30,14 @@ public ShippingSearchResult search(ShippingSearchCondition condition) { default -> 10; }; int page = condition.getPage(); - List content = queryFactory - .selectFrom(shipping) + List content = queryFactory + .select(Projections.constructor(ShippingResponseDto.class, + shipping.id, + shipping.receiverName, + shipping.shippingAddress, + shipping.status + )) + .from(shipping) .where( containsShippingAddress(condition.getShippingAddress()), containsReceiverName(condition.getReceiverName()), @@ -61,7 +70,7 @@ private BooleanExpression containsShippingAddress(String address) { return StringUtils.hasText(address) ? shipping.shippingAddress.containsIgnoreCase(address) : null; } private BooleanExpression containsReceiverName(String name) { - return StringUtils.hasText(name) ? shipping.receiverName.eq(name) : null; + return StringUtils.hasText(name) ? shipping.receiverName.containsIgnoreCase(name) : null; } private BooleanExpression eqStatus(ShippingStatus status) { diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index 106ad1e..a9f2b9d 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -9,15 +9,17 @@ import com.sparta.shippingservice.application.service.ShippingService; import com.sparta.shippingservice.domain.model.Shipping; +import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.UUID; - +@Slf4j @RestController @RequestMapping("/api/v1/shippings") @RequiredArgsConstructor @@ -52,8 +54,10 @@ public ResponseEntity updateShipping(@PathVariable("shippin } @GetMapping("/search") - public ResponseEntity> searchShippings(@ModelAttribute ShippingSearchCondition condition) { - Page result = shippingService.searchShipping(condition); + public ResponseEntity> searchShippings(@ModelAttribute ShippingSearchCondition condition, HttpServletRequest request) { + Page result = shippingService.searchShipping(condition); + log.info("receiverName raw param: {}", request.getParameter("receiverName")); + log.info("receiverName from DTO: {}", condition.getReceiverName()); return ResponseEntity.ok(result); } From 7ce76bbbd593f1af895339f9e2c68bc0a7b54521 Mon Sep 17 00:00:00 2001 From: jiyun Date: Mon, 24 Mar 2025 01:15:37 +0900 Subject: [PATCH 294/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20[#171]=20=EA=B2=8C?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8=EC=9B=A8=EC=9D=B4=20=EC=98=A4=ED=83=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gateway/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index a4deef0..bf88979 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -155,7 +155,7 @@ springdoc: url: /hub-service/v3/api-docs urls[3]: name: Company Service - url: /comp-service/v3/api-docs + url: /company-service/v3/api-docs urls[4]: name: Slack Service url: /slack-service/v3/api-docs From 7a698d486f2c05621695b0b48d543865d34358e8 Mon Sep 17 00:00:00 2001 From: jiyun Date: Mon, 24 Mar 2025 01:50:37 +0900 Subject: [PATCH 295/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20[#171]=20ROLE=20na?= =?UTF-8?q?me=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/controller/CompanyController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java index c61b937..89a3cad 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -35,7 +35,7 @@ public boolean existsById(@PathVariable UUID id) { // 생성 @Operation(summary = "Company 등록", description = "Company 생성 api 입니다.") - @RoleCheck("ROLE_MASTER, ROLE_HUB_MANAGER") + @RoleCheck("ROLE_MASTER, ROLE_HUB") @PostMapping public ResponseEntity createCompany(@Valid @RequestBody CompanyCreateRequest request, @RequestHeader("user_id") Long userId) { CompanyDto createdCompany = companyService.createCompany(request.toDto(), userId); @@ -66,7 +66,7 @@ public ResponseEntity getCompanyById(@PathVariable UUID company // 수정 @Operation(summary = "Company 수정", description = "Company 수정 api 입니다.") - @RoleCheck("ROLE_MASTER, ROLE_HUB_MANAGER, ROLE_COMPANY_MANAGER") + @RoleCheck("ROLE_MASTER, ROLE_HUB, ROLE_COMPANY") @PatchMapping("/{companyId}") public ResponseEntity updateCompany(@PathVariable UUID companyId, @Valid @RequestBody CompanyUpdateRequest request, @RequestHeader("user_id") Long userId) { CompanyDto updatedCompany = companyService.updateCompany(companyId, request.toDto(), userId); @@ -75,7 +75,7 @@ public ResponseEntity updateCompany(@PathVariable UUID companyI // 삭제 @Operation(summary = "Company 삭제", description = "Company 삭제 api 입니다.") - @RoleCheck("ROLE_MASTER, ROLE_HUB_MANAGER") + @RoleCheck("ROLE_MASTER, ROLE_HUB") @DeleteMapping("/{companyId}") public ResponseEntity deleteCompany(@PathVariable UUID companyId, @RequestHeader("user_id") Long userId) { CompanyDeleteResponse deletedCompany = companyService.deleteCompany(companyId, userId); From 1469613c59a9268bab8d93548cb3ea392b5c9105 Mon Sep 17 00:00:00 2001 From: jiyun Date: Mon, 24 Mar 2025 12:23:45 +0900 Subject: [PATCH 296/389] =?UTF-8?q?=F0=9F=8D=BB=20test=20[#171]=20test?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/CompanyServiceTest.java | 170 ++++++++++++++++++ .../domain/model/CompanyTest.java | 119 ++++++++++++ 2 files changed, 289 insertions(+) create mode 100644 company-service/src/test/java/com/sparta/companyservice/application/service/CompanyServiceTest.java create mode 100644 company-service/src/test/java/com/sparta/companyservice/domain/model/CompanyTest.java diff --git a/company-service/src/test/java/com/sparta/companyservice/application/service/CompanyServiceTest.java b/company-service/src/test/java/com/sparta/companyservice/application/service/CompanyServiceTest.java new file mode 100644 index 0000000..0ffdf7a --- /dev/null +++ b/company-service/src/test/java/com/sparta/companyservice/application/service/CompanyServiceTest.java @@ -0,0 +1,170 @@ +package com.sparta.companyservice.application.service; + +import com.sparta.companyservice.application.dto.CompanyCreateDto; +import com.sparta.companyservice.application.dto.CompanyDto; +import com.sparta.companyservice.application.dto.CompanyUpdateDto; +import com.sparta.companyservice.domain.model.Company; +import com.sparta.companyservice.domain.model.CompanyType; +import com.sparta.companyservice.domain.repository.CompanyRepository; +import com.sparta.companyservice.infrastructure.client.HubClient; +import com.sparta.companyservice.infrastructure.client.dto.HubClientDto; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import java.util.Optional; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class CompanyServiceTest { + + @Mock + private HubClient hubClient; + + @Mock + private CompanyRepository companyRepository; + + @InjectMocks + private CompanyService companyService; + + @Test + void 회사_생성_정상작동() { + // given + UUID hubId = UUID.randomUUID(); + long userId = 1L; + + CompanyCreateDto 요청 = new CompanyCreateDto( + "새로운회사", + CompanyType.PRODUCER, + hubId, + "서울시 강남구" + ); + + HubClientDto 가짜허브 = new HubClientDto(hubId, "서울허브", "서울시 중구"); + + Company 저장예정회사 = Company.create( + 요청.name(), + 요청.address(), + 요청.hubId(), + 요청.type(), + userId + ); + + when(hubClient.getHubById(hubId)).thenReturn(가짜허브); + when(companyRepository.save(any(Company.class))).thenReturn(저장예정회사); + + // when + CompanyDto 결과 = companyService.createCompany(요청, userId); + + // then + assertEquals("새로운회사", 결과.name()); + assertEquals(CompanyType.PRODUCER, 결과.type()); + assertEquals("서울시 강남구", 결과.address()); + assertEquals(hubId, 결과.hubId()); + assertEquals(userId, 결과.createdBy()); + + verify(hubClient, times(1)).getHubById(hubId); + verify(companyRepository, times(1)).save(any(Company.class)); + } + + @Test + void 허브가_없으면_예외처리() { + // given + UUID hubId = UUID.randomUUID(); + long userId = 1L; + + CompanyCreateDto 요청 = new CompanyCreateDto( + "없는허브회사", + CompanyType.RECEIVER, + hubId, + "대전 중구" + ); + + when(hubClient.getHubById(hubId)).thenThrow(new IllegalArgumentException("존재하지 않는 허브입니다.")); + + // when & then + IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> { + companyService.createCompany(요청, userId); + }); + + assertEquals("존재하지 않는 허브입니다.", ex.getMessage()); + verify(hubClient, times(1)).getHubById(hubId); + verify(companyRepository, never()).save(any()); + } + + @Test + void 회사_정보_수정_정상작동() { + // given + UUID companyId = UUID.randomUUID(); + UUID newHubId = UUID.randomUUID(); + long userId = 99L; + + Company 기존회사 = Company.create( + "기존이름", "기존주소", UUID.randomUUID(), CompanyType.PRODUCER, 1L + ); + + CompanyUpdateDto 수정요청 = new CompanyUpdateDto("수정된이름", newHubId, "수정된주소"); + + when(companyRepository.findByIdAndDeletedAtIsNull(companyId)).thenReturn(Optional.of(기존회사)); + when(hubClient.getHubById(newHubId)).thenReturn(new HubClientDto(newHubId, "부산허브", "부산시")); + + // when + CompanyDto 결과 = companyService.updateCompany(companyId, 수정요청, userId); + + // then + assertEquals("수정된이름", 결과.name()); + assertEquals("수정된주소", 결과.address()); + assertEquals(newHubId, 결과.hubId()); + + verify(companyRepository).save(any(Company.class)); + } + + @Test + void 회사_정보_일부수정_정상작동() { + // given + UUID companyId = UUID.randomUUID(); + UUID 기존HubId = UUID.randomUUID(); + long userId = 42L; + + Company 기존회사 = Company.create("오리지널", "강남구", 기존HubId, CompanyType.RECEIVER, 1L); + CompanyUpdateDto 수정요청 = new CompanyUpdateDto("수정된이름", null, null); // 일부만 수정 + + when(companyRepository.findByIdAndDeletedAtIsNull(companyId)).thenReturn(Optional.of(기존회사)); + + // when + CompanyDto 결과 = companyService.updateCompany(companyId, 수정요청, userId); + + // then + assertEquals("수정된이름", 결과.name()); + assertEquals("강남구", 결과.address()); // 그대로 유지 + assertEquals(기존HubId, 결과.hubId()); // 그대로 유지 + } + + @Test + void 회사_삭제_정상작동() { + // given + UUID companyId = UUID.randomUUID(); + long userId = 88L; + + Company 기존회사 = Company.create("삭제대상", "용산구", UUID.randomUUID(), CompanyType.RECEIVER, 2L); + + when(companyRepository.findByIdAndDeletedAtIsNull(companyId)).thenReturn(Optional.of(기존회사)); + + // when + companyService.deleteCompany(companyId, userId); + + // then + assertNotNull(기존회사.getDeletedAt()); + assertEquals(userId, 기존회사.getDeletedBy()); + + verify(companyRepository).save(any(Company.class)); + } + +} diff --git a/company-service/src/test/java/com/sparta/companyservice/domain/model/CompanyTest.java b/company-service/src/test/java/com/sparta/companyservice/domain/model/CompanyTest.java new file mode 100644 index 0000000..8d74368 --- /dev/null +++ b/company-service/src/test/java/com/sparta/companyservice/domain/model/CompanyTest.java @@ -0,0 +1,119 @@ +package com.sparta.companyservice.domain.model; + +import com.sparta.companyservice.application.dto.CompanyUpdateDto; +import org.junit.jupiter.api.Test; + +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; + +class CompanyTest { + + @Test + void 회사_정상_생성됨() { + // given + String name = "테스트회사"; + String address = "서울시 강남구"; + UUID hubId = UUID.randomUUID(); + CompanyType type = CompanyType.PRODUCER; + long userId = 1L; + + // when + Company company = Company.create(name, address, hubId, type, userId); + + // then + assertEquals(name, company.getName()); + assertEquals(address, company.getAddress()); + assertEquals(hubId, company.getHubId()); + assertEquals(type, company.getType()); + assertEquals(userId, company.getCreatedBy()); + } + + @Test + void 회사명_null_이면_예외발생() { + // given + String name = null; + String address = "서울시 중구"; + UUID hubId = UUID.randomUUID(); + CompanyType type = CompanyType.RECEIVER; + long userId = 1L; + + // when & then + IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> + Company.create(name, address, hubId, type, userId) + ); + assertTrue(ex.getMessage().contains("업체명")); + } + + @Test + void 회사정보_업데이트_정상작동() { + // given + Company company = Company.create( + "기존회사", + "기존주소", + UUID.randomUUID(), + CompanyType.RECEIVER, + 1L + ); + + String newName = "새로운회사"; + String newAddress = "새로운주소"; + UUID newHubId = UUID.randomUUID(); + long updatedBy = 2L; + + // when + company.update(newName, newAddress, newHubId, updatedBy); + + // then + assertEquals(newName, company.getName()); + assertEquals(newAddress, company.getAddress()); + assertEquals(newHubId, company.getHubId()); + assertEquals(updatedBy, company.getUpdatedBy()); + } + + @Test + void 회사정보_일부만_업데이트() { + // given + UUID hubId = UUID.randomUUID(); + Company company = Company.create( + "기존상호", + "기존주소", + hubId, + CompanyType.PRODUCER, + 1L + ); + + CompanyUpdateDto dto = new CompanyUpdateDto("바뀐상호", null, null); + long updatedBy = 3L; + + // when + company.applyUpdate(dto, updatedBy); + + // then + assertEquals("바뀐상호", company.getName()); + assertEquals("기존주소", company.getAddress()); + assertEquals(hubId, company.getHubId()); + assertEquals(updatedBy, company.getUpdatedBy()); + } + + @Test + void 회사정보_소프트삭제_정상작동() { + // given + Company company = Company.create( + "삭제할회사", + "삭제주소", + UUID.randomUUID(), + CompanyType.RECEIVER, + 1L + ); + + long deletedBy = 5L; + + // when + company.delete(deletedBy); + + // then + assertNotNull(company.getDeletedAt()); + assertEquals(deletedBy, company.getDeletedBy()); + } +} From 51991f41ab5e21c897af70b8c590d3fdd6ac9a52 Mon Sep 17 00:00:00 2001 From: jiyun Date: Mon, 24 Mar 2025 12:24:24 +0900 Subject: [PATCH 297/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20[#171]=20build.gra?= =?UTF-8?q?dle=EC=97=90=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- company-service/build.gradle | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/company-service/build.gradle b/company-service/build.gradle index 71f7544..91943fe 100644 --- a/company-service/build.gradle +++ b/company-service/build.gradle @@ -13,6 +13,7 @@ dependencies { implementation 'jakarta.validation:jakarta.validation-api:3.0.2' implementation 'org.hibernate.validator:hibernate-validator:8.0.0.Final' implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' + testImplementation 'org.springframework.boot:spring-boot-starter-test' // QueryDSL implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' @@ -47,4 +48,8 @@ sourceSets { // clean 시 Q파일 삭제 clean { delete file(querydslDir) -} \ No newline at end of file +} + +tasks.test { + useJUnitPlatform() +} From 76a8857e571b35ede82a0bc8b8f8410abf0dea28 Mon Sep 17 00:00:00 2001 From: jiyun Date: Mon, 24 Mar 2025 14:11:21 +0900 Subject: [PATCH 298/389] =?UTF-8?q?=F0=9F=8D=BB=20test=20[#171]=20http=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/CompanyService.java | 5 ++ .../companyservice/domain/model/Company.java | 1 + .../controller/CompanyController.java | 13 ++--- company-service/src/test/http/company.http | 53 +++++++++++++------ 4 files changed, 51 insertions(+), 21 deletions(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java index 532f020..aa73542 100644 --- a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java +++ b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java @@ -84,6 +84,11 @@ private void validateHubExists(UUID hubId) { } } +// public void validateHubExists(UUID hubId) { +// // http 테스트 시 이 메서드 사용 +// } + + private Company findCompany(UUID id) { return companyRepository.findByIdAndDeletedAtIsNull(id).orElseThrow(() -> new ResourceNotFoundException("해당 업체를 찾을 수 없습니다.")); } diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java index 5605c27..001aa76 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/model/Company.java @@ -8,6 +8,7 @@ import java.util.UUID; @Entity +@Table(name = "p_company") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Company extends BaseEntity { diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java index 89a3cad..8ac7319 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -46,9 +46,9 @@ public ResponseEntity createCompany(@Valid @RequestBody Company @Operation(summary = "Company 조회", description = "Company 조회 api 입니다.") @GetMapping public ResponseEntity> searchCompanies( - @RequestParam(required = false) String name, - @RequestParam(required = false) String address, - @RequestParam(required = false) CompanyType type, + @RequestParam(name = "name", required = false) String name, + @RequestParam(name = "address", required = false) String address, + @RequestParam(name = "type", required = false) CompanyType type, Pageable pageable ) { Page companies = companyService.searchCompanies(name, address, type, pageable); @@ -59,7 +59,8 @@ public ResponseEntity> searchCompanies( // 단일 조회 @Operation(summary = "Company 조회", description = "Company 단건 조회 api 입니다.") @GetMapping("/{companyId}") - public ResponseEntity getCompanyById(@PathVariable UUID companyId) { + public ResponseEntity getCompanyById(@PathVariable("companyId") UUID companyId + ) { CompanyDto oneCompany = companyService.getCompanyById(companyId); return ResponseEntity.ok(CompanyResponse.fromDto(oneCompany)); } @@ -68,7 +69,7 @@ public ResponseEntity getCompanyById(@PathVariable UUID company @Operation(summary = "Company 수정", description = "Company 수정 api 입니다.") @RoleCheck("ROLE_MASTER, ROLE_HUB, ROLE_COMPANY") @PatchMapping("/{companyId}") - public ResponseEntity updateCompany(@PathVariable UUID companyId, @Valid @RequestBody CompanyUpdateRequest request, @RequestHeader("user_id") Long userId) { + public ResponseEntity updateCompany(@PathVariable("companyId") UUID companyId, @Valid @RequestBody CompanyUpdateRequest request, @RequestHeader("user_id") Long userId) { CompanyDto updatedCompany = companyService.updateCompany(companyId, request.toDto(), userId); return ResponseEntity.ok(CompanyResponse.fromDto(updatedCompany)); } @@ -77,7 +78,7 @@ public ResponseEntity updateCompany(@PathVariable UUID companyI @Operation(summary = "Company 삭제", description = "Company 삭제 api 입니다.") @RoleCheck("ROLE_MASTER, ROLE_HUB") @DeleteMapping("/{companyId}") - public ResponseEntity deleteCompany(@PathVariable UUID companyId, @RequestHeader("user_id") Long userId) { + public ResponseEntity deleteCompany(@PathVariable("companyId") UUID companyId, @RequestHeader("user_id") Long userId) { CompanyDeleteResponse deletedCompany = companyService.deleteCompany(companyId, userId); return ResponseEntity.ok(deletedCompany); } diff --git a/company-service/src/test/http/company.http b/company-service/src/test/http/company.http index 030fce6..d0c0828 100644 --- a/company-service/src/test/http/company.http +++ b/company-service/src/test/http/company.http @@ -1,33 +1,56 @@ +### 업체 존재 여부 확인 +GET http://localhost:8085/api/v1/companies/550e8400-e29b-41d4-a716-446655440000/exists +Content-Type: application/json + +### + ### 업체 생성 -POST http://localhost:8082/api/v1/companies +POST http://localhost:8085/api/v1/companies Content-Type: application/json -X-User-Id: 12345 +user_id: 12345 +role: ROLE_MASTER { - "name": "오징어 가공식품 회사", - "address": "경기도 수원시", - "companyType": "PRODUCER", - "hubId": "123e4567-e89b-12d3-a456-426614174000" + "name": "원두 로스팅 업체", + "type": "PRODUCER", + "hubId": "123e4567-e89b-12d3-a456-426614174000", + "address": "경기도 과천시" } +### + ### 업체 단일 조회 -GET http://localhost:8082/api/v1/companies/550e8400-e29b-41d4-a716-446655440000 +GET http://localhost:8085/api/v1/companies/14613578-fd1b-4576-9d33-9601dc79c3ff Content-Type: application/json -### 업체 목록 조회 -GET http://localhost:8082/api/v1/companies -Content-Type: application/json✨ +### + +### 업체 목록 조회 (전체 조회) +GET http://localhost:8085/api/v1/companies?page=0&size=10 +Content-Type: application/json + +### + +### 업체 목록 조회 (검색 포함) +GET http://localhost:8085/api/v1/companies?name=스파르타 +Content-Type: application/json + +### ### 업체 수정 -PUT http://localhost:8082/api/v1/companies/550e8400-e29b-41d4-a716-446655440000 +PATCH http://localhost:8085/api/v1/companies/b3f77c99-ae2c-426a-835b-b9f2c23ed112 Content-Type: application/json -X-User-Id: 12345 +user_id: 12345 +role: ROLE_MASTER { - "name": "오징어 가공센터", + "name": "스파르타 가공식품", "address": "서울특별시 강남구" } +### + ### 업체 삭제 -DELETE http://localhost:8082/api/v1/companies/550e8400-e29b-41d4-a716-446655440000 -X-User-Id: 12345 +DELETE http://localhost:8085/api/v1/companies/767c333e-b7cc-4be7-a860-14adebbc962a +user_id: 12345 +role: ROLE_MASTER From e765bd73b0500bab3a22dfede82ffa5e4b6e859a Mon Sep 17 00:00:00 2001 From: devdaeun Date: Mon, 24 Mar 2025 14:38:43 +0900 Subject: [PATCH 299/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor[#182]=20:?= =?UTF-8?q?=20User-service=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20-=20ap?= =?UTF-8?q?plication=EC=97=90=20JpaAuditingConfig.class=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sparta/user/UserServiceApplication.java | 3 ++- .../dto/request/UserSignupRequestDto.java | 1 - .../user/application/service/UserService.java | 3 ++- .../java/com/sparta/user/domain/model/User.java | 13 +++++++------ 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/user-service/src/main/java/com/sparta/user/UserServiceApplication.java b/user-service/src/main/java/com/sparta/user/UserServiceApplication.java index 4b1578d..973fce6 100644 --- a/user-service/src/main/java/com/sparta/user/UserServiceApplication.java +++ b/user-service/src/main/java/com/sparta/user/UserServiceApplication.java @@ -1,12 +1,13 @@ package com.sparta.user; +import com.sparta.commonmodule.config.JpaAuditingConfig; import com.sparta.commonmodule.config.SwaggerConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Import; @SpringBootApplication(scanBasePackages = "com.sparta") -@Import(SwaggerConfig.class) +@Import({SwaggerConfig.class, JpaAuditingConfig.class}) public class UserServiceApplication { public static void main(String[] args) { diff --git a/user-service/src/main/java/com/sparta/user/application/dto/request/UserSignupRequestDto.java b/user-service/src/main/java/com/sparta/user/application/dto/request/UserSignupRequestDto.java index 27ef940..e34392b 100644 --- a/user-service/src/main/java/com/sparta/user/application/dto/request/UserSignupRequestDto.java +++ b/user-service/src/main/java/com/sparta/user/application/dto/request/UserSignupRequestDto.java @@ -45,6 +45,5 @@ public User createUser(String password, UserRoleEnum role){ } - } diff --git a/user-service/src/main/java/com/sparta/user/application/service/UserService.java b/user-service/src/main/java/com/sparta/user/application/service/UserService.java index 8e1ed1d..24cfde4 100644 --- a/user-service/src/main/java/com/sparta/user/application/service/UserService.java +++ b/user-service/src/main/java/com/sparta/user/application/service/UserService.java @@ -33,6 +33,7 @@ public Long signUp(UserSignupRequestDto requestDto) throws IllegalAccessExceptio validDuplicatedNames(requestDto); UserRoleEnum role = checkUserRole(requestDto.getTokenValue()); User user = requestDto.createUser(encryptPassword(requestDto.getPassword()), role); + user.setting(userRepository.save(user).getId()); return userRepository.save(user).getId(); } //로그인 @@ -56,7 +57,7 @@ public UserInfoResponseDto getUserInfo(Long userId) { public void updateUser(UserUpdateRequestDto requestDto, Long userId) { User user = findUserInfo(userId); UserRoleEnum userRole = checkUserRole(requestDto.getTokenValue()); - user.updateUser(encryptPassword(requestDto.getPassword()), requestDto, userRole.getAuthority(), userId); + user.updateUser(encryptPassword(requestDto.getPassword()), requestDto, userRole.getAuthority()); } //회원정보 삭제 public void deleteUser(Long userId) { diff --git a/user-service/src/main/java/com/sparta/user/domain/model/User.java b/user-service/src/main/java/com/sparta/user/domain/model/User.java index 56aa845..895728e 100644 --- a/user-service/src/main/java/com/sparta/user/domain/model/User.java +++ b/user-service/src/main/java/com/sparta/user/domain/model/User.java @@ -45,22 +45,19 @@ public User(String username, String password, String email, String slackName, St this.email = email; this.slackName = slackName; this.role = role; - setCreatedBy(getId()); - setCreatedAt(LocalDateTime.now()); } @Builder - public User(String username, String password, String email, String slackName) { + public User(String username, String password, String email, String slackName,Long userId) { this.username = username; this.password = password; this.email = email; this.slackName = slackName; + setCreatedBy(userId); } - public void updateUser(String encryptedpassword, UserUpdateRequestDto requestDto, String userRole, Long userId) { - super.update(userId); - setUpdatedAt(LocalDateTime.now()); + public void updateUser(String encryptedpassword, UserUpdateRequestDto requestDto, String userRole) { Optional.ofNullable(requestDto.getUsername()).ifPresent(username -> this.username = username); Optional.ofNullable(encryptedpassword).ifPresent(password -> this.password = encryptedpassword); Optional.ofNullable(requestDto.getEmail()).ifPresent(email -> this.email = email); @@ -68,4 +65,8 @@ public void updateUser(String encryptedpassword, UserUpdateRequestDto requestDto Optional.ofNullable(userRole).ifPresent(role -> this.role = userRole); } + public void setting(Long userId) { + setCreatedBy(userId); + setUpdatedBy(userId); + } } From 7461ea37e4286e14ffc09b18c869c05456fb231b Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 14:48:20 +0900 Subject: [PATCH 300/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20JGraphT=20?= =?UTF-8?q?=EC=A0=9C=EC=99=B8=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub_route/application/dijkstra/PathCalculate.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java index fd27f97..ee16429 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/application/dijkstra/PathCalculate.java @@ -49,6 +49,7 @@ public List getShortPath(Hub fromHub, Hub toHub) { DijkstraPathFinder dijkstraPathFinder = new DijkstraPathFinder(graph); List sequencePathByDijkstra = dijkstraPathFinder.getShortPath(fromHub, toHub); + /* // JGraphT 라이브러리를 사용한 체크포인트 리스트 생성 JGraphTPathFinder jgraphT = new JGraphTPathFinder(graph); List sequencePathByJGraphT = jgraphT.getShortPath(fromHub, toHub); @@ -56,6 +57,7 @@ public List getShortPath(Hub fromHub, Hub toHub) { if(sequencePathByDijkstra.equals(sequencePathByJGraphT)) { log.info("Checking checkpoint path validity : dijkstraPath same JGraphT"); } + */ return sequencePathByDijkstra; } From b850d93f37bfe4fec0b5f6f75722b9d37ef3f05e Mon Sep 17 00:00:00 2001 From: jin2304 Date: Mon, 24 Mar 2025 15:03:53 +0900 Subject: [PATCH 301/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#178]=20:=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EC=88=98=EC=A0=95(=EC=9E=AC=EA=B3=A0=20?= =?UTF-8?q?=EC=A6=9D=EA=B0=80)=20api=20=EB=B0=8F=20dto=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...reaseProductQuantityServiceRequestDto.java | 23 +++++++++++++ .../presentation/ProductController.java | 17 +++++++--- .../IncreaseProductQuantityRequestDto.java | 11 +++++++ .../IncreaseProductQuantityResponseDto.java | 33 +++++++++++++++++++ 4 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 product-service/src/main/java/com/sparta/product/application/dto/IncreaseProductQuantityServiceRequestDto.java create mode 100644 product-service/src/main/java/com/sparta/product/presentation/dto/request/IncreaseProductQuantityRequestDto.java create mode 100644 product-service/src/main/java/com/sparta/product/presentation/dto/response/IncreaseProductQuantityResponseDto.java diff --git a/product-service/src/main/java/com/sparta/product/application/dto/IncreaseProductQuantityServiceRequestDto.java b/product-service/src/main/java/com/sparta/product/application/dto/IncreaseProductQuantityServiceRequestDto.java new file mode 100644 index 0000000..ab6264b --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/application/dto/IncreaseProductQuantityServiceRequestDto.java @@ -0,0 +1,23 @@ +package com.sparta.product.application.dto; + +import com.sparta.product.presentation.dto.request.IncreaseProductQuantityRequestDto; +import lombok.Builder; + +import java.util.UUID; + +@Builder +public record IncreaseProductQuantityServiceRequestDto(UUID productId, + UUID companyId, + UUID hubId, + Integer quantity) { + + // 요청 DTO -> 서비스 DTO 변환 메서드 + public static IncreaseProductQuantityServiceRequestDto of(IncreaseProductQuantityRequestDto request, UUID productId) { + return IncreaseProductQuantityServiceRequestDto.builder() + .productId(productId) + .companyId(request.companyId()) + .hubId(request.hubId()) + .quantity(request.quantity()) + .build(); + } +} diff --git a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java index dbbbab5..324de4c 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java +++ b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java @@ -3,12 +3,10 @@ import com.sparta.commonmodule.aop.RoleCheck; import com.sparta.product.application.dto.DeleteProductServiceRequestDto; import com.sparta.product.application.dto.DecreaseProductQuantityServiceRequestDto; +import com.sparta.product.application.dto.IncreaseProductQuantityServiceRequestDto; import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.application.service.ProductServiceImpl; -import com.sparta.product.presentation.dto.request.CreateProductRequestDto; -import com.sparta.product.presentation.dto.request.DecreaseProductQuantityRequestDto; -import com.sparta.product.presentation.dto.request.SearchProductRequestDto; -import com.sparta.product.presentation.dto.request.UpdateProductRequestDto; +import com.sparta.product.presentation.dto.request.*; import com.sparta.product.presentation.dto.response.*; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -108,4 +106,15 @@ public ResponseEntity decreaseProductQuantit DecreaseProductQuantityServiceRequestDto.of(requestDto, productId))); } + + /** + * 상품 수정(재고 증가) + */ + @PutMapping("/{productId}/increase") + public ResponseEntity increaseProductQuantity(@PathVariable UUID productId, + @RequestBody IncreaseProductQuantityRequestDto requestDto) { + return ResponseEntity.ok(productServiceImpl.increaseProductQuantity( + IncreaseProductQuantityServiceRequestDto.of(requestDto, productId))); + } + } diff --git a/product-service/src/main/java/com/sparta/product/presentation/dto/request/IncreaseProductQuantityRequestDto.java b/product-service/src/main/java/com/sparta/product/presentation/dto/request/IncreaseProductQuantityRequestDto.java new file mode 100644 index 0000000..6e13fb6 --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/presentation/dto/request/IncreaseProductQuantityRequestDto.java @@ -0,0 +1,11 @@ +package com.sparta.product.presentation.dto.request; + +import java.util.UUID; + +public record IncreaseProductQuantityRequestDto(UUID companyId, + UUID hubId, + Integer quantity +) { + + +} diff --git a/product-service/src/main/java/com/sparta/product/presentation/dto/response/IncreaseProductQuantityResponseDto.java b/product-service/src/main/java/com/sparta/product/presentation/dto/response/IncreaseProductQuantityResponseDto.java new file mode 100644 index 0000000..2e6f6d1 --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/presentation/dto/response/IncreaseProductQuantityResponseDto.java @@ -0,0 +1,33 @@ +package com.sparta.product.presentation.dto.response; + +import com.sparta.product.domain.model.Product; +import lombok.Builder; + +import java.util.UUID; + +@Builder +public record IncreaseProductQuantityResponseDto(UUID productId, // 재고 증가 상품 + Boolean isSuccess, // 재고 증가 성공 여부 + Integer increasedQuantity, // 실제 증가된 수량 + String message) { // 성공 or 실패 메세지 + // Entity -> DTO 변환 메서드 + // 성공 응답 + public static IncreaseProductQuantityResponseDto success(Product product, int increasedQuantity) { + return IncreaseProductQuantityResponseDto.builder() + .productId(product.getId()) + .isSuccess(true) + .increasedQuantity(increasedQuantity) + .message("재고 증가 성공.") + .build(); + } + + // 실패 응답 + public static IncreaseProductQuantityResponseDto failure(Product product) { + return IncreaseProductQuantityResponseDto.builder() + .productId(product.getId()) + .isSuccess(false) + .increasedQuantity(0) + .message("재고 증가 실패.") + .build(); + } +} From 3e468d84c603a6c1be92d064d294d819248efccc Mon Sep 17 00:00:00 2001 From: jin2304 Date: Mon, 24 Mar 2025 15:04:18 +0900 Subject: [PATCH 302/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#178]=20:=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EC=88=98=EC=A0=95(=EC=9E=AC=EA=B3=A0=20?= =?UTF-8?q?=EC=A6=9D=EA=B0=80)=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/ProductService.java | 3 +++ .../application/service/ProductServiceImpl.java | 15 +++++++++++++++ .../com/sparta/product/domain/model/Product.java | 8 ++++++++ 3 files changed, 26 insertions(+) diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductService.java b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java index 54cfa19..0b72724 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductService.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java @@ -2,6 +2,7 @@ import com.sparta.product.application.dto.DeleteProductServiceRequestDto; import com.sparta.product.application.dto.DecreaseProductQuantityServiceRequestDto; +import com.sparta.product.application.dto.IncreaseProductQuantityServiceRequestDto; import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.presentation.dto.request.CreateProductRequestDto; import com.sparta.product.presentation.dto.request.SearchProductRequestDto; @@ -28,4 +29,6 @@ public interface ProductService { Page searchProducts(SearchProductRequestDto requestDto, Pageable pageable); DecreaseProductQuantityResponseDto decreaseProductQuantity(DecreaseProductQuantityServiceRequestDto serviceDto); + + IncreaseProductQuantityResponseDto increaseProductQuantity(IncreaseProductQuantityServiceRequestDto serviceDto); } diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java index 2e36a2d..1dc841d 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java @@ -3,6 +3,7 @@ import com.sparta.commonmodule.exception.ResourceNotFoundException; import com.sparta.product.application.dto.DeleteProductServiceRequestDto; import com.sparta.product.application.dto.DecreaseProductQuantityServiceRequestDto; +import com.sparta.product.application.dto.IncreaseProductQuantityServiceRequestDto; import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.domain.model.Product; import com.sparta.product.domain.repository.ProductRepository; @@ -119,6 +120,20 @@ public DecreaseProductQuantityResponseDto decreaseProductQuantity(DecreaseProduc } + /** + * 상품 수정(재고 증가) + */ + @Override + public IncreaseProductQuantityResponseDto increaseProductQuantity(IncreaseProductQuantityServiceRequestDto serviceDto) { + Product product = productRepository.findByIdAndHubId(serviceDto.productId(), serviceDto.hubId()) + .orElseThrow(() -> new ResourceNotFoundException("해당 허브에 상품이 존재하지 않습니다.")); + + product.increaseQuantity(serviceDto.quantity()); + + return IncreaseProductQuantityResponseDto.success(product, serviceDto.quantity()); + + } + // 업체 존재 검증 메서드 private void validateCompanyExists(UUID companyId) { diff --git a/product-service/src/main/java/com/sparta/product/domain/model/Product.java b/product-service/src/main/java/com/sparta/product/domain/model/Product.java index 4fc8edd..6b43aef 100644 --- a/product-service/src/main/java/com/sparta/product/domain/model/Product.java +++ b/product-service/src/main/java/com/sparta/product/domain/model/Product.java @@ -87,6 +87,14 @@ public void decreaseQuantity(Integer quantity) { + /** + * 상품 수정(재고 증가) + */ + public void increaseQuantity(Integer quantity) { + this.quantity = this.quantity + quantity; + } + + private void validateDecreaseQuantity(Integer quantity) { if (quantity == null || quantity < 30) { throw new IllegalArgumentException("최소 30개 이상 요청해야 합니다."); From c68976f0bc9e1b9df78561c378b3d4ee6d3c4a52 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Mon, 24 Mar 2025 15:13:45 +0900 Subject: [PATCH 303/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#178]=20:=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EC=88=98=EC=A0=95(=EC=9E=AC=EA=B3=A0=20?= =?UTF-8?q?=EC=A6=9D=EA=B0=80)=20HTTP=20=ED=85=8C=EC=8A=A4=ED=8A=B8=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 --- product-service/src/test/http/product.http | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/product-service/src/test/http/product.http b/product-service/src/test/http/product.http index 0778769..0db720a 100644 --- a/product-service/src/test/http/product.http +++ b/product-service/src/test/http/product.http @@ -38,7 +38,8 @@ Content-Type: application/json ### 상품 수정(재고 감소 성공) -PUT http://localhost:8083/api/v1/products/fabd981b-844a-47f9-a15c-60ae362c2eb7/decrease +PUT http://localhost:8083/api/v1/products/d6183a42-df2e-44fa-8331-cf7a90a1f82e/decrease +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI3ODg3OTEsImV4cCI6MTc0Mjc5MjM5MX0.GTMZCuZ7-jfzYshDEfBdCAfelNFAexIogXxU6rzX3fNTaeQ0GPFilKyylO_E90PiX5DFUWBQ29oIChuMpUU-gg Content-Type: application/json { @@ -59,6 +60,18 @@ Content-Type: application/json } +### 상품 수정(재고 증가) +PUT http://localhost:8080/api/v1/products/d6183a42-df2e-44fa-8331-cf7a90a1f82e/increase +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI3ODg3OTEsImV4cCI6MTc0Mjc5MjM5MX0.GTMZCuZ7-jfzYshDEfBdCAfelNFAexIogXxU6rzX3fNTaeQ0GPFilKyylO_E90PiX5DFUWBQ29oIChuMpUU-gg +Content-Type: application/json + +{ + "companyId": "550e8400-e29b-41d4-a716-446655440000", + "hubId": "123e4567-e89b-12d3-a456-426614174000", + "quantity": 30 +} + + ### 상품 삭제 DELETE http://localhost:8080/api/v1/products/64597bbf-a016-4343-8a5c-f39cf122a4be Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMyIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2cyMzA0IiwiaXNzIjoidXNlci1zZXJ2aWNlIiwiaWF0IjoxNzQyNzUyNTM0LCJleHAiOjE3NDI3NTYxMzR9.DHkrq9nWvvvSJkCbnOyqQo85FuNBhA2kA6lCYpsWG-F4mDLxHZJ73goCDGUcywNMtDdpmW0Iv-cSV3fOg6BpWQ From b3c5135b46a707d39ea2de501220e895ca9dd232 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Mon, 24 Mar 2025 15:33:39 +0900 Subject: [PATCH 304/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#178]?= =?UTF-8?q?=20:=20=EC=83=81=ED=92=88=EC=97=90=EC=84=9C=20HubClient=20?= =?UTF-8?q?=EB=B0=8F=20CompanyClient=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/application/service/ProductServiceImpl.java | 4 ++-- .../sparta/product/infrastructure/client/CompanyClient.java | 4 ++-- .../com/sparta/product/infrastructure/client/HubClient.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java index 1dc841d..7f8b8b8 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java @@ -137,7 +137,7 @@ public IncreaseProductQuantityResponseDto increaseProductQuantity(IncreaseProduc // 업체 존재 검증 메서드 private void validateCompanyExists(UUID companyId) { - if (!companyClient.existsById(companyId)) { + if (!companyClient.getCompanyById(companyId)) { throw new ResourceNotFoundException("해당 업체가 존재하지 않습니다."); } } @@ -145,7 +145,7 @@ private void validateCompanyExists(UUID companyId) { // 허브 존재 검증 메서드 private void validateHubExists(UUID hubId) { - if (!hubClient.existsById(hubId)) { + if (!hubClient.getHubById(hubId)) { throw new ResourceNotFoundException("해당 허브가 존재하지 않습니다."); } } diff --git a/product-service/src/main/java/com/sparta/product/infrastructure/client/CompanyClient.java b/product-service/src/main/java/com/sparta/product/infrastructure/client/CompanyClient.java index 5a33dfe..d37de8b 100644 --- a/product-service/src/main/java/com/sparta/product/infrastructure/client/CompanyClient.java +++ b/product-service/src/main/java/com/sparta/product/infrastructure/client/CompanyClient.java @@ -12,6 +12,6 @@ public interface CompanyClient { /** * 업체 존재 확인 */ - @GetMapping("/api/v1/companies/{id}/exists") - boolean existsById(@PathVariable("id") UUID id); + @GetMapping("/api/v1/companies/{companyId}") + boolean getCompanyById(@PathVariable("companyId") UUID companyId); } diff --git a/product-service/src/main/java/com/sparta/product/infrastructure/client/HubClient.java b/product-service/src/main/java/com/sparta/product/infrastructure/client/HubClient.java index 7a9e420..5dfd6fa 100644 --- a/product-service/src/main/java/com/sparta/product/infrastructure/client/HubClient.java +++ b/product-service/src/main/java/com/sparta/product/infrastructure/client/HubClient.java @@ -12,6 +12,6 @@ public interface HubClient { /** * 허브 존재 확인 */ - @GetMapping("/api/v1/hubs/{id}/exists") - boolean existsById(@PathVariable("id") UUID id); + @GetMapping("/api/v1/hubs/{hub_id}") + boolean getHubById(@PathVariable("hub_id") UUID hubId); } From 7642abf34b664abdd5bf94ea9084989ec760c3c0 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 16:16:35 +0900 Subject: [PATCH 305/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20@RoleChek=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=B0=8F=20@RequestHeader=EB=A1=9C=20user?= =?UTF-8?q?Id=20=EB=B0=9B=EC=95=84=EC=98=AC=20=EC=88=98=20=EC=9E=88?= =?UTF-8?q?=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub/presentation/controller/HubController.java | 11 ++++++++--- .../controller/HubShippingScanController.java | 5 +++-- .../presentation/controller/HubRouteController.java | 12 +++++++++--- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java index 1ff6866..bc4d2f7 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java @@ -1,5 +1,6 @@ package com.sparta.hubservice.hub.presentation.controller; +import com.sparta.commonmodule.aop.RoleCheck; import com.sparta.hubservice.hub.application.dto.response.HubCreateResponseDto; import com.sparta.hubservice.hub.application.dto.response.HubDeleteResponseDto; import com.sparta.hubservice.hub.application.dto.request.HubRequestDto; @@ -19,6 +20,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -56,22 +58,25 @@ public ResponseEntity> getSearchHubs( } // 허브 생성 + @RoleCheck("ROLE_MASTER") @PostMapping - public ResponseEntity createHub(@RequestBody @Valid HubRequestDto requestDto, @RequestParam Long userId) { + public ResponseEntity createHub(@RequestBody @Valid HubRequestDto requestDto,@RequestHeader("user-id") Long userId) { HubCreateResponseDto responseDto = hubService.createHub(requestDto, userId); return ResponseEntity.ok(responseDto); } // 허브 수정 + @RoleCheck("ROLE_MASTER") @PutMapping("{hub_id}") - public ResponseEntity updateHub(@PathVariable("hub_id") UUID hubId, @RequestParam String address, @RequestParam Long userId) { + public ResponseEntity updateHub(@PathVariable("hub_id") UUID hubId, @RequestParam String address, @RequestHeader("user-id") Long userId) { HubUpdateResponseDto responseDto = hubService.updateHub(hubId, address, userId); return ResponseEntity.ok(responseDto); } // 허브 삭제 + @RoleCheck("ROLE_MASTER") @DeleteMapping("{hub_id}") - public ResponseEntity deleteHub(@PathVariable("hub_id") UUID hubId, @RequestParam Long userId) { + public ResponseEntity deleteHub(@PathVariable("hub_id") UUID hubId, @RequestHeader("user-id") Long userId) { HubDeleteResponseDto responseDto = hubService.deleteHub(hubId, userId); return ResponseEntity.ok(responseDto); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java index b8ec5ef..4b67945 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java @@ -8,6 +8,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -24,7 +25,7 @@ public class HubShippingScanController { public ResponseEntity inboundStatus( @PathVariable("hub_id") UUID hubId, @PathVariable("shipping_id") UUID shippingId, - @RequestParam("user_id") Long userId){ + @RequestHeader("user-id") Long userId){ InboundStatusResponseDto responseDto = hubShippingScanService.createInbound(hubId, shippingId, userId); @@ -37,7 +38,7 @@ public ResponseEntity inboundStatus( public ResponseEntity outboundStatus( @PathVariable("hub_id") UUID hubId, @PathVariable("shipping_id") UUID shippingId, - @RequestParam("user_id") Long userId + @RequestHeader("user-id") Long userId ){ OutboundStatusResponseDto responseDto = hubShippingScanService.createOutbound(hubId, shippingId, userId); diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java index aa58fbd..f559986 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java @@ -1,6 +1,7 @@ package com.sparta.hubservice.hub_route.presentation.controller; +import com.sparta.commonmodule.aop.RoleCheck; import com.sparta.hubservice.hub_route.application.dto.response.HubRouteCreateResponseDto; import com.sparta.hubservice.hub_route.application.dto.response.HubRouteDeleteResponseDto; import com.sparta.hubservice.hub_route.application.dto.response.HubRouteDetailsResponseDto; @@ -8,6 +9,7 @@ import com.sparta.hubservice.hub_route.application.service.HubRouteService; import java.util.UUID; import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Role; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; @@ -16,6 +18,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -52,31 +55,34 @@ public ResponseEntity getDirectHubRoute( } // (정해진) 허브 간 경로 생성 (direct) + @RoleCheck("ROLE_MASTER") @PostMapping("/{from_hub_id}/{to_hub_id}/direct") public ResponseEntity createDirectHubRoute( @PathVariable("from_hub_id") UUID fromHubId, @PathVariable("to_hub_id") UUID toHubId, - @RequestParam Long userId) { + @RequestHeader("user_id") Long userId) { HubRouteCreateResponseDto response = hubRouteService.createDirectHubRoute(userId, fromHubId, toHubId); return ResponseEntity.ok(response); } // 허브 간 경로 정보 삭제 + @RoleCheck("ROLE_MASTER") @DeleteMapping("/{hub_route_id}") public ResponseEntity deleteHubRoute( @PathVariable("hub_route_id") UUID hubRouteId, - @RequestParam Long userId) { + @RequestHeader("user_id") Long userId) { HubRouteDeleteResponseDto response = hubRouteService.deleteHubRoute(hubRouteId, userId); return ResponseEntity.ok(response); } // form -> to 최단경로 생성 (다이렉트는 항상 최단경로) + @RoleCheck("ROLE_MASTER") @PostMapping("/{from_hub_id}/{to_hub_id}/path") public ResponseEntity createPathHubRoute( @PathVariable("from_hub_id") UUID fromHubId, @PathVariable("to_hub_id") UUID toHubId, - @RequestParam Long userId + @RequestHeader("user_id") Long userId ){ HubRouteDetailsResponseDto response = hubRouteService.createPathHubRoute(fromHubId, toHubId, userId); From 51c18189b9161df63e9ac3e684fce5870dc2360c Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 16:44:13 +0900 Subject: [PATCH 306/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=EB=8F=84?= =?UTF-8?q?=EC=BB=A4=EB=82=B4=EC=97=90=EC=84=9C=20=EC=97=AC=EB=9F=AC=20?= =?UTF-8?q?=EC=8A=A4=ED=82=A4=EB=A7=88=EB=A5=BC=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=9C=20=EC=B4=88=EA=B8=B0=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 19 +++++++++++++++++++ .../src/main/resources/application.yml | 15 ++++++--------- init.sql | 9 +++++++++ 3 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 init.sql diff --git a/docker-compose.yml b/docker-compose.yml index 2a4a7d7..69c47b0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,20 @@ +version: '3.8' + services: + postgres: + image: postgres:15 + container_name: my_postgres + environment: + POSTGRES_USER: admin + POSTGRES_PASSWORD: 1234 + POSTGRES_DB: maindb + ports: + - "5432:5432" + volumes: + - pgdata:/var/lib/postgresql/data + - ./init.sql:/docker-entrypoint-initdb.d/init.sql + + eureka-server: build: context: . # 루트에서 빌드 (Gradle 파일 접근 가능) @@ -135,3 +151,6 @@ services: networks: msa-network: driver: bridge + +volumes: + pgdata: \ No newline at end of file diff --git a/hub-service/src/main/resources/application.yml b/hub-service/src/main/resources/application.yml index dc88b9e..398e44a 100644 --- a/hub-service/src/main/resources/application.yml +++ b/hub-service/src/main/resources/application.yml @@ -1,23 +1,24 @@ server: port: 8082 + spring: application: name: hub-service config: import: "application-secret.yml" datasource: - url: jdbc:postgresql://localhost:5432/testdb - username: postgres + url: jdbc:postgresql://postgres:5432/maindb + username: admin password: 1234 driver-class-name: org.postgresql.Driver - jpa: properties: hibernate: + default_schema: hub_service dialect: org.hibernate.dialect.PostgreSQLDialect hibernate: - ddl-auto: update # 테이블 자동 생성 - show-sql: true # SQL 로그 출력 + ddl-auto: update + show-sql: true eureka: client: @@ -28,10 +29,6 @@ eureka: instance: prefer-ip-address: true -security: - basic: - enabled: false - shipping: service: url: http://localhost:8081/api/v1/shippings diff --git a/init.sql b/init.sql new file mode 100644 index 0000000..67b618d --- /dev/null +++ b/init.sql @@ -0,0 +1,9 @@ +-- init.sql +CREATE SCHEMA IF NOT EXISTS user_service; +CREATE SCHEMA IF NOT EXISTS order_service; +CREATE SCHEMA IF NOT EXISTS hub_service; +CREATE SCHEMA IF NOT EXISTS product_service; +CREATE SCHEMA IF NOT EXISTS company_service; +CREATE SCHEMA IF NOT EXISTS shipping_service; +CREATE SCHEMA IF NOT EXISTS slack_service; + From 2144df066372a375e4867ee3af2653b769b0f0e7 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Mon, 24 Mar 2025 16:49:31 +0900 Subject: [PATCH 307/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor[#182]=20:?= =?UTF-8?q?=20User,slack=20service=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= =?UTF-8?q?=20-=20docker=20=EC=97=B0=EA=B2=B0=EC=84=A4=EC=A0=95=20-=20slac?= =?UTF-8?q?k=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B5=9C=EC=A2=85=EC=A0=90?= =?UTF-8?q?=EA=B2=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api-http/slack/slack-service.http | 9 +++++++- api-http/user/user-service.http | 4 ++-- .../presentation/SlackController.java | 2 +- .../src/main/resources/application.yml | 14 ++++++++----- user-service/docker-compose.yml | 21 ------------------- .../src/main/resources/application.yml | 12 +++++++---- 6 files changed, 28 insertions(+), 34 deletions(-) delete mode 100644 user-service/docker-compose.yml diff --git a/api-http/slack/slack-service.http b/api-http/slack/slack-service.http index e4cd8df..ebac945 100644 --- a/api-http/slack/slack-service.http +++ b/api-http/slack/slack-service.http @@ -21,7 +21,14 @@ Authorization: {{access_token}} ### -GET http://localhost:8080/api/v1/slacks/b08bd42a-6b0e-497d-831f-a9f5b4fa63db +POST http://localhost:8080/api/v1/slacks/send/9ae52019-9b37-4bc0-b171-96da397337f3 +Authorization: {{access_token}} + +#### + +### + +GET http://localhost:8080/api/v1/slacks/9ae52019-9b37-4bc0-b171-96da397337f3 Authorization: {{access_token}} #### diff --git a/api-http/user/user-service.http b/api-http/user/user-service.http index ce7f843..f4206cb 100644 --- a/api-http/user/user-service.http +++ b/api-http/user/user-service.http @@ -5,7 +5,8 @@ Content-Type: application/json "username":"asdf123", "password":"asdfgA12@", "email":"asdf@naver.com", - "slackName": "asdggg" + "slackName": "asdggg", + "tokenValue": "mgbE4vogtrMGufz6PXkQNTV-KZtU4-Mz7_wcKf7r40kKTu8z4BD9l_kacdd4MzU3pQV6y3LB-yrmMvvXFKep2Q" } ### @@ -41,5 +42,4 @@ Authorization: {{access_token}} ### DELETE http://localhost:8080/api/v1/users -Content-Type: application/json Authorization: {{access_token}} \ No newline at end of file diff --git a/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java b/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java index 79dd72f..563a976 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java +++ b/slack-service/src/main/java/com/sparta/slackservice/presentation/SlackController.java @@ -34,7 +34,7 @@ public ResponseEntity createSlack(@RequestHeader("user_id") Lo } @Operation(summary = "메세지 전송", description = "메세지 전송 api입니다.") - @GetMapping("/send/{id}") + @PostMapping("/send/{id}") public ResponseEntity sendSlack(@PathVariable("id") UUID slackId) { slackService.sendSlack(slackId); return ResponseEntity.ok("전송성공"); diff --git a/slack-service/src/main/resources/application.yml b/slack-service/src/main/resources/application.yml index f8cff42..1c76149 100644 --- a/slack-service/src/main/resources/application.yml +++ b/slack-service/src/main/resources/application.yml @@ -2,14 +2,18 @@ spring: application: name: slack-service datasource: - url: jdbc:postgresql://localhost:5001/user_db # Docker의 PostgreSQL 컨테이너의 IP 또는 호스트와 포트를 사용 - username: postgres_user # PostgreSQL 사용자 이름 - password: 12345 # PostgreSQL 비밀번호 + url: jdbc:postgresql://postgres:5432/maindb + username: admin + password: 1234 driver-class-name: org.postgresql.Driver jpa: + properties: + hibernate: + default_schema: slack_service + dialect: org.hibernate.dialect.PostgreSQLDialect hibernate: ddl-auto: update - database-platform: org.hibernate.dialect.PostgreSQLDialect # PostgreSQL에 맞는 Hibernate Dialect 설정 + show-sql: true h2: console: enabled: false # H2 콘솔 비활성화 (PostgreSQL 사용 시) @@ -33,4 +37,4 @@ springdoc: path: /swagger-ui.html slack: webhook: - url: https://hooks.slack.com/services/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 \ No newline at end of file + url: https://hooks.slack.com/services/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 \ No newline at end of file diff --git a/user-service/docker-compose.yml b/user-service/docker-compose.yml deleted file mode 100644 index 096c630..0000000 --- a/user-service/docker-compose.yml +++ /dev/null @@ -1,21 +0,0 @@ -services: - # PostgreSQL 데이터베이스 설정 - postgres: - image: postgres:latest - container_name: postgres_user - ports: - - "5001:5432" # 외부에서 접속할 수 있는 포트 - environment: - POSTGRES_USER: postgres_user - POSTGRES_PASSWORD: 12345 - POSTGRES_DB: user_db # 생성할 데이터베이스 이름 - volumes: - - postgres_data:/var/lib/postgresql/data # 데이터가 유지될 경로 - networks: - - user-network # user 서비스와만 연결될 네트워크 -networks: - user-network: - driver: bridge # user 서비스와 PostgreSQL만 연결될 네트워크 - -volumes: - postgres_data: # PostgreSQL 데이터 저장을 위한 볼륨 diff --git a/user-service/src/main/resources/application.yml b/user-service/src/main/resources/application.yml index 87229b4..d87f12e 100644 --- a/user-service/src/main/resources/application.yml +++ b/user-service/src/main/resources/application.yml @@ -2,14 +2,18 @@ spring: application: name: user-service datasource: - url: jdbc:postgresql://localhost:5001/user_db # Docker의 PostgreSQL 컨테이너의 IP 또는 호스트와 포트를 사용 - username: postgres_user # PostgreSQL 사용자 이름 - password: 12345 # PostgreSQL 비밀번호 + url: jdbc:postgresql://postgres:5432/maindb + username: admin + password: 1234 driver-class-name: org.postgresql.Driver jpa: + properties: + hibernate: + default_schema: user_service + dialect: org.hibernate.dialect.PostgreSQLDialect hibernate: ddl-auto: update - database-platform: org.hibernate.dialect.PostgreSQLDialect # PostgreSQL에 맞는 Hibernate Dialect 설정 + show-sql: true h2: console: enabled: false # H2 콘솔 비활성화 (PostgreSQL 사용 시) From 0c57f36af36541cc4fbafbafb7b06fdacf07b86a Mon Sep 17 00:00:00 2001 From: devdaeun Date: Mon, 24 Mar 2025 16:53:23 +0900 Subject: [PATCH 308/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor[#182]=20:?= =?UTF-8?q?=20User,slack=20service=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= =?UTF-8?q?=20-=20SQLRestriction=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/sparta/slackservice/domain/model/Slack.java | 2 ++ .../src/main/java/com/sparta/user/domain/model/User.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java b/slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java index 6a9d338..db02507 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java +++ b/slack-service/src/main/java/com/sparta/slackservice/domain/model/Slack.java @@ -6,6 +6,7 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.SQLRestriction; import java.time.LocalDateTime; import java.util.Optional; @@ -15,6 +16,7 @@ @Getter @Table(name = "p_slacks") @NoArgsConstructor +@SQLRestriction("is_deleted IS FALSE") public class Slack extends BaseEntity { @Id diff --git a/user-service/src/main/java/com/sparta/user/domain/model/User.java b/user-service/src/main/java/com/sparta/user/domain/model/User.java index 895728e..e966950 100644 --- a/user-service/src/main/java/com/sparta/user/domain/model/User.java +++ b/user-service/src/main/java/com/sparta/user/domain/model/User.java @@ -7,6 +7,7 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.SQLRestriction; import java.time.LocalDateTime; import java.util.Optional; @@ -15,6 +16,7 @@ @NoArgsConstructor @Table(name = "p_users") @Entity +@SQLRestriction("is_deleted IS FALSE") public class User extends BaseEntity { @Id From e4a008d2afee65017e2eff3bad2981c7ea61eb1c Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 24 Mar 2025 16:53:42 +0900 Subject: [PATCH 309/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20:=20doc?= =?UTF-8?q?ker=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- order-service/src/main/resources/application.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/order-service/src/main/resources/application.yml b/order-service/src/main/resources/application.yml index 25b431b..317fcb9 100644 --- a/order-service/src/main/resources/application.yml +++ b/order-service/src/main/resources/application.yml @@ -3,15 +3,18 @@ spring: name: order-service datasource: - url: jdbc:postgresql://localhost:5432/delivery + url: jdbc:postgresql://postgres:5432/maindb username: admin password: 1234 driver-class-name: org.postgresql.Driver jpa: - database-platform: org.hibernate.dialect.PostgreSQLDialect hibernate: ddl-auto: update + properties: + hibernate: + default_schema: order_service + dialect: org.hibernate.dialect.PostgreSQLDialect show-sql: true eureka: From 82df1d1b7c050ea82de35b1a762f0166d557f95b Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 24 Mar 2025 16:54:14 +0900 Subject: [PATCH 310/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20:=20?= =?UTF-8?q?=EC=8A=AC=EB=9E=99=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=20DTO=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=ED=95=84?= =?UTF-8?q?=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 --- .../client/dto/response/CreateShippingResponseDto.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/response/CreateShippingResponseDto.java b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/response/CreateShippingResponseDto.java index 89ea6ed..461b010 100644 --- a/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/response/CreateShippingResponseDto.java +++ b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/response/CreateShippingResponseDto.java @@ -17,4 +17,8 @@ public class CreateShippingResponseDto { private UUID shippingId; // 생성된 배송 ID private String status; // 배송 상태 (예: READY, SHIPPING 등) private String message; // 성공/실패 메시지 + private String route; // 배송 경로 + private String hubName; // 허브 이름 + private String hubManagerName; // 허브 담당자 이름 + } From 7536311e55291e7adec51f795b7fabab044b422b Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 24 Mar 2025 16:55:17 +0900 Subject: [PATCH 311/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20Slack=20?= =?UTF-8?q?=EC=95=8C=EB=A6=BC=20=EA=B4=80=EB=A0=A8=ED=95=B4=EC=84=9C=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=20DTO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/SlackNotificationDto.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/response/SlackNotificationDto.java diff --git a/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/response/SlackNotificationDto.java b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/response/SlackNotificationDto.java new file mode 100644 index 0000000..94cf5b4 --- /dev/null +++ b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/response/SlackNotificationDto.java @@ -0,0 +1,24 @@ +package com.sparta.orderservice.infrastructure.client.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +//Slack 알림 관련해서 응답 DTO +public class SlackNotificationDto { + + private UUID orderId; + private UUID shippingId; + private String shippingStatus; + private String route; + private String hubName; + private String hubManagerName; + private String message; +} From 1b4e50d0dc489a76f0d9210dce274c18ba7bc391 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 24 Mar 2025 16:55:28 +0900 Subject: [PATCH 312/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20Slack=20?= =?UTF-8?q?=EC=95=8C=EB=A6=BC=20=EA=B4=80=EB=A0=A8=ED=95=B4=EC=84=9C=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/OrderService.java | 30 +++++++++++++++---- .../infrastructure/client/ShippingClient.java | 9 ++++++ .../controller/OrderController.java | 9 ++++++ 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java index 88df036..d32d8a5 100644 --- a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java +++ b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java @@ -14,6 +14,7 @@ import com.sparta.orderservice.infrastructure.client.dto.response.CreateShippingResponseDto; import com.sparta.orderservice.infrastructure.client.dto.response.DecreaseProductQuantityResponseDto; import com.sparta.orderservice.infrastructure.client.dto.request.DecreaseProductQuantityServiceRequestDto; +import com.sparta.orderservice.infrastructure.client.dto.response.SlackNotificationDto; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; @@ -29,12 +30,12 @@ public class OrderService { private final OrderRepository orderRepository; + @Qualifier("orderQueryDSLRepositoryImpl") private final OrderQueryDSLRepository orderQueryDSLRepository; + private final ProductClient productClient; private final ShippingClient shippingClient; -// private final ProductClient productClient; - //주문 생성 @Transactional @@ -46,7 +47,7 @@ public OrderResponseDto createOrder(OrderRequestDto requestDto) { .productId(requestDto.getProductId()) .companyId(requestDto.getSupplierId()) // supplierId → companyId .hubId(requestDto.getReceiverId()) // receiverId → hubId - .quantity(1) // 기본 수량 예시 + .quantity(1) // 기본 수량 .build(); // 2. FeignClient로 재고 차감 요청 @@ -55,12 +56,12 @@ public OrderResponseDto createOrder(OrderRequestDto requestDto) { DecreaseProductQuantityResponseDto response = productClient.decreaseProductQuantity(productId, reduceRequest); - // 3. 실패 시 예외 발생 if (!response.getIsSuccess()) { throw new OperationNotAllowedException("재고 차감에 실패하여 주문을 생성할 수 없습니다."); } + // 4. 주문 저장 Order order = Order.builder() .name(requestDto.getName()) .supplierId(requestDto.getSupplierId()) @@ -150,7 +151,7 @@ public OrderResponseDto cancelOrder(UUID orderId, String cancelReason) { return OrderResponseDto.fromEntity(order); } - // 검색 + // 주문 검색 @Transactional(readOnly = true) public List searchOrders(String name, OrderStatus status) { List result = orderQueryDSLRepository.searchOrders(name, status); @@ -158,4 +159,23 @@ public List searchOrders(String name, OrderStatus status) { .map(OrderResponseDto::fromEntity) .collect(Collectors.toList()); } + + // 슬랙 알림용 DTO 생성 메서드 + @Transactional(readOnly = true) + public SlackNotificationDto getSlackNotificationDto(UUID orderId) { + Order order = orderRepository.findById(orderId) + .orElseThrow(() -> new ResourceNotFoundException("해당 주문을 찾을 수 없습니다.")); + + CreateShippingResponseDto shipping = shippingClient.getShippingInfo(orderId); + + return SlackNotificationDto.builder() + .orderId(order.getOrderId()) + .shippingId(shipping.getShippingId()) + .shippingStatus(shipping.getStatus()) + .route(shipping.getRoute()) + .hubName(shipping.getHubName()) + .hubManagerName(shipping.getHubManagerName()) + .message(shipping.getMessage()) + .build(); + } } diff --git a/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/ShippingClient.java b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/ShippingClient.java index 0771a58..c4ce378 100644 --- a/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/ShippingClient.java +++ b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/ShippingClient.java @@ -3,12 +3,21 @@ import com.sparta.orderservice.infrastructure.client.dto.request.CreateShippingRequestDto; import com.sparta.orderservice.infrastructure.client.dto.response.CreateShippingResponseDto; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import java.util.UUID; + @FeignClient(name = "shipping-service", path = "/api/v1/shippings") public interface ShippingClient { + // 배송 생성 @PostMapping CreateShippingResponseDto createShipping(@RequestBody CreateShippingRequestDto request); + + // 주문 ID로 배송 조회 + @GetMapping("/{orderId}") + CreateShippingResponseDto getShippingInfo(@PathVariable("orderId") UUID orderId); } diff --git a/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java b/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java index 3bcc291..42453a9 100644 --- a/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java +++ b/order-service/src/main/java/com/sparta/orderservice/presentation/controller/OrderController.java @@ -4,6 +4,7 @@ import com.sparta.orderservice.application.dto.OrderResponseDto; import com.sparta.orderservice.application.service.OrderService; import com.sparta.orderservice.domain.model.OrderStatus; +import com.sparta.orderservice.infrastructure.client.dto.response.SlackNotificationDto; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; @@ -82,5 +83,13 @@ public ResponseEntity> searchOrders( return ResponseEntity.ok(orderService.searchOrders(name, status)); } + // slack 응답 + @Operation(summary = "Slack 알림 응답", description = "Slack 도메인에서 주문 정보를 가져가기 위한 api입니다.") + @GetMapping("/{id}/slack-info") + public ResponseEntity getSlackNotificationInfo(@PathVariable UUID id) { + SlackNotificationDto slackDto = orderService.getSlackNotificationDto(id); + return ResponseEntity.ok(slackDto); + } + } From 59aa5b2fe76d0c31e6f491c1feb8161a33b386be Mon Sep 17 00:00:00 2001 From: jiyun Date: Mon, 24 Mar 2025 16:43:19 +0900 Subject: [PATCH 313/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20[#186]=20yml=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/company-service/src/main/resources/application.yml b/company-service/src/main/resources/application.yml index 5c66149..207dc47 100644 --- a/company-service/src/main/resources/application.yml +++ b/company-service/src/main/resources/application.yml @@ -2,15 +2,28 @@ spring: application: name: company-service datasource: - url: jdbc:postgresql://localhost:5432/company-service - username: myuser - password: mypassword + url: jdbc:postgresql://postgres:5432/maindb + username: admin + password: 1234 driver-class-name: org.postgresql.Driver - jpa: + jpa: + properties: hibernate: - ddl-auto: update - show-sql: true # 실행되는 SQL 쿼리 출력 - database-platform: org.hibernate.dialect.PostgreSQLDialect + default_schema: company_service + dialect: org.hibernate.dialect.PostgreSQLDialect + hibernate: + ddl-auto: update + show-sql: true +# datasource: +# url: jdbc:postgresql://localhost:5432/company-service +# username: myuser +# password: mypassword +# driver-class-name: org.postgresql.Driver +# jpa: +# hibernate: +# ddl-auto: update +# show-sql: true # 실행되는 SQL 쿼리 출력 +# database-platform: org.hibernate.dialect.PostgreSQLDialect springdoc: api-docs: From 647cb3080e16c884e9215e40e6378d5dd210cbf5 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 17:29:28 +0900 Subject: [PATCH 314/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20=EB=9D=BC?= =?UTF-8?q?=EC=9A=B0=ED=8C=85=20=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gateway/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index bf88979..188cf87 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -57,7 +57,7 @@ spring: - id: hub-service uri: lb://hub-service predicates: - - Path=/api/v1/hubs/** + - Path=/api/v1/(hubs|hub-routes|hub-shipping-scan)/** - id: hub-docs uri: lb://hub-service predicates: From f0c4e3ece7ed6b36c80aef656058cf46c464211c Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 17:30:50 +0900 Subject: [PATCH 315/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20swagger=20?= =?UTF-8?q?=EC=97=90=20=ED=95=84=EC=9A=94=ED=95=9C=20yml=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hub-service/src/main/resources/application.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/hub-service/src/main/resources/application.yml b/hub-service/src/main/resources/application.yml index 398e44a..bc941ce 100644 --- a/hub-service/src/main/resources/application.yml +++ b/hub-service/src/main/resources/application.yml @@ -29,6 +29,15 @@ eureka: instance: prefer-ip-address: true +springdoc: + api-docs: + version: openapi_3_1 + enabled: true + path: /hub-service/v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui.html + shipping: service: url: http://localhost:8081/api/v1/shippings From 62af1f766295606e33a8808db124d8b4a285e2e1 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 17:31:31 +0900 Subject: [PATCH 316/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20swagger=20?= =?UTF-8?q?=EC=97=90=20=ED=95=84=EC=9A=94=ED=95=9C=20=EC=96=B4=EB=85=B8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/sparta/hubservice/HubServiceApplication.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hub-service/src/main/java/com/sparta/hubservice/HubServiceApplication.java b/hub-service/src/main/java/com/sparta/hubservice/HubServiceApplication.java index bc59935..a31b7a1 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/HubServiceApplication.java +++ b/hub-service/src/main/java/com/sparta/hubservice/HubServiceApplication.java @@ -1,11 +1,14 @@ package com.sparta.hubservice; +import com.sparta.commonmodule.config.SwaggerConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.Import; @SpringBootApplication(scanBasePackages = "com.sparta") @EnableFeignClients +@Import(SwaggerConfig.class) public class HubServiceApplication { public static void main(String[] args) { From 9ce8cadd143b347aa40399401ccd5e98eea0eecf Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 17:31:50 +0900 Subject: [PATCH 317/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20swagger=20?= =?UTF-8?q?=EC=97=90=20=ED=95=84=EC=9A=94=ED=95=9C=20Controller=20?= =?UTF-8?q?=EB=8B=A8=EC=97=90=EC=84=9C=EC=9D=98=20=EC=96=B4=EB=85=B8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EC=85=98=EB=93=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub/presentation/controller/HubController.java | 13 +++++++++++-- .../controller/HubShippingScanController.java | 8 ++++++-- .../presentation/controller/HubRouteController.java | 12 ++++++++++-- .../controller/HubRouteFeignController.java | 4 ++++ 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java index bc4d2f7..41b8f74 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java @@ -1,12 +1,14 @@ package com.sparta.hubservice.hub.presentation.controller; import com.sparta.commonmodule.aop.RoleCheck; +import com.sparta.hubservice.hub.application.dto.request.HubRequestDto; import com.sparta.hubservice.hub.application.dto.response.HubCreateResponseDto; import com.sparta.hubservice.hub.application.dto.response.HubDeleteResponseDto; -import com.sparta.hubservice.hub.application.dto.request.HubRequestDto; import com.sparta.hubservice.hub.application.dto.response.HubResponseDto; import com.sparta.hubservice.hub.application.dto.response.HubUpdateResponseDto; import com.sparta.hubservice.hub.application.service.HubService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import java.util.UUID; import lombok.RequiredArgsConstructor; @@ -28,11 +30,13 @@ @RestController @RequestMapping("/api/v1/hubs") @RequiredArgsConstructor +@Tag(name = "Hub Service", description = "허브 서비스 API") public class HubController { private final HubService hubService; - // 허브 목록 검색 + // 허브 전체 조회 + @Operation(summary = "Hub 전체 조회", description = "허브 전체 조회 api") @GetMapping public ResponseEntity> getHubs( @PageableDefault(page = 0, size = 30, sort = "createdAt") Pageable pageable) { @@ -41,6 +45,7 @@ public ResponseEntity> getHubs( } // 특정 허브 조회 + @Operation(summary = "Hub 단일 조회", description = "허브 단일 조회 api") @GetMapping("/{hub_id}") public ResponseEntity getHubById(@PathVariable("hub_id") UUID hubId) { HubResponseDto responseDto = hubService.getHub(hubId); @@ -48,6 +53,7 @@ public ResponseEntity getHubById(@PathVariable("hub_id") UUID hu } // 허브 검색 + @Operation(summary = "Hub 검색", description = "허브 검색 api") @GetMapping("/search") public ResponseEntity> getSearchHubs( @RequestParam(required = false) String name, @@ -58,6 +64,7 @@ public ResponseEntity> getSearchHubs( } // 허브 생성 + @Operation(summary = "Hub 생성", description = "허브 생성 api") @RoleCheck("ROLE_MASTER") @PostMapping public ResponseEntity createHub(@RequestBody @Valid HubRequestDto requestDto,@RequestHeader("user-id") Long userId) { @@ -66,6 +73,7 @@ public ResponseEntity createHub(@RequestBody @Valid HubReq } // 허브 수정 + @Operation(summary = "Hub 수정", description = "허브 수정 api") @RoleCheck("ROLE_MASTER") @PutMapping("{hub_id}") public ResponseEntity updateHub(@PathVariable("hub_id") UUID hubId, @RequestParam String address, @RequestHeader("user-id") Long userId) { @@ -74,6 +82,7 @@ public ResponseEntity updateHub(@PathVariable("hub_id") UU } // 허브 삭제 + @Operation(summary = "Hub 삭제", description = "허브 삭제 api") @RoleCheck("ROLE_MASTER") @DeleteMapping("{hub_id}") public ResponseEntity deleteHub(@PathVariable("hub_id") UUID hubId, @RequestHeader("user-id") Long userId) { diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java index 4b67945..3a80b28 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java @@ -3,6 +3,8 @@ import com.sparta.hubservice.hub.application.service.HubShippingScanService; import com.sparta.hubservice.hub.infrastructure.feignclient.dto.InboundStatusResponseDto; import com.sparta.hubservice.hub.infrastructure.feignclient.dto.OutboundStatusResponseDto; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -10,17 +12,18 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor -@RequestMapping("/api/v1/shipping-scan") +@RequestMapping("/api/v1/hub-shipping-scan") +@Tag(name = "Hub Service", description = "허브 서비스 API") public class HubShippingScanController { private final HubShippingScanService hubShippingScanService; // 입고 처리 저장 + @Operation(summary = "Hub - 상품 입고처리", description = "허브 내 상품 입고처리 api") @PostMapping("/{hub_id}/{shipping_id}/inbound-log") public ResponseEntity inboundStatus( @PathVariable("hub_id") UUID hubId, @@ -34,6 +37,7 @@ public ResponseEntity inboundStatus( } // 출고 처리 저장 + @Operation(summary = "Hub - 상품 출고처리", description = "허브 내 상품 출고처리 api") @PostMapping("/{hub_id}/{shipping_id}/outbound-log") public ResponseEntity outboundStatus( @PathVariable("hub_id") UUID hubId, diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java index f559986..8ad3019 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java @@ -7,9 +7,10 @@ import com.sparta.hubservice.hub_route.application.dto.response.HubRouteDetailsResponseDto; import com.sparta.hubservice.hub_route.application.dto.response.HubRouteResponseDto; import com.sparta.hubservice.hub_route.application.service.HubRouteService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import java.util.UUID; import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Role; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; @@ -20,17 +21,18 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/v1/hub-routes") @RequiredArgsConstructor +@Tag(name = "Hub Service", description = "허브 서비스 API") public class HubRouteController { private final HubRouteService hubRouteService; // 전체 허브 간 경로 목록 조회 (direct) + @Operation(summary = "Hub Route", description = "전체 허브 간 경로 조회 api") @GetMapping public ResponseEntity> getHubRoutes( @PageableDefault(page = 0, size = 30, sort = "createdAt") Pageable pageable){ @@ -39,6 +41,7 @@ public ResponseEntity> getHubRoutes( } // 특정 경로 ID 조회 + @Operation(summary = "Hub Route", description = "id기반 허브 간 경로 조회 api") @GetMapping("/{hub_route_id}") public ResponseEntity getHubRoute(@PathVariable("hub_route_id") UUID hubRouteId) { HubRouteResponseDto response = hubRouteService.getHubRoute(hubRouteId); @@ -46,6 +49,7 @@ public ResponseEntity getHubRoute(@PathVariable("hub_route_ } // 특정 출발 허브 → 도착 허브 경로 조회 (direct) + @Operation(summary = "Hub Route", description = "from->to 허브 간 경로 조회 api") @GetMapping("/{from_hub_id}/{to_hub_id}/direct") public ResponseEntity getDirectHubRoute( @PathVariable("from_hub_id") UUID fromHubId, @@ -55,6 +59,7 @@ public ResponseEntity getDirectHubRoute( } // (정해진) 허브 간 경로 생성 (direct) + @Operation(summary = "Hub Route", description = "from->to 허브 간 경로 생성 api") @RoleCheck("ROLE_MASTER") @PostMapping("/{from_hub_id}/{to_hub_id}/direct") public ResponseEntity createDirectHubRoute( @@ -67,6 +72,7 @@ public ResponseEntity createDirectHubRoute( } // 허브 간 경로 정보 삭제 + @Operation(summary = "Hub Route", description = "허브 간 경로 삭제 api") @RoleCheck("ROLE_MASTER") @DeleteMapping("/{hub_route_id}") public ResponseEntity deleteHubRoute( @@ -77,6 +83,7 @@ public ResponseEntity deleteHubRoute( } // form -> to 최단경로 생성 (다이렉트는 항상 최단경로) + @Operation(summary = "Hub Route - Checkpoint", description = "허브 간 최단 경로 생성 api") @RoleCheck("ROLE_MASTER") @PostMapping("/{from_hub_id}/{to_hub_id}/path") public ResponseEntity createPathHubRoute( @@ -90,6 +97,7 @@ public ResponseEntity createPathHubRoute( } // fromHub -> toHub 최단 경로 정보 조회 + @Operation(summary = "Hub Route - Checkpoint", description = "허브 간 최단 경로 조회 api") @GetMapping("/{from_hub_id}/{to_hub_id}/path") public ResponseEntity getPathHubRoute( @PathVariable("from_hub_id") UUID fromHubId, diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteFeignController.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteFeignController.java index e392bb7..62be262 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteFeignController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteFeignController.java @@ -2,6 +2,8 @@ import com.sparta.hubservice.hub_route.application.dto.response.HubRouteDetailsResponseDto; import com.sparta.hubservice.hub_route.application.service.HubRouteService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -13,10 +15,12 @@ @RestController @RequiredArgsConstructor @RequestMapping("/api/v1/hub-route/feign") +@Tag(name = "Hub Service", description = "허브 서비스 API") public class HubRouteFeignController { private final HubRouteService hubRouteService; + @Operation(summary = "Hub Route - Checkpoint : Feign", description = "허브 간 최단 경로 조회 api") @GetMapping("/{from_id}/{to_id}/path") public ResponseEntity getHubRouteDetails( @PathVariable("from_id") UUID fromId, From 9d1dc2d382f96856de46444380259bc67d4d4b73 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Mon, 24 Mar 2025 17:58:36 +0900 Subject: [PATCH 318/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#191]?= =?UTF-8?q?=20:=20AuditorAwareImpl=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commonmodule/config/AuditorAwareImpl.java | 33 ------------ .../config/JpaAuditingConfig.java | 2 +- .../commonmodule/entity/AuditorAwareImpl.java | 51 +++++++++++++++++++ .../product/ProductServiceApplication.java | 3 +- 4 files changed, 54 insertions(+), 35 deletions(-) delete mode 100644 common-module/src/main/java/com/sparta/commonmodule/config/AuditorAwareImpl.java create mode 100644 common-module/src/main/java/com/sparta/commonmodule/entity/AuditorAwareImpl.java diff --git a/common-module/src/main/java/com/sparta/commonmodule/config/AuditorAwareImpl.java b/common-module/src/main/java/com/sparta/commonmodule/config/AuditorAwareImpl.java deleted file mode 100644 index e35e4f9..0000000 --- a/common-module/src/main/java/com/sparta/commonmodule/config/AuditorAwareImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -//package com.sparta.commonmodule.config; -// -//import java.util.Optional; -//import org.springframework.data.domain.AuditorAware; -//import org.springframework.security.core.Authentication; -//import org.springframework.security.core.context.SecurityContextHolder; -// - -// 각 모듈에 시큐리티 적용 후 적용 예정 - -//public class AuditorAwareImpl implements AuditorAware { -// -// @Override -// public Optional getCurrentAuditor() { -// Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); -// if (authentication == null || !authentication.isAuthenticated()) { -// return Optional.empty(); -// } -// Object principal = authentication.getPrincipal(); -// -// if (principal instanceof String idStr) { -// try { -// return Optional.of(Long.parseLong(idStr)); -// } catch (NumberFormatException e) { -// return Optional.empty(); -// } -// } else if (principal instanceof Long idLong) { -// return Optional.of(idLong); -// } -// -// return Optional.empty(); -// } -//} diff --git a/common-module/src/main/java/com/sparta/commonmodule/config/JpaAuditingConfig.java b/common-module/src/main/java/com/sparta/commonmodule/config/JpaAuditingConfig.java index c908bcc..9257896 100644 --- a/common-module/src/main/java/com/sparta/commonmodule/config/JpaAuditingConfig.java +++ b/common-module/src/main/java/com/sparta/commonmodule/config/JpaAuditingConfig.java @@ -4,7 +4,7 @@ import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @Configuration -@EnableJpaAuditing(auditorAwareRef = "auditorAwareImpl") +@EnableJpaAuditing public class JpaAuditingConfig { } diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/AuditorAwareImpl.java b/common-module/src/main/java/com/sparta/commonmodule/entity/AuditorAwareImpl.java new file mode 100644 index 0000000..8eb45da --- /dev/null +++ b/common-module/src/main/java/com/sparta/commonmodule/entity/AuditorAwareImpl.java @@ -0,0 +1,51 @@ +package com.sparta.commonmodule.entity; + +import org.springframework.data.domain.AuditorAware; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import jakarta.servlet.http.HttpServletRequest; +import java.util.Optional; + +/** + * Spring Data JPA의 AuditorAware 구현체 + * HTTP 요청의 `X-User-Id` 헤더 값을 기반으로 @CreatedBy, @LastModifiedBy 값을 자동 설정 + */ +@Component +public class AuditorAwareImpl implements AuditorAware { + + /** + * 현재 요청을 보낸 사용자의 ID를 반환 (Auditing 기능에서 호출됨) + * @return Optional - 요청에서 추출한 사용자 ID (없으면 null) + */ + @Override + public Optional getCurrentAuditor() { + Long userId = getUserIdFromHeader(); + return Optional.ofNullable(userId); + } + + /** + * HTTP 요청에서 'X-User-Id' 헤더 값을 가져와 Long 타입으로 변환 + * @return Long - 변환된 사용자 ID (없으면 null) + */ + private Long getUserIdFromHeader() { + // 현재 요청의 정보를 가져옴 + ServletRequestAttributes attributes = + (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + + if (attributes != null) { + HttpServletRequest request = attributes.getRequest(); + String userIdHeader = request.getHeader("user_id"); // 헤더에서 사용자 ID 가져오기 + + if (userIdHeader != null) { + try { + return Long.parseLong(userIdHeader); // String → Long 변환 + } catch (NumberFormatException e) { + return null; + } + } + } + return null; + } +} \ No newline at end of file diff --git a/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java b/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java index 844498f..8fbdd84 100644 --- a/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java +++ b/product-service/src/main/java/com/sparta/product/ProductServiceApplication.java @@ -1,5 +1,6 @@ package com.sparta.product; +import com.sparta.commonmodule.config.JpaAuditingConfig; import com.sparta.commonmodule.config.SwaggerConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -8,7 +9,7 @@ @SpringBootApplication(scanBasePackages = "com.sparta") @EnableFeignClients -@Import(SwaggerConfig.class) +@Import({SwaggerConfig.class, JpaAuditingConfig.class}) public class ProductServiceApplication { public static void main(String[] args) { From b36d00c80f55991b2c327a82e4e09d76878ac0bf Mon Sep 17 00:00:00 2001 From: jin2304 Date: Mon, 24 Mar 2025 17:58:58 +0900 Subject: [PATCH 319/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#191]?= =?UTF-8?q?=20:=20BaseEntity=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20@SQLRestri?= =?UTF-8?q?ction=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Product 엔티티에 @SQLRestriction("is_deleted IS FALSE") 적용 - 논리적으로 삭제된 데이터는 자동으로 조회에서 제외되도록 설정 - 쿼리 실행 시 Hibernate가 WHERE is_deleted IS FALSE 조건을 자동 추가함 - ex) SELECT * FROM product WHERE is_deleted IS FALSE --- .../main/java/com/sparta/commonmodule/entity/BaseEntity.java | 2 +- .../src/main/java/com/sparta/product/domain/model/Product.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java b/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java index 8eef6ac..eb8eed6 100644 --- a/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java +++ b/common-module/src/main/java/com/sparta/commonmodule/entity/BaseEntity.java @@ -40,7 +40,7 @@ public class BaseEntity { @Column(name = "is_deleted") @ColumnDefault("FALSE") - private Boolean isDeleted; + private Boolean isDeleted = false; @Column(name = "deleted_at", nullable = true) diff --git a/product-service/src/main/java/com/sparta/product/domain/model/Product.java b/product-service/src/main/java/com/sparta/product/domain/model/Product.java index 54a0a3c..68b21ca 100644 --- a/product-service/src/main/java/com/sparta/product/domain/model/Product.java +++ b/product-service/src/main/java/com/sparta/product/domain/model/Product.java @@ -7,6 +7,7 @@ import com.sparta.product.presentation.dto.response.CreateProductResponseDto; import jakarta.persistence.*; import lombok.*; +import org.hibernate.annotations.SQLRestriction; import java.math.BigDecimal; import java.util.UUID; @@ -17,6 +18,7 @@ @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PRIVATE) +@SQLRestriction("is_deleted IS FALSE") @Builder(access = AccessLevel.PRIVATE) public class Product extends BaseEntity { From 02c79ef3bb64ada3a9983af35cb6b91b51990a1a Mon Sep 17 00:00:00 2001 From: jin2304 Date: Mon, 24 Mar 2025 18:00:33 +0900 Subject: [PATCH 320/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#191]?= =?UTF-8?q?=20:=20=EC=83=81=ED=92=88=20=EC=83=9D=EC=84=B1/=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sparta/product/presentation/ProductController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java index febc3f6..9b1b63d 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java +++ b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java @@ -32,7 +32,7 @@ public class ProductController { @Operation(summary = "Product 등록", description = "Product 생성 api 입니다.") @PostMapping public ResponseEntity createProduct(@RequestBody CreateProductRequestDto requestDto, - @RequestHeader(value = "X-User-Id", required = true) Long userId) { + @RequestHeader(value = "user_id", required = true) Long userId) { return ResponseEntity.ok(productServiceImpl.createProduct(requestDto, userId)); } @@ -72,7 +72,7 @@ public ResponseEntity updateProduct(@PathVariable UUID */ @DeleteMapping("/{productId}") public ResponseEntity deleteProduct(@PathVariable UUID productId, - @RequestHeader(value = "X-User-Id", required = true) Long userId) { + @RequestHeader(value = "user_id", required = true) Long userId) { productServiceImpl.deleteProduct( DeleteProductServiceRequestDto.of(userId, productId)); return ResponseEntity.noContent().build(); From 72095267e30743473bedae2e6a4cc7996e70eff6 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Mon, 24 Mar 2025 18:02:00 +0900 Subject: [PATCH 321/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#191]?= =?UTF-8?q?=20:=20=EC=83=81=ED=92=88=20api=20=EA=B6=8C=ED=95=9C=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 --- .../sparta/product/presentation/ProductController.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java index 9b1b63d..57218a5 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java +++ b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java @@ -1,5 +1,6 @@ package com.sparta.product.presentation; +import com.sparta.commonmodule.aop.RoleCheck; import com.sparta.product.application.dto.DeleteProductServiceRequestDto; import com.sparta.product.application.dto.DecreaseProductQuantityServiceRequestDto; import com.sparta.product.application.dto.IncreaseProductQuantityServiceRequestDto; @@ -30,6 +31,7 @@ public class ProductController { * 상품 생성 */ @Operation(summary = "Product 등록", description = "Product 생성 api 입니다.") + @RoleCheck("ROLE_MASTER, ROLE_HUB, ROLE_COMPANY") @PostMapping public ResponseEntity createProduct(@RequestBody CreateProductRequestDto requestDto, @RequestHeader(value = "user_id", required = true) Long userId) { @@ -41,6 +43,7 @@ public ResponseEntity createProduct(@RequestBody Creat * 상품 단일 조회 */ @Operation(summary = "Product 단일 조회", description = "Product 단일 조회 api 입니다.") + @RoleCheck("ROLE_MASTER, ROLE_HUB, ROLE_COMPANY, ROLE_SHIPPING") @GetMapping("/{productId}") public ResponseEntity readProduct(@PathVariable UUID productId) { return ResponseEntity.ok(productServiceImpl.readProduct(productId)); @@ -50,6 +53,7 @@ public ResponseEntity readProduct(@PathVariable UUID pro /** * 상품 목록 조회 */ + @RoleCheck("ROLE_MASTER, ROLE_HUB, ROLE_COMPANY, ROLE_SHIPPING") @GetMapping public ResponseEntity> readAllProduct() { return ResponseEntity.ok(productServiceImpl.readAllProduct()); @@ -59,6 +63,7 @@ public ResponseEntity> readAllProduct() { /** * 상품 수정 */ + @RoleCheck("ROLE_MASTER, ROLE_HUB, ROLE_COMPANY") @PutMapping("/{productId}") public ResponseEntity updateProduct(@PathVariable UUID productId, @RequestBody UpdateProductRequestDto requestDto) { @@ -70,6 +75,7 @@ public ResponseEntity updateProduct(@PathVariable UUID /** * 상품 삭제 */ + @RoleCheck("ROLE_MASTER, ROLE_HUB") @DeleteMapping("/{productId}") public ResponseEntity deleteProduct(@PathVariable UUID productId, @RequestHeader(value = "user_id", required = true) Long userId) { @@ -82,6 +88,7 @@ public ResponseEntity deleteProduct(@PathVariable UUID productId, /** * 상품 검색 */ + @RoleCheck("ROLE_MASTER, ROLE_HUB, ROLE_COMPANY, ROLE_SHIPPING") @GetMapping("/search") public ResponseEntity> searchProducts(@ModelAttribute SearchProductRequestDto requestDto, Pageable pageable) { @@ -92,6 +99,7 @@ public ResponseEntity> searchProducts(@ModelAttri /** * 상품 수정(재고 감소) */ + @RoleCheck("ROLE_MASTER, ROLE_HUB, ROLE_COMPANY") @PutMapping("/{productId}/decrease") public ResponseEntity decreaseProductQuantity(@PathVariable UUID productId, @RequestBody DecreaseProductQuantityRequestDto requestDto) { @@ -103,6 +111,7 @@ public ResponseEntity decreaseProductQuantit /** * 상품 수정(재고 증가) */ + @RoleCheck("ROLE_MASTER, ROLE_HUB, ROLE_COMPANY") @PutMapping("/{productId}/increase") public ResponseEntity increaseProductQuantity(@PathVariable UUID productId, @RequestBody IncreaseProductQuantityRequestDto requestDto) { From 67cf7564ee05006aac399c2f7579069b43b20374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=EC=9D=80=E2=98=98?= <138298079+devdaeun@users.noreply.github.com> Date: Mon, 24 Mar 2025 19:44:14 +0900 Subject: [PATCH 322/389] Update README.md --- README.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index d1a1542..34fc604 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,6 @@ Logistics-delivery # 프로젝트 소개 - > 물류 관리 시스템이 달성해야 하는 기술적 목표와, 우리팀이 집중한 구현 목표를 포함한 간략한 개요 ## 핵심기술 목표 ### 1. MSA 기반 시스템 설계 및 구현 @@ -81,11 +80,11 @@ Logistics-delivery # 설계 산출물 - - [[도메인 다이어그램]] - - [[테이블 설계서]] - - [[ERD]] - - [[API 명세서]] - - [[인프라 설계서]] + - [[도메인 다이어그램]](https://github.com/logistics-delivery/Back-end/wiki/%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8-&-%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%8B%B4%EB%8B%B9%EC%9E%90-%EB%AA%A9%EB%A1%9D) + - [[테이블 설계서]](https://github.com/logistics-delivery/Back-end/wiki/%ED%85%8C%EC%9D%B4%EB%B8%94-%EB%AA%85%EC%84%B8%EC%84%9C) + - [[ERD]](https://github.com/logistics-delivery/Back-end/wiki/ERD-%EB%AA%85%EC%84%B8%EC%84%9C) + - [[API 명세서]](https://github.com/logistics-delivery/Back-end/wiki/API-%EB%AA%85%EC%84%B8%EC%84%9C) + - [[인프라 설계서]](https://github.com/logistics-delivery/Back-end/wiki/%EC%9D%B8%ED%94%84%EB%9D%BC-%EC%84%A4%EA%B3%84%EC%84%9C) - [[Conventions]] : 우리 조의 개발 규칙 - [[Commit Message Conventions]] - [[Java Code Style]] @@ -135,9 +134,9 @@ Logistics-delivery | **역할** | **담당자** | **세부 업무** | |-------------------------|:---------------------:|------------------------------------| | **인증인가,
사용자API** | 신다은
(팀장) | - 회원가입,로그인 등의 사용자 정보CRUD 구현
- 로그인 성공 시 JWT 토큰을 생성하여 사용자에게 전달되도록 함
- JWT 토큰을 사용하여 회원정보를 인증, 내부payload값을 추출하여 서브모듈에서 사용가능하도록 구현
- 인증된 정보를 바탕으로 사용자의 권한이 요청 url에 접근가능한지 gateway에서 우선적으로 인가처리를 할 수 있도록 구현
- 세부 API 기능별로 AOP에서 인가처리를 추가적으로 진행하도록 구현| -|**슬랙API**|신다은
(팀장) | - 슬랙 메세지 관리 CRUD 구현
- 슬랙 외부 API를 연동하여 메세지 발송 시 실제 슬랙 사이트로 알림메세지가 전송되도록 함.
- Base Entity를 사용한 생성,수정,삭제 기록 저장 및 SoftDelete 구현| -|**허브API**|이소현
(테크리드) | - | +|**슬랙API**|신다은
(팀장) | - 슬랙 메세지 관리 CRUD 구현
- 슬랙 외부 API를 연동하여 메세지 발송 시 실제 슬랙 사이트로 알림메세지가 전송되도록 함.
- Base Entity를 사용한 생성,수정,삭제 기록 저장 및 SoftDelete 구현
- QueryDSL을 이용한 슬랙 메세지 검색기능 구현| +|**허브API**|이소현
(테크리드) | - 허브 정보, 허브간 경로 CRUD 구현
- 허브 검색 기능 (Query DSL) 구현
- 최단 경로를 위한 허브간 경로 체크포인트 생성 및 조회 구현
-허브 내 배송품 입고 및 출고 처리 기능 구현 | |**상품API**|서진영
(테크리드) | - | |**배송API**|권길남 | - | -|**업체API**|원지윤 | - | -|**주문API**|이용재 | - | +|**업체API**|원지윤 | - Company-service CRUD 개발 및 Spring Boot 기반 4계층 아키텍처 적용
- QueryDSL 기반 동적 검색 조건 및 페이징 기능 구현
- HTTP API 테스트, 도메인 및 서비스 계층 테스트 코드 작성| +|**주문API**|이용재 | - 주문 CRUD 구현
- 주문 생성 시 Product 서비스에 재고 차감 요청 기능 연동 (FeignClient 사용)
- 주문 생성 시 Shipping 서비스에 배송 생성 요청 기능 연동 (FeignClient 사용)
- Slack 도메인 연동을 위한 주문 + 배송 정보 응답 API 제공
- QueryDSL을 활용한 주문 검색 기능 구현 (주문명 + 상태 검색)| From 07aabdc4749a84e7add44d3aabaf5003bfc863f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=EC=9D=80=E2=98=98?= <138298079+devdaeun@users.noreply.github.com> Date: Mon, 24 Mar 2025 19:52:17 +0900 Subject: [PATCH 323/389] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 34fc604..1c091e6 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,6 @@ Logistics-delivery |**슬랙API**|신다은
(팀장) | - 슬랙 메세지 관리 CRUD 구현
- 슬랙 외부 API를 연동하여 메세지 발송 시 실제 슬랙 사이트로 알림메세지가 전송되도록 함.
- Base Entity를 사용한 생성,수정,삭제 기록 저장 및 SoftDelete 구현
- QueryDSL을 이용한 슬랙 메세지 검색기능 구현| |**허브API**|이소현
(테크리드) | - 허브 정보, 허브간 경로 CRUD 구현
- 허브 검색 기능 (Query DSL) 구현
- 최단 경로를 위한 허브간 경로 체크포인트 생성 및 조회 구현
-허브 내 배송품 입고 및 출고 처리 기능 구현 | |**상품API**|서진영
(테크리드) | - | -|**배송API**|권길남 | - | +|**배송API**|권길남 | - 배송, 배송 로그, 배송 담당자 CRUD 구현
- 배송 담당자 배정 알고리즘 구현
- QueryDSL을 사용한 배송정보 검색기능 구현 | |**업체API**|원지윤 | - Company-service CRUD 개발 및 Spring Boot 기반 4계층 아키텍처 적용
- QueryDSL 기반 동적 검색 조건 및 페이징 기능 구현
- HTTP API 테스트, 도메인 및 서비스 계층 테스트 코드 작성| |**주문API**|이용재 | - 주문 CRUD 구현
- 주문 생성 시 Product 서비스에 재고 차감 요청 기능 연동 (FeignClient 사용)
- 주문 생성 시 Shipping 서비스에 배송 생성 요청 기능 연동 (FeignClient 사용)
- Slack 도메인 연동을 위한 주문 + 배송 정보 응답 API 제공
- QueryDSL을 활용한 주문 검색 기능 구현 (주문명 + 상태 검색)| From 4a47f63d249bea3310d052d4d38542044fad5db9 Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Mon, 24 Mar 2025 21:07:35 +0900 Subject: [PATCH 324/389] =?UTF-8?q?=E2=9C=A8feat=20[#179]:=20Hub=EC=99=80?= =?UTF-8?q?=20FeignClient=EB=A1=9C=20=ED=86=B5=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/CreateRouteLogRequestDto.java | 89 ++++++++++------- .../response/ShippingRouteResponseDto.java | 76 ++++++++++----- .../application/service/ShippingService.java | 40 +++----- .../domain/model/Shipping.java | 16 +++- .../domain/model/ShippingCheckpoint.java | 36 +++++++ .../domain/model/ShippingRouteLog.java | 65 ++++++------- .../domain/model/trans/ShippingSelf.java | 34 +++---- .../infrastructure/client/HubClient.java | 19 ++++ .../client/HubRouteDetailsResponseDto.java | 96 +++++++++++++++++++ .../ShippingLogSearchRepository.java | 7 ++ .../presentation/ShippingController.java | 6 +- .../src/main/resources/application.yaml | 4 +- 12 files changed, 339 insertions(+), 149 deletions(-) create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingCheckpoint.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/client/HubClient.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/client/HubRouteDetailsResponseDto.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingLogSearchRepository.java diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateRouteLogRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateRouteLogRequestDto.java index fa25a34..01035aa 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateRouteLogRequestDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/CreateRouteLogRequestDto.java @@ -1,53 +1,70 @@ package com.sparta.shippingservice.application.dto.request; -import com.sparta.shippingservice.domain.model.trans.RouteLogSelf; -import com.sparta.shippingservice.domain.model.Shipping; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotNull; +import com.sparta.shippingservice.domain.model.ShippingCheckpoint; +import com.sparta.shippingservice.domain.model.ShippingRouteLog; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; import java.math.BigDecimal; +import java.util.List; import java.util.UUID; -public record CreateRouteLogRequestDto( +@Setter +@Getter +@Builder +@AllArgsConstructor +public class CreateRouteLogRequestDto { + private UUID hubRouteId; + private UUID fromHubId; + private UUID toHubId; + private int duration; + private BigDecimal distance; + private List checkpoints; + + public ShippingRouteLog toEntity() { + ShippingRouteLog route = ShippingRouteLog.builder() + .hubRouteId(hubRouteId) + .fromHubId(fromHubId) + .toHubId(toHubId) + .duration(duration) + .distance(distance) + .build(); + // 체크포인트 추가 + if (checkpoints != null) { + for (CheckpointSaveDto cp : checkpoints) { + route.addCheckpoint(cp.toEntity()); + } + } + return route; + } + + @Getter + @Builder + @AllArgsConstructor + public static class CheckpointSaveDto { + private int orderIndex; + private UUID hubId; + private String hubName; + public ShippingCheckpoint toEntity() { + return ShippingCheckpoint.builder() + .orderIndex(orderIndex) + .hubId(hubId) + .hubName(hubName) + .build(); + } + } +} - Shipping shipping, - @NotNull(message = "출발 허브 ID는 필수입니다.") - UUID startHubId, - @NotNull(message = "도착 허브 ID는 필수입니다.") - UUID endHubId, - @NotNull(message = "배송 순번은 필수입니다.") - @Min(value = 1, message = "배송 순번은 1 이상이어야 합니다.") - Integer sequence, - @NotNull(message = "예상 거리 입력은 필수입니다.") - BigDecimal estimatedDistance, - @NotNull(message = "예상 시간 입력은 필수입니다.") - @Min(value = 1, message = "예상 시간은 1분 이상이어야 합니다.") - Integer estimatedTime, - BigDecimal actualDistance, // 실측 데이터는 선택값일 수 있음 - Integer actualTime, // 마찬가지로 선택값 - @NotNull(message = "배송 담당자 ID는 필수입니다.") - UUID shippingManagerId -) { - public RouteLogSelf of() { - return new RouteLogSelf( - this.startHubId(), - this.endHubId(), - this.sequence(), - this.estimatedDistance(), - this.estimatedTime(), - this.actualDistance(), - this.actualTime(), - this.shippingManagerId() - ); - } -} \ No newline at end of file diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingRouteResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingRouteResponseDto.java index cb5aee0..b294a38 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingRouteResponseDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingRouteResponseDto.java @@ -1,33 +1,61 @@ package com.sparta.shippingservice.application.dto.response; - +import com.sparta.shippingservice.domain.model.ShippingCheckpoint; import com.sparta.shippingservice.domain.model.ShippingRouteLog; - +import lombok.Builder; import java.math.BigDecimal; +import java.util.List; import java.util.UUID; - +@Builder public record ShippingRouteResponseDto( UUID id, - UUID startHubId, - UUID endHubId, - Integer sequence, - BigDecimal estimatedDistance, - Integer estimatedTime, - BigDecimal actualDistance, - Integer actualTime, - UUID shippingManagerId + UUID hubRouteId, + UUID fromHubId, + UUID toHubId, + int duration, + BigDecimal distance, + List checkpoints ) { - public static ShippingRouteResponseDto from(ShippingRouteLog shippingRouteLog) { - return new ShippingRouteResponseDto( - shippingRouteLog.getId(), - shippingRouteLog.getStartHubId(), - shippingRouteLog.getEndHubId(), - shippingRouteLog.getSequence(), - shippingRouteLog.getEstimatedDistance(), - shippingRouteLog.getEstimatedTime(), - shippingRouteLog.getActualDistance(), - shippingRouteLog.getActualTime(), - shippingRouteLog.getShippingManagerId() - ); + public static ShippingRouteResponseDto from(ShippingRouteLog routeLog) { + return ShippingRouteResponseDto.builder() + .id(routeLog.getId()) + .hubRouteId(routeLog.getHubRouteId()) + .fromHubId(routeLog.getFromHubId()) + .toHubId(routeLog.getToHubId()) + .duration(routeLog.getDuration()) + .distance(routeLog.getDistance()) + .checkpoints( + routeLog.getCheckpoints().stream() + .map(CheckpointResponse::from) + .toList() + ) + .build(); + } + @Builder + public record CheckpointResponse( + int orderIndex, + UUID hubId, + String hubName + ) { + public static CheckpointResponse from(ShippingCheckpoint cp) { + return CheckpointResponse.builder() + .orderIndex(cp.getOrderIndex()) + .hubId(cp.getHubId()) + .hubName(cp.getHubName()) + .build(); + } } - } + + + + + + + + + + + + + + diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java index cbc2c41..09f48ad 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -12,13 +12,13 @@ import com.sparta.shippingservice.application.dto.response.ShippingSearchResult; import com.sparta.shippingservice.application.dto.response.ShippingWithRouteResponseDto; import com.sparta.shippingservice.domain.model.*; -import com.sparta.shippingservice.domain.model.trans.RouteLogSelf; import com.sparta.shippingservice.domain.repository.ShippingRepository; import com.sparta.commonmodule.exception.*; import com.sparta.shippingservice.domain.repository.ShippingRouteRepository; +import com.sparta.shippingservice.infrastructure.client.HubClient; +import com.sparta.shippingservice.infrastructure.client.HubRouteDetailsResponseDto; import com.sparta.shippingservice.infrastructure.client.ShippingManagerClient; -//import com.sparta.shippingservice.infrastructure.repository.ShippingSearchRepository; import com.sparta.shippingservice.infrastructure.repository.ShippingSearchRepository; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -41,11 +41,12 @@ public class ShippingService { private final ShippingRouteRepository shippingRouteRepository; private final ShippingManagerClient shippingManagerClient; private final ShippingSearchRepository searchRepository; + private final HubClient hubClient; //각 허브에 10명 / 업체에 10명 @Transactional - public ShippingWithRouteResponseDto create(@Valid CreateShippingRequestDto request , @Valid CreateRouteLogRequestDto logDto,Long userId) { + public ShippingWithRouteResponseDto create(@Valid CreateShippingRequestDto request ,Long userId) { ShippingManagerResponseDto manager = shippingManagerClient.assignManager(); if(manager.managerType() != ManagerType.CARRIER){ @@ -54,22 +55,12 @@ public ShippingWithRouteResponseDto create(@Valid CreateShippingRequestDto reque Shipping shipping = request.of(manager.id()).toShipping(userId); - RouteLogSelf routeLogSelf = new RouteLogSelf( - logDto.startHubId(), - logDto.endHubId(), - logDto.sequence(), - logDto.estimatedDistance(), - logDto.estimatedTime(), - logDto.actualDistance(), - logDto.actualTime(), - logDto.shippingManagerId() - - ); - ShippingRouteLog routeLog = routeLogSelf.toShippingRouteLog(); + HubRouteDetailsResponseDto pathHubRoute = hubClient.createPathHubRoute(shipping.getRouteLog().getFromHubId(),shipping.getRouteLog().getToHubId()); + ShippingRouteLog routeLog = pathHubRoute.toShippingRouteLog(); // 양방향 연관관계 설정 routeLog.setShipping(shipping); - shipping.getRouteLogs().add(routeLog); + shipping.add(routeLog); shippingRepository.save(shipping); return ShippingWithRouteResponseDto.from(shipping,routeLog); @@ -131,23 +122,14 @@ public ShippingRouteResponseDto getLogById(UUID shippingId, UUID shippingLogId){ } @Transactional(readOnly = true) - public List getLogAll(){ + public List getLogAll() { List result = shippingRouteRepository.findAll(); return result.stream() - .map(shippingRouteLog->new ShippingRouteResponseDto( - shippingRouteLog.getId(), - shippingRouteLog.getStartHubId(), - shippingRouteLog.getEndHubId(), - shippingRouteLog.getSequence(), - shippingRouteLog.getEstimatedDistance(), - shippingRouteLog.getActualTime(), - shippingRouteLog.getActualDistance(), - shippingRouteLog.getEstimatedTime(), - shippingRouteLog.getShippingManagerId() - - )).collect(Collectors.toList()); + .map(ShippingRouteResponseDto::from) + .collect(Collectors.toList()); } + @Transactional public ShippingRouteResponseDto deleteShippingLog(UUID shippingId,UUID shippingLogId, long userId) { ShippingRouteLog routeLog = shippingRouteRepository.findByIdAndShippingId(shippingLogId, shippingId) diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java index 0a080fc..fb229c1 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java @@ -31,24 +31,25 @@ public class Shipping extends BaseEntity { @Column(name = "shipping_manager_id", nullable = false) private UUID shippingManagerId; - @OneToMany(mappedBy = "shipping",cascade = CascadeType.PERSIST) - private List routeLogs = new ArrayList<>(); + @OneToOne(mappedBy = "shipping",cascade = CascadeType.PERSIST) + private ShippingRouteLog routeLog; @Enumerated(EnumType.STRING) @Column(name = "status", nullable = false, length = 50) private ShippingStatus status = ShippingStatus.PENDING; // 기본값 설정 - public Shipping(Long userId,UUID orderId, String shippingAddress, String receiverName, UUID shippingManagerId, ShippingStatus status) { + public Shipping(Long userId, UUID id, UUID orderId, String shippingAddress, String receiverName, UUID shippingManagerId, ShippingRouteLog routeLog, ShippingStatus status) { super(userId); + this.id = id; this.orderId = orderId; this.shippingAddress = shippingAddress; this.receiverName = receiverName; this.shippingManagerId = shippingManagerId; + this.routeLog = routeLog; this.status = status; } - - public Shipping updateShipping(Shipping shipping,Long userId) { + public Shipping updateShipping(Shipping shipping, Long userId) { super.update(userId); if (this.status == ShippingStatus.DELIVERED) { throw new IllegalStateException("배송이 완료된 후에는 정보를 변경할 수 없습니다."); @@ -60,6 +61,11 @@ public Shipping updateShipping(Shipping shipping,Long userId) { return this; } + public void add(ShippingRouteLog routeLog) { + this.routeLog = routeLog; + } + + @PrePersist public void prePersist(){ diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingCheckpoint.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingCheckpoint.java new file mode 100644 index 0000000..4e59e12 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingCheckpoint.java @@ -0,0 +1,36 @@ +package com.sparta.shippingservice.domain.model; + +import com.sparta.commonmodule.entity.BaseEntity; +import jakarta.persistence.*; +import lombok.*; + +import java.util.UUID; + +@Setter +@Entity +@Table(name = "shipping_checkpoint") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +public class ShippingCheckpoint extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private int orderIndex; + + @Column(nullable = false) + private UUID hubId; + + @Column(nullable = false) + private String hubName; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "shipping_route_id") + private ShippingRouteLog shippingRouteLog; + + public void setShippingRoute(ShippingRouteLog route) { + this.shippingRouteLog = route; + } +} \ No newline at end of file diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java index 9328dec..a5d0e0c 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java @@ -5,62 +5,57 @@ import jakarta.persistence.*; import lombok.*; import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; @Entity -@Table(name = "p_shipping_route_logs", - uniqueConstraints = @UniqueConstraint(columnNames = {"shipping_id", "sequence"})) // 동일 배송에 같은 순번 불가능 +@Table(name = "shipping_route") @Getter -@Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder public class ShippingRouteLog extends BaseEntity { - @Id - @Column(name = "shipping_route_log_id", nullable = false, updatable = false) private UUID id; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "shipping_id", nullable = false) - private Shipping shipping; - - @Column(name = "start_hub_id", nullable = false) - private UUID startHubId; + @Column(nullable = false) + private UUID hubRouteId; - @Column(name = "end_hub_id", nullable = false) - private UUID endHubId; + @Column(nullable = false) + private UUID fromHubId; - @Column(name = "sequence", nullable = false) - private Integer sequence; + @Column(nullable = false) + private UUID toHubId; - @Column(name = "estimated_distance", nullable = false, precision = 10, scale = 2) - private BigDecimal estimatedDistance; + @Column(nullable = false) + private int duration; // 총 소요 시간 (분) - @Column(name = "estimated_time", nullable = false) - private Integer estimatedTime; + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal distance; // 총 거리 (km 단위) + // 체크포인트들 - OneToMany - @Column(name = "actual_distance") - private BigDecimal actualDistance; + @OneToMany(mappedBy = "shippingRouteLog", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) + private List checkpoints = new ArrayList<>(); - @Column(name = "actual_time") - private Integer actualTime; + @OneToOne + @JoinColumn(name = "shipping_shipping_id") + private Shipping shipping; - @Column(name = "shipping_manager_id", nullable = false) - private UUID shippingManagerId; + // 연관관계 편의 메서드 + public void addCheckpoint(ShippingCheckpoint checkpoint) { + checkpoints.add(checkpoint); + checkpoint.setShippingRoute(this); - public ShippingRouteLog(UUID startHubId, UUID endHubId, Integer sequence, BigDecimal estimatedDistance, Integer estimatedTime, BigDecimal actualDistance, Integer actualTime, UUID shippingManagerId) { + } - this.startHubId = startHubId; - this.endHubId = endHubId; - this.sequence = sequence; - this.estimatedDistance = estimatedDistance; - this.estimatedTime = estimatedTime; - this.actualDistance = actualDistance; - this.actualTime = actualTime; - this.shippingManagerId = shippingManagerId; + public void setShipping(Shipping shipping) { + this.shipping = shipping; } + @PrePersist public void prePersist() { if (this.id == null) this.id = UUID.randomUUID(); } -} +} \ No newline at end of file diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/ShippingSelf.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/ShippingSelf.java index bb79452..a115852 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/ShippingSelf.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/ShippingSelf.java @@ -1,24 +1,26 @@ package com.sparta.shippingservice.domain.model.trans; - import com.sparta.shippingservice.domain.model.Shipping; import com.sparta.shippingservice.domain.model.ShippingStatus; - +import lombok.Builder; import java.util.UUID; - -public record ShippingSelf(UUID orderId, - String shippingAddress, - String receiverName, - UUID shippingManagerId, - ShippingStatus status) { - public Shipping toShipping(Long userId){ // DTO - > entity 전환 +@Builder +public record ShippingSelf( + UUID orderId, + String shippingAddress, + String receiverName, + UUID shippingManagerId, + ShippingStatus status +) { + public Shipping toShipping(Long userId) { return new Shipping( userId, - this.orderId, - this.shippingAddress, - this.receiverName, - this.shippingManagerId, - this.status + null, // 배송 ID는 생성 시 자동 UUID 설정 + this.orderId, + this.shippingAddress, + this.receiverName, + this.shippingManagerId, + null, // routeLog는 추후 연결 + this.status != null ? this.status : ShippingStatus.PENDING // 기본값 설정 ); } - -} +} \ No newline at end of file diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/client/HubClient.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/client/HubClient.java new file mode 100644 index 0000000..b91213b --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/client/HubClient.java @@ -0,0 +1,19 @@ +package com.sparta.shippingservice.infrastructure.client; + + + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + + +import java.util.UUID; + +@FeignClient(name = "hub-service") +public interface HubClient { + @GetMapping("/api/v1/hub-route/feign/{from_id}/{to_id}/path") + HubRouteDetailsResponseDto createPathHubRoute( + @PathVariable("from_id") UUID fromHubId, + @PathVariable("to_id") UUID toHubId + ); +} \ No newline at end of file diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/client/HubRouteDetailsResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/client/HubRouteDetailsResponseDto.java new file mode 100644 index 0000000..5403f88 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/client/HubRouteDetailsResponseDto.java @@ -0,0 +1,96 @@ +package com.sparta.shippingservice.infrastructure.client; + + +import com.sparta.shippingservice.domain.model.ShippingCheckpoint; +import com.sparta.shippingservice.domain.model.ShippingRouteLog; + +import lombok.*; + +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; + +@Setter +@Getter +@Builder +@AllArgsConstructor +@RequiredArgsConstructor +public class HubRouteDetailsResponseDto { + private UUID hubRouteId; + private UUID fromHubId; + private UUID toHubId; + private int duration; + private BigDecimal distance; + private List checkpoints; + public HubRouteDetailsResponseDto(HubRoute hubRoute, List checkpoints) { + this.hubRouteId = hubRoute.getHubRouteId(); + this.fromHubId = hubRoute.getFromHub().getHubId(); + this.toHubId = hubRoute.getToHub().getHubId(); + this.duration = hubRoute.getDuration(); + this.distance = hubRoute.getDistance(); + this.checkpoints = checkpoints; + } + + public ShippingRouteLog toShippingRouteLog() { + ShippingRouteLog routeLog = ShippingRouteLog.builder() + .hubRouteId(hubRouteId) + .fromHubId(fromHubId) + .toHubId(toHubId) + .duration(duration) + .distance(distance) + .build(); + if (checkpoints != null) { + for (CheckpointResponseDto cp : checkpoints) { + ShippingCheckpoint checkpoint = ShippingCheckpoint.builder() + .orderIndex(cp.getOrder()) + .hubId(cp.getHubId()) + .hubName(cp.getHubName()) + .build(); + routeLog.addCheckpoint(checkpoint); + } + } + return routeLog; + } + /** + * :흰색_확인_표시: Checkpoint 응답 + */ + @Setter + @Getter + @Builder + @AllArgsConstructor + public static class CheckpointResponseDto { + private final int order; + private final UUID hubId; + private final String hubName; + } + @Setter + @Getter + @Builder + @AllArgsConstructor + public static class HubRoute { + private final UUID hubRouteId; + private final Hub fromHub; + private final Hub toHub; + private final int duration; + private final BigDecimal distance; + } + @Setter + @Getter + @Builder + @AllArgsConstructor + public static class Hub { + private final UUID hubId; + private final String name; + private final String address; + private final BigDecimal latitude; + private final BigDecimal longitude; + } +} + + + + + + + + diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingLogSearchRepository.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingLogSearchRepository.java new file mode 100644 index 0000000..6b490ec --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingLogSearchRepository.java @@ -0,0 +1,7 @@ +package com.sparta.shippingservice.infrastructure.repository; + +import org.springframework.stereotype.Repository; + +@Repository +public class ShippingLogSearchRepository { +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index a9f2b9d..fc00211 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -1,5 +1,6 @@ package com.sparta.shippingservice.presentation; +import com.sparta.shippingservice.application.dto.request.CreateShippingRequestDto; import com.sparta.shippingservice.application.dto.request.CreateShippingWithRouteRequestDto; import com.sparta.shippingservice.application.dto.request.ShippingSearchCondition; import com.sparta.shippingservice.application.dto.request.UpdateShippingRequestDto; @@ -27,9 +28,8 @@ public class ShippingController { private final ShippingService shippingService; @PostMapping() // 배송 생성 - public ResponseEntity create (@Valid @RequestBody CreateShippingWithRouteRequestDto request, - @RequestHeader("userId")Long userId) { - ShippingWithRouteResponseDto responseDto = shippingService.create(request.shipping(), request.routeLog(),userId); + public ResponseEntity create (@Valid @RequestBody CreateShippingRequestDto request, @RequestHeader("userId")Long userId) { + ShippingWithRouteResponseDto responseDto = shippingService.create(request,userId); return ResponseEntity.ok(responseDto); } diff --git a/shipping-service/src/main/resources/application.yaml b/shipping-service/src/main/resources/application.yaml index 192593e..8412137 100644 --- a/shipping-service/src/main/resources/application.yaml +++ b/shipping-service/src/main/resources/application.yaml @@ -27,4 +27,6 @@ feign: client: config: shipping-manager-service: - url: http://localhost:8088 \ No newline at end of file + url: http://localhost:8088 + hub-service: + url: http://localhost:8082 \ No newline at end of file From 380ccd31207e22f859befda7bd225d8beb1f1073 Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 24 Mar 2025 21:12:19 +0900 Subject: [PATCH 325/389] =?UTF-8?q?=E2=9C=A8=20feat:=20SQLRestriction=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/sparta/orderservice/domain/model/Order.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java b/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java index ad4aad5..bca4b71 100644 --- a/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java +++ b/order-service/src/main/java/com/sparta/orderservice/domain/model/Order.java @@ -4,6 +4,7 @@ import com.sparta.commonmodule.entity.BaseEntity; import jakarta.persistence.*; import lombok.*; +import org.hibernate.annotations.SQLRestriction; import java.math.BigDecimal; import java.util.ArrayList; @@ -17,6 +18,7 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor @Builder +@SQLRestriction("is_deleted IS FALSE") public class Order extends BaseEntity { @Id From e36dd3d0d6cbbabdb3564bd2fe1a4f7e7b42a27c Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 24 Mar 2025 21:12:31 +0900 Subject: [PATCH 326/389] =?UTF-8?q?=E2=9C=A8=20feat:=20JpaAuditingConfig.c?= =?UTF-8?q?lass=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sparta/orderservice/OrderServiceApplication.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java b/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java index ac7b366..29990db 100644 --- a/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java +++ b/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java @@ -1,5 +1,6 @@ package com.sparta.orderservice; +import com.sparta.commonmodule.config.JpaAuditingConfig; import com.sparta.commonmodule.config.SwaggerConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -10,7 +11,7 @@ @EnableFeignClients(basePackages = "com.sparta.orderservice.infrastructure.client") @EnableJpaAuditing @SpringBootApplication(scanBasePackages = "com.sparta") -@Import(SwaggerConfig.class) +@Import({SwaggerConfig.class, JpaAuditingConfig.class}) public class OrderServiceApplication { public static void main(String[] args) { From c1f2d1dd217c35e3f054e6579a7b83665c18cd0f Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 21:43:37 +0900 Subject: [PATCH 327/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=ED=97=88?= =?UTF-8?q?=EB=B8=8C=EC=97=90=EC=84=9C=20=EB=B3=B4=EB=82=B8=20feign=20clie?= =?UTF-8?q?nt=20=EC=9A=94=EC=B2=AD=20=EC=B2=98=EB=A6=AC=20=EB=B0=8F=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EC=A0=80=EC=9E=A5=20-=20=ED=97=88?= =?UTF-8?q?=EB=B8=8C=20=EC=9E=85=EA=B3=A0=20=EB=82=B4=EC=97=AD=EC=9D=84=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8A=94=20?= =?UTF-8?q?entity=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?-=20=ED=97=88=EB=B8=8C=20=EC=9E=85=EA=B3=A0=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=A5=BC=20=EB=8B=B4=EC=9D=80=20response,=20request?= =?UTF-8?q?=20dto=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?-=20=ED=97=88=EB=B8=8C=20=EC=9E=85=EA=B3=A0=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EB=82=B4=EC=97=AD=EC=9D=84=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=ED=95=98=EB=8A=94=20Controller=20=EA=B5=AC=ED=98=84=20-=20?= =?UTF-8?q?=ED=97=88=EB=B8=8C=20=EC=9E=85=EA=B3=A0=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EB=82=B4=EC=97=AD=EC=9D=84=20=EA=B5=AC=ED=98=84=ED=95=98?= =?UTF-8?q?=EB=8A=94=20Service=20=EA=B5=AC=ED=98=84=20-=20=ED=97=88?= =?UTF-8?q?=EB=B8=8C=20=EC=9E=85=EA=B3=A0=20=EC=B2=98=EB=A6=AC=20=EB=82=B4?= =?UTF-8?q?=EC=97=AD=EC=9D=84=20=EC=A0=80=EC=9E=A5=ED=95=98=EB=8A=94=20Rep?= =?UTF-8?q?ository,=20RepositoryImpl,=20JpaReposiroty=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=20=EB=B0=8F=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ShippingHubScanService.java | 35 +++++++++ .../domain/model/ShippingHubScanLog.java | 74 +++++++++++++++++++ .../ShippingHubScanLogRepository.java | 8 ++ .../dto/InboundStatusRequestDto.java | 28 +++++++ .../dto/InboundStatusResponseDto.java | 33 +++++++++ .../dto/OutboundStatusRequestDto.java | 29 ++++++++ .../dto/OutboundStatusResponseDto.java | 24 ++++++ .../JpaShippingHubScanLogRepository.java | 11 +++ .../ShippingHubScanLogRepositoryImpl.java | 18 +++++ .../ShippingHubScanController.java | 36 +++++++++ 10 files changed, 296 insertions(+) create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingHubScanService.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingHubScanLog.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingHubScanLogRepository.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusRequestDto.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusResponseDto.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusRequestDto.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusResponseDto.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/JpaShippingHubScanLogRepository.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingHubScanLogRepositoryImpl.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingHubScanController.java diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingHubScanService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingHubScanService.java new file mode 100644 index 0000000..a4acc36 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingHubScanService.java @@ -0,0 +1,35 @@ +package com.sparta.shippingservice.application.service; + +import com.sparta.commonmodule.exception.ResourceNotFoundException; +import com.sparta.shippingservice.domain.model.Shipping; +import com.sparta.shippingservice.domain.model.ShippingHubScanLog; +import com.sparta.shippingservice.domain.repository.ShippingHubScanLogRepository; +import com.sparta.shippingservice.domain.repository.ShippingRepository; +import com.sparta.shippingservice.infrastructure.hub_feign.dto.InboundStatusRequestDto; +import com.sparta.shippingservice.infrastructure.hub_feign.dto.InboundStatusResponseDto; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class ShippingHubScanService { + + private final ShippingRepository shippingRepository; + private final ShippingHubScanLogRepository shippingHubScanLogRepository; + + @Transactional + public InboundStatusResponseDto createInboundLog(UUID shippingId, Long userId, InboundStatusRequestDto requestDto) { + + Shipping shipping = shippingRepository.findById(shippingId) + .orElseThrow(ResourceNotFoundException::new); + + ShippingHubScanLog log = + ShippingHubScanLog.createInboundLog(requestDto.getHubId(), shipping, userId); + + shippingHubScanLogRepository.save(log); + + return new InboundStatusResponseDto(log, "Success Save Inbound Log"); + } +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingHubScanLog.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingHubScanLog.java new file mode 100644 index 0000000..bc45126 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingHubScanLog.java @@ -0,0 +1,74 @@ +package com.sparta.shippingservice.domain.model; + +import com.sparta.commonmodule.entity.BaseEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; + +@Entity +@Getter +@NoArgsConstructor +@Table(name = "p_shipping_hub_scan_log") +public class ShippingHubScanLog extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(name = "shipping_hub_scan_log_id") + private UUID hubShippingScanLogId; + + @Column(name = "hub_id", nullable = false) + private UUID hubId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name ="shipping_id", nullable = false) + private Shipping shippingId; + + @CreatedDate + @Column(nullable = false, updatable = false) + private LocalDateTime timestamp; + + @Column(nullable = false) + private ShippingStatus status; + + @Column(name = "next_hub_id", nullable = true) + private UUID nextHubId; + + public ShippingHubScanLog(UUID hubId,Shipping shippingId, ShippingStatus status, Long userId) { + super(userId); + this.hubId = hubId; + this.shippingId = shippingId; + this.status = status; + } + + public ShippingHubScanLog(UUID hubId,Shipping shippingId, ShippingStatus status, UUID nextHubId, Long userId) { + super(userId); + this.hubId = hubId; + this.shippingId = shippingId; + this.status = status; + this.nextHubId = nextHubId; + } + + public static ShippingHubScanLog createInboundLog(UUID hubId, Shipping shippingId, Long userId) { + return new ShippingHubScanLog(hubId,shippingId, ShippingStatus.INBOUND, userId); + } + + public static ShippingHubScanLog createOutboundLog(UUID hubId, Shipping shippingId, Long userId) { + return new ShippingHubScanLog(hubId, shippingId, ShippingStatus.OUTBOUND, userId); + } + + public enum ShippingStatus { + INBOUND, OUTBOUND + } + +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingHubScanLogRepository.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingHubScanLogRepository.java new file mode 100644 index 0000000..d4cf34e --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingHubScanLogRepository.java @@ -0,0 +1,8 @@ +package com.sparta.shippingservice.domain.repository; + +import com.sparta.shippingservice.domain.model.ShippingHubScanLog; + +public interface ShippingHubScanLogRepository { + + void save(ShippingHubScanLog log); +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusRequestDto.java new file mode 100644 index 0000000..56c0807 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusRequestDto.java @@ -0,0 +1,28 @@ +package com.sparta.shippingservice.infrastructure.hub_feign.dto; + +import com.sparta.shippingservice.domain.model.ShippingHubScanLog; +import com.sparta.shippingservice.domain.model.ShippingHubScanLog.ShippingStatus; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class InboundStatusRequestDto { + + private UUID hubId; + private ShippingStatus status; + private LocalDateTime timestamp; + + public InboundStatusRequestDto(ShippingHubScanLog log) { + this.hubId = log.getHubId(); + this.status = log.getStatus(); + this.timestamp = log.getTimestamp(); + } + +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusResponseDto.java new file mode 100644 index 0000000..71ba3f0 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusResponseDto.java @@ -0,0 +1,33 @@ +package com.sparta.shippingservice.infrastructure.hub_feign.dto; + +import com.sparta.shippingservice.domain.model.ShippingHubScanLog; +import com.sparta.shippingservice.domain.model.ShippingHubScanLog.ShippingStatus; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class InboundStatusResponseDto { + + private String message; + private UUID hubId; + private UUID shippingId; + private ShippingStatus shippingStatus; + private LocalDateTime timestamp; + + public InboundStatusResponseDto(ShippingHubScanLog log, String message) { + this.shippingStatus = log.getStatus(); + this.timestamp = log.getTimestamp(); + this.hubId = log.getHubId(); + this.shippingId = log.getShippingId().getId(); + this.message = message; + } + + +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusRequestDto.java new file mode 100644 index 0000000..b686ff7 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusRequestDto.java @@ -0,0 +1,29 @@ +package com.sparta.shippingservice.infrastructure.hub_feign.dto; + +import com.sparta.hubservice.hub.domain.model.HubShippingScanLog; +import com.sparta.hubservice.hub.domain.model.HubShippingScanLog.ShippingStatus; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class OutboundStatusRequestDto { + + private UUID hubId; + private ShippingStatus shippingStatus; + private LocalDateTime timestamp; + private UUID nextHubId; + + public OutboundStatusRequestDto(HubShippingScanLog log) { + this.hubId = log.getHub().getHubId(); + this.shippingStatus = log.getStatus(); + this.timestamp = log.getTimestamp(); + this.nextHubId = log.getNextHub().getHubId(); + } +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusResponseDto.java new file mode 100644 index 0000000..39fb94d --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusResponseDto.java @@ -0,0 +1,24 @@ +package com.sparta.shippingservice.infrastructure.hub_feign.dto; + +import com.sparta.hubservice.hub.domain.model.HubShippingScanLog.ShippingStatus; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class OutboundStatusResponseDto { + + private String message; + private UUID hubId; + private UUID shippingId; + private ShippingStatus shippingStatus; + private LocalDateTime timestamp; + private UUID nextHubId; + +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/JpaShippingHubScanLogRepository.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/JpaShippingHubScanLogRepository.java new file mode 100644 index 0000000..7737d1d --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/JpaShippingHubScanLogRepository.java @@ -0,0 +1,11 @@ +package com.sparta.shippingservice.infrastructure.repository; + +import com.sparta.shippingservice.domain.model.ShippingHubScanLog; +import java.util.UUID; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface JpaShippingHubScanLogRepository extends JpaRepository { + +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingHubScanLogRepositoryImpl.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingHubScanLogRepositoryImpl.java new file mode 100644 index 0000000..3858f89 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingHubScanLogRepositoryImpl.java @@ -0,0 +1,18 @@ +package com.sparta.shippingservice.infrastructure.repository; + +import com.sparta.shippingservice.domain.model.ShippingHubScanLog; +import com.sparta.shippingservice.domain.repository.ShippingHubScanLogRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class ShippingHubScanLogRepositoryImpl implements ShippingHubScanLogRepository { + + private JpaShippingHubScanLogRepository jpaRepository; + + @Override + public void save(ShippingHubScanLog log) { + jpaRepository.save(log); + } +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingHubScanController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingHubScanController.java new file mode 100644 index 0000000..f9428fa --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingHubScanController.java @@ -0,0 +1,36 @@ +package com.sparta.shippingservice.presentation; + +import com.sparta.hubservice.hub.application.service.shipping.ShippingService; +import com.sparta.shippingservice.application.service.ShippingHubScanService; +import com.sparta.shippingservice.infrastructure.hub_feign.dto.InboundStatusRequestDto; +import com.sparta.shippingservice.infrastructure.hub_feign.dto.InboundStatusResponseDto; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v1/shippings") +public class ShippingHubScanController { + + private final ShippingHubScanService shippingHubScanService; + + // feign client : 배송건에 대한 허브 입고 기록 저장 + @PostMapping("/{shipping_id}/inbound") + public ResponseEntity inbound( + @PathVariable("shipping_id") UUID shippingId, + @RequestHeader("user_id") Long userId, + @RequestBody InboundStatusRequestDto inboundStatusRequestDto) { + + InboundStatusResponseDto responseDto = + shippingHubScanService.createInboundLog(shippingId,userId, inboundStatusRequestDto); + return ResponseEntity.ok(responseDto); + } + +} From 9f5f5d2709720cafe928070095d62f7b5e6b7c28 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 21:44:31 +0900 Subject: [PATCH 328/389] =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub_feign/dto/InboundStatusRequestDto.java | 5 ----- .../presentation/ShippingHubScanController.java | 1 - 2 files changed, 6 deletions(-) diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusRequestDto.java index 56c0807..c263366 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusRequestDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusRequestDto.java @@ -19,10 +19,5 @@ public class InboundStatusRequestDto { private ShippingStatus status; private LocalDateTime timestamp; - public InboundStatusRequestDto(ShippingHubScanLog log) { - this.hubId = log.getHubId(); - this.status = log.getStatus(); - this.timestamp = log.getTimestamp(); - } } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingHubScanController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingHubScanController.java index f9428fa..6276d0e 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingHubScanController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingHubScanController.java @@ -1,6 +1,5 @@ package com.sparta.shippingservice.presentation; -import com.sparta.hubservice.hub.application.service.shipping.ShippingService; import com.sparta.shippingservice.application.service.ShippingHubScanService; import com.sparta.shippingservice.infrastructure.hub_feign.dto.InboundStatusRequestDto; import com.sparta.shippingservice.infrastructure.hub_feign.dto.InboundStatusResponseDto; From 04129568c86e2dec0dfe6c3ab3bf44c0dcf29e14 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 22:08:16 +0900 Subject: [PATCH 329/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=ED=97=88?= =?UTF-8?q?=EB=B8=8C=EC=97=90=EC=84=9C=20=EB=B3=B4=EB=82=B8=20feign=20clie?= =?UTF-8?q?nt=20=EC=9A=94=EC=B2=AD=20=EC=B2=98=EB=A6=AC=20=EB=B0=8F=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EC=A0=80=EC=9E=A5=20-=20=ED=97=88?= =?UTF-8?q?=EB=B8=8C=20=EC=9E=85=EC=B6=9C=EA=B3=A0=20Entity=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=EB=AA=85=20=EC=88=98=EC=A0=95=20-=20=ED=97=88?= =?UTF-8?q?=EB=B8=8C=20=EC=B6=9C=EA=B3=A0=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20?= =?UTF-8?q?=EB=8B=B4=EC=9D=80=20response,=20request=20dto=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=B0=8F=20=EA=B5=AC=ED=98=84=20-=20=ED=97=88?= =?UTF-8?q?=EB=B8=8C=20=EC=B6=9C=EA=B3=A0=20=EC=B2=98=EB=A6=AC=20=EB=82=B4?= =?UTF-8?q?=EC=97=AD=EC=9D=84=20=EA=B5=AC=ED=98=84=ED=95=98=EB=8A=94=20Con?= =?UTF-8?q?troller=20=EA=B5=AC=ED=98=84=20-=20=ED=97=88=EB=B8=8C=20?= =?UTF-8?q?=EC=B6=9C=EA=B3=A0=20=EC=B2=98=EB=A6=AC=20=EB=82=B4=EC=97=AD?= =?UTF-8?q?=EC=9D=84=20=EA=B5=AC=ED=98=84=ED=95=98=EB=8A=94=20Service=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ShippingHubScanService.java | 17 +++++++++++++++++ .../domain/model/ShippingHubScanLog.java | 18 +++++++++--------- .../hub_feign/dto/InboundStatusRequestDto.java | 1 - .../dto/InboundStatusResponseDto.java | 5 ++--- .../dto/OutboundStatusRequestDto.java | 9 +-------- .../dto/OutboundStatusResponseDto.java | 11 ++++++++++- .../ShippingHubScanLogRepositoryImpl.java | 2 +- .../ShippingHubScanController.java | 16 +++++++++++++++- 8 files changed, 55 insertions(+), 24 deletions(-) diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingHubScanService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingHubScanService.java index a4acc36..d363ef4 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingHubScanService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingHubScanService.java @@ -7,6 +7,8 @@ import com.sparta.shippingservice.domain.repository.ShippingRepository; import com.sparta.shippingservice.infrastructure.hub_feign.dto.InboundStatusRequestDto; import com.sparta.shippingservice.infrastructure.hub_feign.dto.InboundStatusResponseDto; +import com.sparta.shippingservice.infrastructure.hub_feign.dto.OutboundStatusRequestDto; +import com.sparta.shippingservice.infrastructure.hub_feign.dto.OutboundStatusResponseDto; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -19,6 +21,7 @@ public class ShippingHubScanService { private final ShippingRepository shippingRepository; private final ShippingHubScanLogRepository shippingHubScanLogRepository; + // 입고 처리 @Transactional public InboundStatusResponseDto createInboundLog(UUID shippingId, Long userId, InboundStatusRequestDto requestDto) { @@ -32,4 +35,18 @@ public InboundStatusResponseDto createInboundLog(UUID shippingId, Long userId, I return new InboundStatusResponseDto(log, "Success Save Inbound Log"); } + + @Transactional + public OutboundStatusResponseDto createOutboundLog(UUID shippingId, Long userId, OutboundStatusRequestDto outboundStatusRequestDto) { + + Shipping shipping = shippingRepository.findById(shippingId) + .orElseThrow(ResourceNotFoundException::new); + + ShippingHubScanLog log = + ShippingHubScanLog.createOutboundLog(outboundStatusRequestDto.getHubId(), shipping, userId); + + shippingHubScanLogRepository.save(log); + + return new OutboundStatusResponseDto(log, "Success Save Outbound Log"); + } } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingHubScanLog.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingHubScanLog.java index bc45126..ae63496 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingHubScanLog.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingHubScanLog.java @@ -32,7 +32,7 @@ public class ShippingHubScanLog extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name ="shipping_id", nullable = false) - private Shipping shippingId; + private Shipping shipping; @CreatedDate @Column(nullable = false, updatable = false) @@ -44,27 +44,27 @@ public class ShippingHubScanLog extends BaseEntity { @Column(name = "next_hub_id", nullable = true) private UUID nextHubId; - public ShippingHubScanLog(UUID hubId,Shipping shippingId, ShippingStatus status, Long userId) { + public ShippingHubScanLog(UUID hubId,Shipping shipping, ShippingStatus status, Long userId) { super(userId); this.hubId = hubId; - this.shippingId = shippingId; + this.shipping = shipping; this.status = status; } - public ShippingHubScanLog(UUID hubId,Shipping shippingId, ShippingStatus status, UUID nextHubId, Long userId) { + public ShippingHubScanLog(UUID hubId,Shipping shipping, ShippingStatus status, UUID nextHubId, Long userId) { super(userId); this.hubId = hubId; - this.shippingId = shippingId; + this.shipping = shipping; this.status = status; this.nextHubId = nextHubId; } - public static ShippingHubScanLog createInboundLog(UUID hubId, Shipping shippingId, Long userId) { - return new ShippingHubScanLog(hubId,shippingId, ShippingStatus.INBOUND, userId); + public static ShippingHubScanLog createInboundLog(UUID hubId, Shipping shipping, Long userId) { + return new ShippingHubScanLog(hubId,shipping, ShippingStatus.INBOUND, userId); } - public static ShippingHubScanLog createOutboundLog(UUID hubId, Shipping shippingId, Long userId) { - return new ShippingHubScanLog(hubId, shippingId, ShippingStatus.OUTBOUND, userId); + public static ShippingHubScanLog createOutboundLog(UUID hubId, Shipping shipping, Long userId) { + return new ShippingHubScanLog(hubId, shipping, ShippingStatus.OUTBOUND, userId); } public enum ShippingStatus { diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusRequestDto.java index c263366..983d5db 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusRequestDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusRequestDto.java @@ -1,6 +1,5 @@ package com.sparta.shippingservice.infrastructure.hub_feign.dto; -import com.sparta.shippingservice.domain.model.ShippingHubScanLog; import com.sparta.shippingservice.domain.model.ShippingHubScanLog.ShippingStatus; import java.time.LocalDateTime; import java.util.UUID; diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusResponseDto.java index 71ba3f0..13522fb 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusResponseDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/InboundStatusResponseDto.java @@ -22,10 +22,9 @@ public class InboundStatusResponseDto { private LocalDateTime timestamp; public InboundStatusResponseDto(ShippingHubScanLog log, String message) { - this.shippingStatus = log.getStatus(); - this.timestamp = log.getTimestamp(); + this.shippingStatus = ShippingStatus.INBOUND; this.hubId = log.getHubId(); - this.shippingId = log.getShippingId().getId(); + this.shippingId = log.getShipping().getId(); this.message = message; } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusRequestDto.java index b686ff7..92ddab7 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusRequestDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusRequestDto.java @@ -1,6 +1,5 @@ package com.sparta.shippingservice.infrastructure.hub_feign.dto; -import com.sparta.hubservice.hub.domain.model.HubShippingScanLog; import com.sparta.hubservice.hub.domain.model.HubShippingScanLog.ShippingStatus; import java.time.LocalDateTime; import java.util.UUID; @@ -16,14 +15,8 @@ public class OutboundStatusRequestDto { private UUID hubId; - private ShippingStatus shippingStatus; + private ShippingStatus status; private LocalDateTime timestamp; private UUID nextHubId; - public OutboundStatusRequestDto(HubShippingScanLog log) { - this.hubId = log.getHub().getHubId(); - this.shippingStatus = log.getStatus(); - this.timestamp = log.getTimestamp(); - this.nextHubId = log.getNextHub().getHubId(); - } } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusResponseDto.java index 39fb94d..b9aef5e 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusResponseDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusResponseDto.java @@ -1,6 +1,7 @@ package com.sparta.shippingservice.infrastructure.hub_feign.dto; import com.sparta.hubservice.hub.domain.model.HubShippingScanLog.ShippingStatus; +import com.sparta.shippingservice.domain.model.ShippingHubScanLog; import java.time.LocalDateTime; import java.util.UUID; import lombok.AllArgsConstructor; @@ -17,8 +18,16 @@ public class OutboundStatusResponseDto { private String message; private UUID hubId; private UUID shippingId; - private ShippingStatus shippingStatus; + private ShippingStatus status; private LocalDateTime timestamp; private UUID nextHubId; + public OutboundStatusResponseDto(ShippingHubScanLog log, String message) { + this.message = message; + this.hubId = log.getHubId(); + this.shippingId = log.getShipping().getId(); + this.status = ShippingStatus.OUTBOUND; + this.nextHubId = log.getNextHubId(); + } + } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingHubScanLogRepositoryImpl.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingHubScanLogRepositoryImpl.java index 3858f89..b623bb7 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingHubScanLogRepositoryImpl.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingHubScanLogRepositoryImpl.java @@ -9,7 +9,7 @@ @RequiredArgsConstructor public class ShippingHubScanLogRepositoryImpl implements ShippingHubScanLogRepository { - private JpaShippingHubScanLogRepository jpaRepository; + private final JpaShippingHubScanLogRepository jpaRepository; @Override public void save(ShippingHubScanLog log) { diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingHubScanController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingHubScanController.java index 6276d0e..66081b5 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingHubScanController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingHubScanController.java @@ -3,6 +3,8 @@ import com.sparta.shippingservice.application.service.ShippingHubScanService; import com.sparta.shippingservice.infrastructure.hub_feign.dto.InboundStatusRequestDto; import com.sparta.shippingservice.infrastructure.hub_feign.dto.InboundStatusResponseDto; +import com.sparta.shippingservice.infrastructure.hub_feign.dto.OutboundStatusRequestDto; +import com.sparta.shippingservice.infrastructure.hub_feign.dto.OutboundStatusResponseDto; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -22,7 +24,7 @@ public class ShippingHubScanController { // feign client : 배송건에 대한 허브 입고 기록 저장 @PostMapping("/{shipping_id}/inbound") - public ResponseEntity inbound( + public ResponseEntity inboundStatus( @PathVariable("shipping_id") UUID shippingId, @RequestHeader("user_id") Long userId, @RequestBody InboundStatusRequestDto inboundStatusRequestDto) { @@ -32,4 +34,16 @@ public ResponseEntity inbound( return ResponseEntity.ok(responseDto); } + // feign client : 배송건에 대한 허브 출고 기록 저장 + @PostMapping("/{shipping_id}/outbound") + public ResponseEntity outboundStatus( + @PathVariable("shipping_id") UUID shippingId, + @RequestHeader("user_id") Long userId, + @RequestBody OutboundStatusRequestDto outboundStatusRequestDto){ + + OutboundStatusResponseDto responseDto = + shippingHubScanService.createOutboundLog(shippingId, userId, outboundStatusRequestDto); + return ResponseEntity.ok(responseDto); + } + } From 574d4269fbf52bd9525fd731f039ecff4f6cea4e Mon Sep 17 00:00:00 2001 From: dydwo6018 Date: Mon, 24 Mar 2025 22:17:06 +0900 Subject: [PATCH 330/389] =?UTF-8?q?=F0=9F=90=9B=20bugfix:=20JpaAuditingCon?= =?UTF-8?q?fig.class=20=EC=84=A4=EC=A0=95=20=EA=B4=80=EB=A0=A8=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=EC=97=86=EB=8A=94=20=EC=BD=94=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sparta/orderservice/OrderServiceApplication.java | 1 - .../sparta/orderservice/application/service/OrderService.java | 1 - 2 files changed, 2 deletions(-) diff --git a/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java b/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java index 29990db..eb3615d 100644 --- a/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java +++ b/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java @@ -9,7 +9,6 @@ import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @EnableFeignClients(basePackages = "com.sparta.orderservice.infrastructure.client") -@EnableJpaAuditing @SpringBootApplication(scanBasePackages = "com.sparta") @Import({SwaggerConfig.class, JpaAuditingConfig.class}) public class OrderServiceApplication { diff --git a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java index d32d8a5..a8824a6 100644 --- a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java +++ b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java @@ -72,7 +72,6 @@ public OrderResponseDto createOrder(OrderRequestDto requestDto) { .status(OrderStatus.CREATED) .build(); - order.setCreatedBy(0L); // createdBy 기본값 설정 (BaseEntity 상속으로 인해 필요) orderRepository.save(order); // 5. 배송 요청 DTO 생성 From e58123a9ffba8888b83d4384fce02bc7b47cc395 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 23:11:14 +0900 Subject: [PATCH 331/389] init postgres setting --- .../src/main/resources/application.yml | 2 +- docker-compose.yml | 4 +- .../src/main/resources/application.yml | 2 +- .../src/main/resources/application.yml | 2 +- .../domain/model/trans/RouteLogSelf.java | 92 +++++++++---------- .../src/main/resources/application.yaml | 6 +- .../src/main/resources/application.yml | 2 +- .../src/main/resources/application.yml | 2 +- 8 files changed, 55 insertions(+), 57 deletions(-) diff --git a/company-service/src/main/resources/application.yml b/company-service/src/main/resources/application.yml index 207dc47..b3d5da3 100644 --- a/company-service/src/main/resources/application.yml +++ b/company-service/src/main/resources/application.yml @@ -2,7 +2,7 @@ spring: application: name: company-service datasource: - url: jdbc:postgresql://postgres:5432/maindb + url: jdbc:postgresql://localhost:5001/maindb username: admin password: 1234 driver-class-name: org.postgresql.Driver diff --git a/docker-compose.yml b/docker-compose.yml index 69c47b0..7fb95fb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: postgres: image: postgres:15 @@ -9,7 +7,7 @@ services: POSTGRES_PASSWORD: 1234 POSTGRES_DB: maindb ports: - - "5432:5432" + - "5001:5432" volumes: - pgdata:/var/lib/postgresql/data - ./init.sql:/docker-entrypoint-initdb.d/init.sql diff --git a/hub-service/src/main/resources/application.yml b/hub-service/src/main/resources/application.yml index bc941ce..107e035 100644 --- a/hub-service/src/main/resources/application.yml +++ b/hub-service/src/main/resources/application.yml @@ -7,7 +7,7 @@ spring: config: import: "application-secret.yml" datasource: - url: jdbc:postgresql://postgres:5432/maindb + url: jdbc:postgresql://localhost:5001/maindb username: admin password: 1234 driver-class-name: org.postgresql.Driver diff --git a/order-service/src/main/resources/application.yml b/order-service/src/main/resources/application.yml index 317fcb9..5d43550 100644 --- a/order-service/src/main/resources/application.yml +++ b/order-service/src/main/resources/application.yml @@ -3,7 +3,7 @@ spring: name: order-service datasource: - url: jdbc:postgresql://postgres:5432/maindb + url: jdbc:postgresql://localhost:5001/maindb username: admin password: 1234 driver-class-name: org.postgresql.Driver diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/RouteLogSelf.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/RouteLogSelf.java index 31b34ce..ff3c06b 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/RouteLogSelf.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/trans/RouteLogSelf.java @@ -1,46 +1,46 @@ -package com.sparta.shippingservice.domain.model.trans; - -import com.sparta.shippingservice.domain.model.Shipping; -import com.sparta.shippingservice.domain.model.ShippingRouteLog; - -import java.math.BigDecimal; -import java.util.UUID; - -public record RouteLogSelf( - - UUID startHubId, - UUID endHubId, - Integer sequence, - BigDecimal estimatedDistance, - Integer estimatedTime, - BigDecimal actualDistance, - Integer actualTime, - UUID shippingManagerId -) { - public ShippingRouteLog toShippingRouteLog() { - return new ShippingRouteLog( - this.startHubId, - this.endHubId, - this.sequence, - this.estimatedDistance, - this.estimatedTime, - this.actualDistance, - this.actualTime, - this.shippingManagerId - ); - } -} - - - - - - - - - - - - - - +//package com.sparta.shippingservice.domain.model.trans; +// +//import com.sparta.shippingservice.domain.model.Shipping; +//import com.sparta.shippingservice.domain.model.ShippingRouteLog; +// +//import java.math.BigDecimal; +//import java.util.UUID; +// +//public record RouteLogSelf( +// +// UUID startHubId, +// UUID endHubId, +// Integer sequence, +// BigDecimal estimatedDistance, +// Integer estimatedTime, +// BigDecimal actualDistance, +// Integer actualTime, +// UUID shippingManagerId +//) { +// public ShippingRouteLog toShippingRouteLog() { +// return new ShippingRouteLog( +// this.startHubId, +// this.endHubId, +// this.sequence, +// this.estimatedDistance, +// this.estimatedTime, +// this.actualDistance, +// this.actualTime, +// this.shippingManagerId +// ); +// } +//} +// +// +// +// +// +// +// +// +// +// +// +// +// +// diff --git a/shipping-service/src/main/resources/application.yaml b/shipping-service/src/main/resources/application.yaml index 8412137..a166c54 100644 --- a/shipping-service/src/main/resources/application.yaml +++ b/shipping-service/src/main/resources/application.yaml @@ -2,9 +2,9 @@ spring: application: name: shipping-service datasource: - url: jdbc:postgresql://localhost:5432/shipping - username: myuser - password: mypassword + url: jdbc:postgresql://localhost:5001/maindb + username: admin + password: 1234 driver-class-name: org.postgresql.Driver jpa: diff --git a/slack-service/src/main/resources/application.yml b/slack-service/src/main/resources/application.yml index 1c76149..e703439 100644 --- a/slack-service/src/main/resources/application.yml +++ b/slack-service/src/main/resources/application.yml @@ -2,7 +2,7 @@ spring: application: name: slack-service datasource: - url: jdbc:postgresql://postgres:5432/maindb + url: jdbc:postgresql://localhost:5001/maindb username: admin password: 1234 driver-class-name: org.postgresql.Driver diff --git a/user-service/src/main/resources/application.yml b/user-service/src/main/resources/application.yml index d87f12e..369354c 100644 --- a/user-service/src/main/resources/application.yml +++ b/user-service/src/main/resources/application.yml @@ -2,7 +2,7 @@ spring: application: name: user-service datasource: - url: jdbc:postgresql://postgres:5432/maindb + url: jdbc:postgresql://localhost:5001/maindb username: admin password: 1234 driver-class-name: org.postgresql.Driver From f2d260d03f6312c0d4482d300d4629b7a22c10b8 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Mon, 24 Mar 2025 23:12:37 +0900 Subject: [PATCH 332/389] =?UTF-8?q?=E2=9C=A8=20feat[#203]=20:=20slack=20ai?= =?UTF-8?q?=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- slack-service/build.gradle | 2 + .../application/config/RestConfig.java | 14 +++++ .../application/service/GeminiService.java | 62 +++++++++++++++++++ .../infastructure/client/OrderClient.java | 16 +++++ .../client/dto/GeminiResponseDto.java | 10 +++ .../client/dto/SlackNotificationDto.java | 24 +++++++ .../presentation/GeminiController.java | 45 ++++++++++++++ 7 files changed, 173 insertions(+) create mode 100644 slack-service/src/main/java/com/sparta/slackservice/application/config/RestConfig.java create mode 100644 slack-service/src/main/java/com/sparta/slackservice/application/service/GeminiService.java create mode 100644 slack-service/src/main/java/com/sparta/slackservice/infastructure/client/OrderClient.java create mode 100644 slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiResponseDto.java create mode 100644 slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/SlackNotificationDto.java create mode 100644 slack-service/src/main/java/com/sparta/slackservice/presentation/GeminiController.java diff --git a/slack-service/build.gradle b/slack-service/build.gradle index a6b967e..772df2f 100644 --- a/slack-service/build.gradle +++ b/slack-service/build.gradle @@ -18,6 +18,8 @@ dependencies { runtimeOnly 'org.postgresql:postgresql' implementation project(':common-module') + implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' + } dependencyManagement { diff --git a/slack-service/src/main/java/com/sparta/slackservice/application/config/RestConfig.java b/slack-service/src/main/java/com/sparta/slackservice/application/config/RestConfig.java new file mode 100644 index 0000000..640e3a3 --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/application/config/RestConfig.java @@ -0,0 +1,14 @@ +package com.sparta.slackservice.application.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestConfig { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } +} \ No newline at end of file diff --git a/slack-service/src/main/java/com/sparta/slackservice/application/service/GeminiService.java b/slack-service/src/main/java/com/sparta/slackservice/application/service/GeminiService.java new file mode 100644 index 0000000..c7a818a --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/application/service/GeminiService.java @@ -0,0 +1,62 @@ +package com.sparta.slackservice.application.service; + +import com.sparta.slackservice.infastructure.client.dto.GeminiResponseDto; +import com.sparta.slackservice.infastructure.client.dto.SlackNotificationDto; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +@RequiredArgsConstructor +public class GeminiService { + + private final RestTemplate restTemplate; + + public GeminiResponseDto createMessage(SlackNotificationDto requstDto){ + String prompt = createCombinedMessage(requstDto) + "이 데이터를 하나의 배송메세지로 만들어줘"; + String aiApiUrl = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=AIzaSyDrLB8TPWb0uhedaw9Oy4dxMl2Rm5EU-U4"; // 실제 AI 서비스 URL로 수정 필요 + + // 요청할 데이터 준비 + Map requestData = new HashMap<>(); + requestData.put("contents", List.of( + Map.of( + "parts", List.of( + Map.of("text", prompt) // text 안에 prompt를 넣음 + ) + ) + )); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> entity = new HttpEntity<>(requestData, headers); + + // 4. AI에 POST 요청을 보내고 응답 받기 + ResponseEntity aiResponse = restTemplate.postForEntity(aiApiUrl, entity, String.class); + + // 5. AI 응답을 GeminiResponseDto로 변환 + GeminiResponseDto geminiResponse = new GeminiResponseDto(); + geminiResponse.setAnswer(aiResponse.getBody()); // AI 응답 내용 설정 + + return geminiResponse; + } + + private String createCombinedMessage(SlackNotificationDto requestDto) { + // SlackNotificationDto의 필드를 하나의 메시지로 결합 + return "OrderId: " + requestDto.getOrderId() + "\n" + + "ShippingId: " + requestDto.getShippingId() + "\n" + + "ShippingStatus: " + requestDto.getShippingStatus() + "\n" + + "Route: " + requestDto.getRoute() + "\n" + + "HubName: " + requestDto.getHubName() + "\n" + + "HubManagerName: " + requestDto.getHubManagerName() + "\n" + + "Message: " + requestDto.getMessage(); + } +} diff --git a/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/OrderClient.java b/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/OrderClient.java new file mode 100644 index 0000000..5554329 --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/OrderClient.java @@ -0,0 +1,16 @@ +package com.sparta.slackservice.infastructure.client; + +import com.sparta.slackservice.infastructure.client.dto.SlackNotificationDto; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.UUID; + +@FeignClient(name = "order-service", path = "/api/v1/orders") +public interface OrderClient { + + @GetMapping("/{id}/slack-info") + SlackNotificationDto getSlackNotificationInfo(@PathVariable UUID id); +} diff --git a/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiResponseDto.java b/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiResponseDto.java new file mode 100644 index 0000000..1701b50 --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiResponseDto.java @@ -0,0 +1,10 @@ +package com.sparta.slackservice.infastructure.client.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class GeminiResponseDto { + private String answer; +} diff --git a/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/SlackNotificationDto.java b/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/SlackNotificationDto.java new file mode 100644 index 0000000..ccb59e0 --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/SlackNotificationDto.java @@ -0,0 +1,24 @@ +package com.sparta.slackservice.infastructure.client.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +//Slack 알림 관련해서 응답 DTO +public class SlackNotificationDto { + + private UUID orderId; + private UUID shippingId; + private String shippingStatus; + private String route; + private String hubName; + private String hubManagerName; + private String message; +} diff --git a/slack-service/src/main/java/com/sparta/slackservice/presentation/GeminiController.java b/slack-service/src/main/java/com/sparta/slackservice/presentation/GeminiController.java new file mode 100644 index 0000000..d34ead8 --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/presentation/GeminiController.java @@ -0,0 +1,45 @@ +package com.sparta.slackservice.presentation; + +import com.sparta.slackservice.application.service.GeminiService; +import com.sparta.slackservice.infastructure.client.OrderClient; +import com.sparta.slackservice.infastructure.client.dto.GeminiResponseDto; +import com.sparta.slackservice.infastructure.client.dto.SlackNotificationDto; +import jakarta.ws.rs.Path; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.UUID; + +@RestController +@RequestMapping("/api/v1/ai") +@RequiredArgsConstructor +public class GeminiController { + + private GeminiService geminiService; + private OrderClient orderClient; + + public GeminiController(GeminiService geminiService, OrderClient orderClient) { + this.geminiService = geminiService; + this.orderClient = orderClient; + } + + @PostMapping("/create/{id}") + public ResponseEntity createMessage(@PathVariable UUID id) {//주문정보 입력 + //요청한 정보가져오기 + SlackNotificationDto slackNotificationDto = orderClient.getSlackNotificationInfo(id); + + GeminiResponseDto responseDto = geminiService.createMessage(slackNotificationDto); + return ResponseEntity.ok(responseDto); + } + + @PostMapping("/create") + public ResponseEntity createMessage(@RequestBody SlackNotificationDto requestDto) {//주문정보 입력 + //요청한 정보가져오기 + GeminiResponseDto responseDto = geminiService.createMessage(requestDto); + return ResponseEntity.ok(responseDto); + } + + +} \ No newline at end of file From ab39aa19279f608713556cedb2298de74b1685b6 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 23:12:46 +0900 Subject: [PATCH 333/389] init postgres setting --- product-service/src/main/resources/application.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/product-service/src/main/resources/application.yml b/product-service/src/main/resources/application.yml index 4985a2a..e759c3c 100644 --- a/product-service/src/main/resources/application.yml +++ b/product-service/src/main/resources/application.yml @@ -2,21 +2,22 @@ spring: application: name: product-service datasource: - driver-class-name: org.postgresql.Driver - url: jdbc:postgresql://localhost:5432/msa-product - username: test + url: jdbc:postgresql://localhost:5432/maindb + username: admin password: 1234 + driver-class-name: org.postgresql.Driver jpa: database: postgresql - show-sql: true - hibernate: - ddl-auto: create properties: hibernate: spring.jpa.open-in-view: false format_sql: true default_batch_fetch_size: 10 + default_schema: product_service dialect: org.hibernate.dialect.PostgreSQLDialect + hibernate: + ddl-auto: update + show-sql: true server: port: 8083 From 370331cadbd420f3feb79fe6dddf601098dc4774 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Mon, 24 Mar 2025 23:22:00 +0900 Subject: [PATCH 334/389] init postgres setting --- .../com/sparta/orderservice/OrderServiceApplication.java | 5 ++--- product-service/src/main/resources/application.yml | 2 +- user-service/src/main/resources/application.yml | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java b/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java index ac7b366..4745301 100644 --- a/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java +++ b/order-service/src/main/java/com/sparta/orderservice/OrderServiceApplication.java @@ -1,16 +1,15 @@ package com.sparta.orderservice; +import com.sparta.commonmodule.config.JpaAuditingConfig; import com.sparta.commonmodule.config.SwaggerConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Import; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @EnableFeignClients(basePackages = "com.sparta.orderservice.infrastructure.client") -@EnableJpaAuditing @SpringBootApplication(scanBasePackages = "com.sparta") -@Import(SwaggerConfig.class) +@Import({SwaggerConfig.class, JpaAuditingConfig.class}) public class OrderServiceApplication { public static void main(String[] args) { diff --git a/product-service/src/main/resources/application.yml b/product-service/src/main/resources/application.yml index e759c3c..ddcde5b 100644 --- a/product-service/src/main/resources/application.yml +++ b/product-service/src/main/resources/application.yml @@ -2,7 +2,7 @@ spring: application: name: product-service datasource: - url: jdbc:postgresql://localhost:5432/maindb + url: jdbc:postgresql://localhost:5001/maindb username: admin password: 1234 driver-class-name: org.postgresql.Driver diff --git a/user-service/src/main/resources/application.yml b/user-service/src/main/resources/application.yml index 369354c..b1e66f9 100644 --- a/user-service/src/main/resources/application.yml +++ b/user-service/src/main/resources/application.yml @@ -12,7 +12,7 @@ spring: default_schema: user_service dialect: org.hibernate.dialect.PostgreSQLDialect hibernate: - ddl-auto: update + ddl-auto: create show-sql: true h2: console: From 949fb9b3e232876efacd1f95affd6cae5b612084 Mon Sep 17 00:00:00 2001 From: jiyun Date: Mon, 24 Mar 2025 23:19:52 +0900 Subject: [PATCH 335/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20[#195]=20Company?= =?UTF-8?q?=20JpaAuditingConfig=20import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sparta/companyservice/CompanyServiceApplication.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java b/company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java index 7430580..7ac5fc7 100644 --- a/company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java +++ b/company-service/src/main/java/com/sparta/companyservice/CompanyServiceApplication.java @@ -1,6 +1,7 @@ package com.sparta.companyservice; -import org.springdoc.webmvc.ui.SwaggerConfig; +import com.sparta.commonmodule.config.JpaAuditingConfig; +import com.sparta.commonmodule.config.SwaggerConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; @@ -8,7 +9,7 @@ @SpringBootApplication(scanBasePackages = "com.sparta") @EnableFeignClients(basePackages = "com.sparta") -@Import(SwaggerConfig.class) +@Import({SwaggerConfig.class, JpaAuditingConfig.class}) public class CompanyServiceApplication { public static void main(String[] args) { From 45f401dbaafa8cf34ad0ccd6973915982f3019cb Mon Sep 17 00:00:00 2001 From: jiyun Date: Mon, 24 Mar 2025 23:31:38 +0900 Subject: [PATCH 336/389] =?UTF-8?q?=E2=9C=A8=20feat=20[#195]=20:=20?= =?UTF-8?q?=EB=B0=B0=EC=86=A1=EB=A1=9C=EA=B7=B8=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shipping-service/build.gradle | 21 ++++- .../request/ShippingRouteSearchCondition.java | 15 ++++ .../application/service/ShippingService.java | 14 +++- .../ShippingRouteQueryRepository.java | 10 +++ .../ShippingRouteQueryRepositoryImpl.java | 83 +++++++++++++++++++ .../presentation/ShippingController.java | 24 +++++- 6 files changed, 158 insertions(+), 9 deletions(-) create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/ShippingRouteSearchCondition.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRouteQueryRepository.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingRouteQueryRepositoryImpl.java diff --git a/shipping-service/build.gradle b/shipping-service/build.gradle index a975afc..b16ab55 100644 --- a/shipping-service/build.gradle +++ b/shipping-service/build.gradle @@ -24,4 +24,23 @@ dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } -} \ No newline at end of file +} + +// ✅ QueryDSL Q클래스 생성 디렉토리 설정 +def querydslDir = "$buildDir/generated/querydsl" + +tasks.withType(JavaCompile).configureEach { + options.annotationProcessorGeneratedSourcesDirectory = file(querydslDir) +} + +sourceSets { + main { + java { + srcDirs += querydslDir + } + } +} + +clean { + delete file(querydslDir) +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/ShippingRouteSearchCondition.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/ShippingRouteSearchCondition.java new file mode 100644 index 0000000..66f73c5 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/ShippingRouteSearchCondition.java @@ -0,0 +1,15 @@ +package com.sparta.shippingservice.application.dto.request; + +import lombok.Getter; +import lombok.Setter; + +import java.util.UUID; + +@Getter +@Setter +public class ShippingRouteSearchCondition { + private UUID shippingId; + private UUID fromHubId; + private UUID toHubId; + private UUID hubRouteId; +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java index 09f48ad..7bfb5b8 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -3,10 +3,7 @@ import com.sparta.shippingmanager.domain.model.ManagerType; import com.sparta.shippingmanager.domain.model.ShippingManager; import com.sparta.shippingservice.application.dto.client.ShippingManagerResponseDto; -import com.sparta.shippingservice.application.dto.request.CreateRouteLogRequestDto; -import com.sparta.shippingservice.application.dto.request.CreateShippingRequestDto; -import com.sparta.shippingservice.application.dto.request.ShippingSearchCondition; -import com.sparta.shippingservice.application.dto.request.UpdateShippingRequestDto; +import com.sparta.shippingservice.application.dto.request.*; import com.sparta.shippingservice.application.dto.response.ShippingResponseDto; import com.sparta.shippingservice.application.dto.response.ShippingRouteResponseDto; import com.sparta.shippingservice.application.dto.response.ShippingSearchResult; @@ -15,6 +12,7 @@ import com.sparta.shippingservice.domain.repository.ShippingRepository; import com.sparta.commonmodule.exception.*; +import com.sparta.shippingservice.domain.repository.ShippingRouteQueryRepository; import com.sparta.shippingservice.domain.repository.ShippingRouteRepository; import com.sparta.shippingservice.infrastructure.client.HubClient; import com.sparta.shippingservice.infrastructure.client.HubRouteDetailsResponseDto; @@ -25,6 +23,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -42,6 +41,7 @@ public class ShippingService { private final ShippingManagerClient shippingManagerClient; private final ShippingSearchRepository searchRepository; private final HubClient hubClient; + private final ShippingRouteQueryRepository shippingRouteQueryRepository; //각 허브에 10명 / 업체에 10명 @@ -148,4 +148,10 @@ private Shipping findShipping(UUID shippingId) { return shipping; } + @Transactional(readOnly = true) // 배송 로그 검색 + public Page searchShippingLogs(ShippingRouteSearchCondition condition, Pageable pageable) { + Page logs = shippingRouteQueryRepository.search(condition, pageable); + return logs.map(ShippingRouteResponseDto::from); + } + } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRouteQueryRepository.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRouteQueryRepository.java new file mode 100644 index 0000000..e640ed5 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/repository/ShippingRouteQueryRepository.java @@ -0,0 +1,10 @@ +package com.sparta.shippingservice.domain.repository; + +import com.sparta.shippingservice.application.dto.request.ShippingRouteSearchCondition; +import com.sparta.shippingservice.domain.model.ShippingRouteLog; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +public interface ShippingRouteQueryRepository { + Page search(ShippingRouteSearchCondition condition, Pageable pageable); +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingRouteQueryRepositoryImpl.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingRouteQueryRepositoryImpl.java new file mode 100644 index 0000000..f11de99 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingRouteQueryRepositoryImpl.java @@ -0,0 +1,83 @@ +package com.sparta.shippingservice.infrastructure.repository; + +import com.querydsl.core.BooleanBuilder; +import com.querydsl.core.types.Order; +import com.querydsl.core.types.OrderSpecifier; +import com.querydsl.core.types.dsl.PathBuilder; +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.sparta.shippingservice.application.dto.request.ShippingRouteSearchCondition; +import com.sparta.shippingservice.domain.model.QShippingRouteLog; +import com.sparta.shippingservice.domain.model.ShippingRouteLog; +import com.sparta.shippingservice.domain.repository.ShippingRouteQueryRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.*; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class ShippingRouteQueryRepositoryImpl implements ShippingRouteQueryRepository { + private final JPAQueryFactory queryFactory; + + @Override + public Page search(ShippingRouteSearchCondition condition, Pageable pageable) { + QShippingRouteLog log = QShippingRouteLog.shippingRouteLog; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(log.deletedAt.isNull()); + + if (condition.getShippingId() != null) { + builder.and(log.shipping.id.eq(condition.getShippingId())); + } + + if (condition.getFromHubId() != null) { + builder.and(log.fromHubId.eq(condition.getFromHubId())); + } + + if (condition.getToHubId() != null) { + builder.and(log.toHubId.eq(condition.getToHubId())); + } + + if (condition.getHubRouteId() != null) { + builder.and(log.hubRouteId.eq(condition.getHubRouteId())); + } + + List results = queryFactory + .selectFrom(log) + .where(builder) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .orderBy(getSortedColumn(pageable.getSort())) + .fetch(); + + long total = queryFactory + .select(log.id.count()) + .from(log) + .where(builder) + .fetchOne(); + + return new PageImpl<>(results, pageable, total); + } + + private OrderSpecifier[] getSortedColumn(Sort sort) { + List> orderSpecifiers = new ArrayList<>(); + PathBuilder entityPath = new PathBuilder<>(ShippingRouteLog.class, "shippingRouteLog"); + + if (sort != null && sort.isSorted()) { + for (Sort.Order order : sort) { + Order direction = order.isAscending() ? Order.ASC : Order.DESC; + String property = order.getProperty(); + orderSpecifiers.add(new OrderSpecifier(direction, entityPath.get(property))); + } + } + + // 생성일 내림차순으로 기본 정렬 + if (orderSpecifiers.isEmpty()) { + orderSpecifiers.add(new OrderSpecifier(Order.DESC, entityPath.get("createdAt"))); + } + + return orderSpecifiers.toArray(new OrderSpecifier[0]); + } +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index fc00211..e14f862 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -1,9 +1,6 @@ package com.sparta.shippingservice.presentation; -import com.sparta.shippingservice.application.dto.request.CreateShippingRequestDto; -import com.sparta.shippingservice.application.dto.request.CreateShippingWithRouteRequestDto; -import com.sparta.shippingservice.application.dto.request.ShippingSearchCondition; -import com.sparta.shippingservice.application.dto.request.UpdateShippingRequestDto; +import com.sparta.shippingservice.application.dto.request.*; import com.sparta.shippingservice.application.dto.response.ShippingResponseDto; import com.sparta.shippingservice.application.dto.response.ShippingRouteResponseDto; import com.sparta.shippingservice.application.dto.response.ShippingWithRouteResponseDto; @@ -15,6 +12,9 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -90,5 +90,21 @@ public ResponseEntity> getAllLog() { } + @GetMapping("/log/search") + public ResponseEntity> searchShippingLogs( + @ModelAttribute ShippingRouteSearchCondition condition, + @PageableDefault(size = 10) Pageable pageable + ) { + int size = pageable.getPageSize(); + if (size != 10 && size != 30 && size != 50) { + pageable = PageRequest.of(pageable.getPageNumber(), 10); + } + + Page result = shippingService.searchShippingLogs(condition, pageable); + return ResponseEntity.ok(result); + } + + + } From e3883b0503b9779b9627044dfc5177531251fe5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=EC=9D=80=E2=98=98?= <138298079+devdaeun@users.noreply.github.com> Date: Tue, 25 Mar 2025 00:12:19 +0900 Subject: [PATCH 337/389] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 1c091e6..fc213fb 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,6 @@ Logistics-delivery # 협업 시 우리조가 잘한 것들 - # 협업 시 아쉽거나 부족했던 부분들 @@ -136,7 +135,7 @@ Logistics-delivery | **인증인가,
사용자API** | 신다은
(팀장) | - 회원가입,로그인 등의 사용자 정보CRUD 구현
- 로그인 성공 시 JWT 토큰을 생성하여 사용자에게 전달되도록 함
- JWT 토큰을 사용하여 회원정보를 인증, 내부payload값을 추출하여 서브모듈에서 사용가능하도록 구현
- 인증된 정보를 바탕으로 사용자의 권한이 요청 url에 접근가능한지 gateway에서 우선적으로 인가처리를 할 수 있도록 구현
- 세부 API 기능별로 AOP에서 인가처리를 추가적으로 진행하도록 구현| |**슬랙API**|신다은
(팀장) | - 슬랙 메세지 관리 CRUD 구현
- 슬랙 외부 API를 연동하여 메세지 발송 시 실제 슬랙 사이트로 알림메세지가 전송되도록 함.
- Base Entity를 사용한 생성,수정,삭제 기록 저장 및 SoftDelete 구현
- QueryDSL을 이용한 슬랙 메세지 검색기능 구현| |**허브API**|이소현
(테크리드) | - 허브 정보, 허브간 경로 CRUD 구현
- 허브 검색 기능 (Query DSL) 구현
- 최단 경로를 위한 허브간 경로 체크포인트 생성 및 조회 구현
-허브 내 배송품 입고 및 출고 처리 기능 구현 | -|**상품API**|서진영
(테크리드) | - | +|**상품API**|서진영
(테크리드) | - 상품 CRUD 구현
- QueryDSL을 이용한 상품 검색 기능 구현
- 공통모듈에 swagger, Auditor Aware 구현 | |**배송API**|권길남 | - 배송, 배송 로그, 배송 담당자 CRUD 구현
- 배송 담당자 배정 알고리즘 구현
- QueryDSL을 사용한 배송정보 검색기능 구현 | |**업체API**|원지윤 | - Company-service CRUD 개발 및 Spring Boot 기반 4계층 아키텍처 적용
- QueryDSL 기반 동적 검색 조건 및 페이징 기능 구현
- HTTP API 테스트, 도메인 및 서비스 계층 테스트 코드 작성| |**주문API**|이용재 | - 주문 CRUD 구현
- 주문 생성 시 Product 서비스에 재고 차감 요청 기능 연동 (FeignClient 사용)
- 주문 생성 시 Shipping 서비스에 배송 생성 요청 기능 연동 (FeignClient 사용)
- Slack 도메인 연동을 위한 주문 + 배송 정보 응답 API 제공
- QueryDSL을 활용한 주문 검색 기능 구현 (주문명 + 상태 검색)| From d5d82b01e612b324c06042d8dd630541be7683e6 Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Tue, 25 Mar 2025 01:56:24 +0900 Subject: [PATCH 338/389] =?UTF-8?q?hub=20=EC=AA=BD=20=EA=B2=8C=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=EC=9B=A8=EC=9D=B4=20=EB=93=B1=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gateway/src/main/resources/application.yml | 10 +++++++++- .../application/service/HubShippingScanService.java | 4 ++-- .../service/shipping/ShippingService.java | 9 ++++----- .../feignclient/ShippingFeignClient.java | 3 +++ .../hub/presentation/controller/HubController.java | 13 ++++++++++--- .../controller/HubShippingScanController.java | 4 ++-- hub-service/src/main/resources/application.yml | 2 +- 7 files changed, 31 insertions(+), 14 deletions(-) diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index 188cf87..0763fc2 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -57,7 +57,15 @@ spring: - id: hub-service uri: lb://hub-service predicates: - - Path=/api/v1/(hubs|hub-routes|hub-shipping-scan)/** + - Path=/api/v1/hubs/** + - id: hub-routes-service + uri: lb://hub-service + predicates: + - Path=/api/v1/hub-routes/** + - id: hub-shipping-scan-service + uri: lb://hub-service + predicates: + - Path=/api/v1/hub-shipping-scan/** - id: hub-docs uri: lb://hub-service predicates: diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubShippingScanService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubShippingScanService.java index 10ddf9f..e90671a 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubShippingScanService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/HubShippingScanService.java @@ -34,7 +34,7 @@ public InboundStatusResponseDto createInbound(UUID hubId, UUID shippingId, Long hubShippingScanRepository.save(hubShippingScanLog); log.info("Success Save InboundLog - HubShippingScanLog: {}", hubShippingScanLog); - return shippingService.inboundStatus(hubShippingScanLog); + return shippingService.inboundStatus(hubShippingScanLog, userId); } // 출고 처리 로그 저장 후 feign client 호출 @@ -49,7 +49,7 @@ public OutboundStatusResponseDto createOutbound(UUID hubId, UUID shippingId, Lon log.info("Success Save OutboundLog - HubShippingScanLog: {}", hubShippingScanLog); // feign client - OutboundStatusResponseDto responseDto = shippingService.outboundStatus(hubShippingScanLog); + OutboundStatusResponseDto responseDto = shippingService.outboundStatus(hubShippingScanLog, userId); // 받아온 정보로 nextHub 값 update Hub nextHub = hubRepository.findById(responseDto.getNextHubId()).orElseThrow(ResourceNotFoundException::new); diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/shipping/ShippingService.java b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/shipping/ShippingService.java index 7d67fab..ce0b769 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/shipping/ShippingService.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/application/service/shipping/ShippingService.java @@ -17,12 +17,11 @@ public class ShippingService { private final ShippingFeignClient shippingFeignClient; - public InboundStatusResponseDto inboundStatus(HubShippingScanLog log){ - // Todo: feign client 호출 응답값에 대한 예외 처리 (common.exception 코드도 추가) - return shippingFeignClient.inboundStatus(log.getShippingId(), new InboundStatusRequestDto(log)); + public InboundStatusResponseDto inboundStatus(HubShippingScanLog log, Long userId) { + return shippingFeignClient.inboundStatus(log.getShippingId(), userId, new InboundStatusRequestDto(log)); } - public OutboundStatusResponseDto outboundStatus(HubShippingScanLog log) { - return shippingFeignClient.outboundStatus(log.getShippingId(), new OutboundStatusRequestDto(log)); + public OutboundStatusResponseDto outboundStatus(HubShippingScanLog log, Long userId) { + return shippingFeignClient.outboundStatus(log.getShippingId(),userId, new OutboundStatusRequestDto(log)); } } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/ShippingFeignClient.java b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/ShippingFeignClient.java index c1104e4..b215994 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/ShippingFeignClient.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/infrastructure/feignclient/ShippingFeignClient.java @@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; @FeignClient(name ="shipping-service", url="${shipping.service.url}") public interface ShippingFeignClient { @@ -17,11 +18,13 @@ public interface ShippingFeignClient { @PostMapping("/{shipping_id}/inbound") InboundStatusResponseDto inboundStatus( @PathVariable("shipping_id") UUID shippingId, + @RequestHeader("user_id") Long userId, @RequestBody InboundStatusRequestDto inboundStatusRequestDto); // 출고 처리 내용 전달 @PostMapping("/{shipping_id}/outbound") OutboundStatusResponseDto outboundStatus( @PathVariable("shipping_id") UUID shippingId, + @RequestHeader("user_id") Long userId, @RequestBody OutboundStatusRequestDto outboundStatusRequestDto); } \ No newline at end of file diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java index 41b8f74..772a052 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubController.java @@ -67,16 +67,23 @@ public ResponseEntity> getSearchHubs( @Operation(summary = "Hub 생성", description = "허브 생성 api") @RoleCheck("ROLE_MASTER") @PostMapping - public ResponseEntity createHub(@RequestBody @Valid HubRequestDto requestDto,@RequestHeader("user-id") Long userId) { + public ResponseEntity createHub( + @RequestBody @Valid HubRequestDto requestDto, + @RequestHeader("user_id") Long userId) { HubCreateResponseDto responseDto = hubService.createHub(requestDto, userId); return ResponseEntity.ok(responseDto); } // 허브 수정 @Operation(summary = "Hub 수정", description = "허브 수정 api") + @RoleCheck("ROLE_MASTER") @PutMapping("{hub_id}") - public ResponseEntity updateHub(@PathVariable("hub_id") UUID hubId, @RequestParam String address, @RequestHeader("user-id") Long userId) { + public ResponseEntity updateHub( + @PathVariable("hub_id") UUID hubId, + @RequestParam String address, + @RequestHeader("user_id") Long userId) { + HubUpdateResponseDto responseDto = hubService.updateHub(hubId, address, userId); return ResponseEntity.ok(responseDto); } @@ -85,7 +92,7 @@ public ResponseEntity updateHub(@PathVariable("hub_id") UU @Operation(summary = "Hub 삭제", description = "허브 삭제 api") @RoleCheck("ROLE_MASTER") @DeleteMapping("{hub_id}") - public ResponseEntity deleteHub(@PathVariable("hub_id") UUID hubId, @RequestHeader("user-id") Long userId) { + public ResponseEntity deleteHub(@PathVariable("hub_id") UUID hubId, @RequestHeader("user_id") Long userId) { HubDeleteResponseDto responseDto = hubService.deleteHub(hubId, userId); return ResponseEntity.ok(responseDto); } diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java index 3a80b28..b023dc3 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java @@ -28,7 +28,7 @@ public class HubShippingScanController { public ResponseEntity inboundStatus( @PathVariable("hub_id") UUID hubId, @PathVariable("shipping_id") UUID shippingId, - @RequestHeader("user-id") Long userId){ + @RequestHeader("user_id") Long userId){ InboundStatusResponseDto responseDto = hubShippingScanService.createInbound(hubId, shippingId, userId); @@ -42,7 +42,7 @@ public ResponseEntity inboundStatus( public ResponseEntity outboundStatus( @PathVariable("hub_id") UUID hubId, @PathVariable("shipping_id") UUID shippingId, - @RequestHeader("user-id") Long userId + @RequestHeader("user_id") Long userId ){ OutboundStatusResponseDto responseDto = hubShippingScanService.createOutbound(hubId, shippingId, userId); diff --git a/hub-service/src/main/resources/application.yml b/hub-service/src/main/resources/application.yml index 107e035..f91f9e0 100644 --- a/hub-service/src/main/resources/application.yml +++ b/hub-service/src/main/resources/application.yml @@ -40,4 +40,4 @@ springdoc: shipping: service: - url: http://localhost:8081/api/v1/shippings + url: http://localhost:8080/api/v1/shippings From daad02b34cec076239ac9d6cb550769923ac634b Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Tue, 25 Mar 2025 01:56:32 +0900 Subject: [PATCH 339/389] =?UTF-8?q?hub=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub/create-hub-route-checkpoints.http | 18 ++ api-http/hub/create-hub-routes.http | 126 ++++++++++++ api-http/hub/create-hub.http | 185 ++++++++++++++++++ api-http/hub/hub-route-total-test.http | 38 ++++ api-http/hub/hub-shipping-feignclient.http | 18 ++ api-http/hub/hub-total-test.http | 29 +++ 6 files changed, 414 insertions(+) create mode 100644 api-http/hub/create-hub-route-checkpoints.http create mode 100644 api-http/hub/create-hub-routes.http create mode 100644 api-http/hub/create-hub.http create mode 100644 api-http/hub/hub-route-total-test.http create mode 100644 api-http/hub/hub-shipping-feignclient.http create mode 100644 api-http/hub/hub-total-test.http diff --git a/api-http/hub/create-hub-route-checkpoints.http b/api-http/hub/create-hub-route-checkpoints.http new file mode 100644 index 0000000..f474c49 --- /dev/null +++ b/api-http/hub/create-hub-route-checkpoints.http @@ -0,0 +1,18 @@ + +@seoul_hub = +@busan_hub = +@daejeon_hub = +@Gyeongsangbukdo_hub = +@host = http://localhost:8080 +@access_token = eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4MzA4MzAsImV4cCI6MTc0MjgzNDQzMH0.VHGVmFH9iCNpx1y6Y8Xk1dgncD-5TZjr1L5JLZJYHaqQuKjpZR9MVGspnff7Mqb2Db6mUCdAFtZYBfxKgU1RUw + +### 👩🏻‍💻 Hub Route Checkpoint 테이블 더미데이터에 필요한 코드 -> 중복 있는 상태 +### + +### 서울 -> 부산 +POST{{host}}/api/v1/hub-routes/{{seoul_hub}}/{{busan_hub}}/path +Authorization: {{access_token}} + +### 대전 -> 경상북도 +POST {{host}}/api/v1/hub-routes/{{daejeon_hub}}/{{Gyeongsangbukdo_hub}}/path +Authorization: {{access_token}} diff --git a/api-http/hub/create-hub-routes.http b/api-http/hub/create-hub-routes.http new file mode 100644 index 0000000..61d4d21 --- /dev/null +++ b/api-http/hub/create-hub-routes.http @@ -0,0 +1,126 @@ +@host = http://localhost:8080 +@access_token = eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4MzA4MzAsImV4cCI6MTc0MjgzNDQzMH0.VHGVmFH9iCNpx1y6Y8Xk1dgncD-5TZjr1L5JLZJYHaqQuKjpZR9MVGspnff7Mqb2Db6mUCdAFtZYBfxKgU1RUw + +### 👩🏻‍💻 Hub Route 테이블의 더미데이터에 필요한 코드 +### + +### 경기 남부 센터 연결 (경기북부, 서울, 인천, 강원도, 경상북도, 대전, 대구) +POST {{host}}/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/c1984014-c71d-4c55-a3b6-8568d7d1f897/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/eff77800-604d-441d-a736-63f1f7d25e51/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/f95653a0-edb1-4bb4-8d2e-814e4638639a/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/d6a865bd-b172-433c-b49f-dcd5ff9ee428/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/c27c2ba8-4011-4d68-991e-19315c19a192/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/c1f6e270-bc15-4816-bc25-a1b71070b751/direct +Authorization: {{access_token}} + +### 경기 남부 센터 연결 역방향 +POST {{host}}/api/v1/hub-routes/c1984014-c71d-4c55-a3b6-8568d7d1f897/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/eff77800-604d-441d-a736-63f1f7d25e51/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/f95653a0-edb1-4bb4-8d2e-814e4638639a/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/d6a865bd-b172-433c-b49f-dcd5ff9ee428/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/c27c2ba8-4011-4d68-991e-19315c19a192/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/c1f6e270-bc15-4816-bc25-a1b71070b751/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct +Authorization: {{access_token}} + + + +### 대전 센터 연결 (충남, 충북, 세종, 전북, 광주, 전남, 경기남부, 대구) +POST {{host}}/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/b252fddc-a4b1-420e-94c2-9a91bebee41a/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/031973c0-944d-4c53-803b-27ad45fbfb38/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/854d3f6d-c150-4471-a75c-06248c64daef/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/d073a70d-e200-4301-af35-4c1a87798427/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/9984a080-0ecb-45d6-a92f-0a67cfb63592/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/dfba0f7b-ce3b-4d11-aa8f-40ac398028f9/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/c1f6e270-bc15-4816-bc25-a1b71070b751/direct +Authorization: {{access_token}} + +### 대전 센터 연결 역방향 +POST {{host}}/api/v1/hub-routes/b252fddc-a4b1-420e-94c2-9a91bebee41a/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/031973c0-944d-4c53-803b-27ad45fbfb38/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/854d3f6d-c150-4471-a75c-06248c64daef/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/d073a70d-e200-4301-af35-4c1a87798427/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/9984a080-0ecb-45d6-a92f-0a67cfb63592/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/dfba0f7b-ce3b-4d11-aa8f-40ac398028f9/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/c1f6e270-bc15-4816-bc25-a1b71070b751/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct +Authorization: {{access_token}} + + + +### 대구 센터 연결 (경북, 경남, 부산, 울산, 경기남부, 대전) +POST {{host}}/api/v1/hub-routes/c1f6e270-bc15-4816-bc25-a1b71070b751/c27c2ba8-4011-4d68-991e-19315c19a192/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/c1f6e270-bc15-4816-bc25-a1b71070b751/d57d3022-46a7-4997-902f-0fc122cacd92/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/c1f6e270-bc15-4816-bc25-a1b71070b751/ac20c293-6951-4916-bd0f-d32f6b3b815b/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/c1f6e270-bc15-4816-bc25-a1b71070b751/d03faa5d-afdc-4ed0-b61c-aa7d1b97ba48/direct +Authorization: {{access_token}} + + +### 대구 센터 연결 역방향 +POST {{host}}/api/v1/hub-routes/c27c2ba8-4011-4d68-991e-19315c19a192/c1f6e270-bc15-4816-bc25-a1b71070b751/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/d57d3022-46a7-4997-902f-0fc122cacd92/c1f6e270-bc15-4816-bc25-a1b71070b751/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/ac20c293-6951-4916-bd0f-d32f6b3b815b/c1f6e270-bc15-4816-bc25-a1b71070b751/direct +Authorization: {{access_token}} +### +POST {{host}}/api/v1/hub-routes/d03faa5d-afdc-4ed0-b61c-aa7d1b97ba48/c1f6e270-bc15-4816-bc25-a1b71070b751/direct +Authorization: {{access_token}} + +### 나머지는 위에서 중복되는 데이터임 \ No newline at end of file diff --git a/api-http/hub/create-hub.http b/api-http/hub/create-hub.http new file mode 100644 index 0000000..e5b3087 --- /dev/null +++ b/api-http/hub/create-hub.http @@ -0,0 +1,185 @@ + +@host = http://localhost:8080 + +POST http://localhost:8080/api/v1/users/sign-in +Content-Type: application/json + +{ + "username": "asdf123", + "password": "asdfgA12@" +} +> {% + client.global.set("access_token", response.headers.valueOf("Authorization")) +%} + +### 👩🏻‍💻 Hub 테이블 더미데이터에 필요한 코드 +### +### - 서울특별시 센터 : 서울특별시 송파구 송파대로 55 +POST http://localhost:8080/api/v1/hubs +Content-Type: application/json +Authorization: {{access_token}} + +{ + "name": "서울특별시 센터", + "address": "서울특별시 송파구 송파대로 55" +} + +### - 경기 북부 센터 : 경기도 고양시 덕양구 권율대로 570 +POST http://localhost:8080/api/v1/hubs +Content-Type: application/json +Authorization: {{access_token}} + +{ + "name": "경기 북부 센터", + "address": "경기도 고양시 덕양구 권율대로 570" +} + +### - 경기 남부 센터 : 경기도 이천시 덕평로 257-21 +POST {{host}}/api/v1/hubs +Content-Type: application/json +Authorization: {{access_token}} + +{ + "name": "경기 남부 센터", + "address": "경기도 이천시 덕평로 257-21" +} + +### - 부산광역시 센터 : 부산 동구 중앙대로 206 +POST {{host}}/api/v1/hubs +Content-Type: application/json +Authorization: {{access_token}} + +{ + "name": "부산광역시 센터", + "address": "부산 동구 중앙대로 206" +} + +### - 대구광역시 센터 : 대구 북구 태평로 161 +POST {{host}}/api/v1/hubs +Content-Type: application/json +Authorization: {{access_token}} + +{ + "name": "대구광역시 센터", + "address": "대구 북구 태평로 161" +} + +### - 인천광역시 센터 : 인천 남동구 정각로 29 +POST {{host}}/api/v1/hubs +Content-Type: application/json +Authorization: {{access_token}} + +{ + "name": "인천광역시 센터", + "address": "인천 남동구 정각로 29" +} + +### - 광주광역시 센터 : 광주 서구 내방로 111 +POST{{host}}/api/v1/hubs +Content-Type: application/json +Authorization: {{access_token}} + +{ + "name": "광주광역시 센터", + "address": "광주 서구 내방로 111" +} + +### - 대전광역시 센터 : 대전 서구 둔산로 100 +POST {{host}}/api/v1/hubs +Content-Type: application/json +Authorization: {{access_token}} + +{ + "name": "대전광역시 센터", + "address": "대전 서구 둔산로 100" +} + +### - 울산광역시 센터 : 울산 남구 중앙로 201 +POST {{host}}/api/v1/hubs +Content-Type: application/json +Authorization: {{access_token}} + +{ + "name": "울산광역시 센터", + "address": "울산 남구 중앙로 201" +} + +### - 세종특별자치시 센터 : 세종특별자치시 한누리대로 2130 +POST {{host}}/api/v1/hubs +Content-Type: application/json +Authorization: {{access_token}} + +{ + "name": "세종특별자치시 센터", + "address": "세종특별자치시 한누리대로 2130" +} + +### - 강원특별자치도 센터 : 강원특별자치도 춘천시 중앙로 1 +POST {{host}}/api/v1/hubs +Content-Type: application/json +Authorization: {{access_token}} + +{ + "name": "강원특별자치도 센터", + "address": "강원특별자치도 춘천시 중앙로 1" +} + +### - 충청북도 센터 : 충북 청주시 상당구 상당로 82 +POST {{host}}/api/v1/hubs +Content-Type: application/json +Authorization: {{access_token}} + +{ + "name": "충청북도 센터", + "address": "충북 청주시 상당구 상당로 82" +} + +### - 충청남도 센터 : 충남 홍성군 홍북읍 충남대로 21 +POST {{host}}/api/v1/hubs +Content-Type: application/json +Authorization: {{access_token}} + +{ + "name": "충청남도 센터", + "address": "충남 홍성군 홍북읍 충남대로 21" +} + +### - 전북특별자치도 센터 : 전북특별자치도 전주시 완산구 효자로 225 +POST {{host}}/api/v1/hubs +Content-Type: application/json +Authorization: {{access_token}} + +{ + "name": "전북특별자치도 센터", + "address": "전북특별자치도 전주시 완산구 효자로 225" +} + +### - 전라남도 센터 : 전남 무안군 삼향읍 오룡길 1 +POST {{host}}/api/v1/hubs +Content-Type: application/json +Authorization: {{access_token}} + +{ + "name": "전라남도 센터", + "address": "전남 무안군 삼향읍 오룡길 1" +} + +### - 경상북도 센터 : 경북 안동시 풍천면 도청대로 455 +POST {{host}}/api/v1/hubs +Content-Type: application/json +Authorization: {{access_token}} + +{ + "name": "경상북도 센터", + "address": "경북 안동시 풍천면 도청대로 455" +} + +### - 경상남도 센터 : 경남 창원시 의창구 중앙대로 300 +POST {{host}}/api/v1/hubs +Content-Type: application/json +Authorization: {{access_token}} + +{ + "name": "경상남도 센터", + "address": "경남 창원시 의창구 중앙대로 300" +} \ No newline at end of file diff --git a/api-http/hub/hub-route-total-test.http b/api-http/hub/hub-route-total-test.http new file mode 100644 index 0000000..84a191f --- /dev/null +++ b/api-http/hub/hub-route-total-test.http @@ -0,0 +1,38 @@ + +@hub_route_id = +@seoul_hub = +@busan_hub = +@south_gyeonggi_hub = +@host = http://localhost:8080 +@access_token = eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4MzA4MzAsImV4cCI6MTc0MjgzNDQzMH0.VHGVmFH9iCNpx1y6Y8Xk1dgncD-5TZjr1L5JLZJYHaqQuKjpZR9MVGspnff7Mqb2Db6mUCdAFtZYBfxKgU1RUw + +### 🔹 전체 허브 경로 목록 조회 (페이징) +GET {{host}}/api/v1/hub-routes +Accept: application/json + + +### 🔹 특정 경로 ID 조회 +GET {{host}}/api/v1/hub-routes/{{hub_route_id}} +Accept: application/json + + +### 🔹 특정 허브 간 다이렉트 경로 조회 +GET {{host}}/api/v1/hub-routes/{{seoul_hub}}/{{south_gyeonggi_hub}}/direct +Accept: application/json + + +### 🔹 허브 간 다이렉트 경로 생성 -> ✨ create-hub-routes.http 에서 테스트 및 더미데이터 생성 + + +### 🔹 허브 간 경로 삭제 +DELETE {{host}}/api/v1/hub-routes/{{hub_route_id}} +Accept: application/json +Authorization: {{access_token}} + +### 🔹 허브 간 최단 경로 생성 (Path 기반) -> ✨create-hub-route-checkpoint.http 에서 테스트 및 더미데이터 생성 + + +### 🔹 허브 간 최단 경로 조회 (Path 기반) * +GET {{host}}/api/v1/hub-routes/{{seoul_hub}}/{{busan_hub}}/path +Accept: application/json + diff --git a/api-http/hub/hub-shipping-feignclient.http b/api-http/hub/hub-shipping-feignclient.http new file mode 100644 index 0000000..b6321bc --- /dev/null +++ b/api-http/hub/hub-shipping-feignclient.http @@ -0,0 +1,18 @@ +### 내부 로직에 feign client 호출 존재 : Shipping-service 함께 실행중이여야 가능 + +@hub_id = +@shipping_id = +@host = http://localhost:8080 +@access_token = eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4MzA4MzAsImV4cCI6MTc0MjgzNDQzMH0.VHGVmFH9iCNpx1y6Y8Xk1dgncD-5TZjr1L5JLZJYHaqQuKjpZR9MVGspnff7Mqb2Db6mUCdAFtZYBfxKgU1RUw + +### Hub - 상품 입고 처리 +POST {{host}}/api/v1/hub-shipping-scan/{{hub_id}}/{{shipping_id}}/inbound-log +Content-Type: application/json +Authorization: {{access_token}} + +### + +### Hub - 상품 출고 처리 +POST {{host}}/api/v1/hub-shipping-scan/{{hub_id}}/{{shipping_id}}/outbound-log +Content-Type: application/json +Authorization: {{access_token}} diff --git a/api-http/hub/hub-total-test.http b/api-http/hub/hub-total-test.http new file mode 100644 index 0000000..74d0f56 --- /dev/null +++ b/api-http/hub/hub-total-test.http @@ -0,0 +1,29 @@ + +@hub_id = +@host = http://localhost:8080 +@access_token = eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4MzA4MzAsImV4cCI6MTc0MjgzNDQzMH0.VHGVmFH9iCNpx1y6Y8Xk1dgncD-5TZjr1L5JLZJYHaqQuKjpZR9MVGspnff7Mqb2Db6mUCdAFtZYBfxKgU1RUw + +### 🔹 허브 목록 조회 (페이징) +GET {{host}}/api/v1/hubs +Accept: application/json + +### 🔹 특정 허브 조회 (GET, UUID 사용) +GET {{host}}/api/v1/hubs/{{hub_id}} +Accept: application/json + +### 🔹 허브 생성 (POST) -> ✨ create-hub.http 에서 테스트 및 더미데이터 생성 + +### 🔹 허브 검색 (해당 단어 포함하는 모든 주소, 이름 검색 가능) +GET {{host}}/api/v1/hubs/search?address=서울특별시 송파구 +Accept: application/json + +### 🔹 허브 업데이트 (PUT, UUID 사용) +PUT {{host}}/api/v1/hubs/{{hub_id}}?address=충남 홍성군 홍북읍 충남대로 21 +Accept: application/json +Authorization: {{access_token}} + + +### 🔹 허브 삭제 (DELETE, UUID 사용) +DELETE {{host}}/api/v1/hubs/{{hub_id}} +Accept: application/json +Authorization: {{access_token}} From a4daa1c08b92d326bc272b33558e7608465113c9 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Tue, 25 Mar 2025 02:04:48 +0900 Subject: [PATCH 340/389] =?UTF-8?q?=E2=9C=A8=20feat[#203]=20:=20slack=20ai?= =?UTF-8?q?=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=83=9D=EC=84=B1=20-=20contr?= =?UTF-8?q?oller,=20service,=20dtp=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/GeminiService.java | 53 ++++++++----------- .../client/dto/GeminiReqDto.java | 41 ++++++++++++++ .../client/dto/GeminiResDto.java | 32 +++++++++++ .../presentation/GeminiController.java | 4 +- 4 files changed, 98 insertions(+), 32 deletions(-) create mode 100644 slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiReqDto.java create mode 100644 slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiResDto.java diff --git a/slack-service/src/main/java/com/sparta/slackservice/application/service/GeminiService.java b/slack-service/src/main/java/com/sparta/slackservice/application/service/GeminiService.java index c7a818a..90059f0 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/application/service/GeminiService.java +++ b/slack-service/src/main/java/com/sparta/slackservice/application/service/GeminiService.java @@ -1,14 +1,16 @@ package com.sparta.slackservice.application.service; +import com.sparta.slackservice.application.dto.SlackResponseDto; +import com.sparta.slackservice.infastructure.client.dto.GeminiReqDto; +import com.sparta.slackservice.infastructure.client.dto.GeminiResDto; import com.sparta.slackservice.infastructure.client.dto.GeminiResponseDto; import com.sparta.slackservice.infastructure.client.dto.SlackNotificationDto; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; +import org.springframework.http.*; import org.springframework.stereotype.Service; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.client.RestTemplate; import java.util.HashMap; @@ -21,32 +23,23 @@ public class GeminiService { private final RestTemplate restTemplate; - public GeminiResponseDto createMessage(SlackNotificationDto requstDto){ - String prompt = createCombinedMessage(requstDto) + "이 데이터를 하나의 배송메세지로 만들어줘"; - String aiApiUrl = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=AIzaSyDrLB8TPWb0uhedaw9Oy4dxMl2Rm5EU-U4"; // 실제 AI 서비스 URL로 수정 필요 - - // 요청할 데이터 준비 - Map requestData = new HashMap<>(); - requestData.put("contents", List.of( - Map.of( - "parts", List.of( - Map.of("text", prompt) // text 안에 prompt를 넣음 - ) - ) - )); - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - HttpEntity> entity = new HttpEntity<>(requestData, headers); - - // 4. AI에 POST 요청을 보내고 응답 받기 - ResponseEntity aiResponse = restTemplate.postForEntity(aiApiUrl, entity, String.class); - - // 5. AI 응답을 GeminiResponseDto로 변환 - GeminiResponseDto geminiResponse = new GeminiResponseDto(); - geminiResponse.setAnswer(aiResponse.getBody()); // AI 응답 내용 설정 - - return geminiResponse; + public GeminiResponseDto generateResponse(SlackNotificationDto requestDto) { + String geminiURL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=" + + "AIzaSyDrLB8TPWb0uhedaw9Oy4dxMl2Rm5EU-U4"; + String context = createCombinedMessage(requestDto); + String requestText = context + "에 대해서 하나의 배송메세지를 작성해줘"; + GeminiReqDto request = new GeminiReqDto(); + request.createGeminiReqDto(requestText); + + GeminiResponseDto responseDto = new GeminiResponseDto(); + try{ + String response = restTemplate.postForObject(geminiURL, request, String.class); + responseDto.setAnswer(response); + }catch (Exception e){ + throw new RuntimeException(); + } + + return responseDto; } private String createCombinedMessage(SlackNotificationDto requestDto) { diff --git a/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiReqDto.java b/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiReqDto.java new file mode 100644 index 0000000..061b606 --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiReqDto.java @@ -0,0 +1,41 @@ +package com.sparta.slackservice.infastructure.client.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GeminiReqDto { + + private List contents; + + @Data + public class Content{ + + private List parts; + + public Content(String text){ + parts = new ArrayList<>(); + Part part = new Part(text); + parts.add(part); + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public class Part{ + private String text; + } + } + + public void createGeminiReqDto(String text){ + this.contents = new ArrayList<>(); + Content content = new Content(text); + contents.add(content); + } +} \ No newline at end of file diff --git a/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiResDto.java b/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiResDto.java new file mode 100644 index 0000000..6c5fa02 --- /dev/null +++ b/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiResDto.java @@ -0,0 +1,32 @@ +package com.sparta.slackservice.infastructure.client.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GeminiResDto { + private List candidates; + + @Data + public static class Candidate { + private Content content; + private String finishReason; + } + + @Data + public static class Content { + private List parts; + private String role; + + } + + @Data + public static class Parts { + private String text; + } +} \ No newline at end of file diff --git a/slack-service/src/main/java/com/sparta/slackservice/presentation/GeminiController.java b/slack-service/src/main/java/com/sparta/slackservice/presentation/GeminiController.java index d34ead8..50dbadc 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/presentation/GeminiController.java +++ b/slack-service/src/main/java/com/sparta/slackservice/presentation/GeminiController.java @@ -30,14 +30,14 @@ public ResponseEntity createMessage(@PathVariable UUID id) {/ //요청한 정보가져오기 SlackNotificationDto slackNotificationDto = orderClient.getSlackNotificationInfo(id); - GeminiResponseDto responseDto = geminiService.createMessage(slackNotificationDto); + GeminiResponseDto responseDto = geminiService.generateResponse(slackNotificationDto); return ResponseEntity.ok(responseDto); } @PostMapping("/create") public ResponseEntity createMessage(@RequestBody SlackNotificationDto requestDto) {//주문정보 입력 //요청한 정보가져오기 - GeminiResponseDto responseDto = geminiService.createMessage(requestDto); + GeminiResponseDto responseDto = geminiService.generateResponse(requestDto); return ResponseEntity.ok(responseDto); } From 3c8c60cdc8a3f6122f6150127568329e2cc17b13 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Tue, 25 Mar 2025 02:08:28 +0900 Subject: [PATCH 341/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#191]?= =?UTF-8?q?=20:=20=EC=83=81=ED=92=88=EC=97=90=EC=84=9C=20CompanyClient=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/application/service/ProductServiceImpl.java | 2 +- .../sparta/product/infrastructure/client/CompanyClient.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java index 7f8b8b8..9cb1290 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java @@ -137,7 +137,7 @@ public IncreaseProductQuantityResponseDto increaseProductQuantity(IncreaseProduc // 업체 존재 검증 메서드 private void validateCompanyExists(UUID companyId) { - if (!companyClient.getCompanyById(companyId)) { + if (!companyClient.existsById(companyId)) { throw new ResourceNotFoundException("해당 업체가 존재하지 않습니다."); } } diff --git a/product-service/src/main/java/com/sparta/product/infrastructure/client/CompanyClient.java b/product-service/src/main/java/com/sparta/product/infrastructure/client/CompanyClient.java index d37de8b..5a33dfe 100644 --- a/product-service/src/main/java/com/sparta/product/infrastructure/client/CompanyClient.java +++ b/product-service/src/main/java/com/sparta/product/infrastructure/client/CompanyClient.java @@ -12,6 +12,6 @@ public interface CompanyClient { /** * 업체 존재 확인 */ - @GetMapping("/api/v1/companies/{companyId}") - boolean getCompanyById(@PathVariable("companyId") UUID companyId); + @GetMapping("/api/v1/companies/{id}/exists") + boolean existsById(@PathVariable("id") UUID id); } From 45953d6b1fee64277649bc994ded02758bba94b6 Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Tue, 25 Mar 2025 02:34:58 +0900 Subject: [PATCH 342/389] =?UTF-8?q?=E2=9C=A8feat=20[#205]:swagger=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=B0=8F=20=EA=B6=8C=ED=95=9C=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20http=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api-http/shipping/shipping-service.http | 90 +++++++++++++++++++ .../src/main/resources/application.yml | 7 ++ .../ShippingManagerController.java | 9 ++ .../ShippingServiceApplication.java | 5 ++ .../domain/model/ShippingCheckpoint.java | 2 +- .../domain/model/ShippingRouteLog.java | 2 +- .../dto/OutboundStatusRequestDto.java | 6 +- .../dto/OutboundStatusResponseDto.java | 6 +- .../presentation/ShippingController.java | 34 +++++-- .../src/main/resources/application.yaml | 11 ++- 10 files changed, 155 insertions(+), 17 deletions(-) create mode 100644 api-http/shipping/shipping-service.http diff --git a/api-http/shipping/shipping-service.http b/api-http/shipping/shipping-service.http new file mode 100644 index 0000000..5f9e7d1 --- /dev/null +++ b/api-http/shipping/shipping-service.http @@ -0,0 +1,90 @@ +POST http://localhost:8080/api/v1/users/sign-up +Content-Type: application/json + +{ + "username":"asdf123", + "password":"asdfgA12@", + "email":"asdf@naver.com", + "slackName": "asdggg", + "tokenValue": "mgbE4vogtrMGufz6PXkQNTV-KZtU4-Mz7_wcKf7r40kKTu8z4BD9l_kacdd4MzU3pQV6y3LB-yrmMvvXFKep2Q" +} + + + +### + +POST http://localhost:8080/api/v1/users/sign-in +Content-Type: application/json + +{ + "username": "asdf123", + "password": "asdfgA12@" +} +> {% + client.global.set("access_token", response.headers.valueOf("Authorization")) +%} + +### +GET http://localhost:8080/api/v1/users +Authorization: {{access_token}} + +### + +GET http://localhost:8080/api/v1/shipping/9ae52019-9b37-4bc0-b171-96da397337f3 +Authorization: {{access_token}} + +### +GET http://localhost:8080/api/v1/shippings +Authorization: {{access_token}} + +### +PATCH http://localhost:8080/api/v1/shippings/f271488e-a691-42c6-ac21-e4f85f5af6a7 +Content-Type: application/json +Authorization: {{access_token}} + +{ + "shipping": { + "orderId": "e0a8018e-7ecf-11ee-b962-0242ac120002", + "shippingAddress": "서울시 강남구 역삼동 123", + "receiverName": "홍이", + "status": "PENDING" + }, + "routeLog": { + "startHubId": "11111111-aaaa-bbbb-cccc-111111111111", + "endHubId": "22222222-aaaa-bbbb-cccc-222222222222", + "sequence": 1, + "estimatedDistance": 12.34, + "estimatedTime": 25, + "actualDistance": 3.0, + "actualTime": 2, + "shippingManagerId": "d3e4e889-7134-4db7-bcf6-7cb8b527a1c1" + } +} + +### + +DELETE http://localhost:8080/api/v1/shippings/cbc196b9-28e4-4d59-99ef-6191e753a38e +Authorization: {{access_token}} +### + +GET http://localhost:8080/api/v1/shippings/cbc196b9-28e4-4d59-99ef-6191e753a38e/286e62b7-e1e0-4474-89ba-17418508d1eb +Authorization: {{access_token}} + +### +GET http://localhost:8080/api/v1/shippings/log +Authorization: {{access_token}} + +### +POST http://localhost:8080/api/shipping-managers +Content-Type: application/json +Authorization: {{access_token}} + +{ + "shippingManagerId": "2f20c1b6-d3cb-4b1d-9c24-23b5d6e5b9af", + "managerType": "CARRIER", + "isActive": true, + "count": 0 +} + + + diff --git a/hub-service/src/main/resources/application.yml b/hub-service/src/main/resources/application.yml index 107e035..d22e527 100644 --- a/hub-service/src/main/resources/application.yml +++ b/hub-service/src/main/resources/application.yml @@ -41,3 +41,10 @@ springdoc: shipping: service: url: http://localhost:8081/api/v1/shippings + +naver: + api: + geocode: + url: "https://naveropenapi.apigw.ntruss.com/map-geocode/v2/geocode" + client-id: "2e9tbpntbr" + client-secret: "XHNl0SXFKvSoIzTc7QJeZGayDRRDHyKjKiHz9hq4" \ No newline at end of file diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java b/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java index a810e26..6ff55dd 100644 --- a/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java @@ -1,9 +1,11 @@ package com.sparta.shippingmanager.presentation; +import com.sparta.commonmodule.aop.RoleCheck; import com.sparta.shippingmanager.application.dto.request.ShippingManagerCreateRequestDto; import com.sparta.shippingmanager.application.service.ShippingManagerService; import com.sparta.shippingmanager.domain.model.ShippingManager; import com.sparta.shippingmanager.application.dto.response.ShippingManagerResponseDto; +import io.swagger.v3.oas.annotations.Operation; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -18,17 +20,24 @@ public class ShippingManagerController { private final ShippingManagerService shippingManagerService; + @Operation(summary = "업체 배송 담당자 지정",description = "업체 배송 담당자 지정 API 입니다") @GetMapping("/assign") // 배송 담당자 할당 public ShippingManager assignManager(){ return shippingManagerService.assign(); } + + @Operation(summary = "배송 담당자 등록",description = "배송 담당자 등록 API 입니다") + @RoleCheck("ROLE_HUB,ROLE_MASTER") @PostMapping() public ResponseEntity create(@Valid @RequestBody ShippingManagerCreateRequestDto request, @RequestHeader("userId") Long userId){ ShippingManagerResponseDto response = shippingManagerService.create(request, userId); return ResponseEntity.ok(response); } + + @Operation(summary = "특정 배송 담당자 조회",description = "특정 배송 담당자 조회 API 입니다") + @RoleCheck("ROLE_HUB,ROLE_MASTER") @GetMapping("/{id}") public ResponseEntity getById(@PathVariable("id") UUID id){ ShippingManagerResponseDto response = shippingManagerService.getById(id); diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java b/shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java index 59aede2..22e1e74 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/ShippingServiceApplication.java @@ -1,9 +1,13 @@ package com.sparta.shippingservice; +import com.sparta.commonmodule.config.JpaAuditingConfig; +import com.sparta.commonmodule.config.SwaggerConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.Import; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication(scanBasePackages = "com.sparta") @@ -11,6 +15,7 @@ @EnableJpaRepositories(basePackages = "com.sparta") @EntityScan(basePackages = "com.sparta") +@Import({JpaAuditingConfig.class, SwaggerConfig.class}) public class ShippingServiceApplication { public static void main(String[] args) { SpringApplication.run(ShippingServiceApplication.class, args); diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingCheckpoint.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingCheckpoint.java index 4e59e12..a4ee967 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingCheckpoint.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingCheckpoint.java @@ -8,7 +8,7 @@ @Setter @Entity -@Table(name = "shipping_checkpoint") +@Table(name = "p_shipping_checkpoint") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java index a5d0e0c..0c536f6 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/ShippingRouteLog.java @@ -10,7 +10,7 @@ import java.util.UUID; @Entity -@Table(name = "shipping_route") +@Table(name = "p_shipping_route") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusRequestDto.java index 92ddab7..062cbd3 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusRequestDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusRequestDto.java @@ -1,8 +1,10 @@ package com.sparta.shippingservice.infrastructure.hub_feign.dto; -import com.sparta.hubservice.hub.domain.model.HubShippingScanLog.ShippingStatus; + import java.time.LocalDateTime; import java.util.UUID; + +import com.sparta.shippingservice.domain.model.ShippingHubScanLog; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -15,7 +17,7 @@ public class OutboundStatusRequestDto { private UUID hubId; - private ShippingStatus status; + private ShippingHubScanLog.ShippingStatus status; private LocalDateTime timestamp; private UUID nextHubId; diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusResponseDto.java index b9aef5e..6768618 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusResponseDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusResponseDto.java @@ -1,6 +1,6 @@ package com.sparta.shippingservice.infrastructure.hub_feign.dto; -import com.sparta.hubservice.hub.domain.model.HubShippingScanLog.ShippingStatus; + import com.sparta.shippingservice.domain.model.ShippingHubScanLog; import java.time.LocalDateTime; import java.util.UUID; @@ -18,7 +18,7 @@ public class OutboundStatusResponseDto { private String message; private UUID hubId; private UUID shippingId; - private ShippingStatus status; + private ShippingHubScanLog.ShippingStatus status; private LocalDateTime timestamp; private UUID nextHubId; @@ -26,7 +26,7 @@ public OutboundStatusResponseDto(ShippingHubScanLog log, String message) { this.message = message; this.hubId = log.getHubId(); this.shippingId = log.getShipping().getId(); - this.status = ShippingStatus.OUTBOUND; + this.status = ShippingHubScanLog.ShippingStatus.OUTBOUND; this.nextHubId = log.getNextHubId(); } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index fc00211..2fdfaab 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -1,5 +1,6 @@ package com.sparta.shippingservice.presentation; +import com.sparta.commonmodule.aop.RoleCheck; import com.sparta.shippingservice.application.dto.request.CreateShippingRequestDto; import com.sparta.shippingservice.application.dto.request.CreateShippingWithRouteRequestDto; import com.sparta.shippingservice.application.dto.request.ShippingSearchCondition; @@ -10,6 +11,8 @@ import com.sparta.shippingservice.application.service.ShippingService; import com.sparta.shippingservice.domain.model.Shipping; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -24,56 +27,67 @@ @RestController @RequestMapping("/api/v1/shippings") @RequiredArgsConstructor +@Tag(name = "shipping-service",description = "배송 및 배송 로그 서비 API") public class ShippingController { private final ShippingService shippingService; + + @Operation(summary = "배송 등록",description = "배송 생성 API 입니다") + @RoleCheck("ROLE_MASTER") @PostMapping() // 배송 생성 - public ResponseEntity create (@Valid @RequestBody CreateShippingRequestDto request, @RequestHeader("userId")Long userId) { + public ResponseEntity create (@Valid @RequestBody CreateShippingRequestDto request, @RequestHeader("user_Id")Long userId) { ShippingWithRouteResponseDto responseDto = shippingService.create(request,userId); return ResponseEntity.ok(responseDto); } + @Operation(summary = "특정 배송 정보 조회",description = "특정 배송 조회 API 입니다") @GetMapping("/{shippingId}") // 특정 배송 정보 조회 public ResponseEntity getShippingById(@PathVariable("shippingId") UUID id) { ShippingResponseDto responseDto = shippingService.getShippingById(id); return ResponseEntity.ok(responseDto); } + @Operation(summary = "전체 배송 조회",description = " 모든 배송 조회 API 입니다") @GetMapping() //모든 배송 내역 조회 public ResponseEntity> getAllShipping() { List allShipping = shippingService.getAllShipping(); return ResponseEntity.ok(allShipping); } - + @Operation(summary = "특정 배송 내역 수정",description = "특정 배송 수정 API 입니다") + @RoleCheck("ROLE_SHIPPING,ROLE_MASTER,ROLE_HUB") @PatchMapping("/{shippingId}") // 배송 내역 수정 - public ResponseEntity updateShipping(@PathVariable("shippingId") UUID id, @Valid @RequestBody UpdateShippingRequestDto request, @RequestHeader("userId") Long userId ) { + public ResponseEntity updateShipping(@PathVariable("shippingId") UUID id, @Valid @RequestBody UpdateShippingRequestDto request, @RequestHeader("user_id") Long userId ) { ShippingResponseDto ResponseDto = shippingService.updateShipping(id, request,userId); return ResponseEntity.ok(ResponseDto); } + + @Operation(summary = "배송 정보 검색",description = "배송자,배송 주소, 배송 상태 검색을 할 수 있습니다") + @RoleCheck("ROLE_SHIPPING,ROLE_MASTER,ROLE_HUB") @GetMapping("/search") - public ResponseEntity> searchShippings(@ModelAttribute ShippingSearchCondition condition, HttpServletRequest request) { + public ResponseEntity> searchShippings(@ModelAttribute ShippingSearchCondition condition) { Page result = shippingService.searchShipping(condition); - log.info("receiverName raw param: {}", request.getParameter("receiverName")); - log.info("receiverName from DTO: {}", condition.getReceiverName()); return ResponseEntity.ok(result); } + @RoleCheck("ROLE_HUB,ROLE_MASTER") + @Operation(summary = "배송 삭제",description = "배송 삭제 API 입니다") @DeleteMapping("/{shippingId}") - public ResponseEntity deleteShipping(@PathVariable("shippingId") UUID id, @RequestHeader("userId") long userId) { + public ResponseEntity deleteShipping(@PathVariable("shippingId") UUID id, @RequestHeader("user_id") long userId) { ShippingResponseDto responseDto = shippingService.deleteShipping(id, userId); return ResponseEntity.ok(responseDto); } - + @Operation(summary = "특정 배송 로그 조회",description = "특정 배송 로그 조회 API 입니다") @GetMapping("/{shippingId}/{shippingLogId}") // 특정 배송 로그 조회 public ResponseEntity getLogById(@PathVariable("shippingId") UUID id, @PathVariable("shippingLogId") UUID logId) { ShippingRouteResponseDto responseDto = shippingService.getLogById(id, logId); return ResponseEntity.ok(responseDto); } + @Operation(summary = "모든 배송 로그 정보 조회",description = "모든 배송 로그 조회 API 입니다") @GetMapping("/log") public ResponseEntity> getAllLog() { List allLog = shippingService.getLogAll(); @@ -82,8 +96,10 @@ public ResponseEntity> getAllLog() { } + @Operation(summary = "특정 배송 정보 삭제",description = "특정 배송 삭제 API 입니다") @DeleteMapping("/{shippingId}/{shippingLogId}") - public ResponseEntitydeleteShippingLog(@PathVariable("shippingId") UUID id, @PathVariable("shippingLogId") UUID logId ,@RequestParam Long userId){ + @RoleCheck("ROLE_HUB,ROLE_MASTER") + public ResponseEntitydeleteShippingLog(@PathVariable("shippingId") UUID id, @PathVariable("shippingLogId") UUID logId , @RequestHeader("user_id") Long userId){ ShippingRouteResponseDto responseDto = shippingService.deleteShippingLog(id, logId, userId); return ResponseEntity.ok(responseDto); diff --git a/shipping-service/src/main/resources/application.yaml b/shipping-service/src/main/resources/application.yaml index a166c54..0dab7ca 100644 --- a/shipping-service/src/main/resources/application.yaml +++ b/shipping-service/src/main/resources/application.yaml @@ -29,4 +29,13 @@ feign: shipping-manager-service: url: http://localhost:8088 hub-service: - url: http://localhost:8082 \ No newline at end of file + url: http://localhost:8082 + +springdoc: + api-docs: + version: openapi_3_1 + enabled: true + path: /product-service/v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui.html \ No newline at end of file From 5d5e2808a9beb0c8c8c85378df60fd8ff2fefce7 Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Tue, 25 Mar 2025 02:36:09 +0900 Subject: [PATCH 343/389] =?UTF-8?q?=E2=9C=A8feat=20[#205]:swagger=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=B0=8F=20=EA=B6=8C=ED=95=9C=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20http=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api-http/shipping/http-request.http | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 api-http/shipping/http-request.http diff --git a/api-http/shipping/http-request.http b/api-http/shipping/http-request.http new file mode 100644 index 0000000..f3cb9f6 --- /dev/null +++ b/api-http/shipping/http-request.http @@ -0,0 +1,14 @@ +### + +POST http://localhost:8088/api/v1/shippings +Content-Type: application/json +Authorization: {{access_token}} + +{ + "orderId": "550e8400-e29b-41d4-a716-446655440000", + "shippingAddress": "서울특별시 강남구 테헤란로 427", + "receiverName": "홍길동", + "status": "PENDING" +} + +### \ No newline at end of file From 205748af2eb99dbccbb53c73c1d002f003e376bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=EC=9D=80=E2=98=98?= <138298079+devdaeun@users.noreply.github.com> Date: Tue, 25 Mar 2025 03:13:01 +0900 Subject: [PATCH 344/389] Update README.md --- README.md | 55 +++++++++++++++++++++++-------------------------------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index fc213fb..d0fff83 100644 --- a/README.md +++ b/README.md @@ -5,31 +5,23 @@ Logistics-delivery ## 핵심기술 목표 -### 1. MSA 기반 시스템 설계 및 구현 -- 각 기능을 독립적인 서비스로 분리하여 마이크로서비스 아키텍처(MSA)로 구성합니다. -- 각 서비스는 독립적으로 배포, 확장, 유지보수가 가능하도록 설계됩니다. - -### 2. RESTful API 및 커뮤니케이션 -- 서비스 간 통신을 위한 RESTful API 설계를 통해 상호작용이 이루어집니다. -- API Gateway를 사용하여 외부와의 통신을 단일 진입점으로 처리하고, 각 서비스는 자체적으로 API를 제공합니다. - -### 3. 서비스 간 데이터 공유 및 동기화 -- 각 서비스는 독립적이지만, 데이터의 일관성 있는 처리를 위해 이벤트 기반 메시징 시스템을 도입하여 실시간 데이터 동기화 및 상태 변경을 처리합니다. -- 예를 들어, 주문 발생 이벤트가 발생하면 재고 관리 서비스, 물류 서비스, 배송 서비스가 실시간으로 상태를 갱신하고 처리합니다. -- -### 4. 권한 관리 및 보안 -- 시스템은 **역할 기반 접근 제어(RBAC)**를 통해 각 사용자와 관리자의 권한을 세분화하고, 민감한 데이터를 보호합니다. -- **JWT(JSON Web Token)**을 활용한 인증 및 인가 체계를 구현하여 외부와의 보안을 유지합니다. - -### 5. 배포 및 확장성 -- 시스템은 클라우드 기반에서 배포되며, 각 서비스는 필요에 따라 확장 가능합니다. -- **컨테이너화(Docker)**와 오케스트레이션(Kubernetes) 기술을 활용하여 시스템의 배포와 관리가 용이하도록 설계됩니다. - -### 6. 사용자 경험 개선 -- 실시간 알림 기능을 통해 각 사용자에게 중요 정보를 즉시 제공하여 업무 흐름을 원활하게 유지합니다. - - +### 1. 각 기능별 서비스 분리(MSA 기반 시스템 설계) +- 기능에 따른 개별 애플리케이션을 생성하여 서비스가 독립적으로 존재할 수 있도록 구현. +- 한 서비스에서 이슈가 발생하더라도 다른서비스에는 영향을 미치지않아 시스템의 가용성 향상. +- 서비스 추가에 대한 확장성을 고려한 설계. + +### 2.서비스 간 데이터 공유 및 동기화 +- 독립적인 서비스로 구현되어있지만, 서로 정보를 주고받을 수 있도록 서비스간 통신 설계. +- 트랜젝션 관리를 구현하여 하나라도 실패 시 전체롤백처리. +- 데이터 일관성을 유지하기위한 로직 구현. + +### 3. 인증 및 보안 +- 데이터를 보호하기위해 인증된 사용자만이 접근할 수 있도록 구현. +- 각 서비스 별 접근가능한 권한을 설정하여 보안을 강화. +- JWT(Json Web Token) 를 활용한 인증 및 인가체계를 구현하여 서비스의 보안을 유지 + ## 구현 목표 + ### 1. MSA 기반 아키텍처 & 커뮤니케이션 - 멀티모듈 프로젝트 구조로 각 기능을 독립적인 마이크로서비스로 분리하여 개발진행. - 서비스 간 통신은 REST API를 통해 이루어지며, 다른 서브모듈 간의 통신은 FeignClient 사용. @@ -43,18 +35,16 @@ Logistics-delivery - JWT 인증: 사용자 인증 및 권한 관리를 위해 JWT를 사용하며, 각 요청에서 JWT 토큰을 검증하여 인증된 사용자만 접근하도록 처리. - GateWay의 WebFluxSecurity: API Gateway에서 WebFluxSecurity를 이용해 JWT 토큰을 검증하고, 권한에 따라 요청에 대한 접근을 인가 처리. - AOP를 통한 권한 인가: 서브모듈에서 세부 API별로 AOP를 활용해 권한 인가를 처리, 각 API에 맞는 권한 검사를 자동화 -- 비밀번호 암호화는 BCrypt 해시 알고리즘을 사용. -- 데이터 유효성 검사 및 Spring Validator로 서버 측 검증. +- 비밀번호 암호화: BCrypt 해시 알고리즘을 사용하여 비밀번호 입력 시 암호화 하여 저장. +- 데이터 유효성 검사: Spring Validator로 서버 측에서 유효성 검사 진행. ### 4. 사용자 경험 개선 -- 슬랙 API 연동: 슬랙 API와 연동하여 메시지 발송 시 실시간 알림 기능을 구현, 사용자에게 빠르게 알림을 제공하여 업무 효율성을 향상. +- 슬랙 API 연동: 슬랙 API와 연동하여 메시지 작성 후 발송 시 실시간으로 전달되도록 구현. -### 5. API 문서화 및 개발 지원 --Swagger를 사용하여 API 문서 자동화 및 개발자 지원. +### 5. API 문서화 +- Swagger를 사용하여 API 문서 자동화 지원. # 개발 환경 소개 - - > 프로젝트 개발을 위해 채택한 기술과 용도 및 선택 근거를 포함한 간략한 설명 ### 개발환경 - spring boot 3.4.3 @@ -66,10 +56,11 @@ Logistics-delivery ### 기술스택 | 분류 | 상세 | |----------------|:---------------------------------------------------------| - | Framework | Spring Boot,Spring Cloud (Eureka, Gateway), AOP(사용자 권한 인가), QueryDSL (동적 쿼리 생성) | + | Framework | Spring Boot,JPA ,Spring Cloud (Eureka[MSA 간의 동적 서비스연결], Gateway[공통 진입점], Feign Client[서비스 통신]), AOP(사용자 권한 인가), QueryDSL (동적 쿼리 생성) | | Database | PostgreSQL | | Security | Spring Security(인증,인가), JWT (토큰 기반 인증) | | Documentation | Swagger (API 문서화) | + |Test | Spring Boot Test, JUnit | # 프로젝트 실행 방법 From 2aaec72b268234dc85aee1ae920d940d30fb8903 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Tue, 25 Mar 2025 03:17:40 +0900 Subject: [PATCH 345/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#191]?= =?UTF-8?q?=20:=20=EC=83=81=ED=92=88=EC=97=90=EC=84=9C=20HubClient=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/ProductServiceImpl.java | 6 +++--- .../product/infrastructure/client/HubClient.java | 5 +++-- .../client/dto/response/HubResponseDto.java | 10 ++++++++++ 3 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 product-service/src/main/java/com/sparta/product/infrastructure/client/dto/response/HubResponseDto.java diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java index 9cb1290..15f7d53 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java @@ -19,6 +19,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Optional; import java.util.UUID; @Service @@ -145,9 +146,8 @@ private void validateCompanyExists(UUID companyId) { // 허브 존재 검증 메서드 private void validateHubExists(UUID hubId) { - if (!hubClient.getHubById(hubId)) { - throw new ResourceNotFoundException("해당 허브가 존재하지 않습니다."); - } + Optional.ofNullable(hubClient.getHubById(hubId)) + .orElseThrow(() -> new ResourceNotFoundException("해당 허브가 존재하지 않습니다.")); } } diff --git a/product-service/src/main/java/com/sparta/product/infrastructure/client/HubClient.java b/product-service/src/main/java/com/sparta/product/infrastructure/client/HubClient.java index 5dfd6fa..e07a1da 100644 --- a/product-service/src/main/java/com/sparta/product/infrastructure/client/HubClient.java +++ b/product-service/src/main/java/com/sparta/product/infrastructure/client/HubClient.java @@ -1,5 +1,6 @@ package com.sparta.product.infrastructure.client; +import com.sparta.product.infrastructure.client.dto.response.HubResponseDto; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -10,8 +11,8 @@ public interface HubClient { /** - * 허브 존재 확인 + * 허브 단일 조회 (허브 존재 확인) */ @GetMapping("/api/v1/hubs/{hub_id}") - boolean getHubById(@PathVariable("hub_id") UUID hubId); + HubResponseDto getHubById(@PathVariable("hub_id") UUID hubId); } diff --git a/product-service/src/main/java/com/sparta/product/infrastructure/client/dto/response/HubResponseDto.java b/product-service/src/main/java/com/sparta/product/infrastructure/client/dto/response/HubResponseDto.java new file mode 100644 index 0000000..23cb8c4 --- /dev/null +++ b/product-service/src/main/java/com/sparta/product/infrastructure/client/dto/response/HubResponseDto.java @@ -0,0 +1,10 @@ +package com.sparta.product.infrastructure.client.dto.response; + + +import java.util.UUID; + +public class HubResponseDto { + private UUID id; + private String name; +} + From dbd00d475ab47a4f56b6b7a042ce18ade35a84aa Mon Sep 17 00:00:00 2001 From: jin2304 Date: Tue, 25 Mar 2025 03:20:19 +0900 Subject: [PATCH 346/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#191]?= =?UTF-8?q?=20:=20=EC=83=81=ED=92=88=20HTTP=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- product-service/src/test/http/product.http | 55 +++++++++++++++------- 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/product-service/src/test/http/product.http b/product-service/src/test/http/product.http index 1ea6fc2..8df9451 100644 --- a/product-service/src/test/http/product.http +++ b/product-service/src/test/http/product.http @@ -1,7 +1,20 @@ +### 유저 로그인 +POST http://localhost:8080/api/v1/users/sign-in +Content-Type: application/json + +{ + "username": "asdf123", + "password": "asdfgA12@" +} +> {% + client.global.set("access_token", response.headers.valueOf("Authorization")) +%} + + ### 상품 생성 -POST http://localhost:8083/api/v1/products +POST http://localhost:8080/api/v1/products Content-Type: application/json -X-User-Id: 12345 # 사용자 ID (Long 타입) +Authorization: {{access_token}} { "name": "마른오징어3", @@ -15,18 +28,21 @@ X-User-Id: 12345 # 사용자 ID (Long 타입) ### 상품 단일 조회 -GET http://localhost:8083/api/v1/products/a8fe0567-e857-4427-a612-555328391a36 +GET http://localhost:8080/api/v1/products/238d66b2-f8de-4de9-b0e5-6b32fd620788 Content-Type: application/json +Authorization: {{access_token}} ### 상품 목록 조회 -GET http://localhost:8083/api/v1/products +GET http://localhost:8080/api/v1/products Content-Type: application/json +Authorization: {{access_token}} ### 상품 수정 -PUT http://localhost:8083/api/v1/products/69e23662-9e36-4172-96db-8003308fcb45 +PUT http://localhost:8080/api/v1/products/238d66b2-f8de-4de9-b0e5-6b32fd620788 Content-Type: application/json +Authorization: {{access_token}} { "name": "마른오징어 수정", @@ -37,9 +53,10 @@ Content-Type: application/json ### 상품 수정(재고 감소 성공) -PUT http://localhost:8083/api/v1/products/d6183a42-df2e-44fa-8331-cf7a90a1f82e/decrease +PUT http://localhost:8080/api/v1/products/238d66b2-f8de-4de9-b0e5-6b32fd620788/decrease Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI3ODg3OTEsImV4cCI6MTc0Mjc5MjM5MX0.GTMZCuZ7-jfzYshDEfBdCAfelNFAexIogXxU6rzX3fNTaeQ0GPFilKyylO_E90PiX5DFUWBQ29oIChuMpUU-gg Content-Type: application/json +Authorization: {{access_token}} { "companyId": "550e8400-e29b-41d4-a716-446655440000", @@ -49,8 +66,9 @@ Content-Type: application/json ### 상품 수정(재고 감소 실패) -PUT http://localhost:8083/api/v1/products/fabd981b-844a-47f9-a15c-60ae362c2eb7/decrease +PUT http://localhost:8080/api/v1/products/238d66b2-f8de-4de9-b0e5-6b32fd620788/decrease Content-Type: application/json +Authorization: {{access_token}} { "companyId": "550e8400-e29b-41d4-a716-446655440000", @@ -60,9 +78,10 @@ Content-Type: application/json ### 상품 수정(재고 증가) -PUT http://localhost:8080/api/v1/products/d6183a42-df2e-44fa-8331-cf7a90a1f82e/increase +PUT http://localhost:8080/api/v1/products/238d66b2-f8de-4de9-b0e5-6b32fd620788/increase Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI3ODg3OTEsImV4cCI6MTc0Mjc5MjM5MX0.GTMZCuZ7-jfzYshDEfBdCAfelNFAexIogXxU6rzX3fNTaeQ0GPFilKyylO_E90PiX5DFUWBQ29oIChuMpUU-gg Content-Type: application/json +Authorization: {{access_token}} { "companyId": "550e8400-e29b-41d4-a716-446655440000", @@ -72,27 +91,27 @@ Content-Type: application/json ### 상품 삭제 -DELETE http://localhost:8083/api/v1/products/225dc81a-7b96-4905-83b9-16945fef9a7d -X-User-Id: 12345 # 사용자 ID (Long 타입) +DELETE http://localhost:8080/api/v1/products/225dc81a-7b96-4905-83b9-16945fef9a7d +Authorization: {{access_token}} ### 상품 검색 (상품 이름으로 검색) -GET http://localhost:8083/api/v1/products/search?name=치킨&page=0&size=10&sort=createdAt,asc - +GET http://localhost:8080/api/v1/products/search?name=치킨2&page=0&size=10&sort=createdAt,asc +Authorization: {{access_token}} ### 상품 검색 (상품 설명으로 검색) -GET http://localhost:8083/api/v1/products/search?description=치킨 입니다&page=0&size=10&sort=createdAt,asc - +GET http://localhost:8080/api/v1/products/search?description=마른오징어&page=0&size=10&sort=createdAt,asc +Authorization: {{access_token}} ### 상품 검색 (허브 ID로 검색) -GET http://localhost:8083/api/v1/products/search?hubId=123e4567-e89b-12d3-a456-426614174002&page=0&size=10&sort=createdAt,asc - +GET http://localhost:8080/api/v1/products/search?hubId=db2e0d31-18fb-4856-8d7a-5da08fbf6845&page=0&size=10&sort=createdAt,asc +Authorization: {{access_token}} ### 상품 검색 (업체 ID로 검색) -GET http://localhost:8083/api/v1/products/search?companyId=550e8400-e29b-41d4-a716-446655440001&page=0&size=10&sort=createdAt,asc - +GET http://localhost:8080/api/v1/products/search?companyId=b8166e5f-b844-441c-ae46-75130d4b9fb0&page=0&size=10&sort=createdAt,asc +Authorization: {{access_token}} From a4604943815d8b996eec51fb8d26cd6110bb1d1b Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Tue, 25 Mar 2025 03:20:48 +0900 Subject: [PATCH 347/389] =?UTF-8?q?=F0=9F=8D=BB=20test=20:hub=20=EB=AA=A8?= =?UTF-8?q?=EB=93=A0=20api=EC=9D=98=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hub/create-hub-route-checkpoints.http | 31 +- api-http/hub/create-hub-routes.http | 295 +++++++++++------- api-http/hub/hub-route-total-test.http | 37 +-- api-http/hub/hub-shipping-feignclient.http | 6 +- api-http/hub/hub-total-test.http | 17 +- 5 files changed, 239 insertions(+), 147 deletions(-) diff --git a/api-http/hub/create-hub-route-checkpoints.http b/api-http/hub/create-hub-route-checkpoints.http index f474c49..e7e6419 100644 --- a/api-http/hub/create-hub-route-checkpoints.http +++ b/api-http/hub/create-hub-route-checkpoints.http @@ -1,18 +1,31 @@ -@seoul_hub = -@busan_hub = -@daejeon_hub = -@Gyeongsangbukdo_hub = +@seoul_hub = d25f4291-d134-4f73-885a-0eb188a72649 +@busan_hub = 12bca245-3e19-400d-a421-6e3e42c56b1e +@daejeon_hub = 9d23ac68-441f-4122-ac91-98c99896fcc4 +@Gyeongsangbukdo_hub = ec87005e-5160-4515-90ce-dcbbfb392678 @host = http://localhost:8080 -@access_token = eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4MzA4MzAsImV4cCI6MTc0MjgzNDQzMH0.VHGVmFH9iCNpx1y6Y8Xk1dgncD-5TZjr1L5JLZJYHaqQuKjpZR9MVGspnff7Mqb2Db6mUCdAFtZYBfxKgU1RUw + +POST http://localhost:8080/api/v1/users/sign-in +Content-Type: application/json + +{ + "username": "asdf123", + "password": "asdfgA12@" +} +> {% + client.global.set("access_token", response.headers.valueOf("Authorization")) +%} ### 👩🏻‍💻 Hub Route Checkpoint 테이블 더미데이터에 필요한 코드 -> 중복 있는 상태 ### ### 서울 -> 부산 -POST{{host}}/api/v1/hub-routes/{{seoul_hub}}/{{busan_hub}}/path -Authorization: {{access_token}} +POST{{host}}/api/v1/hubs/hub-routes/{{seoul_hub}}/{{busan_hub}}/path +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzk2MzcsImV4cCI6MTc0Mjg0MzIzN30.QKV6EjSQn5-E9ok_o_teaxK12cIhF3OUsnrPKim4WY16BvO9H97lLIgZru8o3PCKAjoqXHsQhntk3sz8mUU0Cg +Content-Type: application/json ### 대전 -> 경상북도 -POST {{host}}/api/v1/hub-routes/{{daejeon_hub}}/{{Gyeongsangbukdo_hub}}/path -Authorization: {{access_token}} +POST {{host}}/api/v1/hubs/hub-routes/{{daejeon_hub}}/{{Gyeongsangbukdo_hub}}/path +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzk2MzcsImV4cCI6MTc0Mjg0MzIzN30.QKV6EjSQn5-E9ok_o_teaxK12cIhF3OUsnrPKim4WY16BvO9H97lLIgZru8o3PCKAjoqXHsQhntk3sz8mUU0Cg +Content-Type: application/json + diff --git a/api-http/hub/create-hub-routes.http b/api-http/hub/create-hub-routes.http index 61d4d21..7a17265 100644 --- a/api-http/hub/create-hub-routes.http +++ b/api-http/hub/create-hub-routes.http @@ -1,126 +1,201 @@ @host = http://localhost:8080 -@access_token = eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4MzA4MzAsImV4cCI6MTc0MjgzNDQzMH0.VHGVmFH9iCNpx1y6Y8Xk1dgncD-5TZjr1L5JLZJYHaqQuKjpZR9MVGspnff7Mqb2Db6mUCdAFtZYBfxKgU1RUw + +POST http://localhost:8080/api/v1/users/sign-in +Content-Type: application/json + +{ + "username": "asdf123", + "password": "asdfgA12@" +} +> {% + client.global.set("access_token", response.headers.valueOf("Authorization")) +%} ### 👩🏻‍💻 Hub Route 테이블의 더미데이터에 필요한 코드 ### -### 경기 남부 센터 연결 (경기북부, 서울, 인천, 강원도, 경상북도, 대전, 대구) -POST {{host}}/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/c1984014-c71d-4c55-a3b6-8568d7d1f897/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/eff77800-604d-441d-a736-63f1f7d25e51/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/f95653a0-edb1-4bb4-8d2e-814e4638639a/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/d6a865bd-b172-433c-b49f-dcd5ff9ee428/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/c27c2ba8-4011-4d68-991e-19315c19a192/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/c1f6e270-bc15-4816-bc25-a1b71070b751/direct -Authorization: {{access_token}} +### 경기 남부 → 경기 북부 +POST http://localhost:8080/api/v1/hubs/hub-routes/8b3f2668-49cb-4885-8855-e20fd4bf10aa/d2587e4e-b2d4-4c9b-b2fd-37f035596a0d/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json -### 경기 남부 센터 연결 역방향 -POST {{host}}/api/v1/hub-routes/c1984014-c71d-4c55-a3b6-8568d7d1f897/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/eff77800-604d-441d-a736-63f1f7d25e51/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/f95653a0-edb1-4bb4-8d2e-814e4638639a/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/d6a865bd-b172-433c-b49f-dcd5ff9ee428/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/c27c2ba8-4011-4d68-991e-19315c19a192/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/c1f6e270-bc15-4816-bc25-a1b71070b751/3b4279fa-ec57-4a03-a97e-aa8428f3ab0d/direct -Authorization: {{access_token}} +### 경기 북부 → 경기 남부 +POST {{host}}/api/v1/hubs/hub-routes/d2587e4e-b2d4-4c9b-b2fd-37f035596a0d/8b3f2668-49cb-4885-8855-e20fd4bf10aa/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json +### 경기 남부 → 서울특별시 +POST {{host}}/api/v1/hubs/hub-routes/8b3f2668-49cb-4885-8855-e20fd4bf10aa/d25f4291-d134-4f73-885a-0eb188a72649/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json +### 서울특별시 → 경기 남부 +POST {{host}}/api/v1/hubs/hub-routes/d25f4291-d134-4f73-885a-0eb188a72649/8b3f2668-49cb-4885-8855-e20fd4bf10aa/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json -### 대전 센터 연결 (충남, 충북, 세종, 전북, 광주, 전남, 경기남부, 대구) -POST {{host}}/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/b252fddc-a4b1-420e-94c2-9a91bebee41a/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/031973c0-944d-4c53-803b-27ad45fbfb38/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/854d3f6d-c150-4471-a75c-06248c64daef/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/d073a70d-e200-4301-af35-4c1a87798427/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/9984a080-0ecb-45d6-a92f-0a67cfb63592/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/dfba0f7b-ce3b-4d11-aa8f-40ac398028f9/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/984feadc-b1db-43c5-81bc-a24ec5001ddc/c1f6e270-bc15-4816-bc25-a1b71070b751/direct -Authorization: {{access_token}} +### 경기 남부 → 인천광역시 +POST {{host}}/api/v1/hubs/hub-routes/8b3f2668-49cb-4885-8855-e20fd4bf10aa/4410d46d-27a2-4267-824b-4305a6731624/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json -### 대전 센터 연결 역방향 -POST {{host}}/api/v1/hub-routes/b252fddc-a4b1-420e-94c2-9a91bebee41a/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/031973c0-944d-4c53-803b-27ad45fbfb38/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/854d3f6d-c150-4471-a75c-06248c64daef/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/d073a70d-e200-4301-af35-4c1a87798427/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/9984a080-0ecb-45d6-a92f-0a67cfb63592/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/dfba0f7b-ce3b-4d11-aa8f-40ac398028f9/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/c1f6e270-bc15-4816-bc25-a1b71070b751/984feadc-b1db-43c5-81bc-a24ec5001ddc/direct -Authorization: {{access_token}} +### 인천광역시 → 경기 남부 +POST {{host}}/api/v1/hubs/hub-routes/4410d46d-27a2-4267-824b-4305a6731624/8b3f2668-49cb-4885-8855-e20fd4bf10aa/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json +### 경기 남부 → 강원특별자치도 +POST {{host}}/api/v1/hubs/hub-routes/8b3f2668-49cb-4885-8855-e20fd4bf10aa/3e734ae7-1030-45c8-b19d-b7ee7601cf2f/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json +### 강원특별자치도 → 경기 남부 +POST {{host}}/api/v1/hubs/hub-routes/3e734ae7-1030-45c8-b19d-b7ee7601cf2f/8b3f2668-49cb-4885-8855-e20fd4bf10aa/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json -### 대구 센터 연결 (경북, 경남, 부산, 울산, 경기남부, 대전) -POST {{host}}/api/v1/hub-routes/c1f6e270-bc15-4816-bc25-a1b71070b751/c27c2ba8-4011-4d68-991e-19315c19a192/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/c1f6e270-bc15-4816-bc25-a1b71070b751/d57d3022-46a7-4997-902f-0fc122cacd92/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/c1f6e270-bc15-4816-bc25-a1b71070b751/ac20c293-6951-4916-bd0f-d32f6b3b815b/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/c1f6e270-bc15-4816-bc25-a1b71070b751/d03faa5d-afdc-4ed0-b61c-aa7d1b97ba48/direct -Authorization: {{access_token}} +### 경기 남부 → 경상북도 +POST {{host}}/api/v1/hubs/hub-routes/8b3f2668-49cb-4885-8855-e20fd4bf10aa/ec87005e-5160-4515-90ce-dcbbfb392678/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json +### 경상북도 → 경기 남부 +POST {{host}}/api/v1/hubs/hub-routes/ec87005e-5160-4515-90ce-dcbbfb392678/8b3f2668-49cb-4885-8855-e20fd4bf10aa/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json -### 대구 센터 연결 역방향 -POST {{host}}/api/v1/hub-routes/c27c2ba8-4011-4d68-991e-19315c19a192/c1f6e270-bc15-4816-bc25-a1b71070b751/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/d57d3022-46a7-4997-902f-0fc122cacd92/c1f6e270-bc15-4816-bc25-a1b71070b751/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/ac20c293-6951-4916-bd0f-d32f6b3b815b/c1f6e270-bc15-4816-bc25-a1b71070b751/direct -Authorization: {{access_token}} -### -POST {{host}}/api/v1/hub-routes/d03faa5d-afdc-4ed0-b61c-aa7d1b97ba48/c1f6e270-bc15-4816-bc25-a1b71070b751/direct -Authorization: {{access_token}} -### 나머지는 위에서 중복되는 데이터임 \ No newline at end of file + + + + +### 대전광역시 → 충청남도 +POST {{host}}/api/v1/hubs/hub-routes/9d23ac68-441f-4122-ac91-98c99896fcc4/a8d36f04-6312-4acb-aac1-1b5e82e0995d/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 충청남도 → 대전광역시 +POST {{host}}/api/v1/hubs/hub-routes/a8d36f04-6312-4acb-aac1-1b5e82e0995d/9d23ac68-441f-4122-ac91-98c99896fcc4/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 대전광역시 → 충청북도 +POST {{host}}/api/v1/hubs/hub-routes/9d23ac68-441f-4122-ac91-98c99896fcc4/2cddf4cb-07fc-487a-bceb-9613b884447f/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 충청북도 → 대전광역시 +POST {{host}}/api/v1/hubs/hub-routes/2cddf4cb-07fc-487a-bceb-9613b884447f/9d23ac68-441f-4122-ac91-98c99896fcc4/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 대전광역시 → 세종특별자치시 +POST {{host}}/api/v1/hubs/hub-routes/9d23ac68-441f-4122-ac91-98c99896fcc4/0b1fa666-ebaa-4da8-a880-3bd40181ec0c/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 세종특별자치시 → 대전광역시 +POST {{host}}/api/v1/hubs/hub-routes/0b1fa666-ebaa-4da8-a880-3bd40181ec0c/9d23ac68-441f-4122-ac91-98c99896fcc4/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 대전광역시 → 전북특별자치도 +POST {{host}}/api/v1/hubs/hub-routes/9d23ac68-441f-4122-ac91-98c99896fcc4/eb42b568-480c-4515-ac25-6d2dc6532110/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 전북특별자치도 → 대전광역시 +POST {{host}}/api/v1/hubs/hub-routes/eb42b568-480c-4515-ac25-6d2dc6532110/9d23ac68-441f-4122-ac91-98c99896fcc4/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 대전광역시 → 광주광역시 +POST {{host}}/api/v1/hubs/hub-routes/9d23ac68-441f-4122-ac91-98c99896fcc4/b38d1ab0-2d3e-424c-b39d-814f10b294a5/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 광주광역시 → 대전광역시 +POST {{host}}/api/v1/hubs/hub-routes/b38d1ab0-2d3e-424c-b39d-814f10b294a5/9d23ac68-441f-4122-ac91-98c99896fcc4/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 대전광역시 → 전라남도 +POST {{host}}/api/v1/hubs/hub-routes/9d23ac68-441f-4122-ac91-98c99896fcc4/972869be-9b58-4db2-9477-67a986c42d5b/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 전라남도 → 대전광역시 +POST {{host}}/api/v1/hubs/hub-routes/972869be-9b58-4db2-9477-67a986c42d5b/9d23ac68-441f-4122-ac91-98c99896fcc4/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 대전광역시 → 경기 남부 +POST {{host}}/api/v1/hubs/hub-routes/9d23ac68-441f-4122-ac91-98c99896fcc4/8b3f2668-49cb-4885-8855-e20fd4bf10aa/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 경기 남부 → 대전광역시 +POST {{host}}/api/v1/hubs/hub-routes/8b3f2668-49cb-4885-8855-e20fd4bf10aa/9d23ac68-441f-4122-ac91-98c99896fcc4/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 대전광역시 → 대구광역시 +POST {{host}}/api/v1/hubs/hub-routes/9d23ac68-441f-4122-ac91-98c99896fcc4/73c63196-a79c-4b05-912e-d3bbd8244cda/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 대구광역시 → 대전광역시 +POST {{host}}/api/v1/hubs/hub-routes/73c63196-a79c-4b05-912e-d3bbd8244cda/9d23ac68-441f-4122-ac91-98c99896fcc4/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 대구광역시 → 경상북도 +POST {{host}}/api/v1/hubs/hub-routes/73c63196-a79c-4b05-912e-d3bbd8244cda/ec87005e-5160-4515-90ce-dcbbfb392678/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 경상북도 → 대구광역시 +POST {{host}}/api/v1/hubs/hub-routes/ec87005e-5160-4515-90ce-dcbbfb392678/73c63196-a79c-4b05-912e-d3bbd8244cda/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 대구광역시 → 경상남도 +POST {{host}}/api/v1/hubs/hub-routes/73c63196-a79c-4b05-912e-d3bbd8244cda/6ad0e2b5-6a15-437b-be2d-db5329b6cff6/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 경상남도 → 대구광역시 +POST {{host}}/api/v1/hubs/hub-routes/6ad0e2b5-6a15-437b-be2d-db5329b6cff6/73c63196-a79c-4b05-912e-d3bbd8244cda/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 대구광역시 → 부산광역시 +POST {{host}}/api/v1/hubs/hub-routes/73c63196-a79c-4b05-912e-d3bbd8244cda/12bca245-3e19-400d-a421-6e3e42c56b1e/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 부산광역시 → 대구광역시 +POST {{host}}/api/v1/hubs/hub-routes/12bca245-3e19-400d-a421-6e3e42c56b1e/73c63196-a79c-4b05-912e-d3bbd8244cda/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 대구광역시 → 울산광역시 +POST {{host}}/api/v1/hubs/hub-routes/73c63196-a79c-4b05-912e-d3bbd8244cda/b97f9c00-f8bb-4ff4-99d0-624da28a2be7/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 울산광역시 → 대구광역시 +POST {{host}}/api/v1/hubs/hub-routes/b97f9c00-f8bb-4ff4-99d0-624da28a2be7/73c63196-a79c-4b05-912e-d3bbd8244cda/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 대구광역시 → 경기 남부 +POST {{host}}/api/v1/hubs/hub-routes/73c63196-a79c-4b05-912e-d3bbd8244cda/8b3f2668-49cb-4885-8855-e20fd4bf10aa/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + +### 경기 남부 → 대구광역시 +POST {{host}}/api/v1/hubs/hub-routes/8b3f2668-49cb-4885-8855-e20fd4bf10aa/73c63196-a79c-4b05-912e-d3bbd8244cda/direct +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg2MDEsImV4cCI6MTc0Mjg0MjIwMX0.nz_C1XrfRH0FYkP75wiFCzWdMn10TmDs8pUThBvAHaVwotpWtOZmT_vqHNWwIvGAqA1QCvbiSN4ib_E1E3Iy7w +Content-Type: application/json + diff --git a/api-http/hub/hub-route-total-test.http b/api-http/hub/hub-route-total-test.http index 84a191f..bfbaab1 100644 --- a/api-http/hub/hub-route-total-test.http +++ b/api-http/hub/hub-route-total-test.http @@ -1,38 +1,39 @@ -@hub_route_id = -@seoul_hub = -@busan_hub = -@south_gyeonggi_hub = +@hub_route_id = e0ea93fb-8d7c-42c2-ba06-684646745c1e +@seoul_hub = d25f4291-d134-4f73-885a-0eb188a72649 +@busan_hub = 12bca245-3e19-400d-a421-6e3e42c56b1e +@south_gyeonggi_hub = 8b3f2668-49cb-4885-8855-e20fd4bf10aa @host = http://localhost:8080 -@access_token = eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4MzA4MzAsImV4cCI6MTc0MjgzNDQzMH0.VHGVmFH9iCNpx1y6Y8Xk1dgncD-5TZjr1L5JLZJYHaqQuKjpZR9MVGspnff7Mqb2Db6mUCdAFtZYBfxKgU1RUw + ### 🔹 전체 허브 경로 목록 조회 (페이징) -GET {{host}}/api/v1/hub-routes -Accept: application/json +GET {{host}}/api/v1/hubs/hub-routes +Content-Type: application/json +Authorization: {{access_token}} ### 🔹 특정 경로 ID 조회 -GET {{host}}/api/v1/hub-routes/{{hub_route_id}} -Accept: application/json - +GET {{host}}/api/v1/hubs/hub-routes/{{hub_route_id}} +Content-Type: application/json +Authorization: {{access_token}} ### 🔹 특정 허브 간 다이렉트 경로 조회 -GET {{host}}/api/v1/hub-routes/{{seoul_hub}}/{{south_gyeonggi_hub}}/direct -Accept: application/json - +GET {{host}}/api/v1/hubs/hub-routes/{{seoul_hub}}/{{south_gyeonggi_hub}}/direct +Content-Type: application/json +Authorization: {{access_token}} ### 🔹 허브 간 다이렉트 경로 생성 -> ✨ create-hub-routes.http 에서 테스트 및 더미데이터 생성 ### 🔹 허브 간 경로 삭제 -DELETE {{host}}/api/v1/hub-routes/{{hub_route_id}} -Accept: application/json +DELETE {{host}}/api/v1/hubs/hub-routes/{{hub_route_id}} +Content-Type: application/json Authorization: {{access_token}} ### 🔹 허브 간 최단 경로 생성 (Path 기반) -> ✨create-hub-route-checkpoint.http 에서 테스트 및 더미데이터 생성 ### 🔹 허브 간 최단 경로 조회 (Path 기반) * -GET {{host}}/api/v1/hub-routes/{{seoul_hub}}/{{busan_hub}}/path -Accept: application/json - +GET {{host}}/api/v1/hubs/hub-routes/{{seoul_hub}}/{{busan_hub}}/path +Content-Type: application/json +Authorization: {{access_token}} diff --git a/api-http/hub/hub-shipping-feignclient.http b/api-http/hub/hub-shipping-feignclient.http index b6321bc..8db3e66 100644 --- a/api-http/hub/hub-shipping-feignclient.http +++ b/api-http/hub/hub-shipping-feignclient.http @@ -3,16 +3,16 @@ @hub_id = @shipping_id = @host = http://localhost:8080 -@access_token = eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4MzA4MzAsImV4cCI6MTc0MjgzNDQzMH0.VHGVmFH9iCNpx1y6Y8Xk1dgncD-5TZjr1L5JLZJYHaqQuKjpZR9MVGspnff7Mqb2Db6mUCdAFtZYBfxKgU1RUw + ### Hub - 상품 입고 처리 -POST {{host}}/api/v1/hub-shipping-scan/{{hub_id}}/{{shipping_id}}/inbound-log +POST {{host}}/api/v1/hubs/hub-shipping-scan/{{hub_id}}/{{shipping_id}}/inbound-log Content-Type: application/json Authorization: {{access_token}} ### ### Hub - 상품 출고 처리 -POST {{host}}/api/v1/hub-shipping-scan/{{hub_id}}/{{shipping_id}}/outbound-log +POST {{host}}/api/v1/hubs/hub-shipping-scan/{{hub_id}}/{{shipping_id}}/outbound-log Content-Type: application/json Authorization: {{access_token}} diff --git a/api-http/hub/hub-total-test.http b/api-http/hub/hub-total-test.http index 74d0f56..29d8e1d 100644 --- a/api-http/hub/hub-total-test.http +++ b/api-http/hub/hub-total-test.http @@ -1,29 +1,32 @@ -@hub_id = +@hub_id = d25f4291-d134-4f73-885a-0eb188a72649 @host = http://localhost:8080 -@access_token = eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4MzA4MzAsImV4cCI6MTc0MjgzNDQzMH0.VHGVmFH9iCNpx1y6Y8Xk1dgncD-5TZjr1L5JLZJYHaqQuKjpZR9MVGspnff7Mqb2Db6mUCdAFtZYBfxKgU1RUw + ### 🔹 허브 목록 조회 (페이징) GET {{host}}/api/v1/hubs -Accept: application/json +Content-Type: application/json +Authorization: {{access_token}} ### 🔹 특정 허브 조회 (GET, UUID 사용) GET {{host}}/api/v1/hubs/{{hub_id}} -Accept: application/json +Content-Type: application/json +Authorization: {{access_token}} ### 🔹 허브 생성 (POST) -> ✨ create-hub.http 에서 테스트 및 더미데이터 생성 ### 🔹 허브 검색 (해당 단어 포함하는 모든 주소, 이름 검색 가능) GET {{host}}/api/v1/hubs/search?address=서울특별시 송파구 -Accept: application/json +Content-Type: application/json +Authorization: {{access_token}} ### 🔹 허브 업데이트 (PUT, UUID 사용) PUT {{host}}/api/v1/hubs/{{hub_id}}?address=충남 홍성군 홍북읍 충남대로 21 -Accept: application/json +Content-Type: application/json Authorization: {{access_token}} ### 🔹 허브 삭제 (DELETE, UUID 사용) DELETE {{host}}/api/v1/hubs/{{hub_id}} -Accept: application/json +Content-Type: application/json Authorization: {{access_token}} From 507c2d09500ed221342b0130cf42f32f2465e1ee Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Tue, 25 Mar 2025 03:21:39 +0900 Subject: [PATCH 348/389] =?UTF-8?q?=E2=9C=A8=20feat=20:=20=ED=97=88?= =?UTF-8?q?=EB=B8=8C=20=EA=B4=80=EB=A0=A8=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?sql=20=ED=8C=8C=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hub-service/src/main/resources/sql/p_hub.sql | 17 +++++++++ .../src/main/resources/sql/p_hub_route.sql | 38 +++++++++++++++++++ .../resources/sql/p_hub_route_checkpoint.sql | 3 ++ 3 files changed, 58 insertions(+) create mode 100644 hub-service/src/main/resources/sql/p_hub.sql create mode 100644 hub-service/src/main/resources/sql/p_hub_route.sql create mode 100644 hub-service/src/main/resources/sql/p_hub_route_checkpoint.sql diff --git a/hub-service/src/main/resources/sql/p_hub.sql b/hub-service/src/main/resources/sql/p_hub.sql new file mode 100644 index 0000000..34d0786 --- /dev/null +++ b/hub-service/src/main/resources/sql/p_hub.sql @@ -0,0 +1,17 @@ +INSERT INTO hub_service.p_hub (hub_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, address, latitude, longitude, name) VALUES ('d25f4291-d134-4f73-885a-0eb188a72649', '2025-03-25 01:51:28.958692', 1, null, null, false, '2025-03-25 01:51:28.958692', 1, '서울특별시 송파구 송파대로 55', 37.47415400, 127.12390620, '서울특별시 센터'); +INSERT INTO hub_service.p_hub (hub_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, address, latitude, longitude, name) VALUES ('d2587e4e-b2d4-4c9b-b2fd-37f035596a0d', '2025-03-25 01:51:29.072057', 1, null, null, false, '2025-03-25 01:51:29.072057', 1, '경기도 고양시 덕양구 권율대로 570', 37.64037710, 126.87379550, '경기 북부 센터'); +INSERT INTO hub_service.p_hub (hub_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, address, latitude, longitude, name) VALUES ('8b3f2668-49cb-4885-8855-e20fd4bf10aa', '2025-03-25 01:51:29.179759', 1, null, null, false, '2025-03-25 01:51:29.179759', 1, '경기도 이천시 덕평로 257-21', 37.18962130, 127.37505010, '경기 남부 센터'); +INSERT INTO hub_service.p_hub (hub_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, address, latitude, longitude, name) VALUES ('12bca245-3e19-400d-a421-6e3e42c56b1e', '2025-03-25 01:51:29.285968', 1, null, null, false, '2025-03-25 01:51:29.285968', 1, '부산 동구 중앙대로 206', 35.11760120, 129.04505790, '부산광역시 센터'); +INSERT INTO hub_service.p_hub (hub_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, address, latitude, longitude, name) VALUES ('73c63196-a79c-4b05-912e-d3bbd8244cda', '2025-03-25 01:51:29.395185', 1, null, null, false, '2025-03-25 01:51:29.395185', 1, '대구 북구 태평로 161', 35.87586320, 128.59613850, '대구광역시 센터'); +INSERT INTO hub_service.p_hub (hub_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, address, latitude, longitude, name) VALUES ('4410d46d-27a2-4267-824b-4305a6731624', '2025-03-25 01:51:29.499141', 1, null, null, false, '2025-03-25 01:51:29.499141', 1, '인천 남동구 정각로 29', 37.45594180, 126.70515050, '인천광역시 센터'); +INSERT INTO hub_service.p_hub (hub_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, address, latitude, longitude, name) VALUES ('b38d1ab0-2d3e-424c-b39d-814f10b294a5', '2025-03-25 01:51:29.608871', 1, null, null, false, '2025-03-25 01:51:29.608871', 1, '광주 서구 내방로 111', 35.16003200, 126.85133800, '광주광역시 센터'); +INSERT INTO hub_service.p_hub (hub_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, address, latitude, longitude, name) VALUES ('9d23ac68-441f-4122-ac91-98c99896fcc4', '2025-03-25 01:51:29.711015', 1, null, null, false, '2025-03-25 01:51:29.711015', 1, '대전 서구 둔산로 100', 36.35050010, 127.38483340, '대전광역시 센터'); +INSERT INTO hub_service.p_hub (hub_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, address, latitude, longitude, name) VALUES ('b97f9c00-f8bb-4ff4-99d0-624da28a2be7', '2025-03-25 01:51:29.815896', 1, null, null, false, '2025-03-25 01:51:29.815896', 1, '울산 남구 중앙로 201', 35.53947730, 129.31129940, '울산광역시 센터'); +INSERT INTO hub_service.p_hub (hub_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, address, latitude, longitude, name) VALUES ('0b1fa666-ebaa-4da8-a880-3bd40181ec0c', '2025-03-25 01:51:29.926910', 1, null, null, false, '2025-03-25 01:51:29.926910', 1, '세종특별자치시 한누리대로 2130', 36.48001210, 127.28906910, '세종특별자치시 센터'); +INSERT INTO hub_service.p_hub (hub_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, address, latitude, longitude, name) VALUES ('3e734ae7-1030-45c8-b19d-b7ee7601cf2f', '2025-03-25 01:51:30.049931', 1, null, null, false, '2025-03-25 01:51:30.049931', 1, '강원특별자치도 춘천시 중앙로 1', 37.88539900, 127.72975000, '강원특별자치도 센터'); +INSERT INTO hub_service.p_hub (hub_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, address, latitude, longitude, name) VALUES ('2cddf4cb-07fc-487a-bceb-9613b884447f', '2025-03-25 01:51:30.155681', 1, null, null, false, '2025-03-25 01:51:30.155681', 1, '충북 청주시 상당구 상당로 82', 36.63609950, 127.49136050, '충청북도 센터'); +INSERT INTO hub_service.p_hub (hub_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, address, latitude, longitude, name) VALUES ('a8d36f04-6312-4acb-aac1-1b5e82e0995d', '2025-03-25 01:51:30.267675', 1, null, null, false, '2025-03-25 01:51:30.267675', 1, '충남 홍성군 홍북읍 충남대로 21', 36.65924900, 126.67290800, '충청남도 센터'); +INSERT INTO hub_service.p_hub (hub_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, address, latitude, longitude, name) VALUES ('eb42b568-480c-4515-ac25-6d2dc6532110', '2025-03-25 01:51:30.367681', 1, null, null, false, '2025-03-25 01:51:30.367681', 1, '전북특별자치도 전주시 완산구 효자로 225', 35.82032940, 127.10878400, '전북특별자치도 센터'); +INSERT INTO hub_service.p_hub (hub_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, address, latitude, longitude, name) VALUES ('972869be-9b58-4db2-9477-67a986c42d5b', '2025-03-25 01:51:30.469500', 1, null, null, false, '2025-03-25 01:51:30.469500', 1, '전남 무안군 삼향읍 오룡길 1', 34.81611020, 126.46317140, '전라남도 센터'); +INSERT INTO hub_service.p_hub (hub_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, address, latitude, longitude, name) VALUES ('ec87005e-5160-4515-90ce-dcbbfb392678', '2025-03-25 01:51:30.562934', 1, null, null, false, '2025-03-25 01:51:30.562934', 1, '경북 안동시 풍천면 도청대로 455', 36.57594770, 128.50564620, '경상북도 센터'); +INSERT INTO hub_service.p_hub (hub_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, address, latitude, longitude, name) VALUES ('6ad0e2b5-6a15-437b-be2d-db5329b6cff6', '2025-03-25 01:51:30.665512', 1, null, null, false, '2025-03-25 01:51:30.665512', 1, '경남 창원시 의창구 중앙대로 300', 35.23779740, 128.69194030, '경상남도 센터'); diff --git a/hub-service/src/main/resources/sql/p_hub_route.sql b/hub-service/src/main/resources/sql/p_hub_route.sql new file mode 100644 index 0000000..913379f --- /dev/null +++ b/hub-service/src/main/resources/sql/p_hub_route.sql @@ -0,0 +1,38 @@ +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('41f4f9f6-4528-465d-a92b-46caee54fd7e', '2025-03-25 02:52:21.400934', 1, null, null, false, '2025-03-25 02:52:21.400934', 1, 66.87, 1, 'd2587e4e-b2d4-4c9b-b2fd-37f035596a0d', '8b3f2668-49cb-4885-8855-e20fd4bf10aa'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('20f474c1-f262-47f2-95db-cb991e613e01', '2025-03-25 02:52:23.575234', 1, null, null, false, '2025-03-25 02:52:23.575234', 1, 38.65, 1, '8b3f2668-49cb-4885-8855-e20fd4bf10aa', 'd25f4291-d134-4f73-885a-0eb188a72649'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('68293329-979f-450e-b625-14c10e6ffc24', '2025-03-25 02:52:36.041411', 1, null, null, false, '2025-03-25 02:52:36.041411', 1, 38.65, 1, 'd25f4291-d134-4f73-885a-0eb188a72649', '8b3f2668-49cb-4885-8855-e20fd4bf10aa'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('64e0c1e8-09f4-4171-8bdd-343da708d0b0', '2025-03-25 02:52:40.494551', 1, null, null, false, '2025-03-25 02:52:40.494551', 1, 66.23, 1, '8b3f2668-49cb-4885-8855-e20fd4bf10aa', '4410d46d-27a2-4267-824b-4305a6731624'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('1b36e421-a0bd-4711-abfc-dfcf6adb7767', '2025-03-25 02:52:44.921514', 1, null, null, false, '2025-03-25 02:52:44.921514', 1, 66.23, 1, '4410d46d-27a2-4267-824b-4305a6731624', '8b3f2668-49cb-4885-8855-e20fd4bf10aa'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('006ab37f-cd90-434e-8ab1-b6ffe6743864', '2025-03-25 02:52:49.610882', 1, null, null, false, '2025-03-25 02:52:49.610882', 1, 83.45, 1, '8b3f2668-49cb-4885-8855-e20fd4bf10aa', '3e734ae7-1030-45c8-b19d-b7ee7601cf2f'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('2794961b-ee17-4eb1-bf15-d9036676845f', '2025-03-25 02:52:54.076497', 1, null, null, false, '2025-03-25 02:52:54.076497', 1, 83.45, 1, '3e734ae7-1030-45c8-b19d-b7ee7601cf2f', '8b3f2668-49cb-4885-8855-e20fd4bf10aa'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('3ebac11c-f1c6-4053-a0a7-2f72d42a1473', '2025-03-25 02:52:58.551441', 1, null, null, false, '2025-03-25 02:52:58.551441', 1, 121.52, 2, '8b3f2668-49cb-4885-8855-e20fd4bf10aa', 'ec87005e-5160-4515-90ce-dcbbfb392678'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('5d5836e9-8fab-4986-9d71-edabdaf2722b', '2025-03-25 02:53:03.202529', 1, null, null, false, '2025-03-25 02:53:03.202529', 1, 121.52, 2, 'ec87005e-5160-4515-90ce-dcbbfb392678', '8b3f2668-49cb-4885-8855-e20fd4bf10aa'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('301ab043-5906-4729-9907-7cf6bd8cb9b4', '2025-03-25 02:53:15.608909', 1, null, null, false, '2025-03-25 02:53:15.608909', 1, 72.30, 1, '9d23ac68-441f-4122-ac91-98c99896fcc4', 'a8d36f04-6312-4acb-aac1-1b5e82e0995d'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('5ef095ff-4db5-4dec-af00-1dcef0582f57', '2025-03-25 02:53:23.883033', 1, null, null, false, '2025-03-25 02:53:23.883033', 1, 72.30, 1, 'a8d36f04-6312-4acb-aac1-1b5e82e0995d', '9d23ac68-441f-4122-ac91-98c99896fcc4'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('1f14d362-1167-40d9-a819-e1e164683b54', '2025-03-25 02:54:48.663139', 1, null, null, false, '2025-03-25 02:54:48.663139', 1, 33.15, 1, '2cddf4cb-07fc-487a-bceb-9613b884447f', '9d23ac68-441f-4122-ac91-98c99896fcc4'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('67e5c1f6-2c42-4ef4-9f8f-abed23552dd0', '2025-03-25 02:54:54.531925', 1, null, null, false, '2025-03-25 02:54:54.531925', 1, 33.15, 1, '9d23ac68-441f-4122-ac91-98c99896fcc4', '2cddf4cb-07fc-487a-bceb-9613b884447f'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('120dea07-2fd9-4ffb-85b1-306c31f8ad45', '2025-03-25 02:55:01.370964', 1, null, null, false, '2025-03-25 02:55:01.370964', 1, 16.76, 0, '9d23ac68-441f-4122-ac91-98c99896fcc4', '0b1fa666-ebaa-4da8-a880-3bd40181ec0c'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('659e2dfc-3cc5-4205-baea-a12dec20dbaa', '2025-03-25 02:59:24.345632', 1, null, null, false, '2025-03-25 02:59:24.345632', 1, 16.76, 0, '0b1fa666-ebaa-4da8-a880-3bd40181ec0c', '9d23ac68-441f-4122-ac91-98c99896fcc4'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('fe8ebb35-7cba-4484-b9e9-0ed9ed40af87', '2025-03-25 02:59:29.953806', 1, null, null, false, '2025-03-25 02:59:29.953806', 1, 63.96, 1, '9d23ac68-441f-4122-ac91-98c99896fcc4', 'eb42b568-480c-4515-ac25-6d2dc6532110'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('f6e46825-a663-43af-be4e-0c9277ff8bf5', '2025-03-25 02:59:37.912100', 1, null, null, false, '2025-03-25 02:59:37.912100', 1, 63.96, 1, 'eb42b568-480c-4515-ac25-6d2dc6532110', '9d23ac68-441f-4122-ac91-98c99896fcc4'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('4ef5b377-84ac-4a5a-8a65-037e4006996d', '2025-03-25 02:59:48.033759', 1, null, null, false, '2025-03-25 02:59:48.033759', 1, 140.86, 2, '9d23ac68-441f-4122-ac91-98c99896fcc4', 'b38d1ab0-2d3e-424c-b39d-814f10b294a5'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('09cf5179-f01b-4780-a84c-eb20b0d60bba', '2025-03-25 02:59:52.636079', 1, null, null, false, '2025-03-25 02:59:52.636079', 1, 140.86, 2, 'b38d1ab0-2d3e-424c-b39d-814f10b294a5', '9d23ac68-441f-4122-ac91-98c99896fcc4'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('5e08df2c-4c8f-4274-be98-1fbf6da44437', '2025-03-25 02:59:57.357067', 1, null, null, false, '2025-03-25 02:59:57.357067', 1, 189.88, 3, '9d23ac68-441f-4122-ac91-98c99896fcc4', '972869be-9b58-4db2-9477-67a986c42d5b'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('6f88c55e-279a-4582-9da9-c2aeda1c9c87', '2025-03-25 03:00:07.000388', 1, null, null, false, '2025-03-25 03:00:07.000388', 1, 189.88, 3, '972869be-9b58-4db2-9477-67a986c42d5b', '9d23ac68-441f-4122-ac91-98c99896fcc4'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('048a196d-72a3-4964-acb7-e799544300fb', '2025-03-25 03:00:11.549404', 1, null, null, false, '2025-03-25 03:00:11.549404', 1, 93.31, 2, '9d23ac68-441f-4122-ac91-98c99896fcc4', '8b3f2668-49cb-4885-8855-e20fd4bf10aa'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('d3651716-5b68-4fb4-899d-dec54d5c3f61', '2025-03-25 03:00:16.788193', 1, null, null, false, '2025-03-25 03:00:16.788193', 1, 93.31, 2, '8b3f2668-49cb-4885-8855-e20fd4bf10aa', '9d23ac68-441f-4122-ac91-98c99896fcc4'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('2f56d3a1-9e12-4de9-a402-cef2cd03134c', '2025-03-25 03:00:23.828329', 1, null, null, false, '2025-03-25 03:00:23.828329', 1, 120.93, 2, '9d23ac68-441f-4122-ac91-98c99896fcc4', '73c63196-a79c-4b05-912e-d3bbd8244cda'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('9f11ba56-8a4e-4bf5-a61c-4eb03cc1af6b', '2025-03-25 03:00:32.135024', 1, null, null, false, '2025-03-25 03:00:32.135024', 1, 120.93, 2, '73c63196-a79c-4b05-912e-d3bbd8244cda', '9d23ac68-441f-4122-ac91-98c99896fcc4'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('de92eaea-1b5f-49ff-b413-682f366a68bb', '2025-03-25 03:00:37.068232', 1, null, null, false, '2025-03-25 03:00:37.068232', 1, 78.27, 1, '73c63196-a79c-4b05-912e-d3bbd8244cda', 'ec87005e-5160-4515-90ce-dcbbfb392678'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('fa5fd99e-d03b-48bf-bfd0-98ebd7d256d8', '2025-03-25 03:00:41.817325', 1, null, null, false, '2025-03-25 03:00:41.817325', 1, 78.27, 1, 'ec87005e-5160-4515-90ce-dcbbfb392678', '73c63196-a79c-4b05-912e-d3bbd8244cda'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('a0d96dfe-3dee-4909-8652-553fae7e57c9', '2025-03-25 03:00:49.210659', 1, null, null, false, '2025-03-25 03:00:49.210659', 1, 71.48, 1, '73c63196-a79c-4b05-912e-d3bbd8244cda', '6ad0e2b5-6a15-437b-be2d-db5329b6cff6'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('b76608da-82a8-40bb-a08c-2e6c70667cb2', '2025-03-25 03:00:53.560388', 1, null, null, false, '2025-03-25 03:00:53.560388', 1, 71.48, 1, '6ad0e2b5-6a15-437b-be2d-db5329b6cff6', '73c63196-a79c-4b05-912e-d3bbd8244cda'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('96d7be7b-e45b-4b98-b05d-77ee1d39717f', '2025-03-25 03:00:57.411149', 1, null, null, false, '2025-03-25 03:00:57.411149', 1, 93.60, 2, '73c63196-a79c-4b05-912e-d3bbd8244cda', '12bca245-3e19-400d-a421-6e3e42c56b1e'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('aada000f-3269-4c52-b947-f8d9ac970908', '2025-03-25 03:01:01.050435', 1, null, null, false, '2025-03-25 03:01:01.050435', 1, 93.60, 2, '12bca245-3e19-400d-a421-6e3e42c56b1e', '73c63196-a79c-4b05-912e-d3bbd8244cda'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('440486c1-4e9f-4a32-a455-d53da83b06a8', '2025-03-25 03:01:05.670636', 1, null, null, false, '2025-03-25 03:01:05.670636', 1, 74.62, 1, '73c63196-a79c-4b05-912e-d3bbd8244cda', 'b97f9c00-f8bb-4ff4-99d0-624da28a2be7'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('a9c08ef8-4015-48f7-a669-8549791e230e', '2025-03-25 03:01:10.395417', 1, null, null, false, '2025-03-25 03:01:10.395417', 1, 74.62, 1, 'b97f9c00-f8bb-4ff4-99d0-624da28a2be7', '73c63196-a79c-4b05-912e-d3bbd8244cda'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('45497ae7-78c9-4e4b-b430-e44de0a13403', '2025-03-25 03:01:16.714435', 1, null, null, false, '2025-03-25 03:01:16.714435', 1, 182.32, 3, '73c63196-a79c-4b05-912e-d3bbd8244cda', '8b3f2668-49cb-4885-8855-e20fd4bf10aa'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('623c82db-1f7e-4178-ab73-8980e367a0c8', '2025-03-25 03:01:21.660722', 1, null, null, false, '2025-03-25 03:01:21.660722', 1, 182.32, 3, '8b3f2668-49cb-4885-8855-e20fd4bf10aa', '73c63196-a79c-4b05-912e-d3bbd8244cda'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('b2d6e643-6f6a-40ef-a0c1-fb5908a9bce8', '2025-03-25 03:08:04.567230', 1, null, null, false, '2025-03-25 03:08:04.567230', 1, 314.57, 6, 'd25f4291-d134-4f73-885a-0eb188a72649', '12bca245-3e19-400d-a421-6e3e42c56b1e'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('50f45bd6-fed3-4478-82b8-c815b86577f1', '2025-03-25 03:08:07.358910', 1, null, null, false, '2025-03-25 03:08:07.358910', 1, 199.20, 3, '9d23ac68-441f-4122-ac91-98c99896fcc4', 'ec87005e-5160-4515-90ce-dcbbfb392678'); +INSERT INTO hub_service.p_hub_route (hub_route_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, distance, duration, from_hub, to_hub) VALUES ('e0ea93fb-8d7c-42c2-ba06-684646745c1e', '2025-03-25 02:52:18.708099', 1, '2025-03-25 03:12:41.743152', 1, true, '2025-03-25 03:12:41.743472', 1, 66.87, 1, '8b3f2668-49cb-4885-8855-e20fd4bf10aa', 'd2587e4e-b2d4-4c9b-b2fd-37f035596a0d'); diff --git a/hub-service/src/main/resources/sql/p_hub_route_checkpoint.sql b/hub-service/src/main/resources/sql/p_hub_route_checkpoint.sql new file mode 100644 index 0000000..9701e34 --- /dev/null +++ b/hub-service/src/main/resources/sql/p_hub_route_checkpoint.sql @@ -0,0 +1,3 @@ +INSERT INTO hub_service.p_hub_route_checkpoint (hub_route_checkpoint_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, sequence, checkpoint_hub_id, hub_route_id) VALUES ('b90d35cf-a8e5-43d0-8892-902a48b0c534', '2025-03-25 03:08:04.569632', 1, null, null, false, '2025-03-25 03:08:04.569632', 1, 1, '8b3f2668-49cb-4885-8855-e20fd4bf10aa', 'b2d6e643-6f6a-40ef-a0c1-fb5908a9bce8'); +INSERT INTO hub_service.p_hub_route_checkpoint (hub_route_checkpoint_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, sequence, checkpoint_hub_id, hub_route_id) VALUES ('89fdb248-938b-4e7c-a77f-969e4dbe2783', '2025-03-25 03:08:04.569818', 1, null, null, false, '2025-03-25 03:08:04.569818', 1, 2, '73c63196-a79c-4b05-912e-d3bbd8244cda', 'b2d6e643-6f6a-40ef-a0c1-fb5908a9bce8'); +INSERT INTO hub_service.p_hub_route_checkpoint (hub_route_checkpoint_id, created_at, created_by, deleted_at, deleted_by, is_deleted, updated_at, updated_by, sequence, checkpoint_hub_id, hub_route_id) VALUES ('1e5438da-508e-486a-9e49-86177eec6916', '2025-03-25 03:08:07.359160', 1, null, null, false, '2025-03-25 03:08:07.359160', 1, 1, '73c63196-a79c-4b05-912e-d3bbd8244cda', '50f45bd6-fed3-4478-82b8-c815b86577f1'); From 9acab82583deb531787669ff128284021c44924f Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Tue, 25 Mar 2025 03:22:07 +0900 Subject: [PATCH 349/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20url=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/controller/HubShippingScanController.java | 2 +- .../hub_route/presentation/controller/HubRouteController.java | 4 +--- .../presentation/controller/HubRouteFeignController.java | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java index b023dc3..8ff8356 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub/presentation/controller/HubShippingScanController.java @@ -16,7 +16,7 @@ @RestController @RequiredArgsConstructor -@RequestMapping("/api/v1/hub-shipping-scan") +@RequestMapping("/api/v1/hubs/hub-shipping-scan") @Tag(name = "Hub Service", description = "허브 서비스 API") public class HubShippingScanController { diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java index 8ad3019..18d46d3 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteController.java @@ -24,7 +24,7 @@ import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("/api/v1/hub-routes") +@RequestMapping("/api/v1/hubs/hub-routes") @RequiredArgsConstructor @Tag(name = "Hub Service", description = "허브 서비스 API") public class HubRouteController { @@ -60,7 +60,6 @@ public ResponseEntity getDirectHubRoute( // (정해진) 허브 간 경로 생성 (direct) @Operation(summary = "Hub Route", description = "from->to 허브 간 경로 생성 api") - @RoleCheck("ROLE_MASTER") @PostMapping("/{from_hub_id}/{to_hub_id}/direct") public ResponseEntity createDirectHubRoute( @PathVariable("from_hub_id") UUID fromHubId, @@ -84,7 +83,6 @@ public ResponseEntity deleteHubRoute( // form -> to 최단경로 생성 (다이렉트는 항상 최단경로) @Operation(summary = "Hub Route - Checkpoint", description = "허브 간 최단 경로 생성 api") - @RoleCheck("ROLE_MASTER") @PostMapping("/{from_hub_id}/{to_hub_id}/path") public ResponseEntity createPathHubRoute( @PathVariable("from_hub_id") UUID fromHubId, diff --git a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteFeignController.java b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteFeignController.java index 62be262..eaa20b4 100644 --- a/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteFeignController.java +++ b/hub-service/src/main/java/com/sparta/hubservice/hub_route/presentation/controller/HubRouteFeignController.java @@ -14,7 +14,7 @@ @RestController @RequiredArgsConstructor -@RequestMapping("/api/v1/hub-route/feign") +@RequestMapping("/api/v1/hubs/hub-route/feign") @Tag(name = "Hub Service", description = "허브 서비스 API") public class HubRouteFeignController { From 0c0210c3350360c56cdaecb8df6aad791ca2b54d Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Tue, 25 Mar 2025 03:22:20 +0900 Subject: [PATCH 350/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20url=20?= =?UTF-8?q?=ED=95=98=EB=82=98=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gateway/src/main/resources/application.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index 0763fc2..bf88979 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -58,14 +58,6 @@ spring: uri: lb://hub-service predicates: - Path=/api/v1/hubs/** - - id: hub-routes-service - uri: lb://hub-service - predicates: - - Path=/api/v1/hub-routes/** - - id: hub-shipping-scan-service - uri: lb://hub-service - predicates: - - Path=/api/v1/hub-shipping-scan/** - id: hub-docs uri: lb://hub-service predicates: From b822ee431c1b3a7ec1d2f17c93611fd6fea943af Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Tue, 25 Mar 2025 04:23:51 +0900 Subject: [PATCH 351/389] =?UTF-8?q?=E2=9C=A8feat=20[#205]:swagger=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=B0=8F=20=EA=B6=8C=ED=95=9C=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20http=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api-http/shipping/http-request.http | 1 + api-http/shipping/shipping-service.http | 13 +++++++++++++ shipping-service/build.gradle | 4 +++- .../presentation/ShippingController.java | 4 ++-- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/api-http/shipping/http-request.http b/api-http/shipping/http-request.http index f3cb9f6..9ce8f92 100644 --- a/api-http/shipping/http-request.http +++ b/api-http/shipping/http-request.http @@ -3,6 +3,7 @@ POST http://localhost:8088/api/v1/shippings Content-Type: application/json Authorization: {{access_token}} +X-User-Id: 12345 { "orderId": "550e8400-e29b-41d4-a716-446655440000", diff --git a/api-http/shipping/shipping-service.http b/api-http/shipping/shipping-service.http index 5f9e7d1..19f1bb3 100644 --- a/api-http/shipping/shipping-service.http +++ b/api-http/shipping/shipping-service.http @@ -28,6 +28,19 @@ Content-Type: application/json GET http://localhost:8080/api/v1/users Authorization: {{access_token}} +### +POST http://localhost:8080/api/v1/shippings +Content-Type: application/json +Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg5NDQsImV4cCI6MTc0Mjg0MjU0NH0.UueDPgZXhB0w1L_XhcE9fwC1BAdjiHe590Rh5HlSIxppfTTSZczHTgzUyLp6iZNR9_0iCqDfRJNPtE4qzdqV8A + +{ + "orderId": "550e8400-e29b-41d4-a716-446655440000", + "shippingAddress": "서울특별시 강남구 테헤란로 427", + "receiverName": "홍길동", + "status": "PENDING" +} + + ### GET http://localhost:8080/api/v1/shipping/9ae52019-9b37-4bc0-b171-96da397337f3 diff --git a/shipping-service/build.gradle b/shipping-service/build.gradle index a975afc..08a9748 100644 --- a/shipping-service/build.gradle +++ b/shipping-service/build.gradle @@ -3,11 +3,13 @@ ext { } dependencies { + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' + implementation "com.querydsl:querydsl-jpa:5.1.0:jakarta" + implementation 'org.springframework.boot:spring-boot-starter-web' annotationProcessor "com.querydsl:querydsl-apt:5.1.0:jakarta" annotationProcessor "jakarta.persistence:jakarta.persistence-api:3.1.0" annotationProcessor "jakarta.annotation:jakarta.annotation-api:2.1.1" - implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index 2fdfaab..1d1980b 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -33,9 +33,9 @@ public class ShippingController { @Operation(summary = "배송 등록",description = "배송 생성 API 입니다") - @RoleCheck("ROLE_MASTER") + // @RoleCheck("ROLE_MASTER") @PostMapping() // 배송 생성 - public ResponseEntity create (@Valid @RequestBody CreateShippingRequestDto request, @RequestHeader("user_Id")Long userId) { + public ResponseEntity create (@Valid @RequestBody CreateShippingRequestDto request, @RequestHeader("user_id")Long userId) { ShippingWithRouteResponseDto responseDto = shippingService.create(request,userId); return ResponseEntity.ok(responseDto); From 1d65dec4b12e0346da85366fc56fe82387d9d054 Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Tue, 25 Mar 2025 07:23:31 +0900 Subject: [PATCH 352/389] =?UTF-8?q?=E2=9C=A8feat=20[#205]:=20ShippingManag?= =?UTF-8?q?er=20=EA=B2=80=EC=83=89=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/vcs.xml | 2 +- .../ShippingManagerSearchCondition.java | 21 +++++ .../response/ShippingManagerSearchResult.java | 19 ++++ .../service/ShippingManagerService.java | 17 ++++ .../ShippingManagerSearchRepository.java | 92 +++++++++++++++++++ .../ShippingManagerController.java | 10 ++ .../dto/OutboundStatusRequestDto.java | 6 +- .../dto/OutboundStatusResponseDto.java | 6 +- .../presentation/ShippingController.java | 2 - 9 files changed, 167 insertions(+), 8 deletions(-) create mode 100644 shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/request/ShippingManagerSearchCondition.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/response/ShippingManagerSearchResult.java create mode 100644 shipping-service/src/main/java/com/sparta/shippingmanager/infrastructure/ShippingManagerSearchRepository.java diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 94a25f7..35eb1dd 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/request/ShippingManagerSearchCondition.java b/shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/request/ShippingManagerSearchCondition.java new file mode 100644 index 0000000..44f1631 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/request/ShippingManagerSearchCondition.java @@ -0,0 +1,21 @@ +package com.sparta.shippingmanager.application.dto.request; + +import com.sparta.shippingmanager.domain.model.ManagerType; +import lombok.*; + +import java.util.UUID; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class ShippingManagerSearchCondition { + + private UUID shippingManagerId; + private ManagerType managerType; + private Integer shippingOrder; + private String sortBy; + private int pageSize; // 허용 값: 10, 30, 50 + private int page; +} \ No newline at end of file diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/response/ShippingManagerSearchResult.java b/shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/response/ShippingManagerSearchResult.java new file mode 100644 index 0000000..5808230 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/application/dto/response/ShippingManagerSearchResult.java @@ -0,0 +1,19 @@ +package com.sparta.shippingmanager.application.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ShippingManagerSearchResult { + private List content; + private int page; // 현재 페이지 번호 + private int pageSize; // 한 페이지에 몇 건 + private long totalCount; // 전체 개수 +} \ No newline at end of file diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java b/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java index be4813b..63daa4b 100644 --- a/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java @@ -2,10 +2,16 @@ import com.sparta.commonmodule.exception.ResourceNotFoundException; import com.sparta.shippingmanager.application.dto.request.ShippingManagerCreateRequestDto; +import com.sparta.shippingmanager.application.dto.request.ShippingManagerSearchCondition; +import com.sparta.shippingmanager.application.dto.response.ShippingManagerSearchResult; import com.sparta.shippingmanager.domain.model.ShippingManager; import com.sparta.shippingmanager.domain.repository.ShippingManagerRepository; import com.sparta.shippingmanager.application.dto.response.ShippingManagerResponseDto; +import com.sparta.shippingmanager.infrastructure.ShippingManagerSearchRepository; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -17,6 +23,7 @@ public class ShippingManagerService { private final ShippingManagerRepository repository; + private final ShippingManagerSearchRepository searchRepository; private static final int MAX_ORDER = 10; private static int MIN_ORDER =0; @@ -49,6 +56,16 @@ public ShippingManagerResponseDto getById(UUID managerId){ } + public Page search(ShippingManagerSearchCondition condition) { + ShippingManagerSearchResult result = searchRepository.search(condition); + return new PageImpl<>( + result.getContent(), + PageRequest.of(result.getPage(), result.getPageSize()), + result.getTotalCount() + ); + } + + private void nextManagerOrder(int currentOrder) { int nextOrder; if (currentOrder + 1 > MAX_ORDER) { diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/infrastructure/ShippingManagerSearchRepository.java b/shipping-service/src/main/java/com/sparta/shippingmanager/infrastructure/ShippingManagerSearchRepository.java new file mode 100644 index 0000000..05713d4 --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/infrastructure/ShippingManagerSearchRepository.java @@ -0,0 +1,92 @@ +package com.sparta.shippingmanager.infrastructure; + +import com.querydsl.core.types.OrderSpecifier; +import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.sparta.shippingmanager.application.dto.request.ShippingManagerSearchCondition; +import com.sparta.shippingmanager.application.dto.response.ShippingManagerResponseDto; +import com.sparta.shippingmanager.application.dto.response.ShippingManagerSearchResult; +import com.sparta.shippingmanager.domain.model.ManagerType; +import com.sparta.shippingmanager.domain.model.QShippingManager; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@RequiredArgsConstructor +@Repository +public class ShippingManagerSearchRepository { + + private final JPAQueryFactory queryFactory; + + public ShippingManagerSearchResult search(ShippingManagerSearchCondition condition) { + QShippingManager sm = QShippingManager.shippingManager; + int validPageSize = switch (condition.getPageSize()) { + case 10, 30, 50 -> condition.getPageSize(); + default -> 10; + }; + int page = Math.max(condition.getPage(), 0); + // 1. 리스트 조회 + List content = queryFactory + .select(Projections.constructor(ShippingManagerResponseDto.class, + sm.managerType, + sm.shippingManagerId, + sm.shippingOrder + )) + .from(sm) + .where( + eqShippingManagerId(condition.getShippingManagerId()), + eqManagerType(condition.getManagerType()), + eqShippingOrder(condition.getShippingOrder()) + ) + .orderBy(resolveSort(condition.getSortBy(), sm)) + .offset((long) page * validPageSize) + .limit(validPageSize) + .fetch(); + // 2. 카운트 조회 + Long total = queryFactory + .select(sm.count()) + .from(sm) + .where( + eqShippingManagerId(condition.getShippingManagerId()), + eqManagerType(condition.getManagerType()), + eqShippingOrder(condition.getShippingOrder()) + ) + .fetchOne(); + return ShippingManagerSearchResult.builder() + .content(content) + .page(page) + .pageSize(validPageSize) + .totalCount(Optional.ofNullable(total).orElse(0L)) + .build(); + } + private BooleanExpression eqShippingManagerId(UUID id) { + return id != null ? QShippingManager.shippingManager.shippingManagerId.eq(id) : null; + } + private BooleanExpression eqManagerType(ManagerType type) { + return type != null ? QShippingManager.shippingManager.managerType.eq(type) : null; + } + private BooleanExpression eqShippingOrder(Integer order) { + return order != null ? QShippingManager.shippingManager.shippingOrder.eq(order) : null; + } + private OrderSpecifier resolveSort(String sortBy, QShippingManager sm) { + if ("modifiedAt".equalsIgnoreCase(sortBy)) { + return sm.updatedAt.desc(); + } + return sm.createdAt.desc(); + } +} + + + + + + + + + + + diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java b/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java index a810e26..05728cd 100644 --- a/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java @@ -1,11 +1,14 @@ package com.sparta.shippingmanager.presentation; import com.sparta.shippingmanager.application.dto.request.ShippingManagerCreateRequestDto; +import com.sparta.shippingmanager.application.dto.request.ShippingManagerSearchCondition; import com.sparta.shippingmanager.application.service.ShippingManagerService; import com.sparta.shippingmanager.domain.model.ShippingManager; import com.sparta.shippingmanager.application.dto.response.ShippingManagerResponseDto; +import com.sparta.shippingmanager.infrastructure.ShippingManagerSearchRepository; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -18,6 +21,8 @@ public class ShippingManagerController { private final ShippingManagerService shippingManagerService; + private final ShippingManagerSearchRepository shippingManagerRepository; + @GetMapping("/assign") // 배송 담당자 할당 public ShippingManager assignManager(){ return shippingManagerService.assign(); @@ -35,5 +40,10 @@ public ResponseEntity getById(@PathVariable("id") UU return ResponseEntity.ok(response); } + @GetMapping("/search") + public ResponseEntity> search(@ModelAttribute ShippingManagerSearchCondition condition) { + Page result = shippingManagerService.search(condition); + return ResponseEntity.ok(result); + } } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusRequestDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusRequestDto.java index 92ddab7..062cbd3 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusRequestDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusRequestDto.java @@ -1,8 +1,10 @@ package com.sparta.shippingservice.infrastructure.hub_feign.dto; -import com.sparta.hubservice.hub.domain.model.HubShippingScanLog.ShippingStatus; + import java.time.LocalDateTime; import java.util.UUID; + +import com.sparta.shippingservice.domain.model.ShippingHubScanLog; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -15,7 +17,7 @@ public class OutboundStatusRequestDto { private UUID hubId; - private ShippingStatus status; + private ShippingHubScanLog.ShippingStatus status; private LocalDateTime timestamp; private UUID nextHubId; diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusResponseDto.java index b9aef5e..6768618 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusResponseDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/hub_feign/dto/OutboundStatusResponseDto.java @@ -1,6 +1,6 @@ package com.sparta.shippingservice.infrastructure.hub_feign.dto; -import com.sparta.hubservice.hub.domain.model.HubShippingScanLog.ShippingStatus; + import com.sparta.shippingservice.domain.model.ShippingHubScanLog; import java.time.LocalDateTime; import java.util.UUID; @@ -18,7 +18,7 @@ public class OutboundStatusResponseDto { private String message; private UUID hubId; private UUID shippingId; - private ShippingStatus status; + private ShippingHubScanLog.ShippingStatus status; private LocalDateTime timestamp; private UUID nextHubId; @@ -26,7 +26,7 @@ public OutboundStatusResponseDto(ShippingHubScanLog log, String message) { this.message = message; this.hubId = log.getHubId(); this.shippingId = log.getShipping().getId(); - this.status = ShippingStatus.OUTBOUND; + this.status = ShippingHubScanLog.ShippingStatus.OUTBOUND; this.nextHubId = log.getNextHubId(); } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index e14f862..9ac5d57 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -56,8 +56,6 @@ public ResponseEntity updateShipping(@PathVariable("shippin @GetMapping("/search") public ResponseEntity> searchShippings(@ModelAttribute ShippingSearchCondition condition, HttpServletRequest request) { Page result = shippingService.searchShipping(condition); - log.info("receiverName raw param: {}", request.getParameter("receiverName")); - log.info("receiverName from DTO: {}", condition.getReceiverName()); return ResponseEntity.ok(result); } From 79183318733c379558352ab92f1df7bc354c8db8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=EC=9D=80=E2=98=98?= <138298079+devdaeun@users.noreply.github.com> Date: Tue, 25 Mar 2025 11:13:15 +0900 Subject: [PATCH 353/389] Update README.md --- README.md | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index d0fff83..83a1cd2 100644 --- a/README.md +++ b/README.md @@ -87,21 +87,12 @@ Logistics-delivery - [[트러블 슈팅]] : 우리조의 기술적 고민과 원인 해결 과정 - - [[트러블 슈팅 #1]] : - - 문제 현상 - - 원인 파악 과정 - - 해결을 위해 시도했던 다양한 기술적 접근 - - 해결 과정 - - 개선 효과 - - [[트러블 슈팅 #2]] - - [[트러블 슈팅 #3]] - - [[트러블 슈팅 #4]] - - [[트러블 슈팅 #5]] + - [[게이트웨이에서의 인가처리오류]](https://github.com/logistics-delivery/Back-end/wiki/%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4%EC%97%90%EC%84%9C%EC%9D%98-%EC%9D%B8%EA%B0%80%EC%B2%98%EB%A6%AC%28ReactiveSecurityContextHolder%29) - [[공통 관심 사항]] - - 공통 관심 사항 구성 요소 및 다른 마이크로서비스에 가이드 방법 - - [[공통 관심 사항 #1]] - - [[공통 관심 사항 #2]] - - [[공통 관심 사항 #3]] + - [[AOP @Rolecheck 사용방법]](https://github.com/logistics-delivery/Back-end/wiki/%EA%B3%B5%ED%86%B5%EB%AA%A8%EB%93%88-AOP-@RoleCheck-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95) + - [[AuditorAwareImpl 구현 및 @SQLRestriction 설정]](https://github.com/logistics-delivery/Back-end/wiki/AuditorAwareImpl-%EA%B5%AC%ED%98%84-%EB%B0%8F-@SQLRestriction-%EC%84%A4%EC%A0%95) + - [[Git 시크릿 키 보호 방법]](https://github.com/logistics-delivery/Back-end/wiki/Git-%EC%8B%9C%ED%81%AC%EB%A6%BF-%ED%82%A4-%EB%B3%B4%ED%98%B8-%EB%B0%A9%EB%B2%95) + - [[Docker 명령어]](https://github.com/logistics-delivery/Back-end/wiki/docker-%EB%AA%85%EB%A0%B9%EC%96%B4) - [[설계 대비 API 구현률]] : 이건 제가 드릴게요~!, 설계 API 수만 적어주세요 - [[개발 측면에서 우리 조가 잘한 것들]] - 소통/협업 @@ -127,6 +118,6 @@ Logistics-delivery |**슬랙API**|신다은
(팀장) | - 슬랙 메세지 관리 CRUD 구현
- 슬랙 외부 API를 연동하여 메세지 발송 시 실제 슬랙 사이트로 알림메세지가 전송되도록 함.
- Base Entity를 사용한 생성,수정,삭제 기록 저장 및 SoftDelete 구현
- QueryDSL을 이용한 슬랙 메세지 검색기능 구현| |**허브API**|이소현
(테크리드) | - 허브 정보, 허브간 경로 CRUD 구현
- 허브 검색 기능 (Query DSL) 구현
- 최단 경로를 위한 허브간 경로 체크포인트 생성 및 조회 구현
-허브 내 배송품 입고 및 출고 처리 기능 구현 | |**상품API**|서진영
(테크리드) | - 상품 CRUD 구현
- QueryDSL을 이용한 상품 검색 기능 구현
- 공통모듈에 swagger, Auditor Aware 구현 | -|**배송API**|권길남 | - 배송, 배송 로그, 배송 담당자 CRUD 구현
- 배송 담당자 배정 알고리즘 구현
- QueryDSL을 사용한 배송정보 검색기능 구현 | +|**배송API**|권길남 | - 배송, 배송 로그, 배송 담당자 CRUD 구현
- 배송 담당자 배정 알고리즘 구현
- QueryDSL을 사용한 배송정보 검색기능 구현
- Docker 개발 환경세팅 | |**업체API**|원지윤 | - Company-service CRUD 개발 및 Spring Boot 기반 4계층 아키텍처 적용
- QueryDSL 기반 동적 검색 조건 및 페이징 기능 구현
- HTTP API 테스트, 도메인 및 서비스 계층 테스트 코드 작성| |**주문API**|이용재 | - 주문 CRUD 구현
- 주문 생성 시 Product 서비스에 재고 차감 요청 기능 연동 (FeignClient 사용)
- 주문 생성 시 Shipping 서비스에 배송 생성 요청 기능 연동 (FeignClient 사용)
- Slack 도메인 연동을 위한 주문 + 배송 정보 응답 API 제공
- QueryDSL을 활용한 주문 검색 기능 구현 (주문명 + 상태 검색)| From a604d9016d2e5be4aafb52fbc8fd812c628c1ebc Mon Sep 17 00:00:00 2001 From: devdaeun Date: Tue, 25 Mar 2025 11:57:16 +0900 Subject: [PATCH 354/389] =?UTF-8?q?=E2=9C=A8=20feat[#203]=20:=20slack=20ai?= =?UTF-8?q?=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=83=9D=EC=84=B1=20-=20?= =?UTF-8?q?=EC=B6=94=ED=9B=84=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=EB=A5=BC=EC=9C=84=ED=95=B4=20=EB=82=B4=EC=9A=A9=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/GeminiService.java | 55 ------------------- .../client/dto/GeminiReqDto.java | 41 -------------- .../client/dto/GeminiResDto.java | 32 ----------- .../client/dto/GeminiResponseDto.java | 10 ---- .../presentation/GeminiController.java | 45 --------------- 5 files changed, 183 deletions(-) delete mode 100644 slack-service/src/main/java/com/sparta/slackservice/application/service/GeminiService.java delete mode 100644 slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiReqDto.java delete mode 100644 slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiResDto.java delete mode 100644 slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiResponseDto.java delete mode 100644 slack-service/src/main/java/com/sparta/slackservice/presentation/GeminiController.java diff --git a/slack-service/src/main/java/com/sparta/slackservice/application/service/GeminiService.java b/slack-service/src/main/java/com/sparta/slackservice/application/service/GeminiService.java deleted file mode 100644 index 90059f0..0000000 --- a/slack-service/src/main/java/com/sparta/slackservice/application/service/GeminiService.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.sparta.slackservice.application.service; - -import com.sparta.slackservice.application.dto.SlackResponseDto; -import com.sparta.slackservice.infastructure.client.dto.GeminiReqDto; -import com.sparta.slackservice.infastructure.client.dto.GeminiResDto; -import com.sparta.slackservice.infastructure.client.dto.GeminiResponseDto; -import com.sparta.slackservice.infastructure.client.dto.SlackNotificationDto; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.*; -import org.springframework.stereotype.Service; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.HttpServerErrorException; -import org.springframework.web.client.RestTemplate; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Service -@RequiredArgsConstructor -public class GeminiService { - - private final RestTemplate restTemplate; - - public GeminiResponseDto generateResponse(SlackNotificationDto requestDto) { - String geminiURL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=" - + "AIzaSyDrLB8TPWb0uhedaw9Oy4dxMl2Rm5EU-U4"; - String context = createCombinedMessage(requestDto); - String requestText = context + "에 대해서 하나의 배송메세지를 작성해줘"; - GeminiReqDto request = new GeminiReqDto(); - request.createGeminiReqDto(requestText); - - GeminiResponseDto responseDto = new GeminiResponseDto(); - try{ - String response = restTemplate.postForObject(geminiURL, request, String.class); - responseDto.setAnswer(response); - }catch (Exception e){ - throw new RuntimeException(); - } - - return responseDto; - } - - private String createCombinedMessage(SlackNotificationDto requestDto) { - // SlackNotificationDto의 필드를 하나의 메시지로 결합 - return "OrderId: " + requestDto.getOrderId() + "\n" + - "ShippingId: " + requestDto.getShippingId() + "\n" + - "ShippingStatus: " + requestDto.getShippingStatus() + "\n" + - "Route: " + requestDto.getRoute() + "\n" + - "HubName: " + requestDto.getHubName() + "\n" + - "HubManagerName: " + requestDto.getHubManagerName() + "\n" + - "Message: " + requestDto.getMessage(); - } -} diff --git a/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiReqDto.java b/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiReqDto.java deleted file mode 100644 index 061b606..0000000 --- a/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiReqDto.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.sparta.slackservice.infastructure.client.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.ArrayList; -import java.util.List; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class GeminiReqDto { - - private List contents; - - @Data - public class Content{ - - private List parts; - - public Content(String text){ - parts = new ArrayList<>(); - Part part = new Part(text); - parts.add(part); - } - - @Data - @NoArgsConstructor - @AllArgsConstructor - public class Part{ - private String text; - } - } - - public void createGeminiReqDto(String text){ - this.contents = new ArrayList<>(); - Content content = new Content(text); - contents.add(content); - } -} \ No newline at end of file diff --git a/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiResDto.java b/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiResDto.java deleted file mode 100644 index 6c5fa02..0000000 --- a/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiResDto.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.sparta.slackservice.infastructure.client.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class GeminiResDto { - private List candidates; - - @Data - public static class Candidate { - private Content content; - private String finishReason; - } - - @Data - public static class Content { - private List parts; - private String role; - - } - - @Data - public static class Parts { - private String text; - } -} \ No newline at end of file diff --git a/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiResponseDto.java b/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiResponseDto.java deleted file mode 100644 index 1701b50..0000000 --- a/slack-service/src/main/java/com/sparta/slackservice/infastructure/client/dto/GeminiResponseDto.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.sparta.slackservice.infastructure.client.dto; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class GeminiResponseDto { - private String answer; -} diff --git a/slack-service/src/main/java/com/sparta/slackservice/presentation/GeminiController.java b/slack-service/src/main/java/com/sparta/slackservice/presentation/GeminiController.java deleted file mode 100644 index 50dbadc..0000000 --- a/slack-service/src/main/java/com/sparta/slackservice/presentation/GeminiController.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.sparta.slackservice.presentation; - -import com.sparta.slackservice.application.service.GeminiService; -import com.sparta.slackservice.infastructure.client.OrderClient; -import com.sparta.slackservice.infastructure.client.dto.GeminiResponseDto; -import com.sparta.slackservice.infastructure.client.dto.SlackNotificationDto; -import jakarta.ws.rs.Path; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.UUID; - -@RestController -@RequestMapping("/api/v1/ai") -@RequiredArgsConstructor -public class GeminiController { - - private GeminiService geminiService; - private OrderClient orderClient; - - public GeminiController(GeminiService geminiService, OrderClient orderClient) { - this.geminiService = geminiService; - this.orderClient = orderClient; - } - - @PostMapping("/create/{id}") - public ResponseEntity createMessage(@PathVariable UUID id) {//주문정보 입력 - //요청한 정보가져오기 - SlackNotificationDto slackNotificationDto = orderClient.getSlackNotificationInfo(id); - - GeminiResponseDto responseDto = geminiService.generateResponse(slackNotificationDto); - return ResponseEntity.ok(responseDto); - } - - @PostMapping("/create") - public ResponseEntity createMessage(@RequestBody SlackNotificationDto requestDto) {//주문정보 입력 - //요청한 정보가져오기 - GeminiResponseDto responseDto = geminiService.generateResponse(requestDto); - return ResponseEntity.ok(responseDto); - } - - -} \ No newline at end of file From 4d129696ca9aed27dbd94e7b9c328fa7ca82e63f Mon Sep 17 00:00:00 2001 From: jiyun Date: Tue, 25 Mar 2025 02:47:05 +0900 Subject: [PATCH 355/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#209]?= =?UTF-8?q?=20=EC=9C=A0=EB=A0=88=EC=B9=B4=20=ED=81=B4=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EC=96=B8=ED=8A=B8=20localhost=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- company-service/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/company-service/src/main/resources/application.yml b/company-service/src/main/resources/application.yml index b3d5da3..d6ffbae 100644 --- a/company-service/src/main/resources/application.yml +++ b/company-service/src/main/resources/application.yml @@ -39,7 +39,7 @@ eureka: register-with-eureka: true fetch-registry: true service-url: - defaultZone: http://eureka-server:8761/eureka/ + defaultZone: http://localhost:8761/eureka/ server: port: 8085 From ca59b22e7ed9cbe46934e3aa8e40f5ebaf2f991b Mon Sep 17 00:00:00 2001 From: jiyun Date: Tue, 25 Mar 2025 02:53:00 +0900 Subject: [PATCH 356/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#209]?= =?UTF-8?q?=20=EB=A9=94=EC=84=9C=EB=93=9C=20=ED=8C=8C=EB=9D=BC=EB=AF=B8?= =?UTF-8?q?=ED=84=B0=EC=97=90=20=EB=AA=85=EC=8B=9C=EC=A0=81=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20name=20=EC=A7=80=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/controller/CompanyController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java index 8ac7319..8dd2bbf 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -29,7 +29,7 @@ public class CompanyController { // 업체 존재 확인 @GetMapping("/{id}/exists") - public boolean existsById(@PathVariable UUID id) { + public boolean existsById(@PathVariable("hubId") UUID id) { return companyService.existsById(id); } From f8180f40ab35276adf6df60ebcaafc30839f9cee Mon Sep 17 00:00:00 2001 From: jiyun Date: Tue, 25 Mar 2025 02:54:24 +0900 Subject: [PATCH 357/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#209]?= =?UTF-8?q?=20=EB=A9=94=EC=84=9C=EB=93=9C=20=ED=8C=8C=EB=9D=BC=EB=AF=B8?= =?UTF-8?q?=ED=84=B0=EC=97=90=20=EB=AA=85=EC=8B=9C=EC=A0=81=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20name=20=EC=A7=80=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/controller/CompanyController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java index 8dd2bbf..d69f8a7 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -29,7 +29,7 @@ public class CompanyController { // 업체 존재 확인 @GetMapping("/{id}/exists") - public boolean existsById(@PathVariable("hubId") UUID id) { + public boolean existsById(@PathVariable("id") UUID id) { return companyService.existsById(id); } From 7e630a7506a12d29aa1cfbcdf97ceb1174e2bc22 Mon Sep 17 00:00:00 2001 From: jiyun Date: Tue, 25 Mar 2025 11:43:38 +0900 Subject: [PATCH 358/389] =?UTF-8?q?=F0=9F=94=A5=20del=20[#209]=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9X=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/repository/CompanySearchCondition.java | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanySearchCondition.java diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanySearchCondition.java b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanySearchCondition.java deleted file mode 100644 index 9645169..0000000 --- a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanySearchCondition.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.sparta.companyservice.domain.repository; - -public class CompanySearchCondition { -} From 5351240832bd21a208f730486509ac1079a7514b Mon Sep 17 00:00:00 2001 From: jiyun Date: Tue, 25 Mar 2025 11:57:07 +0900 Subject: [PATCH 359/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#209]?= =?UTF-8?q?=20=ED=8E=98=EC=9D=B4=EC=A7=95=EC=B2=98=EB=A6=AC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/CompanyService.java | 4 +++- .../domain/repository/CompanyRepository.java | 2 +- .../presentation/controller/CompanyController.java | 12 +++++++++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java index aa73542..b905855 100644 --- a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java +++ b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java @@ -8,6 +8,7 @@ import com.sparta.companyservice.domain.model.CompanyType; import com.sparta.companyservice.domain.repository.CompanyRepository; import com.sparta.companyservice.infrastructure.client.HubClient; +import com.sparta.companyservice.infrastructure.querydsl.CompanyQueryRepository; import com.sparta.companyservice.presentation.response.CompanyDeleteResponse; import feign.FeignException; import lombok.RequiredArgsConstructor; @@ -22,6 +23,7 @@ @RequiredArgsConstructor public class CompanyService { private final CompanyRepository companyRepository; + private final CompanyQueryRepository companyQueryRepository; private final HubClient hubClient; @Transactional(readOnly = true) @@ -45,7 +47,7 @@ public CompanyDto createCompany(CompanyCreateDto dto, long userId) { @Transactional(readOnly = true) // 전체 조회 public Page searchCompanies(String name, String address, CompanyType type, Pageable pageable) { - return companyRepository.searchCompanies(name, address, type, pageable) + return companyQueryRepository.searchCompanies(name, address, type, pageable) .map(CompanyDto::fromEntity); } diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java index 0a5cc8c..69ac617 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java @@ -13,7 +13,7 @@ public interface CompanyRepository { Optional findByIdAndDeletedAtIsNull(UUID id); - Page searchCompanies(String name, String address, CompanyType type, Pageable pageable); +// Page searchCompanies(String name, String address, CompanyType type, Pageable pageable); boolean existsByIdAndDeletedAtIsNull(UUID id); } \ No newline at end of file diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java index d69f8a7..458c8ea 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -13,10 +13,12 @@ import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; import java.util.UUID; @RestController @@ -51,7 +53,9 @@ public ResponseEntity> searchCompanies( @RequestParam(name = "type", required = false) CompanyType type, Pageable pageable ) { - Page companies = companyService.searchCompanies(name, address, type, pageable); + Pageable validatedPageable = validatePageSize(pageable); // 페이지 사이즈 검증 + + Page companies = companyService.searchCompanies(name, address, type, validatedPageable); Page responses = companies.map(CompanyResponse::fromDto); return ResponseEntity.ok(responses); } @@ -83,5 +87,11 @@ public ResponseEntity deleteCompany(@PathVariable("compan return ResponseEntity.ok(deletedCompany); } + private Pageable validatePageSize(Pageable pageable) { // 페이지 사이즈 검증 + List allowedSizes = List.of(10, 30, 50); + int size = allowedSizes.contains(pageable.getPageSize()) ? pageable.getPageSize() : 10; + return PageRequest.of(pageable.getPageNumber(), size, pageable.getSort()); + } + } From 02be14d3972883a91749c5e0eea0d89fd5e69c2e Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Tue, 25 Mar 2025 12:17:57 +0900 Subject: [PATCH 360/389] =?UTF-8?q?=E2=9C=A8feat=20[#217]:ShippingRouteLog?= =?UTF-8?q?=20=EA=B2=80=EC=83=89=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../request/ShippingRouteSearchCondition.java | 11 ++- .../dto/response/ShippingLogSearchResult.java | 22 ++++++ .../application/service/ShippingService.java | 28 +++---- .../domain/model/Shipping.java | 3 +- .../client/HubRouteDetailsResponseDto.java | 4 +- .../ShippingLogSearchRepository.java | 78 ++++++++++++++++++- .../presentation/ShippingController.java | 12 ++- 7 files changed, 132 insertions(+), 26 deletions(-) create mode 100644 shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingLogSearchResult.java diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/ShippingRouteSearchCondition.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/ShippingRouteSearchCondition.java index 66f73c5..33bf06b 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/ShippingRouteSearchCondition.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/request/ShippingRouteSearchCondition.java @@ -1,15 +1,20 @@ package com.sparta.shippingservice.application.dto.request; -import lombok.Getter; -import lombok.Setter; +import lombok.*; import java.util.UUID; -@Getter @Setter +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor public class ShippingRouteSearchCondition { private UUID shippingId; private UUID fromHubId; private UUID toHubId; private UUID hubRouteId; + private String sortBy; // "createdAt", "modifiedAt" + private int pageSize; // 10, 30, 50만 허용 + private int page; // 0부터 시작 } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingLogSearchResult.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingLogSearchResult.java new file mode 100644 index 0000000..3c8b9eb --- /dev/null +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/dto/response/ShippingLogSearchResult.java @@ -0,0 +1,22 @@ +package com.sparta.shippingservice.application.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + + +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ShippingLogSearchResult { + + private List content; + private int page; // 현재 페이지 번호 + private int pageSize; // 한 페이지에 몇 건 + private long totalCount; // 전체 개수 + +} diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java index 7bfb5b8..baf76b5 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/application/service/ShippingService.java @@ -1,29 +1,24 @@ package com.sparta.shippingservice.application.service; import com.sparta.shippingmanager.domain.model.ManagerType; -import com.sparta.shippingmanager.domain.model.ShippingManager; import com.sparta.shippingservice.application.dto.client.ShippingManagerResponseDto; import com.sparta.shippingservice.application.dto.request.*; -import com.sparta.shippingservice.application.dto.response.ShippingResponseDto; -import com.sparta.shippingservice.application.dto.response.ShippingRouteResponseDto; -import com.sparta.shippingservice.application.dto.response.ShippingSearchResult; -import com.sparta.shippingservice.application.dto.response.ShippingWithRouteResponseDto; +import com.sparta.shippingservice.application.dto.response.*; import com.sparta.shippingservice.domain.model.*; import com.sparta.shippingservice.domain.repository.ShippingRepository; import com.sparta.commonmodule.exception.*; -import com.sparta.shippingservice.domain.repository.ShippingRouteQueryRepository; import com.sparta.shippingservice.domain.repository.ShippingRouteRepository; import com.sparta.shippingservice.infrastructure.client.HubClient; import com.sparta.shippingservice.infrastructure.client.HubRouteDetailsResponseDto; import com.sparta.shippingservice.infrastructure.client.ShippingManagerClient; +import com.sparta.shippingservice.infrastructure.repository.ShippingLogSearchRepository; import com.sparta.shippingservice.infrastructure.repository.ShippingSearchRepository; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -41,7 +36,7 @@ public class ShippingService { private final ShippingManagerClient shippingManagerClient; private final ShippingSearchRepository searchRepository; private final HubClient hubClient; - private final ShippingRouteQueryRepository shippingRouteQueryRepository; + private final ShippingLogSearchRepository shippingLogSearchRepository; //각 허브에 10명 / 업체에 10명 @@ -140,6 +135,17 @@ public ShippingRouteResponseDto deleteShippingLog(UUID shippingId,UUID shippingL return ShippingRouteResponseDto.from(routeLog); } + @Transactional(readOnly = true) + public Page searchRoutes(ShippingRouteSearchCondition condition) { + ShippingLogSearchResult result = shippingLogSearchRepository.search(condition); + return new PageImpl<>( + result.getContent(), + PageRequest.of(result.getPage(), result.getPageSize()), + result.getTotalCount() + ); + } + + private Shipping findShipping(UUID shippingId) { @@ -148,10 +154,6 @@ private Shipping findShipping(UUID shippingId) { return shipping; } - @Transactional(readOnly = true) // 배송 로그 검색 - public Page searchShippingLogs(ShippingRouteSearchCondition condition, Pageable pageable) { - Page logs = shippingRouteQueryRepository.search(condition, pageable); - return logs.map(ShippingRouteResponseDto::from); - } + } diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java index fb229c1..2949d13 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/domain/model/Shipping.java @@ -4,8 +4,7 @@ import jakarta.persistence.*; import lombok.*; -import java.util.ArrayList; -import java.util.List; + import java.util.UUID; @Entity diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/client/HubRouteDetailsResponseDto.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/client/HubRouteDetailsResponseDto.java index 5403f88..83b3105 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/client/HubRouteDetailsResponseDto.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/client/HubRouteDetailsResponseDto.java @@ -51,9 +51,7 @@ public ShippingRouteLog toShippingRouteLog() { } return routeLog; } - /** - * :흰색_확인_표시: Checkpoint 응답 - */ + @Setter @Getter @Builder diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingLogSearchRepository.java b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingLogSearchRepository.java index 6b490ec..b8a1126 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingLogSearchRepository.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/infrastructure/repository/ShippingLogSearchRepository.java @@ -1,7 +1,83 @@ package com.sparta.shippingservice.infrastructure.repository; +import com.querydsl.core.types.OrderSpecifier; +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.sparta.shippingservice.application.dto.request.ShippingRouteSearchCondition; +import com.sparta.shippingservice.application.dto.response.ShippingLogSearchResult; +import com.sparta.shippingservice.application.dto.response.ShippingRouteResponseDto; +import com.sparta.shippingservice.domain.model.QShippingRouteLog; +import com.sparta.shippingservice.domain.model.ShippingRouteLog; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + @Repository +@RequiredArgsConstructor public class ShippingLogSearchRepository { -} + + private final JPAQueryFactory queryFactory; + + + public ShippingLogSearchResult search(ShippingRouteSearchCondition condition) { + QShippingRouteLog log = QShippingRouteLog.shippingRouteLog; + int validPageSize = switch (condition.getPageSize()) { + case 10, 30, 50 -> condition.getPageSize(); + default -> 10; + }; + int page = Math.max(condition.getPage(), 0); + List logs = queryFactory + .selectFrom(log) + .where( + eqShippingId(condition.getShippingId()), + eqStartHubId(condition.getFromHubId()), + eqEndHubId(condition.getToHubId()), + eqHubRouteId(condition.getHubRouteId()) + ) + .orderBy(resolveSort(condition.getSortBy(), log)) + .offset((long) page * validPageSize) + .limit(validPageSize) + .fetch(); + Long total = queryFactory + .select(log.count()) + .from(log) + .where( + eqShippingId(condition.getShippingId()), + eqStartHubId(condition.getFromHubId()), + eqEndHubId(condition.getToHubId()), + eqHubRouteId(condition.getHubRouteId()) + ) + .fetchOne(); + // 3. DTO 매핑 + List content = logs.stream() + .map(ShippingRouteResponseDto::from) + .toList(); + return ShippingLogSearchResult.builder() + .content(content) + .page(page) + .pageSize(validPageSize) + .totalCount(Optional.ofNullable(total).orElse(0L)) + .build(); + } + private BooleanExpression eqShippingId(UUID id) { + return id != null ? QShippingRouteLog.shippingRouteLog.shipping.id.eq(id) : null; + } + private BooleanExpression eqStartHubId(UUID id) { + return id != null ? QShippingRouteLog.shippingRouteLog.fromHubId.eq(id) : null; + } + private BooleanExpression eqEndHubId(UUID id) { + return id != null ? QShippingRouteLog.shippingRouteLog.toHubId.eq(id) : null; + } + private BooleanExpression eqHubRouteId(UUID id) { + return id != null ? QShippingRouteLog.shippingRouteLog.hubRouteId.eq(id) : null; + } + private OrderSpecifier resolveSort(String sortBy, QShippingRouteLog log) { + if ("modifiedAt".equalsIgnoreCase(sortBy)) { + return log.updatedAt.desc(); + } + return log.createdAt.desc(); + } +} \ No newline at end of file diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index ab244b6..0981d41 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -1,9 +1,6 @@ package com.sparta.shippingservice.presentation; -import com.sparta.shippingservice.application.dto.request.CreateShippingRequestDto; -import com.sparta.shippingservice.application.dto.request.CreateShippingWithRouteRequestDto; -import com.sparta.shippingservice.application.dto.request.ShippingSearchCondition; -import com.sparta.shippingservice.application.dto.request.UpdateShippingRequestDto; +import com.sparta.shippingservice.application.dto.request.*; import com.sparta.shippingservice.application.dto.response.ShippingResponseDto; import com.sparta.shippingservice.application.dto.response.ShippingRouteResponseDto; import com.sparta.shippingservice.application.dto.response.ShippingWithRouteResponseDto; @@ -87,6 +84,13 @@ public ResponseEntity> getAllLog() { } + @GetMapping("/log/search") + public ResponseEntity> searchShippingRoutes( + @ModelAttribute ShippingRouteSearchCondition condition + ) { + Page result = shippingService.searchRoutes(condition); + return ResponseEntity.ok(result); + } } From 532d8835baf2ca1df1edbcf75cb0f0559d8873a2 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Tue, 25 Mar 2025 13:42:50 +0900 Subject: [PATCH 361/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#222]?= =?UTF-8?q?=20:=20=EC=A3=BC=EB=AC=B8=20->=20=EC=83=81=ED=92=88,=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EC=9E=AC=EA=B3=A0=EA=B0=90=EC=86=8C=20dto?= =?UTF-8?q?=20=EB=B0=8F=20=EA=B6=8C=ED=95=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/OrderService.java | 13 +++++-------- .../infrastructure/client/ProductClient.java | 4 ++-- ....java => DecreaseProductQuantityRequestDto.java} | 4 +--- .../product/presentation/ProductController.java | 2 -- 4 files changed, 8 insertions(+), 15 deletions(-) rename order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/request/{DecreaseProductQuantityServiceRequestDto.java => DecreaseProductQuantityRequestDto.java} (73%) diff --git a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java index a8824a6..09af336 100644 --- a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java +++ b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java @@ -13,7 +13,7 @@ import com.sparta.orderservice.infrastructure.client.dto.request.CreateShippingRequestDto; import com.sparta.orderservice.infrastructure.client.dto.response.CreateShippingResponseDto; import com.sparta.orderservice.infrastructure.client.dto.response.DecreaseProductQuantityResponseDto; -import com.sparta.orderservice.infrastructure.client.dto.request.DecreaseProductQuantityServiceRequestDto; +import com.sparta.orderservice.infrastructure.client.dto.request.DecreaseProductQuantityRequestDto; import com.sparta.orderservice.infrastructure.client.dto.response.SlackNotificationDto; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Qualifier; @@ -42,19 +42,16 @@ public class OrderService { public OrderResponseDto createOrder(OrderRequestDto requestDto) { // 1. 재고 차감 요청 DTO 생성 - DecreaseProductQuantityServiceRequestDto reduceRequest = - DecreaseProductQuantityServiceRequestDto.builder() - .productId(requestDto.getProductId()) + DecreaseProductQuantityRequestDto reduceRequest = + DecreaseProductQuantityRequestDto.builder() .companyId(requestDto.getSupplierId()) // supplierId → companyId .hubId(requestDto.getReceiverId()) // receiverId → hubId - .quantity(1) // 기본 수량 + .quantity(50) // 기본 수량 .build(); // 2. FeignClient로 재고 차감 요청 - UUID productId = reduceRequest.getProductId(); - DecreaseProductQuantityResponseDto response = - productClient.decreaseProductQuantity(productId, reduceRequest); + productClient.decreaseProductQuantity(requestDto.getProductId(), reduceRequest); // 3. 실패 시 예외 발생 if (!response.getIsSuccess()) { diff --git a/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/ProductClient.java b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/ProductClient.java index 725169b..32eeced 100644 --- a/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/ProductClient.java +++ b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/ProductClient.java @@ -1,7 +1,7 @@ package com.sparta.orderservice.infrastructure.client; import com.sparta.orderservice.infrastructure.client.dto.response.DecreaseProductQuantityResponseDto; -import com.sparta.orderservice.infrastructure.client.dto.request.DecreaseProductQuantityServiceRequestDto; +import com.sparta.orderservice.infrastructure.client.dto.request.DecreaseProductQuantityRequestDto; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PutMapping; @@ -15,6 +15,6 @@ public interface ProductClient { @PutMapping("/{productId}/decrease") DecreaseProductQuantityResponseDto decreaseProductQuantity( @PathVariable("productId") UUID productId, - @RequestBody DecreaseProductQuantityServiceRequestDto requestDto + @RequestBody DecreaseProductQuantityRequestDto requestDto ); } diff --git a/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/request/DecreaseProductQuantityServiceRequestDto.java b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/request/DecreaseProductQuantityRequestDto.java similarity index 73% rename from order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/request/DecreaseProductQuantityServiceRequestDto.java rename to order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/request/DecreaseProductQuantityRequestDto.java index 8e74d35..f73456b 100644 --- a/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/request/DecreaseProductQuantityServiceRequestDto.java +++ b/order-service/src/main/java/com/sparta/orderservice/infrastructure/client/dto/request/DecreaseProductQuantityRequestDto.java @@ -7,9 +7,7 @@ @Getter @Builder -public class DecreaseProductQuantityServiceRequestDto { - - private UUID productId; +public class DecreaseProductQuantityRequestDto { private UUID companyId; private UUID hubId; private Integer quantity; diff --git a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java index 57218a5..5593bb9 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java +++ b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java @@ -99,7 +99,6 @@ public ResponseEntity> searchProducts(@ModelAttri /** * 상품 수정(재고 감소) */ - @RoleCheck("ROLE_MASTER, ROLE_HUB, ROLE_COMPANY") @PutMapping("/{productId}/decrease") public ResponseEntity decreaseProductQuantity(@PathVariable UUID productId, @RequestBody DecreaseProductQuantityRequestDto requestDto) { @@ -111,7 +110,6 @@ public ResponseEntity decreaseProductQuantit /** * 상품 수정(재고 증가) */ - @RoleCheck("ROLE_MASTER, ROLE_HUB, ROLE_COMPANY") @PutMapping("/{productId}/increase") public ResponseEntity increaseProductQuantity(@PathVariable UUID productId, @RequestBody IncreaseProductQuantityRequestDto requestDto) { From d9c2579c29e614737daac37e24dcd535e8405af9 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Tue, 25 Mar 2025 14:57:06 +0900 Subject: [PATCH 362/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#222]?= =?UTF-8?q?=20:=20orderService=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/OrderService.java | 111 +++++++++++++++++- 1 file changed, 107 insertions(+), 4 deletions(-) diff --git a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java index 09af336..93622a2 100644 --- a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java +++ b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java @@ -16,6 +16,7 @@ import com.sparta.orderservice.infrastructure.client.dto.request.DecreaseProductQuantityRequestDto; import com.sparta.orderservice.infrastructure.client.dto.response.SlackNotificationDto; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -27,6 +28,7 @@ @Service @RequiredArgsConstructor +@Slf4j public class OrderService { private final OrderRepository orderRepository; @@ -75,13 +77,13 @@ public OrderResponseDto createOrder(OrderRequestDto requestDto) { CreateShippingRequestDto shippingRequest = CreateShippingRequestDto.builder() .orderId(order.getOrderId()) .productId(order.getProductId()) - .supplierId(order.getSupplierId()) - .receiverId(order.getReceiverId()) - .quantity(1) + .supplierId(order.getSupplierId()) // supplierId → companyId + .receiverId(order.getReceiverId()) // receiverId → hubId + .quantity(50) .build(); // 6. FeignClient로 배송 요청 - CreateShippingResponseDto shippingResponse = shippingClient.createShipping(shippingRequest); + CreateShippingResponseDto shippingResponse = shippingClient.create(shippingRequest); // 7. 배송 실패 시 예외 if (!"READY".equals(shippingResponse.getStatus())) { @@ -91,6 +93,107 @@ public OrderResponseDto createOrder(OrderRequestDto requestDto) { return new OrderResponseDto(order); } + + + + +/* + @Transactional + public OrderResponseDto createOrder2(OrderRequestDto requestDto) { + + Order order = Order.builder() + .name(requestDto.getName()) + .supplierId(requestDto.getSupplierId()) + .receiverId(requestDto.getReceiverId()) + .productId(requestDto.getProductId()) + .totalPrice(requestDto.getTotalPrice()) + .requestDetail(requestDto.getRequestDetail()) + .status(OrderStatus.CREATED) + .build(); + + orderRepository.save(order); + + + // 1. 재고 차감 요청 DTO 생성 + DecreaseProductQuantityRequestDto reduceRequest = + DecreaseProductQuantityRequestDto.builder() + .companyId(requestDto.getSupplierId()) // supplierId → companyId + .hubId(requestDto.getReceiverId()) // receiverId → hubId + .quantity(50) // 기본 수량 + .build(); + + // 재고 감소 성공 여부 + boolean stockDecreased = false; + + try { + // 2. FeignClient 재고 차감 요청 + DecreaseProductQuantityResponseDto response = + productClient.decreaseProductQuantity(requestDto.getProductId(), reduceRequest); + stockDecreased = true; + + // 3. FeignClient 배송 생성 요청 + CreateShippingResponseDto shippingResponse = shippingClient.create(shippingRequest); + UUID shippingId = shippingResponse.getShippingId(); + + // 4. 슬랙 생성 요청 + + + } catch (Exception e) { + + // 주문 재고 보상 트랜잭션 - 재고 복구 + if (stockDecreased) { + compensateProduct(requestDto.getProductId(), reduceRequest.getQuantity()); + } + + // 배송 보상 트랜잭션 - 배송 삭제 + if (shippingId != null) { + compensateShipping(shippingId); + } + + throw new RuntimeException("주문 실패 및 보상 처리 완료", e); + } + + + + + return new OrderResponseDto(order); + } + + + // 주문 보상 트랜잭션 - 주문 삭제 + private void compensateOrder(Order order) { + try { + orderRepository.delete(order); + log.info("주문 삭제 보상 완료"); + } catch (Exception e) { + log.warn("주문 삭제 보상 실패", e); + } + } + + + // 주문 재고 보상 트랜잭션 - 재고 복구 + private void compensateProduct(UUID productId, int quantity) { + try { + productClient.increaseProductQuantity(productId, quantity); + log.info("재고 복구 보상 완료"); + } catch (Exception e) { + log.warn("재고 복구 보상 실패", e); + } + } + + // 배송 보상 트랜잭션 - 배송 삭제 + private void compensateShipping(UUID shippingId) { + try { + shippingClient.deleteShipping(shippingId); + log.info("배송 삭제 보상 완료"); + } catch (Exception e) { + log.warn("배송 삭제 보상 실패", e); + } + } + +*/ + + // 주문 전체 조회 @Transactional(readOnly = true) public List getALlOrders() { From 7cb5eeef9d2d8e271587203aed42816fde41e069 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=EC=9D=80=E2=98=98?= <138298079+devdaeun@users.noreply.github.com> Date: Tue, 25 Mar 2025 15:05:10 +0900 Subject: [PATCH 363/389] Update README.md --- README.md | 97 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 70 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 83a1cd2..b790d69 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,9 @@ Logistics-delivery === # 프로젝트 소개 +**- 각 기능에 따른 개별 애플리케이션을 생성하여 서비스가 독립적으로 존재할 수 있도록 구현한 MSA 기반 물류 관리 및 배송시스템 프로젝트입니다.** +**- 서로다른 애플리케이션 간의 데이터 연동과 기능요청을 경험하며 실무에서 발생할 수 있는 다양한 상황에 대한 협업경험을 쌓는것을 목표로합니다.** ## 핵심기술 목표 ### 1. 각 기능별 서비스 분리(MSA 기반 시스템 설계) @@ -20,6 +22,10 @@ Logistics-delivery - 각 서비스 별 접근가능한 권한을 설정하여 보안을 강화. - JWT(Json Web Token) 를 활용한 인증 및 인가체계를 구현하여 서비스의 보안을 유지 +### 4. 배포 및 확장성 +- 시스템은 클라우드 기반에서 배포되며, 각 서비스는 필요에 따라 확장이 가능하도록 구현되어야함. +- 컨테이너화(Docker)를 활용한 시스템 배포 및 관리기능 구현. + ## 구현 목표 ### 1. MSA 기반 아키텍처 & 커뮤니케이션 @@ -61,22 +67,33 @@ Logistics-delivery | Security | Spring Security(인증,인가), JWT (토큰 기반 인증) | | Documentation | Swagger (API 문서화) | |Test | Spring Boot Test, JUnit | + # 프로젝트 실행 방법 + + - Docker Desktop 필요(데이터베이스 연동, 서비스 실행) +```sh +# 프로젝트 클론 +git clone https://github.com/logistics-delivery/Back-end.git +cd Back-end +# 빌드 및 실행 +# 1. 데이터베이스만 docker container로 실행한 뒤, 각 애플리케이션을 개별실행 +$ docker compose up -d postgres - - Local 환경에서 필요한 .env 양식 - - Docker Compose 등 실행에 필요한 환경 +# 2. 데이터베이스와 개별 서비스를 함께 docker container로 업로드하여 실행하는경우 +$ docker compose up -d +``` # 설계 산출물 - - [[도메인 다이어그램]](https://github.com/logistics-delivery/Back-end/wiki/%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8-&-%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%8B%B4%EB%8B%B9%EC%9E%90-%EB%AA%A9%EB%A1%9D) - - [[테이블 설계서]](https://github.com/logistics-delivery/Back-end/wiki/%ED%85%8C%EC%9D%B4%EB%B8%94-%EB%AA%85%EC%84%B8%EC%84%9C) - - [[ERD]](https://github.com/logistics-delivery/Back-end/wiki/ERD-%EB%AA%85%EC%84%B8%EC%84%9C) - - [[API 명세서]](https://github.com/logistics-delivery/Back-end/wiki/API-%EB%AA%85%EC%84%B8%EC%84%9C) - - [[인프라 설계서]](https://github.com/logistics-delivery/Back-end/wiki/%EC%9D%B8%ED%94%84%EB%9D%BC-%EC%84%A4%EA%B3%84%EC%84%9C) - - [[Conventions]] : 우리 조의 개발 규칙 + - [도메인 다이어그램](https://github.com/logistics-delivery/Back-end/wiki/%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8-&-%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%8B%B4%EB%8B%B9%EC%9E%90-%EB%AA%A9%EB%A1%9D) + - [테이블 설계서](https://github.com/logistics-delivery/Back-end/wiki/%ED%85%8C%EC%9D%B4%EB%B8%94-%EB%AA%85%EC%84%B8%EC%84%9C) + - [ERD](https://github.com/logistics-delivery/Back-end/wiki/ERD-%EB%AA%85%EC%84%B8%EC%84%9C) + - [API 명세서](https://github.com/logistics-delivery/Back-end/wiki/API-%EB%AA%85%EC%84%B8%EC%84%9C) + - [인프라 설계서](https://github.com/logistics-delivery/Back-end/wiki/%EC%9D%B8%ED%94%84%EB%9D%BC-%EC%84%A4%EA%B3%84%EC%84%9C) + - [Conventions] : 우리 조의 개발 규칙 - [[Commit Message Conventions]] - [[Java Code Style]] - [[Git-flow]] @@ -86,35 +103,61 @@ Logistics-delivery # 개발 산출물 - - [[트러블 슈팅]] : 우리조의 기술적 고민과 원인 해결 과정 - - [[게이트웨이에서의 인가처리오류]](https://github.com/logistics-delivery/Back-end/wiki/%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4%EC%97%90%EC%84%9C%EC%9D%98-%EC%9D%B8%EA%B0%80%EC%B2%98%EB%A6%AC%28ReactiveSecurityContextHolder%29) - - [[공통 관심 사항]] - - [[AOP @Rolecheck 사용방법]](https://github.com/logistics-delivery/Back-end/wiki/%EA%B3%B5%ED%86%B5%EB%AA%A8%EB%93%88-AOP-@RoleCheck-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95) - - [[AuditorAwareImpl 구현 및 @SQLRestriction 설정]](https://github.com/logistics-delivery/Back-end/wiki/AuditorAwareImpl-%EA%B5%AC%ED%98%84-%EB%B0%8F-@SQLRestriction-%EC%84%A4%EC%A0%95) - - [[Git 시크릿 키 보호 방법]](https://github.com/logistics-delivery/Back-end/wiki/Git-%EC%8B%9C%ED%81%AC%EB%A6%BF-%ED%82%A4-%EB%B3%B4%ED%98%B8-%EB%B0%A9%EB%B2%95) - - [[Docker 명령어]](https://github.com/logistics-delivery/Back-end/wiki/docker-%EB%AA%85%EB%A0%B9%EC%96%B4) - - [[설계 대비 API 구현률]] : 이건 제가 드릴게요~!, 설계 API 수만 적어주세요 - - [[개발 측면에서 우리 조가 잘한 것들]] - - 소통/협업 - - 자동화 - - 트러블슈팅 - + **트러블 슈팅** + + - [게이트웨이에서의 인가처리오류](https://github.com/logistics-delivery/Back-end/wiki/%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4%EC%97%90%EC%84%9C%EC%9D%98-%EC%9D%B8%EA%B0%80%EC%B2%98%EB%A6%AC%28ReactiveSecurityContextHolder%29) +- [QueryDSL Q파일 문제 트러블슈팅](https://github.com/logistics-delivery/Back-end/wiki/QueryDSL-Q%ED%8C%8C%EC%9D%BC-%EB%AC%B8%EC%A0%9C-%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85) + +**공통 관심 사항** - # 시스템을 발전 시키기 위해 더 해본다면? + - [AOP @Rolecheck 사용방법](https://github.com/logistics-delivery/Back-end/wiki/%EA%B3%B5%ED%86%B5%EB%AA%A8%EB%93%88-AOP-@RoleCheck-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95) + - [AuditorAwareImpl 구현 및 @SQLRestriction 설정](https://github.com/logistics-delivery/Back-end/wiki/AuditorAwareImpl-%EA%B5%AC%ED%98%84-%EB%B0%8F-@SQLRestriction-%EC%84%A4%EC%A0%95) +- [Git 시크릿 키 보호 방법](https://github.com/logistics-delivery/Back-end/wiki/Git-%EC%8B%9C%ED%81%AC%EB%A6%BF-%ED%82%A4-%EB%B3%B4%ED%98%B8-%EB%B0%A9%EB%B2%95) +- [Docker 명령어](https://github.com/logistics-delivery/Back-end/wiki/docker-%EB%AA%85%EB%A0%B9%EC%96%B4) +- [설계 대비 API 구현률] : - - 현재 시스템의 문제점 인지 -> 개선을 위한 기술적 계획 및 접근 + # 시스템을 발전 시키기 위해 더 해본다면? +- ai 자동생성 배송메세지 구현 +- 매일 6시 슬랙 알림 발송기능 구현 +- 사용자 테이블에서 슬랙이름 컬럼을 분리하여 개별 테이블로 생성.
+→ 슬랙이름이 필요하지않은 관리자권한 사용자는 해당내용이 null로 표기되는 문제가 있어 분리가 필요하다고 생각됨.
+- Zipkin을 통한 분산 추적 기능 구현 +- 서비스 간의 호출을 feign client가 아닌 메세징 시스템으로 전환 +- 페이징 처리 공통모듈에서 관리 +- 예외처리 도메인 책임으로 분리 # 협업 시 우리조가 잘한 것들 - - # 협업 시 아쉽거나 부족했던 부분들 - + **기술** + - **서비스 디스커버리 도입** + - Eureka 를 활용해 서비스의 동적 등록과 검색이 가능해졌다. +- **API 게이트웨이 활용** + - Gateway를 통해 JWT 토큰 검증 및 권한정보 인가처리를 진행하여 보안이 강화되었다. +- **DDD 구조 활용** + - MSA환경에서 DDD구조를 사용함으로써 인프라스트럭처 코드와 순수한 자바 도메인 코드를 명확히 분리할 수 있었다. 이를 통해서 서로 다른 서비스 간에 기술적인 의존도를 줄일 수 있었다. +- **AOP를 도입** + - 서비스간 권한 체크를 하여 코드 중복을 줄이고 공통 관심사를 효율적으로 처리할 수 있었다. + + **소통** +- **Pull Request 를 통한 코드 리뷰** + - dev에 두 명 이상의 승인이 이루어지게 Pull Request를 열어놓아 코드 변경 사항에 대해 팀원들과 공유하고 검토하는 과정을 거쳐 코드 품질을 높였다. +- **GitHub Issues를 통한 이슈 관리** + - 이슈 트래킹을 통해 진행사항을 파악하는데 도움이 됐다. +- **데일리 스크럼을 통한 원활한 커뮤니케이션** + - 매일 스크럼을 진행하여 모든 팀원의 진행 상황을 공유하고, 이슈를 공유 및 논의 함으로써 빠르게 처리할 수 있었다. + + # 협업 간 발생한 문제와 해결 방안 +- 기존 모놀리식 프로젝트를 진행하면서 3계층에 대한 이해는 되어있지만 MSA 방식의 프로젝트를 진행하게되면서 레이어드 계층 구성에 대한 어려움을 겪음
+ -> MSA 방식에서 레이어드 계층으로 패키지를 구성해야하는 이유를 정리하여 팀원들에게 공유 후 레이어드 계층으로 개발을 진행하게됨. + +- 서버 간 통신 시 (FeignClient) 통신구현에 대한 이해가 되어있지않은채로 개발을 우선적으로 진행하게되어 진행에 차질이 발생
+ → 연관 있는 서비스끼리 지속적으로 소통을 진행하며 개발을 진행하기로 함 # 팀원 소개 및 담당역할 | **역할** | **담당자** | **세부 업무** | |-------------------------|:---------------------:|------------------------------------| -| **인증인가,
사용자API** | 신다은
(팀장) | - 회원가입,로그인 등의 사용자 정보CRUD 구현
- 로그인 성공 시 JWT 토큰을 생성하여 사용자에게 전달되도록 함
- JWT 토큰을 사용하여 회원정보를 인증, 내부payload값을 추출하여 서브모듈에서 사용가능하도록 구현
- 인증된 정보를 바탕으로 사용자의 권한이 요청 url에 접근가능한지 gateway에서 우선적으로 인가처리를 할 수 있도록 구현
- 세부 API 기능별로 AOP에서 인가처리를 추가적으로 진행하도록 구현| +| **인증인가,
사용자API** | 신다은
(팀장) | - 회원가입,로그인 등의 사용자 정보CRUD 구현
- 로그인 성공 시 JWT 토큰을 생성하여 사용자에게 전달되도록 함
- JWT 토큰을 사용하여 회원정보를 인증, 내부payload값을 추출하여 서브모듈에서 사용가능하도록 구현
- 인증된 정보를 바탕으로 사용자의 권한이 요청 url에 접근가능한지 gateway에서 우선적으로 인가처리를 할 수 있도록 구현
- gateway에서 기본 인가 처리 후, AOP와 Custom Annotation을 사용하여 각 API의 세부 기능별로 권한을 추가로 체크하는 접근 인가 기능을 구현.| |**슬랙API**|신다은
(팀장) | - 슬랙 메세지 관리 CRUD 구현
- 슬랙 외부 API를 연동하여 메세지 발송 시 실제 슬랙 사이트로 알림메세지가 전송되도록 함.
- Base Entity를 사용한 생성,수정,삭제 기록 저장 및 SoftDelete 구현
- QueryDSL을 이용한 슬랙 메세지 검색기능 구현| |**허브API**|이소현
(테크리드) | - 허브 정보, 허브간 경로 CRUD 구현
- 허브 검색 기능 (Query DSL) 구현
- 최단 경로를 위한 허브간 경로 체크포인트 생성 및 조회 구현
-허브 내 배송품 입고 및 출고 처리 기능 구현 | |**상품API**|서진영
(테크리드) | - 상품 CRUD 구현
- QueryDSL을 이용한 상품 검색 기능 구현
- 공통모듈에 swagger, Auditor Aware 구현 | From 4aafcf14d7e2a344086f9984917d488b49b2197c Mon Sep 17 00:00:00 2001 From: nimpa3201 Date: Tue, 25 Mar 2025 15:22:52 +0900 Subject: [PATCH 364/389] =?UTF-8?q?=E2=9C=A8feat=20[#226]:swagger,=20?= =?UTF-8?q?=EA=B6=8C=ED=95=9C=20=EC=9E=AC=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ShippingManagerService.java | 3 +-- .../ShippingManagerController.java | 3 ++- .../presentation/ShippingController.java | 23 ++++++++++++------- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java b/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java index 63daa4b..c99b522 100644 --- a/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/application/service/ShippingManagerService.java @@ -26,7 +26,7 @@ public class ShippingManagerService { private final ShippingManagerSearchRepository searchRepository; private static final int MAX_ORDER = 10; - private static int MIN_ORDER =0; + @Transactional public ShippingManager assign() { @@ -35,7 +35,6 @@ public ShippingManager assign() { findFirst(). orElseThrow(() -> new ResourceNotFoundException(" 배정 가능한 담당자가 없습니다.")); - //manager.increaseCount(MIN_ORDER); nextManagerOrder(manager.getShippingOrder()); diff --git a/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java b/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java index e844b3d..a739083 100644 --- a/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java +++ b/shipping-service/src/main/java/com/sparta/shippingmanager/presentation/ShippingManagerController.java @@ -51,7 +51,8 @@ public ResponseEntity getById(@PathVariable("id") UU ShippingManagerResponseDto response = shippingManagerService.getById(id); return ResponseEntity.ok(response); } - + @Operation(summary = "배송 담당자 검색",description = "배송 담당자 검색 API 입니다") + @RoleCheck("ROLE_HUB,ROLE_MASTER,ROLE_SHIPPING") @GetMapping("/search") public ResponseEntity> search(@ModelAttribute ShippingManagerSearchCondition condition) { Page result = shippingManagerService.search(condition); diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index 0981d41..25738b9 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -1,5 +1,6 @@ package com.sparta.shippingservice.presentation; +import com.sparta.commonmodule.aop.RoleCheck; import com.sparta.shippingservice.application.dto.request.*; import com.sparta.shippingservice.application.dto.response.ShippingResponseDto; import com.sparta.shippingservice.application.dto.response.ShippingRouteResponseDto; @@ -7,6 +8,7 @@ import com.sparta.shippingservice.application.service.ShippingService; import com.sparta.shippingservice.domain.model.Shipping; +import io.swagger.v3.oas.annotations.Operation; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -24,26 +26,29 @@ public class ShippingController { private final ShippingService shippingService; + @Operation(summary = "배송 등록",description = "배송 등록 API 입니다") + @RoleCheck("ROLE_MASTER") @PostMapping() // 배송 생성 public ResponseEntity create (@Valid @RequestBody CreateShippingRequestDto request, @RequestHeader("userId")Long userId) { ShippingWithRouteResponseDto responseDto = shippingService.create(request,userId); return ResponseEntity.ok(responseDto); } - + @Operation(summary = "특정 배송 조회",description = "특정 배송 조회API 입니다") @GetMapping("/{shippingId}") // 특정 배송 정보 조회 public ResponseEntity getShippingById(@PathVariable("shippingId") UUID id) { ShippingResponseDto responseDto = shippingService.getShippingById(id); return ResponseEntity.ok(responseDto); } - + @Operation(summary = "모든 배송 조회",description = "모든 배송 조회API 입니다") @GetMapping() //모든 배송 내역 조회 public ResponseEntity> getAllShipping() { List allShipping = shippingService.getAllShipping(); return ResponseEntity.ok(allShipping); } - + @Operation(summary = "배송 수정",description = "배송 수정 API 입니다") + @RoleCheck("ROLE_MASTER") @PatchMapping("/{shippingId}") // 배송 내역 수정 public ResponseEntity updateShipping(@PathVariable("shippingId") UUID id, @Valid @RequestBody UpdateShippingRequestDto request, @RequestHeader("userId") Long userId ) { ShippingResponseDto ResponseDto = shippingService.updateShipping(id, request,userId); @@ -55,20 +60,21 @@ public ResponseEntity> searchShippings(@ModelAttribute Page result = shippingService.searchShipping(condition); return ResponseEntity.ok(result); } - + @Operation(summary = "배송 삭제",description = "배송 삭제 API 입니다") + @RoleCheck("ROLE_MASTER") @DeleteMapping("/{shippingId}") public ResponseEntity deleteShipping(@PathVariable("shippingId") UUID id, @RequestHeader("userId") long userId) { ShippingResponseDto responseDto = shippingService.deleteShipping(id, userId); return ResponseEntity.ok(responseDto); } - + @Operation(summary = "특정 배송 로그 조회",description = "특정 배송 로그 조회 API 입니다") @GetMapping("/{shippingId}/{shippingLogId}") // 특정 배송 로그 조회 public ResponseEntity getLogById(@PathVariable("shippingId") UUID id, @PathVariable("shippingLogId") UUID logId) { ShippingRouteResponseDto responseDto = shippingService.getLogById(id, logId); return ResponseEntity.ok(responseDto); } - + @Operation(summary = "모든 배송 로그 조회",description = "모든 배송 로그 조회 API 입니다") @GetMapping("/log") public ResponseEntity> getAllLog() { List allLog = shippingService.getLogAll(); @@ -76,14 +82,15 @@ public ResponseEntity> getAllLog() { } - + @Operation(summary = "배송 로그 삭제",description = "배송 로그 삭제 API 입니다") + @RoleCheck("ROLE_MASTER") @DeleteMapping("/{shippingId}/{shippingLogId}") public ResponseEntitydeleteShippingLog(@PathVariable("shippingId") UUID id, @PathVariable("shippingLogId") UUID logId ,@RequestParam Long userId){ ShippingRouteResponseDto responseDto = shippingService.deleteShippingLog(id, logId, userId); return ResponseEntity.ok(responseDto); } - + @Operation(summary = "모든 배송 로그 검색",description = "모든 배송 로그 검색 API 입니다") @GetMapping("/log/search") public ResponseEntity> searchShippingRoutes( @ModelAttribute ShippingRouteSearchCondition condition From f21de3df6df2f1ce67a78deb8e70095da790275d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=EC=9D=80=E2=98=98?= <138298079+devdaeun@users.noreply.github.com> Date: Tue, 25 Mar 2025 16:24:50 +0900 Subject: [PATCH 365/389] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b790d69..0acab4c 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ $ docker compose up -d - [AuditorAwareImpl 구현 및 @SQLRestriction 설정](https://github.com/logistics-delivery/Back-end/wiki/AuditorAwareImpl-%EA%B5%AC%ED%98%84-%EB%B0%8F-@SQLRestriction-%EC%84%A4%EC%A0%95) - [Git 시크릿 키 보호 방법](https://github.com/logistics-delivery/Back-end/wiki/Git-%EC%8B%9C%ED%81%AC%EB%A6%BF-%ED%82%A4-%EB%B3%B4%ED%98%B8-%EB%B0%A9%EB%B2%95) - [Docker 명령어](https://github.com/logistics-delivery/Back-end/wiki/docker-%EB%AA%85%EB%A0%B9%EC%96%B4) -- [설계 대비 API 구현률] : +- [설계 대비 API 구현률](https://github.com/logistics-delivery/Back-end/wiki/%EC%84%A4%EA%B3%84%EB%8C%80%EB%B9%84-API-%EA%B5%AC%ED%98%84%EB%A5%A0) # 시스템을 발전 시키기 위해 더 해본다면? From b83dd17e4a49b08f935a647b4a6a7ed9da9478e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=EC=9D=80=E2=98=98?= <138298079+devdaeun@users.noreply.github.com> Date: Tue, 25 Mar 2025 16:26:55 +0900 Subject: [PATCH 366/389] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0acab4c..bcc5290 100644 --- a/README.md +++ b/README.md @@ -160,7 +160,7 @@ $ docker compose up -d | **인증인가,
사용자API** | 신다은
(팀장) | - 회원가입,로그인 등의 사용자 정보CRUD 구현
- 로그인 성공 시 JWT 토큰을 생성하여 사용자에게 전달되도록 함
- JWT 토큰을 사용하여 회원정보를 인증, 내부payload값을 추출하여 서브모듈에서 사용가능하도록 구현
- 인증된 정보를 바탕으로 사용자의 권한이 요청 url에 접근가능한지 gateway에서 우선적으로 인가처리를 할 수 있도록 구현
- gateway에서 기본 인가 처리 후, AOP와 Custom Annotation을 사용하여 각 API의 세부 기능별로 권한을 추가로 체크하는 접근 인가 기능을 구현.| |**슬랙API**|신다은
(팀장) | - 슬랙 메세지 관리 CRUD 구현
- 슬랙 외부 API를 연동하여 메세지 발송 시 실제 슬랙 사이트로 알림메세지가 전송되도록 함.
- Base Entity를 사용한 생성,수정,삭제 기록 저장 및 SoftDelete 구현
- QueryDSL을 이용한 슬랙 메세지 검색기능 구현| |**허브API**|이소현
(테크리드) | - 허브 정보, 허브간 경로 CRUD 구현
- 허브 검색 기능 (Query DSL) 구현
- 최단 경로를 위한 허브간 경로 체크포인트 생성 및 조회 구현
-허브 내 배송품 입고 및 출고 처리 기능 구현 | -|**상품API**|서진영
(테크리드) | - 상품 CRUD 구현
- QueryDSL을 이용한 상품 검색 기능 구현
- 공통모듈에 swagger, Auditor Aware 구현 | +|**상품API**|서진영
(테크리드) | - 상품 CRUD 및 QueryDSL 기반 검색 기능 구현
- Swagger 설정 및 Auditor Aware 등 공통 모듈 구축
- FeignClient를 통한 마이크로서비스 간 통신 처리
- DDD 기반 4계층 아키텍처 설계 및 적용
- 시스템 흐름에 대한 플로우 차트 작성 및 공유
- 프로젝트 내 미숙한 기술에 대한 문서화 및 설명을 통해 팀 기술 이해도 향상 기여| |**배송API**|권길남 | - 배송, 배송 로그, 배송 담당자 CRUD 구현
- 배송 담당자 배정 알고리즘 구현
- QueryDSL을 사용한 배송정보 검색기능 구현
- Docker 개발 환경세팅 | |**업체API**|원지윤 | - Company-service CRUD 개발 및 Spring Boot 기반 4계층 아키텍처 적용
- QueryDSL 기반 동적 검색 조건 및 페이징 기능 구현
- HTTP API 테스트, 도메인 및 서비스 계층 테스트 코드 작성| |**주문API**|이용재 | - 주문 CRUD 구현
- 주문 생성 시 Product 서비스에 재고 차감 요청 기능 연동 (FeignClient 사용)
- 주문 생성 시 Shipping 서비스에 배송 생성 요청 기능 연동 (FeignClient 사용)
- Slack 도메인 연동을 위한 주문 + 배송 정보 응답 API 제공
- QueryDSL을 활용한 주문 검색 기능 구현 (주문명 + 상태 검색)| From 9e805df5f70bf457b86b9bfe4069be855f4d8f3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8B=A4=EC=9D=80=E2=98=98?= <138298079+devdaeun@users.noreply.github.com> Date: Tue, 25 Mar 2025 16:28:02 +0900 Subject: [PATCH 367/389] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bcc5290..edc5dd4 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,7 @@ $ docker compose up -d - [게이트웨이에서의 인가처리오류](https://github.com/logistics-delivery/Back-end/wiki/%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4%EC%97%90%EC%84%9C%EC%9D%98-%EC%9D%B8%EA%B0%80%EC%B2%98%EB%A6%AC%28ReactiveSecurityContextHolder%29) - [QueryDSL Q파일 문제 트러블슈팅](https://github.com/logistics-delivery/Back-end/wiki/QueryDSL-Q%ED%8C%8C%EC%9D%BC-%EB%AC%B8%EC%A0%9C-%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85) +- [도메인형 3계층 vs 4계층 구조 설계](https://github.com/logistics-delivery/Back-end/wiki/%EB%8F%84%EB%A9%94%EC%9D%B8%ED%98%95-3%EA%B3%84%EC%B8%B5-vs-4%EA%B3%84%EC%B8%B5-%EA%B5%AC%EC%A1%B0-%EC%84%A4%EA%B3%84) **공통 관심 사항** From bbdd34b9e085677b2d6a0a9c33368be6a1a2901c Mon Sep 17 00:00:00 2001 From: sohyun119 Date: Tue, 25 Mar 2025 19:49:09 +0900 Subject: [PATCH 368/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20:=20README=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=88=98=EC=A0=95=20=EC=99=84=EB=A3=8C?= =?UTF-8?q?=EB=B3=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 71 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 36 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index edc5dd4..c7b5f94 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Logistics-delivery ### 1. MSA 기반 아키텍처 & 커뮤니케이션 - 멀티모듈 프로젝트 구조로 각 기능을 독립적인 마이크로서비스로 분리하여 개발진행. -- 서비스 간 통신은 REST API를 통해 이루어지며, 다른 서브모듈 간의 통신은 FeignClient 사용. +- 서비스 내 통신은 REST API를 통해 이루어지며, 다른 서브모듈 간의 통신은 FeignClient 사용. - Spring Cloud Eureka를 이용한 서비스 디스커버리 및 Spring Cloud Gateway를 통한 API 라우팅. ### 2. 서비스 확장성 및 유연성 @@ -60,13 +60,14 @@ Logistics-delivery ### 기술스택 - | 분류 | 상세 | - |----------------|:---------------------------------------------------------| - | Framework | Spring Boot,JPA ,Spring Cloud (Eureka[MSA 간의 동적 서비스연결], Gateway[공통 진입점], Feign Client[서비스 통신]), AOP(사용자 권한 인가), QueryDSL (동적 쿼리 생성) | - | Database | PostgreSQL | - | Security | Spring Security(인증,인가), JWT (토큰 기반 인증) | - | Documentation | Swagger (API 문서화) | - |Test | Spring Boot Test, JUnit | + | 분류 | 상세 | + |---------------|:-----------------------------------------------------------------------------------------------------------------| + | Backend | Java & Spring Boot
Spring Cloud (Eureka)
Spring Gateway
JPA
Feign Client
Spring AOP
QueryDSL | + | Database | PostgreSQL | + | Infra | Docker, Docker Compose | +| Auth | Spring Security
JWT | + | Documentation | Swagger | + | Test | Spring Boot Test
JUnit | # 프로젝트 실행 방법 @@ -105,7 +106,7 @@ $ docker compose up -d **트러블 슈팅** - - [게이트웨이에서의 인가처리오류](https://github.com/logistics-delivery/Back-end/wiki/%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4%EC%97%90%EC%84%9C%EC%9D%98-%EC%9D%B8%EA%B0%80%EC%B2%98%EB%A6%AC%28ReactiveSecurityContextHolder%29) +- [게이트웨이에서의 인가처리오류](https://github.com/logistics-delivery/Back-end/wiki/%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4%EC%97%90%EC%84%9C%EC%9D%98-%EC%9D%B8%EA%B0%80%EC%B2%98%EB%A6%AC%28ReactiveSecurityContextHolder%29) - [QueryDSL Q파일 문제 트러블슈팅](https://github.com/logistics-delivery/Back-end/wiki/QueryDSL-Q%ED%8C%8C%EC%9D%BC-%EB%AC%B8%EC%A0%9C-%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85) - [도메인형 3계층 vs 4계층 구조 설계](https://github.com/logistics-delivery/Back-end/wiki/%EB%8F%84%EB%A9%94%EC%9D%B8%ED%98%95-3%EA%B3%84%EC%B8%B5-vs-4%EA%B3%84%EC%B8%B5-%EA%B5%AC%EC%A1%B0-%EC%84%A4%EA%B3%84) @@ -121,47 +122,47 @@ $ docker compose up -d # 시스템을 발전 시키기 위해 더 해본다면? - ai 자동생성 배송메세지 구현 - 매일 6시 슬랙 알림 발송기능 구현 -- 사용자 테이블에서 슬랙이름 컬럼을 분리하여 개별 테이블로 생성.
-→ 슬랙이름이 필요하지않은 관리자권한 사용자는 해당내용이 null로 표기되는 문제가 있어 분리가 필요하다고 생각됨.
+- 슬랙 이름이 Null값인 관리자 권한 사용자의 다른 사용자와의 테이블 분리 - Zipkin을 통한 분산 추적 기능 구현 -- 서비스 간의 호출을 feign client가 아닌 메세징 시스템으로 전환 +- 비동기 이벤트 통신이 필요한 서비스 간의 호출을 Feign client 가 아닌 메세징 시스템으로 전환 - 페이징 처리 공통모듈에서 관리 - 예외처리 도메인 책임으로 분리 # 협업 시 우리조가 잘한 것들 - **기술** +### 기술적 측면 - **서비스 디스커버리 도입** - - Eureka 를 활용해 서비스의 동적 등록과 검색이 가능해졌다. + - Eureka 를 활용해 서비스의 동적 등록과 검색이 가능해짐. - **API 게이트웨이 활용** - - Gateway를 통해 JWT 토큰 검증 및 권한정보 인가처리를 진행하여 보안이 강화되었다. -- **DDD 구조 활용** - - MSA환경에서 DDD구조를 사용함으로써 인프라스트럭처 코드와 순수한 자바 도메인 코드를 명확히 분리할 수 있었다. 이를 통해서 서로 다른 서비스 간에 기술적인 의존도를 줄일 수 있었다. + - Gateway를 통해 JWT 토큰 검증 및 권한정보 인가처리를 진행하여 보안이 강화됨. +- **DDD 설계를 위한 4계층 구조 활용** + - MSA환경에서 4계층 구조를 사용함으로써 인프라스트럭처 코드와 순수한 자바 도메인 코드를 명확히 분리함. + - 이를 통해 서로 다른 서비스 간에 기술적인 의존도를 줄일 수 있게됨. - **AOP를 도입** - - 서비스간 권한 체크를 하여 코드 중복을 줄이고 공통 관심사를 효율적으로 처리할 수 있었다. + - 서비스간 권한 체크를 하여 코드 중복을 줄이고 공통 관심사를 효율적으로 처리할 수 있게함. - **소통** +### 소통적 측면 - **Pull Request 를 통한 코드 리뷰** - - dev에 두 명 이상의 승인이 이루어지게 Pull Request를 열어놓아 코드 변경 사항에 대해 팀원들과 공유하고 검토하는 과정을 거쳐 코드 품질을 높였다. + - dev에 두 명 이상의 승인이 이루어지게 Pull Request를 열어놓아 코드 변경 사항에 대해 팀원들과 공유하고 검토하는 과정을 거쳐 코드 품질을 높임. - **GitHub Issues를 통한 이슈 관리** - - 이슈 트래킹을 통해 진행사항을 파악하는데 도움이 됐다. + - 이슈 트래킹을 통해 진행사항을 파악하는데 도움이 됨. - **데일리 스크럼을 통한 원활한 커뮤니케이션** - - 매일 스크럼을 진행하여 모든 팀원의 진행 상황을 공유하고, 이슈를 공유 및 논의 함으로써 빠르게 처리할 수 있었다. + - 매일 스크럼을 진행하여 모든 팀원의 진행 상황을 공유하고, 이슈를 공유 및 논의 함으로써 신속히 처리할 수 있었음. # 협업 간 발생한 문제와 해결 방안 -- 기존 모놀리식 프로젝트를 진행하면서 3계층에 대한 이해는 되어있지만 MSA 방식의 프로젝트를 진행하게되면서 레이어드 계층 구성에 대한 어려움을 겪음
- -> MSA 방식에서 레이어드 계층으로 패키지를 구성해야하는 이유를 정리하여 팀원들에게 공유 후 레이어드 계층으로 개발을 진행하게됨. +- MSA 방식의 프로젝트를 처음 진행하며 레이어드 계층 구성에 대한 어려움을 겪음
+ → MSA 에서의 4계층 구조의 필요성을 팀원들과 공유하고, 도입하여 각 계층의 역할을 명확히 정의하여 코드의 가독성과 유지보수성을 높임. -- 서버 간 통신 시 (FeignClient) 통신구현에 대한 이해가 되어있지않은채로 개발을 우선적으로 진행하게되어 진행에 차질이 발생
- → 연관 있는 서비스끼리 지속적으로 소통을 진행하며 개발을 진행하기로 함 +- 개발 초기 서버간 통신에 대한 규약을 정하지 않고, 각자 기능 구현에 집중하여 서비스 간 통신시 데이터 포맷 및 명세 불일치 문제 발생
+ → 연관된 서비스 담당자들 간의 주기적인 커뮤니케이션을 강화하고, 공통 API 명세서를 보완하여 협업 효율을 높임 # 팀원 소개 및 담당역할 -| **역할** | **담당자** | **세부 업무** | -|-------------------------|:---------------------:|------------------------------------| -| **인증인가,
사용자API** | 신다은
(팀장) | - 회원가입,로그인 등의 사용자 정보CRUD 구현
- 로그인 성공 시 JWT 토큰을 생성하여 사용자에게 전달되도록 함
- JWT 토큰을 사용하여 회원정보를 인증, 내부payload값을 추출하여 서브모듈에서 사용가능하도록 구현
- 인증된 정보를 바탕으로 사용자의 권한이 요청 url에 접근가능한지 gateway에서 우선적으로 인가처리를 할 수 있도록 구현
- gateway에서 기본 인가 처리 후, AOP와 Custom Annotation을 사용하여 각 API의 세부 기능별로 권한을 추가로 체크하는 접근 인가 기능을 구현.| -|**슬랙API**|신다은
(팀장) | - 슬랙 메세지 관리 CRUD 구현
- 슬랙 외부 API를 연동하여 메세지 발송 시 실제 슬랙 사이트로 알림메세지가 전송되도록 함.
- Base Entity를 사용한 생성,수정,삭제 기록 저장 및 SoftDelete 구현
- QueryDSL을 이용한 슬랙 메세지 검색기능 구현| -|**허브API**|이소현
(테크리드) | - 허브 정보, 허브간 경로 CRUD 구현
- 허브 검색 기능 (Query DSL) 구현
- 최단 경로를 위한 허브간 경로 체크포인트 생성 및 조회 구현
-허브 내 배송품 입고 및 출고 처리 기능 구현 | -|**상품API**|서진영
(테크리드) | - 상품 CRUD 및 QueryDSL 기반 검색 기능 구현
- Swagger 설정 및 Auditor Aware 등 공통 모듈 구축
- FeignClient를 통한 마이크로서비스 간 통신 처리
- DDD 기반 4계층 아키텍처 설계 및 적용
- 시스템 흐름에 대한 플로우 차트 작성 및 공유
- 프로젝트 내 미숙한 기술에 대한 문서화 및 설명을 통해 팀 기술 이해도 향상 기여| -|**배송API**|권길남 | - 배송, 배송 로그, 배송 담당자 CRUD 구현
- 배송 담당자 배정 알고리즘 구현
- QueryDSL을 사용한 배송정보 검색기능 구현
- Docker 개발 환경세팅 | -|**업체API**|원지윤 | - Company-service CRUD 개발 및 Spring Boot 기반 4계층 아키텍처 적용
- QueryDSL 기반 동적 검색 조건 및 페이징 기능 구현
- HTTP API 테스트, 도메인 및 서비스 계층 테스트 코드 작성| -|**주문API**|이용재 | - 주문 CRUD 구현
- 주문 생성 시 Product 서비스에 재고 차감 요청 기능 연동 (FeignClient 사용)
- 주문 생성 시 Shipping 서비스에 배송 생성 요청 기능 연동 (FeignClient 사용)
- Slack 도메인 연동을 위한 주문 + 배송 정보 응답 API 제공
- QueryDSL을 활용한 주문 검색 기능 구현 (주문명 + 상태 검색)| +| **역할** | **담당자** | **세부 업무** | +|-------------------------|:---------------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **인증인가,
사용자API** | 신다은
(팀장) | - 회원가입,로그인 등의 사용자 정보CRUD 구현
- 로그인 성공 시 JWT 토큰을 생성하여 사용자에게 전달되도록 함
- JWT 토큰을 사용하여 회원정보를 인증, 내부payload값을 추출하여 서브모듈에서 사용가능하도록 구현
- 인증된 정보를 바탕으로 사용자의 권한이 요청 url에 접근가능한지 gateway에서 우선적으로 인가처리를 할 수 있도록 구현
- gateway에서 기본 인가 처리 후, AOP와 Custom Annotation을 사용하여 각 API의 세부 기능별로 권한을 추가로 체크하는 접근 인가 기능을 구현. | +|**슬랙API**|신다은
(팀장) | - 슬랙 메세지 관리 CRUD 구현
- 슬랙 외부 API를 연동하여 메세지 발송 시 실제 슬랙 사이트로 알림메세지가 전송되도록 함.
- Base Entity를 사용한 생성,수정,삭제 기록 저장 및 SoftDelete 처리
- QueryDSL을 이용한 슬랙 메세지 검색기능 구현 | +|**허브API**|이소현
(테크리드) | - Naver API 를 이용한 주소→위경도 변환 및 허브 생성 기능 구현
- 허브 조회 및 수정, 삭제 기능 구현
- QueryDSL을 활용한 허브 검색 기능 구현
- 위경도 계산을 통한 허브 경로 생성 구현
- 허브 경로 조회 및 삭제 구현
- 다익스트라 알고리즘을 이용한 최단 경로 기반 체크포인트 생성 구현
- 허브 경로 체크포인트 조회 및 삭제 기능 구현
- Feign client를 이용한 허브 내 입출고 관리 기능 구현
- 공통 모듈 : BaseEntity 구현
- 공통 모듈 : 전역 예외 처리(Exception Handling) 구현
- 배송 서비스 내에 허브 입출고 정보를 수신 및 저장하는 기능 구현
- 모든 도메인이 직접 구현한 BaseEntity를 상속받아 생성일, 수정일, 삭제일을 자동으로 기록하며, Soft Delete를 지원하도록 설계 | +|**상품API**|서진영
(테크리드) | - 상품 CRUD 및 QueryDSL 기반 검색 기능 구현
- Swagger 설정 및 Auditor Aware 등 공통 모듈 구축
- FeignClient를 통한 마이크로서비스 간 통신 처리
- DDD 기반 4계층 아키텍처 설계 및 적용
- 시스템 흐름에 대한 플로우 차트 작성 및 공유
- 프로젝트 내 미숙한 기술에 대한 문서화 및 설명을 통해 팀 기술 이해도 향상 기여 | +|**배송API**|권길남 | - 배송, 배송 로그, 배송 담당자 CRUD 구현
- 배송 담당자 배정 알고리즘 구현
- QueryDSL을 사용한 배송정보 검색기능 구현
- Docker 개발 환경세팅 | +|**업체API**|원지윤 | - Company-service CRUD 개발 및 Spring Boot 기반 4계층 아키텍처 적용
- QueryDSL 기반 동적 검색 조건 및 페이징 기능 구현
- HTTP API 테스트, 도메인 및 서비스 계층 테스트 코드 작성 | +|**주문API**|이용재 | - 주문 CRUD 구현
- 주문 생성 시 Product 서비스에 재고 차감 요청 기능 연동 (FeignClient 사용)
- 주문 생성 시 Shipping 서비스에 배송 생성 요청 기능 연동 (FeignClient 사용)
- Slack 도메인 연동을 위한 주문 + 배송 정보 응답 API 제공
- QueryDSL을 활용한 주문 검색 기능 구현 (주문명 + 상태 검색) | From 61f8427c9cd1e88579436001c4c59ca80a700b62 Mon Sep 17 00:00:00 2001 From: jiyun Date: Tue, 25 Mar 2025 20:20:35 +0900 Subject: [PATCH 369/389] =?UTF-8?q?=F0=9F=A9=B9=20fix=20[#231]=20=EB=A6=AC?= =?UTF-8?q?=ED=8F=AC=EC=A7=80=ED=86=A0=EB=A6=AC=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../companyservice/application/service/CompanyService.java | 3 +-- .../companyservice/domain/repository/CompanyRepository.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java index b905855..d76ddba 100644 --- a/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java +++ b/company-service/src/main/java/com/sparta/companyservice/application/service/CompanyService.java @@ -23,7 +23,6 @@ @RequiredArgsConstructor public class CompanyService { private final CompanyRepository companyRepository; - private final CompanyQueryRepository companyQueryRepository; private final HubClient hubClient; @Transactional(readOnly = true) @@ -47,7 +46,7 @@ public CompanyDto createCompany(CompanyCreateDto dto, long userId) { @Transactional(readOnly = true) // 전체 조회 public Page searchCompanies(String name, String address, CompanyType type, Pageable pageable) { - return companyQueryRepository.searchCompanies(name, address, type, pageable) + return companyRepository.searchCompanies(name, address, type, pageable) .map(CompanyDto::fromEntity); } diff --git a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java index 69ac617..0a5cc8c 100644 --- a/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java +++ b/company-service/src/main/java/com/sparta/companyservice/domain/repository/CompanyRepository.java @@ -13,7 +13,7 @@ public interface CompanyRepository { Optional findByIdAndDeletedAtIsNull(UUID id); -// Page searchCompanies(String name, String address, CompanyType type, Pageable pageable); + Page searchCompanies(String name, String address, CompanyType type, Pageable pageable); boolean existsByIdAndDeletedAtIsNull(UUID id); } \ No newline at end of file From 9f4142e4cdbbd170da752a731e3277d0abaf2868 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Tue, 1 Apr 2025 18:39:31 +0900 Subject: [PATCH 370/389] =?UTF-8?q?=20=E2=9C=A8feat=20[#238]=20:=20stock-s?= =?UTF-8?q?ervice=20init=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gateway/src/main/resources/application.yml | 17 ++++++++ settings.gradle | 1 + stock-service/build.gradle | 41 +++++++++++++++++++ .../stockservice/StockServiceApplication.java | 13 ++++++ .../presentation/StockController.java | 17 ++++++++ .../src/main/resources/application.yml | 39 ++++++++++++++++++ .../StockServiceApplicationTests.java | 13 ++++++ 7 files changed, 141 insertions(+) create mode 100644 stock-service/build.gradle create mode 100644 stock-service/src/main/java/com/sparta/stockservice/StockServiceApplication.java create mode 100644 stock-service/src/main/java/com/sparta/stockservice/presentation/StockController.java create mode 100644 stock-service/src/main/resources/application.yml create mode 100644 stock-service/src/test/java/com/sparta/stockservice/StockServiceApplicationTests.java diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index bf88979..e2eedee 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -81,6 +81,20 @@ spring: - RewritePath=/product-service/api/v1/products/(?.*), /api/v1/products/$\{segment} + # Stock + - id: stock-service + uri: lb://stock-service + predicates: + - Path=/api/v1/stocks/** + - id: stock-docs + uri: lb://stock-service + predicates: + - Path=/stock-service/** + filters: + - RemoveRequestHeader=Cookie + - RewritePath=/stock-service/api/v1/stocks/(?.*), /api/v1/stocks/$\{segment} + + # Slack - id: slack-service uri: lb://slack-service @@ -165,3 +179,6 @@ springdoc: urls[6]: name: Product Service url: /product-service/v3/api-docs + urls[7]: + name: Stock Service + url: /stock-service/v3/api-docs diff --git a/settings.gradle b/settings.gradle index ffdbb10..767a737 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,3 +11,4 @@ include('product-service') include('slack-service') include('payment-service') include('shipping-service') +include('stock-service') diff --git a/stock-service/build.gradle b/stock-service/build.gradle new file mode 100644 index 0000000..45cdf64 --- /dev/null +++ b/stock-service/build.gradle @@ -0,0 +1,41 @@ +ext { + set('springCloudVersion', "2024.0.0") +} + +dependencies { + implementation project(':common-module') + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' + implementation 'jakarta.persistence:jakarta.persistence-api:3.1.0' + runtimeOnly 'org.postgresql:postgresql' + + // QueryDSL + implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta' + annotationProcessor 'com.querydsl:querydsl-apt:5.1.0:jakarta' + annotationProcessor 'jakarta.annotation:jakarta.annotation-api' + annotationProcessor 'jakarta.persistence:jakarta.persistence-api' +} + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" + } +} + + +// ✅ QueryDSL 자동 생성 디렉토리 설정 +tasks.withType(JavaCompile).configureEach { + options.annotationProcessorGeneratedSourcesDirectory = file("$buildDir/generated/querydsl") +} + +// ✅ 자동 생성된 QueryDSL 클래스 경로 추가 +sourceSets { + main { + java { + srcDirs += "$buildDir/generated/querydsl" + } + } +} \ No newline at end of file diff --git a/stock-service/src/main/java/com/sparta/stockservice/StockServiceApplication.java b/stock-service/src/main/java/com/sparta/stockservice/StockServiceApplication.java new file mode 100644 index 0000000..591e595 --- /dev/null +++ b/stock-service/src/main/java/com/sparta/stockservice/StockServiceApplication.java @@ -0,0 +1,13 @@ +package com.sparta.stockservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class StockServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(StockServiceApplication.class, args); + } + +} diff --git a/stock-service/src/main/java/com/sparta/stockservice/presentation/StockController.java b/stock-service/src/main/java/com/sparta/stockservice/presentation/StockController.java new file mode 100644 index 0000000..71decb5 --- /dev/null +++ b/stock-service/src/main/java/com/sparta/stockservice/presentation/StockController.java @@ -0,0 +1,17 @@ +package com.sparta.stockservice.presentation; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/v1/stocks") +public class StockController { + + + @GetMapping("/test") + public String test(){ + return "test ok"; + } + +} diff --git a/stock-service/src/main/resources/application.yml b/stock-service/src/main/resources/application.yml new file mode 100644 index 0000000..8903c3c --- /dev/null +++ b/stock-service/src/main/resources/application.yml @@ -0,0 +1,39 @@ +spring: + application: + name: stock-service + datasource: + url: jdbc:postgresql://localhost:5001/maindb + username: admin + password: 1234 + driver-class-name: org.postgresql.Driver + jpa: + database: postgresql + properties: + hibernate: + spring.jpa.open-in-view: false + format_sql: true + default_batch_fetch_size: 10 + default_schema: stock_service + dialect: org.hibernate.dialect.PostgreSQLDialect + hibernate: + ddl-auto: update + show-sql: true + +server: + port: 8089 + +eureka: + client: + register-with-eureka: true + fetch-registry: true + service-url: + defaultZone: http://localhost:8761/eureka/ + +springdoc: + api-docs: + version: openapi_3_1 + enabled: true + path: /stock-service/v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui.html diff --git a/stock-service/src/test/java/com/sparta/stockservice/StockServiceApplicationTests.java b/stock-service/src/test/java/com/sparta/stockservice/StockServiceApplicationTests.java new file mode 100644 index 0000000..5e48073 --- /dev/null +++ b/stock-service/src/test/java/com/sparta/stockservice/StockServiceApplicationTests.java @@ -0,0 +1,13 @@ +package com.sparta.stockservice; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class StockServiceApplicationTests { + + @Test + void contextLoads() { + } + +} From 2c1d226f997dee2f04c2dfa9ca063d07ab7bb0f8 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 2 Apr 2025 01:20:32 +0900 Subject: [PATCH 371/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#240]?= =?UTF-8?q?=20:=20=EC=83=81=ED=92=88=20=EB=A6=AC=ED=8E=99=ED=84=B0?= =?UTF-8?q?=EB=A7=81,=20=EC=9E=AC=EA=B3=A0=20=EC=97=94=ED=8B=B0=ED=8B=B0?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 상품에서 재고 관련 기능을 재고 엔티티로 분리 --- .../sparta/product/domain/model/Product.java | 41 ------------ .../stockservice/domain/model/Stock.java | 64 +++++++++++++++++++ 2 files changed, 64 insertions(+), 41 deletions(-) create mode 100644 stock-service/src/main/java/com/sparta/stockservice/domain/model/Stock.java diff --git a/product-service/src/main/java/com/sparta/product/domain/model/Product.java b/product-service/src/main/java/com/sparta/product/domain/model/Product.java index 68b21ca..920a839 100644 --- a/product-service/src/main/java/com/sparta/product/domain/model/Product.java +++ b/product-service/src/main/java/com/sparta/product/domain/model/Product.java @@ -36,18 +36,12 @@ public class Product extends BaseEntity { @Column(name = "product_price", nullable = false) private BigDecimal price; - @Column(name = "product_quantity", nullable = false) - private Integer quantity; - @Column(name = "is_display", nullable = false) private boolean isDisplay; @Column(name = "company_id", nullable = false) private UUID companyId; - @Column(name = "hub_id", nullable = false) - private UUID hubId; - /** * 상품 생성 @@ -57,10 +51,8 @@ public static Product createProduct(CreateProductRequestDto requestDto, Long use .name(requestDto.name()) .description(requestDto.description()) .price(requestDto.price()) - .quantity(requestDto.quantity()) .isDisplay(requestDto.isDisplay()) .companyId(requestDto.companyId()) - .hubId(requestDto.hubId()) .build(); } @@ -77,48 +69,15 @@ public Product updateProduct(UpdateProductServiceRequestDto serviceDto) { } - /** - * 상품 수정(재고 감소) - */ - public void decreaseQuantity(Integer quantity) { - validateDecreaseQuantity(quantity); - this.quantity = this.quantity - quantity; - } - - - - /** - * 상품 수정(재고 증가) - */ - public void increaseQuantity(Integer quantity) { - this.quantity = this.quantity + quantity; - } - - - private void validateDecreaseQuantity(Integer quantity) { - if (quantity == null || quantity < 30) { - throw new IllegalArgumentException("최소 30개 이상 요청해야 합니다."); - } - if (this.quantity < quantity) { - throw new IllegalStateException("재고가 부족합니다."); - } - } - - - // DTO -> Entity 변환 메서드 public static Product of(CreateProductResponseDto responseDto) { return Product.builder() .name(responseDto.name()) .description(responseDto.description()) - .quantity(responseDto.quantity()) .price(responseDto.price()) .isDisplay(responseDto.isDisplay()) .companyId(responseDto.companyId()) - .hubId(responseDto.hubId()) .build(); } - - } \ No newline at end of file diff --git a/stock-service/src/main/java/com/sparta/stockservice/domain/model/Stock.java b/stock-service/src/main/java/com/sparta/stockservice/domain/model/Stock.java new file mode 100644 index 0000000..3c878f1 --- /dev/null +++ b/stock-service/src/main/java/com/sparta/stockservice/domain/model/Stock.java @@ -0,0 +1,64 @@ +package com.sparta.stockservice.domain.model; + +import com.sparta.commonmodule.entity.BaseEntity; +import jakarta.persistence.*; +import lombok.*; +import org.hibernate.annotations.SQLRestriction; + +import java.util.UUID; + +@Entity +@Table( + name="p_stock", + uniqueConstraints = @UniqueConstraint(columnNames = {"product_id", "hub_id"}) +) +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@SQLRestriction("is_deleted IS FALSE") +@Builder(access = AccessLevel.PRIVATE) +public class Stock extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(name="stock_id", updatable = false, nullable = false) + private UUID id; + + @Column(name = "product_id", nullable = false) + private UUID productId; + + @Column(name = "hub_id", nullable = false) + private UUID hubId; + + @Column(name = "quantity", nullable = false) + private Integer quantity; + + + /** + * 재고 감소 + */ + public void decreaseStock(Integer quantity) { + validateDecreaseQuantity(quantity); + this.quantity = this.quantity - quantity; + } + + + + /** + * 재고 증가 + */ + public void increaseStock(Integer quantity) { + this.quantity = this.quantity + quantity; + } + + + private void validateDecreaseQuantity(Integer quantity) { + if (quantity == null || quantity < 30) { + throw new IllegalArgumentException("최소 30개 이상 요청해야 합니다."); + } + if (this.quantity < quantity) { + throw new IllegalStateException("재고가 부족합니다."); + } + } + +} From 31069b3b61a375867e222e59fad4a89ebd075e38 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 2 Apr 2025 01:41:20 +0900 Subject: [PATCH 372/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#240]?= =?UTF-8?q?=20:=20=EC=9E=AC=EA=B3=A0=20=EA=B0=90=EC=86=8C=20=EB=B0=8F=20?= =?UTF-8?q?=EC=A6=9D=EA=B0=80=20api=20=EB=A6=AC=ED=8E=99=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ProductController.java | 21 ---------- .../presentation/StockController.java | 41 ++++++++++++++++--- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java index 5593bb9..96bf356 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java +++ b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java @@ -2,8 +2,6 @@ import com.sparta.commonmodule.aop.RoleCheck; import com.sparta.product.application.dto.DeleteProductServiceRequestDto; -import com.sparta.product.application.dto.DecreaseProductQuantityServiceRequestDto; -import com.sparta.product.application.dto.IncreaseProductQuantityServiceRequestDto; import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.application.service.ProductServiceImpl; import com.sparta.product.presentation.dto.request.*; @@ -96,25 +94,6 @@ public ResponseEntity> searchProducts(@ModelAttri } - /** - * 상품 수정(재고 감소) - */ - @PutMapping("/{productId}/decrease") - public ResponseEntity decreaseProductQuantity(@PathVariable UUID productId, - @RequestBody DecreaseProductQuantityRequestDto requestDto) { - return ResponseEntity.ok(productServiceImpl.decreaseProductQuantity( - DecreaseProductQuantityServiceRequestDto.of(requestDto, productId))); - } - - /** - * 상품 수정(재고 증가) - */ - @PutMapping("/{productId}/increase") - public ResponseEntity increaseProductQuantity(@PathVariable UUID productId, - @RequestBody IncreaseProductQuantityRequestDto requestDto) { - return ResponseEntity.ok(productServiceImpl.increaseProductQuantity( - IncreaseProductQuantityServiceRequestDto.of(requestDto, productId))); - } } diff --git a/stock-service/src/main/java/com/sparta/stockservice/presentation/StockController.java b/stock-service/src/main/java/com/sparta/stockservice/presentation/StockController.java index 71decb5..b36d28a 100644 --- a/stock-service/src/main/java/com/sparta/stockservice/presentation/StockController.java +++ b/stock-service/src/main/java/com/sparta/stockservice/presentation/StockController.java @@ -1,17 +1,46 @@ package com.sparta.stockservice.presentation; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import com.sparta.stockservice.presentation.dto.request.CreateStockRequestDto; +import com.sparta.stockservice.presentation.dto.response.CreateStockResponseDto; +import com.sparta.stockservice.presentation.dto.response.DecreaseStockResponseDto; +import com.sparta.stockservice.presentation.dto.response.IncreaseStockResponseDto; +import com.sparta.stockservice.application.dto.DecreaseStockServiceRequestDto; +import com.sparta.stockservice.application.dto.IncreaseStockServiceRequestDto; +import com.sparta.stockservice.application.service.StockService; +import com.sparta.stockservice.presentation.dto.request.DecreaseStockRequestDto; +import com.sparta.stockservice.presentation.dto.request.IncreaseStockRequestDto; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.UUID; @RestController @RequestMapping("/api/v1/stocks") +@RequiredArgsConstructor public class StockController { + private final StockService stockService; + + /** + * 재고 감소 + */ + @PutMapping("/{productId}/decrease") + public ResponseEntity decreaseStock(@PathVariable UUID productId, + @RequestBody DecreaseStockRequestDto requestDto) { + return ResponseEntity.ok(stockService.decreaseStock( + DecreaseStockServiceRequestDto.of(requestDto, productId))); + } + - @GetMapping("/test") - public String test(){ - return "test ok"; + /** + * 재고 증가 + */ + @PutMapping("/{productId}/increase") + public ResponseEntity increaseStock(@PathVariable UUID productId, + @RequestBody IncreaseStockRequestDto requestDto) { + return ResponseEntity.ok(stockService.increaseStock( + IncreaseStockServiceRequestDto.of(requestDto, productId))); } } From 86ef8605d70f468034bdbfab5465add4c4fc75b0 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 2 Apr 2025 01:41:39 +0900 Subject: [PATCH 373/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#240]?= =?UTF-8?q?=20:=20=EC=9E=AC=EA=B3=A0=20=EA=B0=90=EC=86=8C=20dto=20?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...reaseProductQuantityServiceRequestDto.java | 23 ------------- .../DecreaseProductQuantityRequestDto.java | 11 ------- .../DecreaseProductQuantityResponseDto.java | 33 ------------------- .../dto/DecreaseStockServiceRequestDto.java | 23 +++++++++++++ .../dto/request/DecreaseStockRequestDto.java | 11 +++++++ .../response/DecreaseStockResponseDto.java | 32 ++++++++++++++++++ 6 files changed, 66 insertions(+), 67 deletions(-) delete mode 100644 product-service/src/main/java/com/sparta/product/application/dto/DecreaseProductQuantityServiceRequestDto.java delete mode 100644 product-service/src/main/java/com/sparta/product/presentation/dto/request/DecreaseProductQuantityRequestDto.java delete mode 100644 product-service/src/main/java/com/sparta/product/presentation/dto/response/DecreaseProductQuantityResponseDto.java create mode 100644 stock-service/src/main/java/com/sparta/stockservice/application/dto/DecreaseStockServiceRequestDto.java create mode 100644 stock-service/src/main/java/com/sparta/stockservice/presentation/dto/request/DecreaseStockRequestDto.java create mode 100644 stock-service/src/main/java/com/sparta/stockservice/presentation/dto/response/DecreaseStockResponseDto.java diff --git a/product-service/src/main/java/com/sparta/product/application/dto/DecreaseProductQuantityServiceRequestDto.java b/product-service/src/main/java/com/sparta/product/application/dto/DecreaseProductQuantityServiceRequestDto.java deleted file mode 100644 index e88fc27..0000000 --- a/product-service/src/main/java/com/sparta/product/application/dto/DecreaseProductQuantityServiceRequestDto.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.sparta.product.application.dto; - -import com.sparta.product.presentation.dto.request.DecreaseProductQuantityRequestDto; -import lombok.Builder; - -import java.util.UUID; - -@Builder -public record DecreaseProductQuantityServiceRequestDto(UUID productId, - UUID companyId, - UUID hubId, - Integer quantity) { - - // 요청 DTO -> 서비스 DTO 변환 메서드 - public static DecreaseProductQuantityServiceRequestDto of(DecreaseProductQuantityRequestDto request, UUID productId) { - return DecreaseProductQuantityServiceRequestDto.builder() - .productId(productId) - .companyId(request.companyId()) - .hubId(request.hubId()) - .quantity(request.quantity()) - .build(); - } -} diff --git a/product-service/src/main/java/com/sparta/product/presentation/dto/request/DecreaseProductQuantityRequestDto.java b/product-service/src/main/java/com/sparta/product/presentation/dto/request/DecreaseProductQuantityRequestDto.java deleted file mode 100644 index 9893ca4..0000000 --- a/product-service/src/main/java/com/sparta/product/presentation/dto/request/DecreaseProductQuantityRequestDto.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sparta.product.presentation.dto.request; - -import java.util.UUID; - -public record DecreaseProductQuantityRequestDto(UUID companyId, - UUID hubId, - Integer quantity -) { - - -} diff --git a/product-service/src/main/java/com/sparta/product/presentation/dto/response/DecreaseProductQuantityResponseDto.java b/product-service/src/main/java/com/sparta/product/presentation/dto/response/DecreaseProductQuantityResponseDto.java deleted file mode 100644 index 7383c38..0000000 --- a/product-service/src/main/java/com/sparta/product/presentation/dto/response/DecreaseProductQuantityResponseDto.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.sparta.product.presentation.dto.response; - -import com.sparta.product.domain.model.Product; -import lombok.Builder; - -import java.util.UUID; - -@Builder -public record DecreaseProductQuantityResponseDto(UUID productId, // 재고 감소 상품 - Boolean isSuccess, // 재고 감소 성공 여부 - Integer decreasedQuantity, // 실제 차감된 수량 - String message) { // 성공 or 실패 메세지 - // Entity -> DTO 변환 메서드 - // 성공 응답 - public static DecreaseProductQuantityResponseDto success(Product product, int decreasedQuantity) { - return DecreaseProductQuantityResponseDto.builder() - .productId(product.getId()) - .isSuccess(true) - .decreasedQuantity(decreasedQuantity) - .message("재고 감소 성공.") - .build(); - } - - // 실패 응답 - public static DecreaseProductQuantityResponseDto failure(Product product) { - return DecreaseProductQuantityResponseDto.builder() - .productId(product.getId()) - .isSuccess(false) - .decreasedQuantity(0) - .message("재고 감소 실패.") - .build(); - } -} diff --git a/stock-service/src/main/java/com/sparta/stockservice/application/dto/DecreaseStockServiceRequestDto.java b/stock-service/src/main/java/com/sparta/stockservice/application/dto/DecreaseStockServiceRequestDto.java new file mode 100644 index 0000000..9ff1ff9 --- /dev/null +++ b/stock-service/src/main/java/com/sparta/stockservice/application/dto/DecreaseStockServiceRequestDto.java @@ -0,0 +1,23 @@ +package com.sparta.stockservice.application.dto; + +import com.sparta.stockservice.presentation.dto.request.DecreaseStockRequestDto; +import lombok.Builder; + +import java.util.UUID; + +@Builder +public record DecreaseStockServiceRequestDto(UUID productId, + UUID companyId, + UUID hubId, + Integer quantity) { + + // 요청 DTO -> 서비스 DTO 변환 메서드 + public static DecreaseStockServiceRequestDto of(DecreaseStockRequestDto request, UUID productId) { + return DecreaseStockServiceRequestDto.builder() + .productId(productId) + .companyId(request.companyId()) + .hubId(request.hubId()) + .quantity(request.quantity()) + .build(); + } +} diff --git a/stock-service/src/main/java/com/sparta/stockservice/presentation/dto/request/DecreaseStockRequestDto.java b/stock-service/src/main/java/com/sparta/stockservice/presentation/dto/request/DecreaseStockRequestDto.java new file mode 100644 index 0000000..975863f --- /dev/null +++ b/stock-service/src/main/java/com/sparta/stockservice/presentation/dto/request/DecreaseStockRequestDto.java @@ -0,0 +1,11 @@ +package com.sparta.stockservice.presentation.dto.request; + +import java.util.UUID; + +public record DecreaseStockRequestDto(UUID companyId, + UUID hubId, + Integer quantity +) { + + +} diff --git a/stock-service/src/main/java/com/sparta/stockservice/presentation/dto/response/DecreaseStockResponseDto.java b/stock-service/src/main/java/com/sparta/stockservice/presentation/dto/response/DecreaseStockResponseDto.java new file mode 100644 index 0000000..a15f1cf --- /dev/null +++ b/stock-service/src/main/java/com/sparta/stockservice/presentation/dto/response/DecreaseStockResponseDto.java @@ -0,0 +1,32 @@ +package com.sparta.stockservice.presentation.dto.response; + +import lombok.Builder; + +import java.util.UUID; + +@Builder +public record DecreaseStockResponseDto(UUID productId, // 재고 감소 상품 + Boolean isSuccess, // 재고 감소 성공 여부 + Integer decreasedQuantity, // 실제 차감된 수량 + String message) { // 성공 or 실패 메세지 + // Entity -> DTO 변환 메서드 + // 성공 응답 + public static DecreaseStockResponseDto success(UUID productId, int decreasedQuantity) { + return DecreaseStockResponseDto.builder() + .productId(productId) + .isSuccess(true) + .decreasedQuantity(decreasedQuantity) + .message("재고 감소 성공.") + .build(); + } + + // 실패 응답 + public static DecreaseStockResponseDto failure(UUID productId) { + return DecreaseStockResponseDto.builder() + .productId(productId) + .isSuccess(false) + .decreasedQuantity(0) + .message("재고 감소 실패.") + .build(); + } +} From 126f14f7c384cbe194a6274abd9bce9d4d0542ff Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 2 Apr 2025 01:41:53 +0900 Subject: [PATCH 374/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#240]?= =?UTF-8?q?=20:=20=EC=9E=AC=EA=B3=A0=20=EC=A6=9D=EA=B0=80=20dto=20?= =?UTF-8?q?=EB=A6=AC=ED=8E=99=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...reaseProductQuantityServiceRequestDto.java | 23 ------------- .../IncreaseProductQuantityRequestDto.java | 11 ------- .../IncreaseProductQuantityResponseDto.java | 33 ------------------- .../dto/IncreaseStockServiceRequestDto.java | 23 +++++++++++++ .../dto/request/IncreaseStockRequestDto.java | 11 +++++++ .../response/IncreaseStockResponseDto.java | 32 ++++++++++++++++++ 6 files changed, 66 insertions(+), 67 deletions(-) delete mode 100644 product-service/src/main/java/com/sparta/product/application/dto/IncreaseProductQuantityServiceRequestDto.java delete mode 100644 product-service/src/main/java/com/sparta/product/presentation/dto/request/IncreaseProductQuantityRequestDto.java delete mode 100644 product-service/src/main/java/com/sparta/product/presentation/dto/response/IncreaseProductQuantityResponseDto.java create mode 100644 stock-service/src/main/java/com/sparta/stockservice/application/dto/IncreaseStockServiceRequestDto.java create mode 100644 stock-service/src/main/java/com/sparta/stockservice/presentation/dto/request/IncreaseStockRequestDto.java create mode 100644 stock-service/src/main/java/com/sparta/stockservice/presentation/dto/response/IncreaseStockResponseDto.java diff --git a/product-service/src/main/java/com/sparta/product/application/dto/IncreaseProductQuantityServiceRequestDto.java b/product-service/src/main/java/com/sparta/product/application/dto/IncreaseProductQuantityServiceRequestDto.java deleted file mode 100644 index ab6264b..0000000 --- a/product-service/src/main/java/com/sparta/product/application/dto/IncreaseProductQuantityServiceRequestDto.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.sparta.product.application.dto; - -import com.sparta.product.presentation.dto.request.IncreaseProductQuantityRequestDto; -import lombok.Builder; - -import java.util.UUID; - -@Builder -public record IncreaseProductQuantityServiceRequestDto(UUID productId, - UUID companyId, - UUID hubId, - Integer quantity) { - - // 요청 DTO -> 서비스 DTO 변환 메서드 - public static IncreaseProductQuantityServiceRequestDto of(IncreaseProductQuantityRequestDto request, UUID productId) { - return IncreaseProductQuantityServiceRequestDto.builder() - .productId(productId) - .companyId(request.companyId()) - .hubId(request.hubId()) - .quantity(request.quantity()) - .build(); - } -} diff --git a/product-service/src/main/java/com/sparta/product/presentation/dto/request/IncreaseProductQuantityRequestDto.java b/product-service/src/main/java/com/sparta/product/presentation/dto/request/IncreaseProductQuantityRequestDto.java deleted file mode 100644 index 6e13fb6..0000000 --- a/product-service/src/main/java/com/sparta/product/presentation/dto/request/IncreaseProductQuantityRequestDto.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sparta.product.presentation.dto.request; - -import java.util.UUID; - -public record IncreaseProductQuantityRequestDto(UUID companyId, - UUID hubId, - Integer quantity -) { - - -} diff --git a/product-service/src/main/java/com/sparta/product/presentation/dto/response/IncreaseProductQuantityResponseDto.java b/product-service/src/main/java/com/sparta/product/presentation/dto/response/IncreaseProductQuantityResponseDto.java deleted file mode 100644 index 2e6f6d1..0000000 --- a/product-service/src/main/java/com/sparta/product/presentation/dto/response/IncreaseProductQuantityResponseDto.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.sparta.product.presentation.dto.response; - -import com.sparta.product.domain.model.Product; -import lombok.Builder; - -import java.util.UUID; - -@Builder -public record IncreaseProductQuantityResponseDto(UUID productId, // 재고 증가 상품 - Boolean isSuccess, // 재고 증가 성공 여부 - Integer increasedQuantity, // 실제 증가된 수량 - String message) { // 성공 or 실패 메세지 - // Entity -> DTO 변환 메서드 - // 성공 응답 - public static IncreaseProductQuantityResponseDto success(Product product, int increasedQuantity) { - return IncreaseProductQuantityResponseDto.builder() - .productId(product.getId()) - .isSuccess(true) - .increasedQuantity(increasedQuantity) - .message("재고 증가 성공.") - .build(); - } - - // 실패 응답 - public static IncreaseProductQuantityResponseDto failure(Product product) { - return IncreaseProductQuantityResponseDto.builder() - .productId(product.getId()) - .isSuccess(false) - .increasedQuantity(0) - .message("재고 증가 실패.") - .build(); - } -} diff --git a/stock-service/src/main/java/com/sparta/stockservice/application/dto/IncreaseStockServiceRequestDto.java b/stock-service/src/main/java/com/sparta/stockservice/application/dto/IncreaseStockServiceRequestDto.java new file mode 100644 index 0000000..0b8cda4 --- /dev/null +++ b/stock-service/src/main/java/com/sparta/stockservice/application/dto/IncreaseStockServiceRequestDto.java @@ -0,0 +1,23 @@ +package com.sparta.stockservice.application.dto; + +import com.sparta.stockservice.presentation.dto.request.IncreaseStockRequestDto; +import lombok.Builder; + +import java.util.UUID; + +@Builder +public record IncreaseStockServiceRequestDto(UUID productId, + UUID companyId, + UUID hubId, + Integer quantity) { + + // 요청 DTO -> 서비스 DTO 변환 메서드 + public static IncreaseStockServiceRequestDto of(IncreaseStockRequestDto request, UUID productId) { + return IncreaseStockServiceRequestDto.builder() + .productId(productId) + .companyId(request.companyId()) + .hubId(request.hubId()) + .quantity(request.quantity()) + .build(); + } +} diff --git a/stock-service/src/main/java/com/sparta/stockservice/presentation/dto/request/IncreaseStockRequestDto.java b/stock-service/src/main/java/com/sparta/stockservice/presentation/dto/request/IncreaseStockRequestDto.java new file mode 100644 index 0000000..735fb3d --- /dev/null +++ b/stock-service/src/main/java/com/sparta/stockservice/presentation/dto/request/IncreaseStockRequestDto.java @@ -0,0 +1,11 @@ +package com.sparta.stockservice.presentation.dto.request; + +import java.util.UUID; + +public record IncreaseStockRequestDto(UUID companyId, + UUID hubId, + Integer quantity +) { + + +} diff --git a/stock-service/src/main/java/com/sparta/stockservice/presentation/dto/response/IncreaseStockResponseDto.java b/stock-service/src/main/java/com/sparta/stockservice/presentation/dto/response/IncreaseStockResponseDto.java new file mode 100644 index 0000000..410b174 --- /dev/null +++ b/stock-service/src/main/java/com/sparta/stockservice/presentation/dto/response/IncreaseStockResponseDto.java @@ -0,0 +1,32 @@ +package com.sparta.stockservice.presentation.dto.response; + +import lombok.Builder; + +import java.util.UUID; + +@Builder +public record IncreaseStockResponseDto(UUID productId, // 재고 증가 상품 + Boolean isSuccess, // 재고 증가 성공 여부 + Integer increasedQuantity, // 실제 증가된 수량 + String message) { // 성공 or 실패 메세지 + // Entity -> DTO 변환 메서드 + // 성공 응답 + public static IncreaseStockResponseDto success(UUID productId, int increasedQuantity) { + return IncreaseStockResponseDto.builder() + .productId(productId) + .isSuccess(true) + .increasedQuantity(increasedQuantity) + .message("재고 증가 성공.") + .build(); + } + + // 실패 응답 + public static IncreaseStockResponseDto failure(UUID productId) { + return IncreaseStockResponseDto.builder() + .productId(productId) + .isSuccess(false) + .increasedQuantity(0) + .message("재고 증가 실패.") + .build(); + } +} From 23231b8843f9712112c95e3d5a0b307be77df7a7 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 2 Apr 2025 01:42:35 +0900 Subject: [PATCH 375/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#240]?= =?UTF-8?q?=20:=20=EC=9E=AC=EA=B3=A0=20=EA=B0=90=EC=86=8C=20=EB=B0=8F=20?= =?UTF-8?q?=EC=A6=9D=EA=B0=80=20=EB=B9=84=EC=A6=88=EB=8B=88=EC=8A=A4=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EB=A6=AC=ED=8E=99=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -기존에는 상품 서비스에서 재고 감소 및 증가를 로직 수행 -리펙터링 후 재고 서비스를 따로 분리하여, 재고 감소 및 증가처리 로직 수행 --- .../application/service/ProductService.java | 6 -- .../service/ProductServiceImpl.java | 36 ------------ .../application/service/StockService.java | 16 ++++++ .../application/service/StockServiceImpl.java | 56 +++++++++++++++++++ 4 files changed, 72 insertions(+), 42 deletions(-) create mode 100644 stock-service/src/main/java/com/sparta/stockservice/application/service/StockService.java create mode 100644 stock-service/src/main/java/com/sparta/stockservice/application/service/StockServiceImpl.java diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductService.java b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java index 0b72724..9bef65c 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductService.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java @@ -1,8 +1,6 @@ package com.sparta.product.application.service; import com.sparta.product.application.dto.DeleteProductServiceRequestDto; -import com.sparta.product.application.dto.DecreaseProductQuantityServiceRequestDto; -import com.sparta.product.application.dto.IncreaseProductQuantityServiceRequestDto; import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.presentation.dto.request.CreateProductRequestDto; import com.sparta.product.presentation.dto.request.SearchProductRequestDto; @@ -27,8 +25,4 @@ public interface ProductService { void deleteProduct(DeleteProductServiceRequestDto serviceDto); Page searchProducts(SearchProductRequestDto requestDto, Pageable pageable); - - DecreaseProductQuantityResponseDto decreaseProductQuantity(DecreaseProductQuantityServiceRequestDto serviceDto); - - IncreaseProductQuantityResponseDto increaseProductQuantity(IncreaseProductQuantityServiceRequestDto serviceDto); } diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java index 15f7d53..8d449e3 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java @@ -2,8 +2,6 @@ import com.sparta.commonmodule.exception.ResourceNotFoundException; import com.sparta.product.application.dto.DeleteProductServiceRequestDto; -import com.sparta.product.application.dto.DecreaseProductQuantityServiceRequestDto; -import com.sparta.product.application.dto.IncreaseProductQuantityServiceRequestDto; import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.domain.model.Product; import com.sparta.product.domain.repository.ProductRepository; @@ -102,40 +100,6 @@ public Page searchProducts(SearchProductRequestDto req } - /** - * 상품 수정(재고 감소) - */ - @Override - public DecreaseProductQuantityResponseDto decreaseProductQuantity(DecreaseProductQuantityServiceRequestDto serviceDto) { - Product product = productRepository.findByIdAndHubId(serviceDto.productId(), serviceDto.hubId()) - .orElseThrow(() -> new ResourceNotFoundException("해당 허브에 상품이 존재하지 않습니다.")); - - try { - // 재고 감소 성공 - product.decreaseQuantity(serviceDto.quantity()); - return DecreaseProductQuantityResponseDto.success(product, serviceDto.quantity()); - } catch (IllegalArgumentException | IllegalStateException e) { - // 재고 감소 실패 (재고 부족, 최소 수량 미만 등) - return DecreaseProductQuantityResponseDto.failure(product); - } - } - - - /** - * 상품 수정(재고 증가) - */ - @Override - public IncreaseProductQuantityResponseDto increaseProductQuantity(IncreaseProductQuantityServiceRequestDto serviceDto) { - Product product = productRepository.findByIdAndHubId(serviceDto.productId(), serviceDto.hubId()) - .orElseThrow(() -> new ResourceNotFoundException("해당 허브에 상품이 존재하지 않습니다.")); - - product.increaseQuantity(serviceDto.quantity()); - - return IncreaseProductQuantityResponseDto.success(product, serviceDto.quantity()); - - } - - // 업체 존재 검증 메서드 private void validateCompanyExists(UUID companyId) { if (!companyClient.existsById(companyId)) { diff --git a/stock-service/src/main/java/com/sparta/stockservice/application/service/StockService.java b/stock-service/src/main/java/com/sparta/stockservice/application/service/StockService.java new file mode 100644 index 0000000..b9d6edd --- /dev/null +++ b/stock-service/src/main/java/com/sparta/stockservice/application/service/StockService.java @@ -0,0 +1,16 @@ +package com.sparta.stockservice.application.service; + + +import com.sparta.stockservice.application.dto.DecreaseStockServiceRequestDto; +import com.sparta.stockservice.application.dto.IncreaseStockServiceRequestDto; +import com.sparta.stockservice.presentation.dto.request.CreateStockRequestDto; +import com.sparta.stockservice.presentation.dto.response.CreateStockResponseDto; +import com.sparta.stockservice.presentation.dto.response.DecreaseStockResponseDto; +import com.sparta.stockservice.presentation.dto.response.IncreaseStockResponseDto; + +public interface StockService { + + DecreaseStockResponseDto decreaseStock(DecreaseStockServiceRequestDto serviceDto); + + IncreaseStockResponseDto increaseStock(IncreaseStockServiceRequestDto serviceDto); +} diff --git a/stock-service/src/main/java/com/sparta/stockservice/application/service/StockServiceImpl.java b/stock-service/src/main/java/com/sparta/stockservice/application/service/StockServiceImpl.java new file mode 100644 index 0000000..611c780 --- /dev/null +++ b/stock-service/src/main/java/com/sparta/stockservice/application/service/StockServiceImpl.java @@ -0,0 +1,56 @@ +package com.sparta.stockservice.application.service; + +import com.sparta.commonmodule.exception.ResourceNotFoundException; +import com.sparta.stockservice.application.dto.DecreaseStockServiceRequestDto; +import com.sparta.stockservice.application.dto.IncreaseStockServiceRequestDto; +import com.sparta.stockservice.domain.model.Stock; +import com.sparta.stockservice.domain.repository.StockRepository; +import com.sparta.stockservice.presentation.dto.request.CreateStockRequestDto; +import com.sparta.stockservice.presentation.dto.response.CreateStockResponseDto; +import com.sparta.stockservice.presentation.dto.response.DecreaseStockResponseDto; +import com.sparta.stockservice.presentation.dto.response.IncreaseStockResponseDto; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional +public class StockServiceImpl implements StockService { + + private final StockRepository stockRepository; + + + /** + * 재고 감소 + */ + @Override + public DecreaseStockResponseDto decreaseStock(DecreaseStockServiceRequestDto serviceDto) { + Stock stock = stockRepository.findByProductIdAndHubId(serviceDto.productId(), serviceDto.hubId()) + .orElseThrow(() -> new ResourceNotFoundException("해당 허브에 상품이 존재하지 않습니다.")); + + try { + // 재고 감소 성공 + stock.decreaseStock(serviceDto.quantity()); + return DecreaseStockResponseDto.success(serviceDto.productId(), serviceDto.quantity()); + } catch (IllegalArgumentException | IllegalStateException e) { + // 재고 감소 실패 (재고 부족, 최소 수량 미만 등) + return DecreaseStockResponseDto.failure(serviceDto.productId()); + } + } + + + /** + * 재고 증가 + */ + @Override + public IncreaseStockResponseDto increaseStock(IncreaseStockServiceRequestDto serviceDto) { + Stock stock = stockRepository.findByProductIdAndHubId(serviceDto.productId(), serviceDto.hubId()) + .orElseThrow(() -> new ResourceNotFoundException("해당 허브에 상품이 존재하지 않습니다.")); + + stock.increaseStock(serviceDto.quantity()); + + return IncreaseStockResponseDto.success(serviceDto.productId(), serviceDto.quantity()); + } + +} From 997813120a141ac020a5010c474a735b15556622 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 2 Apr 2025 01:43:39 +0900 Subject: [PATCH 376/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#240]?= =?UTF-8?q?=20:=20=EC=83=81=ED=92=88=20=EB=A6=AC=ED=8F=AC=EC=A7=80?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EC=9E=AC?= =?UTF-8?q?=EA=B3=A0=20=EB=A6=AC=ED=8F=AC=EC=A7=80=ED=86=A0=EB=A6=AC=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 --- .../product/domain/repository/ProductRepository.java | 2 -- .../domain/repository/StockRepository.java | 11 +++++++++++ .../infrastructure/repository/JpaStockRepository.java | 10 ++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 stock-service/src/main/java/com/sparta/stockservice/domain/repository/StockRepository.java create mode 100644 stock-service/src/main/java/com/sparta/stockservice/infrastructure/repository/JpaStockRepository.java diff --git a/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java b/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java index 7b0e96f..a00f561 100644 --- a/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java +++ b/product-service/src/main/java/com/sparta/product/domain/repository/ProductRepository.java @@ -16,8 +16,6 @@ public interface ProductRepository { Optional findById(UUID productId); - Optional findByIdAndHubId(UUID productId, UUID hubId); - List findAll(); Page searchProducts(SearchProductRequestDto requestDto, Pageable pageable); diff --git a/stock-service/src/main/java/com/sparta/stockservice/domain/repository/StockRepository.java b/stock-service/src/main/java/com/sparta/stockservice/domain/repository/StockRepository.java new file mode 100644 index 0000000..8a20ac2 --- /dev/null +++ b/stock-service/src/main/java/com/sparta/stockservice/domain/repository/StockRepository.java @@ -0,0 +1,11 @@ +package com.sparta.stockservice.domain.repository; + +import com.sparta.stockservice.domain.model.Stock; + +import java.util.Optional; +import java.util.UUID; + +public interface StockRepository { + + Optional findByProductIdAndHubId(UUID productId, UUID hubId); +} diff --git a/stock-service/src/main/java/com/sparta/stockservice/infrastructure/repository/JpaStockRepository.java b/stock-service/src/main/java/com/sparta/stockservice/infrastructure/repository/JpaStockRepository.java new file mode 100644 index 0000000..3a7eccf --- /dev/null +++ b/stock-service/src/main/java/com/sparta/stockservice/infrastructure/repository/JpaStockRepository.java @@ -0,0 +1,10 @@ +package com.sparta.stockservice.infrastructure.repository; + +import com.sparta.stockservice.domain.model.Stock; +import com.sparta.stockservice.domain.repository.StockRepository; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface JpaStockRepository extends StockRepository, JpaRepository { +} From cfb604b052f48a434673a0cf31b08f8264bde73f Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 2 Apr 2025 01:44:50 +0900 Subject: [PATCH 377/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#240]?= =?UTF-8?q?=20:=20=EC=9E=AC=EA=B3=A0=20=EC=83=9D=EC=84=B1=20api=20?= =?UTF-8?q?=EB=B0=8F=20dto=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/StockController.java | 10 ++++++++ .../dto/request/CreateStockRequestDto.java | 8 +++++++ .../dto/response/CreateStockResponseDto.java | 24 +++++++++++++++++++ 3 files changed, 42 insertions(+) create mode 100644 stock-service/src/main/java/com/sparta/stockservice/presentation/dto/request/CreateStockRequestDto.java create mode 100644 stock-service/src/main/java/com/sparta/stockservice/presentation/dto/response/CreateStockResponseDto.java diff --git a/stock-service/src/main/java/com/sparta/stockservice/presentation/StockController.java b/stock-service/src/main/java/com/sparta/stockservice/presentation/StockController.java index b36d28a..f65a3a9 100644 --- a/stock-service/src/main/java/com/sparta/stockservice/presentation/StockController.java +++ b/stock-service/src/main/java/com/sparta/stockservice/presentation/StockController.java @@ -22,6 +22,16 @@ public class StockController { private final StockService stockService; + /** + * 재고 생성 + */ + @PostMapping + public ResponseEntity createStock(@RequestBody CreateStockRequestDto requestDto, + @RequestHeader(value = "user_id", required = true) Long user_id){ + return ResponseEntity.ok(stockService.createStock(requestDto)); + } + + /** * 재고 감소 */ diff --git a/stock-service/src/main/java/com/sparta/stockservice/presentation/dto/request/CreateStockRequestDto.java b/stock-service/src/main/java/com/sparta/stockservice/presentation/dto/request/CreateStockRequestDto.java new file mode 100644 index 0000000..b2c76b1 --- /dev/null +++ b/stock-service/src/main/java/com/sparta/stockservice/presentation/dto/request/CreateStockRequestDto.java @@ -0,0 +1,8 @@ +package com.sparta.stockservice.presentation.dto.request; + +import java.util.UUID; + +public record CreateStockRequestDto(UUID productId, + UUID hubId, + Integer quantity) { +} diff --git a/stock-service/src/main/java/com/sparta/stockservice/presentation/dto/response/CreateStockResponseDto.java b/stock-service/src/main/java/com/sparta/stockservice/presentation/dto/response/CreateStockResponseDto.java new file mode 100644 index 0000000..5c35434 --- /dev/null +++ b/stock-service/src/main/java/com/sparta/stockservice/presentation/dto/response/CreateStockResponseDto.java @@ -0,0 +1,24 @@ +package com.sparta.stockservice.presentation.dto.response; + + +import com.sparta.stockservice.domain.model.Stock; +import lombok.Builder; + +import java.util.UUID; + +@Builder +public record CreateStockResponseDto(UUID id, + UUID productId, + UUID hubId, + Integer quantity) { + + // Entity -> DTO 변환 메서드 + public static CreateStockResponseDto from(Stock stock) { + return CreateStockResponseDto.builder() + .id(stock.getId()) + .productId(stock.getProductId()) + .hubId(stock.getHubId()) + .quantity(stock.getQuantity()) + .build(); + } +} From 91db5a38d031952ef5863f323862bcadf25e6019 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 2 Apr 2025 01:45:45 +0900 Subject: [PATCH 378/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#240]?= =?UTF-8?q?=20:=20=EC=9E=AC=EA=B3=A0=20=EC=83=9D=EC=84=B1=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/StockService.java | 2 ++ .../application/service/StockServiceImpl.java | 11 +++++++++++ .../com/sparta/stockservice/domain/model/Stock.java | 12 ++++++++++++ .../domain/repository/StockRepository.java | 2 ++ 4 files changed, 27 insertions(+) diff --git a/stock-service/src/main/java/com/sparta/stockservice/application/service/StockService.java b/stock-service/src/main/java/com/sparta/stockservice/application/service/StockService.java index b9d6edd..19e87ad 100644 --- a/stock-service/src/main/java/com/sparta/stockservice/application/service/StockService.java +++ b/stock-service/src/main/java/com/sparta/stockservice/application/service/StockService.java @@ -10,6 +10,8 @@ public interface StockService { + CreateStockResponseDto createStock(CreateStockRequestDto requestDto); + DecreaseStockResponseDto decreaseStock(DecreaseStockServiceRequestDto serviceDto); IncreaseStockResponseDto increaseStock(IncreaseStockServiceRequestDto serviceDto); diff --git a/stock-service/src/main/java/com/sparta/stockservice/application/service/StockServiceImpl.java b/stock-service/src/main/java/com/sparta/stockservice/application/service/StockServiceImpl.java index 611c780..c01abfa 100644 --- a/stock-service/src/main/java/com/sparta/stockservice/application/service/StockServiceImpl.java +++ b/stock-service/src/main/java/com/sparta/stockservice/application/service/StockServiceImpl.java @@ -21,6 +21,17 @@ public class StockServiceImpl implements StockService { private final StockRepository stockRepository; + /** + * 재고 생성 + */ + @Override + public CreateStockResponseDto createStock(CreateStockRequestDto requestDto) { + Stock stock = stockRepository.save(Stock.createStock(requestDto.productId(), requestDto.hubId(), requestDto.quantity())); + return CreateStockResponseDto.from(stock); + } + + + /** * 재고 감소 */ diff --git a/stock-service/src/main/java/com/sparta/stockservice/domain/model/Stock.java b/stock-service/src/main/java/com/sparta/stockservice/domain/model/Stock.java index 3c878f1..66d23ce 100644 --- a/stock-service/src/main/java/com/sparta/stockservice/domain/model/Stock.java +++ b/stock-service/src/main/java/com/sparta/stockservice/domain/model/Stock.java @@ -34,6 +34,18 @@ public class Stock extends BaseEntity { private Integer quantity; + /** + * 재고 생성 + */ + public static Stock createStock(UUID productId, UUID hubId, Integer quantity) { + return Stock.builder() + .productId(productId) + .hubId(hubId) + .quantity(quantity) + .build(); + } + + /** * 재고 감소 */ diff --git a/stock-service/src/main/java/com/sparta/stockservice/domain/repository/StockRepository.java b/stock-service/src/main/java/com/sparta/stockservice/domain/repository/StockRepository.java index 8a20ac2..a3ac60c 100644 --- a/stock-service/src/main/java/com/sparta/stockservice/domain/repository/StockRepository.java +++ b/stock-service/src/main/java/com/sparta/stockservice/domain/repository/StockRepository.java @@ -7,5 +7,7 @@ public interface StockRepository { + Stock save(Stock stock); + Optional findByProductIdAndHubId(UUID productId, UUID hubId); } From b06bb59e757da31392156dda82a9a50fcde74206 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 2 Apr 2025 01:46:11 +0900 Subject: [PATCH 379/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#240]?= =?UTF-8?q?=20:=20=EC=9E=AC=EA=B3=A0=20=EC=83=9D=EC=84=B1=20http=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api-http/stock/stock.http | 47 +++++++++++++++++++++++++++++++++++++++ init.sql | 2 +- 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 api-http/stock/stock.http diff --git a/api-http/stock/stock.http b/api-http/stock/stock.http new file mode 100644 index 0000000..7d08bed --- /dev/null +++ b/api-http/stock/stock.http @@ -0,0 +1,47 @@ +### 유저 로그인 +POST http://localhost:8080/api/v1/users/sign-in +Content-Type: application/json + +{ + "username": "asdf123", + "password": "asdfgA12@" +} +> {% + client.global.set("access_token", response.headers.valueOf("Authorization")) +%} + + +### 재고 생성 +POST http://localhost:8080/api/v1/stocks +Content-Type: application/json +Authorization: {{access_token}} + +{ + "productId": "ddf9aa8c-1e24-4a08-b1c3-5dfe14ec46a8", + "hubId": "123e4567-e89b-12d3-a456-426614174000", + "quantity": 50 +} + + + +### 재고 감소 +PUT http://localhost:8080/api/v1/stocks/ddf9aa8c-1e24-4a08-b1c3-5dfe14ec46a8/decrease +Content-Type: application/json +Authorization: {{access_token}} + +{ + "hubId": "123e4567-e89b-12d3-a456-426614174000", + "quantity": 20 +} + + + +### 재고 증가 +PUT http://localhost:8080/api/v1/stocks/ddf9aa8c-1e24-4a08-b1c3-5dfe14ec46a8/increase +Content-Type: application/json +Authorization: {{access_token}} + +{ + "hubId": "123e4567-e89b-12d3-a456-426614174000", + "quantity": 50 +} \ No newline at end of file diff --git a/init.sql b/init.sql index 67b618d..0fc73bb 100644 --- a/init.sql +++ b/init.sql @@ -6,4 +6,4 @@ CREATE SCHEMA IF NOT EXISTS product_service; CREATE SCHEMA IF NOT EXISTS company_service; CREATE SCHEMA IF NOT EXISTS shipping_service; CREATE SCHEMA IF NOT EXISTS slack_service; - +CREATE SCHEMA IF NOT EXISTS stock_service; From e9e78e1215894ddf812a4f4bed03dbc46d4421e5 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Wed, 2 Apr 2025 15:18:32 +0900 Subject: [PATCH 380/389] =?UTF-8?q?=E2=9C=A8=20feat[#203]=20AI=20=EC=97=B0?= =?UTF-8?q?=EB=8F=99=20-=20ai=20=EC=97=B0=EB=8F=99=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20=ED=99=98=EA=B2=BD=EB=B3=80=EC=88=98=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ slack-service/build.gradle | 4 ++++ slack-service/src/main/resources/application.yml | 6 +++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1b2f2b1..8a77821 100644 --- a/.gitignore +++ b/.gitignore @@ -85,3 +85,5 @@ application-secret.yml *.pem *.crt *.pfx +.env + diff --git a/slack-service/build.gradle b/slack-service/build.gradle index 772df2f..26a936d 100644 --- a/slack-service/build.gradle +++ b/slack-service/build.gradle @@ -1,6 +1,8 @@ ext { set('springCloudVersion', "2024.0.0") + set('springAiVersion', "1.0.0-M6") + } dependencies { @@ -20,10 +22,12 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' + implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter' } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" + mavenBom "org.springframework.ai:spring-ai-bom:${springAiVersion}" } } \ No newline at end of file diff --git a/slack-service/src/main/resources/application.yml b/slack-service/src/main/resources/application.yml index e703439..5808340 100644 --- a/slack-service/src/main/resources/application.yml +++ b/slack-service/src/main/resources/application.yml @@ -17,6 +17,9 @@ spring: h2: console: enabled: false # H2 콘솔 비활성화 (PostgreSQL 사용 시) + ai: + openai: + api-key: ${OPEN_AI_KEY} server: port: 8087 @@ -37,4 +40,5 @@ springdoc: path: /swagger-ui.html slack: webhook: - url: https://hooks.slack.com/services/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 \ No newline at end of file + url: ${SLACK_URL} + \ No newline at end of file From bdd8461b1defad66499b176f9093b83d6f08cee7 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 2 Apr 2025 20:51:21 +0900 Subject: [PATCH 381/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#242]?= =?UTF-8?q?=20:=20ProductService=EC=9D=98=20=EA=B5=AC=EC=B2=B4=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=97=90=20=EC=9D=98=EC=A1=B4=ED=95=98?= =?UTF-8?q?=EB=8D=98=20=EB=B6=80=EB=B6=84=EC=9D=84=20=EC=9D=B8=ED=84=B0?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=EC=97=90=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/presentation/ProductController.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java index 96bf356..c2b19c0 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java +++ b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java @@ -3,7 +3,7 @@ import com.sparta.commonmodule.aop.RoleCheck; import com.sparta.product.application.dto.DeleteProductServiceRequestDto; import com.sparta.product.application.dto.UpdateProductServiceRequestDto; -import com.sparta.product.application.service.ProductServiceImpl; +import com.sparta.product.application.service.ProductService; import com.sparta.product.presentation.dto.request.*; import com.sparta.product.presentation.dto.response.*; import io.swagger.v3.oas.annotations.Operation; @@ -23,7 +23,7 @@ @Tag(name = "Product Service", description = "상품 서비스 API") public class ProductController { - private final ProductServiceImpl productServiceImpl; + private final ProductService productService; /** * 상품 생성 @@ -33,7 +33,7 @@ public class ProductController { @PostMapping public ResponseEntity createProduct(@RequestBody CreateProductRequestDto requestDto, @RequestHeader(value = "user_id", required = true) Long userId) { - return ResponseEntity.ok(productServiceImpl.createProduct(requestDto, userId)); + return ResponseEntity.ok(productService.createProduct(requestDto, userId)); } @@ -44,7 +44,7 @@ public ResponseEntity createProduct(@RequestBody Creat @RoleCheck("ROLE_MASTER, ROLE_HUB, ROLE_COMPANY, ROLE_SHIPPING") @GetMapping("/{productId}") public ResponseEntity readProduct(@PathVariable UUID productId) { - return ResponseEntity.ok(productServiceImpl.readProduct(productId)); + return ResponseEntity.ok(productService.readProduct(productId)); } @@ -54,7 +54,7 @@ public ResponseEntity readProduct(@PathVariable UUID pro @RoleCheck("ROLE_MASTER, ROLE_HUB, ROLE_COMPANY, ROLE_SHIPPING") @GetMapping public ResponseEntity> readAllProduct() { - return ResponseEntity.ok(productServiceImpl.readAllProduct()); + return ResponseEntity.ok(productService.readAllProduct()); } @@ -65,7 +65,7 @@ public ResponseEntity> readAllProduct() { @PutMapping("/{productId}") public ResponseEntity updateProduct(@PathVariable UUID productId, @RequestBody UpdateProductRequestDto requestDto) { - return ResponseEntity.ok(productServiceImpl.updateProduct( + return ResponseEntity.ok(productService.updateProduct( UpdateProductServiceRequestDto.of(requestDto, productId))); } @@ -77,7 +77,7 @@ public ResponseEntity updateProduct(@PathVariable UUID @DeleteMapping("/{productId}") public ResponseEntity deleteProduct(@PathVariable UUID productId, @RequestHeader(value = "user_id", required = true) Long userId) { - productServiceImpl.deleteProduct( + productService.deleteProduct( DeleteProductServiceRequestDto.of(userId, productId)); return ResponseEntity.noContent().build(); } @@ -90,7 +90,7 @@ public ResponseEntity deleteProduct(@PathVariable UUID productId, @GetMapping("/search") public ResponseEntity> searchProducts(@ModelAttribute SearchProductRequestDto requestDto, Pageable pageable) { - return ResponseEntity.ok(productServiceImpl.searchProducts(requestDto, pageable)); + return ResponseEntity.ok(productService.searchProducts(requestDto, pageable)); } From 24f9d5f37bed74255e41b425eb67e28537adcd25 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 2 Apr 2025 21:14:12 +0900 Subject: [PATCH 382/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#242]?= =?UTF-8?q?=20:=20=EC=83=81=ED=92=88=20=EC=83=9D=EC=84=B1=20api=20?= =?UTF-8?q?=EB=B0=8F=20Dto=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sparta/product/presentation/ProductController.java | 2 +- .../presentation/dto/request/CreateProductRequestDto.java | 4 +--- .../presentation/dto/response/CreateProductResponseDto.java | 6 +----- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java index c2b19c0..cf13fa5 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/ProductController.java +++ b/product-service/src/main/java/com/sparta/product/presentation/ProductController.java @@ -33,7 +33,7 @@ public class ProductController { @PostMapping public ResponseEntity createProduct(@RequestBody CreateProductRequestDto requestDto, @RequestHeader(value = "user_id", required = true) Long userId) { - return ResponseEntity.ok(productService.createProduct(requestDto, userId)); + return ResponseEntity.ok(productService.createProduct(requestDto)); } diff --git a/product-service/src/main/java/com/sparta/product/presentation/dto/request/CreateProductRequestDto.java b/product-service/src/main/java/com/sparta/product/presentation/dto/request/CreateProductRequestDto.java index 0ef7c6c..89d8b1c 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/dto/request/CreateProductRequestDto.java +++ b/product-service/src/main/java/com/sparta/product/presentation/dto/request/CreateProductRequestDto.java @@ -7,9 +7,7 @@ public record CreateProductRequestDto(String name, String description, BigDecimal price, - Integer quantity, boolean isDisplay, - UUID companyId, - UUID hubId) { + UUID companyId) { } diff --git a/product-service/src/main/java/com/sparta/product/presentation/dto/response/CreateProductResponseDto.java b/product-service/src/main/java/com/sparta/product/presentation/dto/response/CreateProductResponseDto.java index f1e0500..db56eaf 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/dto/response/CreateProductResponseDto.java +++ b/product-service/src/main/java/com/sparta/product/presentation/dto/response/CreateProductResponseDto.java @@ -12,10 +12,8 @@ public record CreateProductResponseDto(UUID id, String name, String description, BigDecimal price, - Integer quantity, boolean isDisplay, - UUID companyId, - UUID hubId) { + UUID companyId) { // Entity -> DTO 변환 메서드 public static CreateProductResponseDto from(Product product) { @@ -24,10 +22,8 @@ public static CreateProductResponseDto from(Product product) { .name(product.getName()) .description(product.getDescription()) .price(product.getPrice()) - .quantity(product.getQuantity()) .isDisplay(product.isDisplay()) .companyId(product.getCompanyId()) - .hubId(product.getHubId()) .build(); } } From 352072d3be0e15ea285bf79de77bf71cb5d5fb94 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 2 Apr 2025 21:18:09 +0900 Subject: [PATCH 383/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#242]?= =?UTF-8?q?=20:=20=EC=83=81=ED=92=88=20=EC=83=9D=EC=84=B1=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - createProduct 메서드에서 userId 파라미터 제거 - Product 엔티티가 DTO에 의존하지 않도록 수정 - 도메인 계층이 프레젠테이션 계층에 의존하지 않도록 DDD 원칙 준수 --- .../application/service/ProductService.java | 2 +- .../service/ProductServiceImpl.java | 22 +++++++++---------- .../sparta/product/domain/model/Product.java | 13 +++++------ 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductService.java b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java index 9bef65c..4688d0a 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductService.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductService.java @@ -14,7 +14,7 @@ public interface ProductService { - CreateProductResponseDto createProduct(CreateProductRequestDto requestDto, Long userId); + CreateProductResponseDto createProduct(CreateProductRequestDto requestDto); ReadProductResponseDto readProduct(UUID productId); diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java index 8d449e3..ad3dc05 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java @@ -6,7 +6,6 @@ import com.sparta.product.domain.model.Product; import com.sparta.product.domain.repository.ProductRepository; import com.sparta.product.infrastructure.client.CompanyClient; -import com.sparta.product.infrastructure.client.HubClient; import com.sparta.product.presentation.dto.request.CreateProductRequestDto; import com.sparta.product.presentation.dto.request.SearchProductRequestDto; import com.sparta.product.presentation.dto.response.*; @@ -17,7 +16,6 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Optional; import java.util.UUID; @Service @@ -26,7 +24,6 @@ public class ProductServiceImpl implements ProductService { private final ProductRepository productRepository; - private final HubClient hubClient; private final CompanyClient companyClient; @@ -34,10 +31,17 @@ public class ProductServiceImpl implements ProductService { * 상품 생성 */ @Override - public CreateProductResponseDto createProduct(CreateProductRequestDto requestDto, Long userId) { + public CreateProductResponseDto createProduct(CreateProductRequestDto requestDto) { validateCompanyExists(requestDto.companyId()); - validateHubExists(requestDto.hubId()); - Product product = productRepository.save(Product.createProduct(requestDto, userId)); + Product product = productRepository + .save(Product.createProduct( + requestDto.name(), + requestDto.description(), + requestDto.price(), + requestDto.isDisplay(), + requestDto.companyId() + )); + return CreateProductResponseDto.from(product); } @@ -108,10 +112,4 @@ private void validateCompanyExists(UUID companyId) { } - // 허브 존재 검증 메서드 - private void validateHubExists(UUID hubId) { - Optional.ofNullable(hubClient.getHubById(hubId)) - .orElseThrow(() -> new ResourceNotFoundException("해당 허브가 존재하지 않습니다.")); - } - } diff --git a/product-service/src/main/java/com/sparta/product/domain/model/Product.java b/product-service/src/main/java/com/sparta/product/domain/model/Product.java index 920a839..e01600f 100644 --- a/product-service/src/main/java/com/sparta/product/domain/model/Product.java +++ b/product-service/src/main/java/com/sparta/product/domain/model/Product.java @@ -3,7 +3,6 @@ import com.sparta.commonmodule.entity.BaseEntity; import com.sparta.product.application.dto.UpdateProductServiceRequestDto; -import com.sparta.product.presentation.dto.request.CreateProductRequestDto; import com.sparta.product.presentation.dto.response.CreateProductResponseDto; import jakarta.persistence.*; import lombok.*; @@ -46,13 +45,13 @@ public class Product extends BaseEntity { /** * 상품 생성 */ - public static Product createProduct(CreateProductRequestDto requestDto, Long userId) { + public static Product createProduct(String name, String description, BigDecimal price, boolean isDisplay,UUID companyId) { return Product.builder() - .name(requestDto.name()) - .description(requestDto.description()) - .price(requestDto.price()) - .isDisplay(requestDto.isDisplay()) - .companyId(requestDto.companyId()) + .name(name) + .description(description) + .price(price) + .isDisplay(isDisplay) + .companyId(companyId) .build(); } From 3da8200d5782e788939a048c09463bc43320c8db Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 2 Apr 2025 21:19:31 +0900 Subject: [PATCH 384/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#242]?= =?UTF-8?q?=20:=20=EC=83=81=ED=92=88=20=EC=83=9D=EC=84=B1=20http=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- product-service/src/test/http/product.http | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/product-service/src/test/http/product.http b/product-service/src/test/http/product.http index 8df9451..6d21df9 100644 --- a/product-service/src/test/http/product.http +++ b/product-service/src/test/http/product.http @@ -20,10 +20,8 @@ Authorization: {{access_token}} "name": "마른오징어3", "description": "마른오징어 입니다3.", "price": 1000, - "quantity": 50, "isDisplay": true, - "companyId": "550e8400-e29b-41d4-a716-446655440000", - "hubId": "123e4567-e89b-12d3-a456-426614174000" + "companyId": "b8166e5f-b844-441c-ae46-75130d4b9fb0" } From 0e9925477f9bdf8adb7591052e7347c431c173f7 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 2 Apr 2025 21:19:59 +0900 Subject: [PATCH 385/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#242]?= =?UTF-8?q?=20:=20=EC=83=81=ED=92=88=20=EA=B2=80=EC=83=89=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=B0=8F=20dto=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/impl/ProductQueryDSLRepositoryImpl.java | 10 ++-------- .../dto/response/ReadProductResponseDto.java | 6 +----- .../dto/response/SearchProductResponseDto.java | 6 +----- 3 files changed, 4 insertions(+), 18 deletions(-) diff --git a/product-service/src/main/java/com/sparta/product/infrastructure/repository/impl/ProductQueryDSLRepositoryImpl.java b/product-service/src/main/java/com/sparta/product/infrastructure/repository/impl/ProductQueryDSLRepositoryImpl.java index 4797f93..906b92e 100644 --- a/product-service/src/main/java/com/sparta/product/infrastructure/repository/impl/ProductQueryDSLRepositoryImpl.java +++ b/product-service/src/main/java/com/sparta/product/infrastructure/repository/impl/ProductQueryDSLRepositoryImpl.java @@ -43,8 +43,7 @@ public Page searchProducts(SearchProductRequestDto req .where( nameContains(requestDto.name()), descriptionContains(requestDto.description()), - companyIdEq(requestDto.companyId()), - hubIdEq(requestDto.hubId()) + companyIdEq(requestDto.companyId()) ) .orderBy(orderSpecifierList.toArray(new OrderSpecifier[0])) // 동적 정렬 .offset(pageable.getOffset()) // 페이징 - 시작 인덱스 @@ -60,8 +59,7 @@ public Page searchProducts(SearchProductRequestDto req .where( nameContains(requestDto.name()), descriptionContains(requestDto.description()), - companyIdEq(requestDto.companyId()), - hubIdEq(requestDto.hubId()) + companyIdEq(requestDto.companyId()) ) .fetchOne(); @@ -94,10 +92,6 @@ private BooleanExpression companyIdEq(UUID companyId) { } - private BooleanExpression hubIdEq(UUID hubId) { - return hubId != null ? product.hubId.eq(hubId) : null; - } - /** * 동적 정렬 조건 생성 메서드 diff --git a/product-service/src/main/java/com/sparta/product/presentation/dto/response/ReadProductResponseDto.java b/product-service/src/main/java/com/sparta/product/presentation/dto/response/ReadProductResponseDto.java index 703ae99..52c27f6 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/dto/response/ReadProductResponseDto.java +++ b/product-service/src/main/java/com/sparta/product/presentation/dto/response/ReadProductResponseDto.java @@ -12,10 +12,8 @@ public record ReadProductResponseDto(UUID id, String name, String description, BigDecimal price, - Integer quantity, boolean isDisplay, - UUID companyId, - UUID hubId) { + UUID companyId) { // Entity -> DTO 변환 메서드 public static ReadProductResponseDto from(Product product) { @@ -24,10 +22,8 @@ public static ReadProductResponseDto from(Product product) { .name(product.getName()) .description(product.getDescription()) .price(product.getPrice()) - .quantity(product.getQuantity()) .isDisplay(product.isDisplay()) .companyId(product.getCompanyId()) - .hubId(product.getHubId()) .build(); } } diff --git a/product-service/src/main/java/com/sparta/product/presentation/dto/response/SearchProductResponseDto.java b/product-service/src/main/java/com/sparta/product/presentation/dto/response/SearchProductResponseDto.java index da39067..ec77df2 100644 --- a/product-service/src/main/java/com/sparta/product/presentation/dto/response/SearchProductResponseDto.java +++ b/product-service/src/main/java/com/sparta/product/presentation/dto/response/SearchProductResponseDto.java @@ -11,10 +11,8 @@ public record SearchProductResponseDto(UUID id, String name, String description, BigDecimal price, - Integer quantity, Boolean isDisplay, - UUID companyId, - UUID hubId) { + UUID companyId) { // Entity -> DTO 변환 메서드 public static SearchProductResponseDto from(Product product) { return SearchProductResponseDto.builder() @@ -22,10 +20,8 @@ public static SearchProductResponseDto from(Product product) { .name(product.getName()) .description(product.getDescription()) .price(product.getPrice()) - .quantity(product.getQuantity()) .isDisplay(product.isDisplay()) .companyId(product.getCompanyId()) - .hubId(product.getHubId()) .build(); } } From 3216e86c7998780d984368ed578a2cb93a6ccee7 Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 2 Apr 2025 21:31:11 +0900 Subject: [PATCH 386/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#242]?= =?UTF-8?q?=20:=20=EC=83=81=ED=92=88=20=EC=88=98=EC=A0=95=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Product 엔티티가 DTO에 의존하지 않도록 수정 - 도메인 계층이 프레젠테이션 계층에 의존하지 않도록 DDD 원칙 준수 --- .../application/service/ProductServiceImpl.java | 8 +++++++- .../java/com/sparta/product/domain/model/Product.java | 11 +++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java index ad3dc05..f5158d6 100644 --- a/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java +++ b/product-service/src/main/java/com/sparta/product/application/service/ProductServiceImpl.java @@ -78,7 +78,13 @@ public List readAllProduct() { public UpdateProductResponseDto updateProduct(UpdateProductServiceRequestDto serviceDto) { Product product = productRepository.findById(serviceDto.id()) .orElseThrow(() -> new ResourceNotFoundException("찾을 수 없는 상품 입니다.")); - product.updateProduct(serviceDto); + product.updateProduct( + serviceDto.name(), + serviceDto.description(), + serviceDto.price(), + serviceDto.isDisplay() + ); + return UpdateProductResponseDto.from(product); } diff --git a/product-service/src/main/java/com/sparta/product/domain/model/Product.java b/product-service/src/main/java/com/sparta/product/domain/model/Product.java index e01600f..b2eb036 100644 --- a/product-service/src/main/java/com/sparta/product/domain/model/Product.java +++ b/product-service/src/main/java/com/sparta/product/domain/model/Product.java @@ -2,7 +2,6 @@ import com.sparta.commonmodule.entity.BaseEntity; -import com.sparta.product.application.dto.UpdateProductServiceRequestDto; import com.sparta.product.presentation.dto.response.CreateProductResponseDto; import jakarta.persistence.*; import lombok.*; @@ -59,11 +58,11 @@ public static Product createProduct(String name, String description, BigDecimal /** * 상품 수정 */ - public Product updateProduct(UpdateProductServiceRequestDto serviceDto) { - this.name = serviceDto.name(); - this.description = serviceDto.description(); - this.price = serviceDto.price(); - this.isDisplay = serviceDto.isDisplay(); + public Product updateProduct(String name, String description, BigDecimal price, boolean isDisplay) { + this.name = name; + this.description = description; + this.price = price; + this.isDisplay = isDisplay; return this; } From 58b221f7e264e8555c121363660a17109909db8c Mon Sep 17 00:00:00 2001 From: jin2304 Date: Wed, 2 Apr 2025 21:34:16 +0900 Subject: [PATCH 387/389] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20[#242]?= =?UTF-8?q?=20:=20=EC=82=AC=EC=9A=A9=EB=90=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8A=94=20Product.of()=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Product.of(CreateProductResponseDto) 메서드 제거 - ResponseDto → Entity 변환은 일반적인 흐름에 적합하지 않아 제거 - 필요 시 명확한 목적과 사용처를 기반으로 재도입 예정 --- .../com/sparta/product/domain/model/Product.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/product-service/src/main/java/com/sparta/product/domain/model/Product.java b/product-service/src/main/java/com/sparta/product/domain/model/Product.java index b2eb036..71e274a 100644 --- a/product-service/src/main/java/com/sparta/product/domain/model/Product.java +++ b/product-service/src/main/java/com/sparta/product/domain/model/Product.java @@ -2,7 +2,6 @@ import com.sparta.commonmodule.entity.BaseEntity; -import com.sparta.product.presentation.dto.response.CreateProductResponseDto; import jakarta.persistence.*; import lombok.*; import org.hibernate.annotations.SQLRestriction; @@ -67,15 +66,4 @@ public Product updateProduct(String name, String description, BigDecimal price, } - - // DTO -> Entity 변환 메서드 - public static Product of(CreateProductResponseDto responseDto) { - return Product.builder() - .name(responseDto.name()) - .description(responseDto.description()) - .price(responseDto.price()) - .isDisplay(responseDto.isDisplay()) - .companyId(responseDto.companyId()) - .build(); - } } \ No newline at end of file From 270b879c55210aa2a087f273b6a2206daf0df5f8 Mon Sep 17 00:00:00 2001 From: devdaeun Date: Thu, 3 Apr 2025 01:23:43 +0900 Subject: [PATCH 388/389] =?UTF-8?q?=E2=9C=A8=20feat[#203]=20AI=20=EC=97=B0?= =?UTF-8?q?=EB=8F=99=20-=20=EC=8B=9C=EC=8A=A4=ED=85=9C=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=9E=91=EB=8F=99=ED=99=95=EC=9D=B8=20=EB=B0=8F=20?= =?UTF-8?q?=EC=9D=BC=EB=B6=80=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95=20-?= =?UTF-8?q?=20=EB=B0=B0=EC=86=A1->=20=EC=A3=BC=EB=AC=B8=20feignclient=20?= =?UTF-8?q?=EC=A0=84=EB=8B=AC=EB=A1=9C=EC=A7=81=EC=9D=B4=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=EC=95=88=EB=90=9C=EA=B2=83=EC=9D=84=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api-http/shipping/shipping-service.http | 2 +- .../controller/CompanyController.java | 2 +- company-service/src/test/http/company.http | 19 +++++++++++++++---- .../application/service/OrderService.java | 2 +- .../presentation/ShippingController.java | 5 ++--- .../src/main/resources/application.yaml | 8 +++++--- .../application/service/SlackService.java | 1 + 7 files changed, 26 insertions(+), 13 deletions(-) diff --git a/api-http/shipping/shipping-service.http b/api-http/shipping/shipping-service.http index 19f1bb3..59be16b 100644 --- a/api-http/shipping/shipping-service.http +++ b/api-http/shipping/shipping-service.http @@ -31,7 +31,7 @@ Authorization: {{access_token}} ### POST http://localhost:8080/api/v1/shippings Content-Type: application/json -Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMSIsInJvbGUiOiJST0xFX01BU1RFUiIsInNsYWNrX25hbWUiOiJhc2RnZ2ciLCJpc3MiOiJ1c2VyLXNlcnZpY2UiLCJpYXQiOjE3NDI4Mzg5NDQsImV4cCI6MTc0Mjg0MjU0NH0.UueDPgZXhB0w1L_XhcE9fwC1BAdjiHe590Rh5HlSIxppfTTSZczHTgzUyLp6iZNR9_0iCqDfRJNPtE4qzdqV8A +Authorization: {{access_token}} { "orderId": "550e8400-e29b-41d4-a716-446655440000", diff --git a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java index 458c8ea..f858fd0 100644 --- a/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java +++ b/company-service/src/main/java/com/sparta/companyservice/presentation/controller/CompanyController.java @@ -37,7 +37,7 @@ public boolean existsById(@PathVariable("id") UUID id) { // 생성 @Operation(summary = "Company 등록", description = "Company 생성 api 입니다.") - @RoleCheck("ROLE_MASTER, ROLE_HUB") + @RoleCheck("ROLE_COMPANY") @PostMapping public ResponseEntity createCompany(@Valid @RequestBody CompanyCreateRequest request, @RequestHeader("user_id") Long userId) { CompanyDto createdCompany = companyService.createCompany(request.toDto(), userId); diff --git a/company-service/src/test/http/company.http b/company-service/src/test/http/company.http index d0c0828..8b7ff01 100644 --- a/company-service/src/test/http/company.http +++ b/company-service/src/test/http/company.http @@ -4,16 +4,27 @@ Content-Type: application/json ### +POST http://localhost:8080/api/v1/users/sign-in +Content-Type: application/json + +{ + "username":"company123", + "password":"Company123@" +} +> {% + client.global.set("access_token", response.headers.valueOf("Authorization")) +%} + + ### 업체 생성 -POST http://localhost:8085/api/v1/companies +POST http://localhost:8080/api/v1/companies Content-Type: application/json -user_id: 12345 -role: ROLE_MASTER +Authorization: {{access_token}} { "name": "원두 로스팅 업체", "type": "PRODUCER", - "hubId": "123e4567-e89b-12d3-a456-426614174000", + "hubId": "d25f4291-d134-4f73-885a-0eb188a72649", "address": "경기도 과천시" } diff --git a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java index 93622a2..add829d 100644 --- a/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java +++ b/order-service/src/main/java/com/sparta/orderservice/application/service/OrderService.java @@ -83,7 +83,7 @@ public OrderResponseDto createOrder(OrderRequestDto requestDto) { .build(); // 6. FeignClient로 배송 요청 - CreateShippingResponseDto shippingResponse = shippingClient.create(shippingRequest); + CreateShippingResponseDto shippingResponse = shippingClient.createShipping(shippingRequest); // 7. 배송 실패 시 예외 if (!"READY".equals(shippingResponse.getStatus())) { diff --git a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java index 25738b9..7183345 100644 --- a/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java +++ b/shipping-service/src/main/java/com/sparta/shippingservice/presentation/ShippingController.java @@ -28,8 +28,8 @@ public class ShippingController { @Operation(summary = "배송 등록",description = "배송 등록 API 입니다") @RoleCheck("ROLE_MASTER") - @PostMapping() // 배송 생성 - public ResponseEntity create (@Valid @RequestBody CreateShippingRequestDto request, @RequestHeader("userId")Long userId) { + @PostMapping // 배송 생성 + public ResponseEntity create (@Valid @RequestBody CreateShippingRequestDto request, @RequestHeader("user_id")Long userId) { ShippingWithRouteResponseDto responseDto = shippingService.create(request,userId); return ResponseEntity.ok(responseDto); @@ -99,5 +99,4 @@ public ResponseEntity> searchShippingRoutes( return ResponseEntity.ok(result); } - } diff --git a/shipping-service/src/main/resources/application.yaml b/shipping-service/src/main/resources/application.yaml index 0dab7ca..9e6a803 100644 --- a/shipping-service/src/main/resources/application.yaml +++ b/shipping-service/src/main/resources/application.yaml @@ -8,11 +8,13 @@ spring: driver-class-name: org.postgresql.Driver jpa: + properties: + hibernate: + default_schema: shipping_service + dialect: org.hibernate.dialect.PostgreSQLDialect hibernate: ddl-auto: update - show-sql: true # 실행되는 SQL 쿼리 출력 - database-platform: org.hibernate.dialect.PostgreSQLDialect - + show-sql: true server: port: 8088 diff --git a/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java b/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java index df694de..787056a 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java +++ b/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java @@ -24,6 +24,7 @@ public class SlackService { //슬랙 메세지 생성 public SlackResponseDto createSlack(String slack_name, SlackRequestDto requestDto, Long userId) { + Slack slack = slackRepository.save(requestDto.createSlack(slack_name, userId)); return new SlackResponseDto(slack); } From 490e2077bfa8d015f51897fb03a3c381434b5beb Mon Sep 17 00:00:00 2001 From: devdaeun Date: Sun, 13 Apr 2025 17:47:42 +0900 Subject: [PATCH 389/389] =?UTF-8?q?=E2=9C=A8=20feat[#203]=20Slack=20AI=20?= =?UTF-8?q?=EC=97=B0=EB=8F=99=20-=20SlackService=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=9D=BC=EB=B6=80=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sparta/slackservice/application/service/SlackService.java | 3 ++- .../slackservice/domain/repository/SlackRepository.java | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java b/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java index 787056a..55b6a93 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java +++ b/slack-service/src/main/java/com/sparta/slackservice/application/service/SlackService.java @@ -5,6 +5,7 @@ import com.sparta.slackservice.application.dto.SlackResponseDto; import com.sparta.slackservice.application.dto.SlackSearchRequestDto; import com.sparta.slackservice.domain.model.Slack; +import com.sparta.slackservice.domain.repository.SlackRepository; import com.sparta.slackservice.infastructure.JpaSlackRepository; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; @@ -19,7 +20,7 @@ @Transactional public class SlackService { - private final JpaSlackRepository slackRepository; + private final SlackRepository slackRepository; private final SlackWebhookService slackWebhookService; //슬랙 메세지 생성 diff --git a/slack-service/src/main/java/com/sparta/slackservice/domain/repository/SlackRepository.java b/slack-service/src/main/java/com/sparta/slackservice/domain/repository/SlackRepository.java index 0465faf..ade11d0 100644 --- a/slack-service/src/main/java/com/sparta/slackservice/domain/repository/SlackRepository.java +++ b/slack-service/src/main/java/com/sparta/slackservice/domain/repository/SlackRepository.java @@ -7,8 +7,12 @@ import org.springframework.data.domain.Pageable; import java.util.Optional; +import java.util.UUID; public interface SlackRepository { Page searchSlack(SlackSearchRequestDto requestDto, Pageable pageable); + Slack save(Slack slack); + + Optional findById(UUID slackId); }