diff --git a/README.md b/README.md new file mode 100644 index 0000000..a9774a4 --- /dev/null +++ b/README.md @@ -0,0 +1,92 @@ +![thumbnail (3)](https://user-images.githubusercontent.com/92681117/230777373-47f9c91c-7bea-4a1b-adc7-27bed9b14843.png) + +# ๐Ÿ›’์‡ผํ•‘๋ชฐ ํ”„๋กœ์ ํŠธ +## ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป์ฐธ์—ฌ +- ์œ ํ˜„์ฃผ + +## โš’๏ธ๊ธฐ์ˆ ์Šคํƒ +- **SpringBoot** + +## ๐Ÿ”งํ˜‘์—… ๋„๊ตฌ +- **Git** +- **GitHub** + +## ๐Ÿ—‚๏ธ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค +- **H2** + +## โž•์˜์กด์„ฑ +```java +dependencies { + implementation group: 'com.auth0', name: 'java-jwt', version: '4.3.0' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'junit:junit:4.13.1' + compileOnly 'org.projectlombok:lombok' + developmentOnly 'org.springframework.boot:spring-boot-devtools' + runtimeOnly 'com.h2database:h2' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + } +``` + +## ๐Ÿ—’๏ธ๊ตฌํ˜„ ์š”์ฒญ ์‚ฌํ•ญ +- ๊ณ ๊ฐ์€ ๋‹ค์ˆ˜์ด๋‹ค. +- ํŒ๋งค์ž๋Š” ํ•œ๋ช…์ด๋‹ค. +- ๊ณ ๊ฐ์€ ์—ฌ๋Ÿฌ๊ฑด์˜ ์ฃผ๋ฌธ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. +- ๊ณ ๊ฐ์€ ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ƒํ’ˆ์„ ์ฃผ๋ฌธํ•  ์ˆ˜ ์žˆ๋‹ค. +- ๊ณ ๊ฐ์€ ์ƒํ’ˆ ์ฃผ๋ฌธ์‹œ์— ๊ฐœ์ˆ˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. + +## ๐Ÿ’ก๊ตฌํ˜„๋œ ๊ธฐ๋Šฅ + +### ๐Ÿ™‹๐Ÿปโ€โ™€๏ธ์‚ฌ์šฉ์ž ๊ธฐ๋Šฅ + - ํšŒ์›๊ฐ€์ž… + - ๋กœ๊ทธ์ธ + +### ๐Ÿ‘œ์ƒํ’ˆ ๊ด€๋ จ ๊ธฐ๋Šฅ + - ํŒ๋งค์ž์˜ ์ƒํ’ˆ ๋“ฑ๋ก + - ๋“ฑ๋ก๋œ ์ƒํ’ˆ๋“ค ๋ชฉ๋ก ๋ณด๊ธฐ + - ์ƒํ’ˆ ์ƒ์„ธ๋ณด๊ธฐ + - ํŒ๋งค์ž์˜ ์ƒํ’ˆ ์ˆ˜์ • + - ํŒ๋งค์ž์˜ ์ƒํ’ˆ ์‚ญ์ œ + +### ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป์ฃผ๋ฌธ ๊ด€๋ จ ๊ธฐ๋Šฅ + - ์ƒํ’ˆ ์ฃผ๋ฌธ + - ๊ณ ๊ฐ ์ฃผ๋ฌธ ๋ชฉ๋ก ๋ณด๊ธฐ + - ํŒ๋งค์ž์˜ ์ „์ฒด ๊ณ ๊ฐ ์ฃผ๋ฌธ ๋ชฉ๋ก ๋ณด๊ธฐ + +**์ƒ์„ธํ•œ ์š”์ฒญ๊ณผ ์‘๋‹ต์€ [api๋ฌธ์„œ](https://github.com/yhj1129/Springboot-MetaMall-Project/blob/main/src/main/java/shop/mtcoding/metamall/api)๋ฅผ ํ™•์ธ** + +## ๐Ÿ”—ER-Diagram +image + + +## ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ”ง์ž‘์„ฑํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ +- ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ฟผ๋ฆฌ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ + + [๊ณ ๊ฐ ์ฟผ๋ฆฌ](https://github.com/yhj1129/Springboot-MetaMall-Project/blob/main/src/test/java/shop/mtcoding/metamall/model/user/UserRepositoryTest.java) + + [์ œํ’ˆ ์ฟผ๋ฆฌ](https://github.com/yhj1129/Springboot-MetaMall-Project/blob/main/src/test/java/shop/mtcoding/metamall/model/product/ProductRepositoryTest.java) + + [์ฃผ๋ฌธ์„œ ์ฟผ๋ฆฌ](https://github.com/yhj1129/Springboot-MetaMall-Project/blob/main/src/test/java/shop/mtcoding/metamall/model/ordersheet/OrderSheetRepositoryTest.java) + +- ์ปจํŠธ๋กค๋Ÿฌ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ + + [๊ณ ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ](https://github.com/yhj1129/Springboot-MetaMall-Project/blob/main/src/test/java/shop/mtcoding/metamall/controller/UserControllerTest.java) + + [์ƒํ’ˆ ์ปจํŠธ๋กค๋Ÿฌ](https://github.com/yhj1129/Springboot-MetaMall-Project/blob/main/src/test/java/shop/mtcoding/metamall/controller/ProductControllerTest.java) + + [์ฃผ๋ฌธ ์ปจํŠธ๋กค๋Ÿฌ](https://github.com/yhj1129/Springboot-MetaMall-Project/blob/main/src/test/java/shop/mtcoding/metamall/controller/OrderControllerTest.java) + +## ๐Ÿ”ง๋ณด์™„ํ•  ์  +- ์š”์ฒญ์— ๋Œ€ํ•ด Dto๋กœ ๋ฐ›์ง€ ๋ชปํ•œ ๊ฒƒ๋“ค์ด ๋ช‡ ๊ฐ€์ง€ ์žˆ์—ˆ๋‹ค. ์ƒˆ๋กœ Dto๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์š”์ฒญ์— ๋งž๋Š” Dto๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋ณ€๊ฒฝํ•  ์˜ˆ์ •์ด๋‹ค. +- ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ถ”๊ฐ€. ํ˜„์žฌ null, "" ์ฒดํฌ ์ •๋„๋งŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค. +- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์ข€ ๋” ๊ณต๋ถ€ํ•ด์„œ ์‘๋‹ต์ด ๋” ๊น”๋”ํ•˜๊ฒŒ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝํ•  ์˜ˆ์ •. ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋งŽ์€ ์ •๋ณด์˜ ์‘๋‹ต์ด ๋‚˜์˜จ๋‹ค๊ณ  ๋А๊ผˆ๋‹ค. +- ER-Diagram์„ ๋ณด์™„ํ•˜๊ธฐ +- AOP ์ ์šฉ ํ•„์š” +- JWT๋ฅผ ํ—ค๋”์—์„œ ๊ฐ€์ ธ์™€์„œ ์ธ์ฆํ•˜๋Š” ๋ถ€๋ถ„์ด ๊ณ„์†ํ•ด์„œ ๋ฐ˜๋ณต๋˜๋Š” ๊ฒƒ์„ ๋А๊ปด ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋งŒ๋“ค์—ˆ์ง€๋งŒ ๊ธฐ์กด ๋ฉ”์„œ๋“œ์™€ ์—ฐ๊ฒฐ์—์„œ ์–ด๋ ค์›€์ด ์žˆ์–ด์„œ ์ ์šฉ์„ ํ•˜์ง€๋Š” ๋ชปํ–ˆ๋‹ค. + +## ๐ŸŒŸ๋А๋‚€ ์  +- ํ˜ผ์ž ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—ฌ์„œ ํ˜‘์—…์— ํฐ ์–ด๋ ค์›€์ด ์—†์—ˆ์ง€๋งŒ, ๋‹ค๋ฅธ ํŒ€์›๋“ค๊ณผ ํ•จ๊ป˜ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฒ„์ „ ๊ด€๋ฆฌ์— ์‹ ๊ฒฝ์„ ๋งŽ์ด ์จ์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค. +- ๋ชจ๋ฅด๊ณ  ์žˆ๋˜(๋ฐฐ์› ์œผ๋‚˜ ๊นŒ๋จน์€..?) ๋ถ€๋ถ„๋„ ์Šค์Šค๋กœ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋‹ค์‹œ ๊ณต๋ถ€ํ•˜๋ฉฐ ๋นˆ ๋ถ€๋ถ„์ด ๋งŽ์ด ์ฑ„์›Œ์กŒ๋‹ค๊ณ  ๋А๊ผˆ๋‹ค. +- ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๋‚ด์šฉ์ด ๋‹ค ๋“ค์–ด์žˆ์–ด์„œ ๋ฟŒ๋“ฏํ–ˆ๋‹ค! diff --git a/build.gradle b/build.gradle index 4943187..31d3826 100644 --- a/build.gradle +++ b/build.gradle @@ -22,12 +22,14 @@ dependencies { implementation group: 'com.auth0', name: 'java-jwt', version: '4.3.0' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'junit:junit:4.13.1' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' -} + } tasks.named('test') { useJUnitPlatform() diff --git a/src/main/java/shop/mtcoding/metamall/MetamallApplication.java b/src/main/java/shop/mtcoding/metamall/MetamallApplication.java index 487bb62..03bd70b 100644 --- a/src/main/java/shop/mtcoding/metamall/MetamallApplication.java +++ b/src/main/java/shop/mtcoding/metamall/MetamallApplication.java @@ -4,24 +4,41 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; +import shop.mtcoding.metamall.model.log.err.ErrorLogRepository; +import shop.mtcoding.metamall.model.log.login.LoginLogRepository; import shop.mtcoding.metamall.model.orderproduct.OrderProduct; import shop.mtcoding.metamall.model.orderproduct.OrderProductRepository; import shop.mtcoding.metamall.model.ordersheet.OrderSheet; import shop.mtcoding.metamall.model.ordersheet.OrderSheetRepository; +import shop.mtcoding.metamall.model.product.Product; import shop.mtcoding.metamall.model.product.ProductRepository; +import shop.mtcoding.metamall.model.user.Role; import shop.mtcoding.metamall.model.user.User; import shop.mtcoding.metamall.model.user.UserRepository; +import java.time.LocalDateTime; + @SpringBootApplication public class MetamallApplication { @Bean - CommandLineRunner initData(UserRepository userRepository, ProductRepository productRepository, OrderProductRepository orderProductRepository, OrderSheetRepository orderSheetRepository){ + CommandLineRunner initData(UserRepository userRepository, ProductRepository productRepository, OrderProductRepository orderProductRepository, OrderSheetRepository orderSheetRepository, ErrorLogRepository errorLogRepository, LoginLogRepository loginLogRepository){ return (args)->{ // ์—ฌ๊ธฐ์—์„œ save ํ•˜๋ฉด ๋จ. // bulk Collector๋Š” saveAll ํ•˜๋ฉด ๋จ. - User ssar = User.builder().username("ssar").password("1234").email("ssar@nate.com").role("USER").build(); + User seller = User.builder().username("seller").password("1234").email("seller@nate.com").role(Role.SELLER).build(); + userRepository.save(seller); + + User ssar = User.builder().username("ssar").password("1234").email("ssar@nate.com").role(Role.USER).build(); userRepository.save(ssar); + OrderSheet orderSheet = OrderSheet.builder().user(ssar).totalPrice(0).build(); + orderSheetRepository.save(orderSheet); // ํ•œ ๊ณ ๊ฐ ๋‹น ์ฃผ๋ฌธ ์‹œํŠธ ์ƒ์„ฑ + + Product book = Product.builder().productname("book1").price(10000).qty(100).build(); + productRepository.save(book); + + Product book2 = Product.builder().productname("book2").price(15000).qty(100).build(); + productRepository.save(book2); }; } diff --git a/src/main/java/shop/mtcoding/metamall/api b/src/main/java/shop/mtcoding/metamall/api new file mode 100644 index 0000000..9a3521f --- /dev/null +++ b/src/main/java/shop/mtcoding/metamall/api @@ -0,0 +1,327 @@ +1. ํšŒ์›๊ฐ€์ž… (POST) + ์š”์ฒญ ์ฃผ์†Œ + - http://localhost:8080/join + ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ + - application/json + { + "username" : "jju", + "password" : "1234", + "email" : "yoo@a,a" + } + ์‘๋‹ต ๋ฐ”๋”” + - application/json + { + "status": 200, + "msg": "์„ฑ๊ณต", + "data": { + "id": 4, + "username": "jju", + "email": "yoo@a,a", + "role": "USER", + "createdAt": "2023-04-09T22:37:00.4652234", + "updatedAt": null + } + } + +2. ๋กœ๊ทธ์ธ (POST) + ์š”์ฒญ ์ฃผ์†Œ + - http://localhost:8080/login + ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ + - application/json + { + "username" : "jju", + "password" : "1234" + } + + ์‘๋‹ต ๋ฐ”๋”” + - application/json + { + "status": 200, + "msg": "์„ฑ๊ณต", + "data": { + "id": 3, + "username": "jju", + "email": "yoo@a,a", + "role": "USER", + "createdAt": "2023-04-09T22:38:19.389678", + "updatedAt": "2023-04-09T22:38:22.6968692" + } + } + +3. ์ƒํ’ˆ๋“ฑ๋ก (POST) + ์š”์ฒญ ์ฃผ์†Œ + - http://localhost:8080/upload + ์š”์ฒญ ํ—ค๋” + - Authorization : Bearer ~ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ + - + { + "productname" : "phone", + "price" : "500000", + "qty" : "100" + } + ์‘๋‹ต ๋ฐ”๋”” + - + { + "status": 200, + "msg": "์„ฑ๊ณต", + "data": { + "id": 3, + "productname": "phone", + "price": 500000, + "qty": 100, + "createdAt": "2023-04-09T22:40:20.4367407", + "updatedAt": null + } + } + +4. ์ƒํ’ˆ๋ชฉ๋ก๋ณด๊ธฐ (GET) + ์š”์ฒญ ์ฃผ์†Œ + - http://localhost:8080/findAll + ์š”์ฒญ ํ—ค๋” + - Authorization : Bearer ~ + ์‘๋‹ต ๋ฐ”๋”” + - + { + "status": 200, + "msg": "์„ฑ๊ณต", + "data": [ + { + "id": 1, + "productname": "book1", + "price": 10000, + "qty": 100, + "createdAt": "2023-04-09T22:38:10.774707", + "updatedAt": null + }, + { + "id": 2, + "productname": "book2", + "price": 15000, + "qty": 100, + "createdAt": "2023-04-09T22:38:10.777716", + "updatedAt": null + }, + { + "id": 3, + "productname": "phone", + "price": 500000, + "qty": 100, + "createdAt": "2023-04-09T22:40:20.436741", + "updatedAt": null + } + ] + } + +5. ์ƒํ’ˆ์ƒ์„ธ๋ณด๊ธฐ (POST) + ์š”์ฒญ ์ฃผ์†Œ + - http://localhost:8080/find + ์š”์ฒญ ํ—ค๋” + - Authorization : Bearer ~ + ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ + - + { + "productname" : "phone" + } + ์‘๋‹ต ๋ฐ”๋”” + - + { + "status": 200, + "msg": "์„ฑ๊ณต", + "data": { + "id": 3, + "productname": "phone", + "price": 500000, + "qty": 100, + "createdAt": "2023-04-09T22:40:20.436741", + "updatedAt": null + } + } + +6. ์ƒํ’ˆ์ˆ˜์ •ํ•˜๊ธฐ (PUT) + ์š”์ฒญ ์ฃผ์†Œ + - http://localhost:8080/update + ์š”์ฒญ ํ—ค๋” + - Authorization : Bearer ~ + ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ + - + { + "productname":"phone", + "price" : "11111", + "qty" : "1010" + } + ์‘๋‹ต ๋ฐ”๋”” + - + { + "status": 200, + "msg": "์„ฑ๊ณต", + "data": { + "id": 3, + "productname": "phone", + "price": 11111, + "qty": 1010, + "createdAt": "2023-04-09T22:52:36.532541", + "updatedAt": null + } + } + +7. ์ƒํ’ˆ์‚ญ์ œํ•˜๊ธฐ (DELETE) + ์š”์ฒญ ์ฃผ์†Œ + - http://localhost:8080/delete/phone + ์š”์ฒญ ํ—ค๋” + - + ์‘๋‹ต ๋ฐ”๋”” + - + { + "status": 200, + "msg": "์„ฑ๊ณต", + "data": "Delete Success!" + } + +8. ์ฃผ๋ฌธํ•˜๊ธฐ (POST) - OrderProduct๋ฅผ ์ƒ์„ฑํ•˜์—ฌ, OrderSheet์— ์ถ”๊ฐ€ํ•˜์„ธ์š” + ์š”์ฒญ ์ฃผ์†Œ + - http://localhost:8080/order + ์š”์ฒญ ํ—ค๋” + - Authorization : Bearer ~ + ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ + - + { + "name" : "book1", + "count" : "3" + } + ์‘๋‹ต ๋ฐ”๋”” + - + { + "status": 200, + "msg": "์„ฑ๊ณต", + "data": { + "id": 1, + "user": { + "id": 2, + "username": "ssar", + "email": "ssar@nate.com", + "role": "USER", + "createdAt": "2023-04-09T22:50:25.430306", + "updatedAt": "2023-04-09T22:54:36.025102" + }, + "orderProductList": [ + { + "id": 1, + "product": { + "id": 1, + "productname": "book1", + "price": 10000, + "qty": 97, + "createdAt": "2023-04-09T22:50:25.450303", + "updatedAt": "2023-04-09T22:54:47.5028385" + }, + "count": 3, + "orderPrice": 30000, + "createdAt": "2023-04-09T22:54:47.4436669", + "orderSheet": 1 + } + ], + "totalPrice": 30000, + "createdAt": "2023-04-09T22:50:25.434301", + "updatedAt": "2023-04-09T22:54:47.5028385" + } + } + +9. ๊ณ ๊ฐ์ž…์žฅ - ์ฃผ๋ฌธ๋ชฉ๋ก๋ณด๊ธฐ (GET) + ์š”์ฒญ ์ฃผ์†Œ + - http://localhost:8080/findAllOrder + ์š”์ฒญ ํ—ค๋” + - Authorization : Bearer ~ + ์‘๋‹ต ๋ฐ”๋”” + - + { + "status": 200, + "msg": "์„ฑ๊ณต", + "data": [ + { + "id": 1, + "product": { + "id": 1, + "productname": "book1", + "price": 10000, + "qty": 97, + "createdAt": "2023-04-09T22:50:25.450303", + "updatedAt": "2023-04-09T22:54:47.502839" + }, + "count": 3, + "orderPrice": 30000, + "createdAt": "2023-04-09T22:54:47.443667", + "orderSheet": 1 + } + ] + } + +10. ํŒ๋งค์ž์ž…์žฅ - ์ฃผ๋ฌธ๋ชฉ๋ก๋ณด๊ธฐ (GET) + ์š”์ฒญ ์ฃผ์†Œ + - http://localhost:8080/findAllOrder + ์š”์ฒญ ํ—ค๋” + - Authorization : Bearer ~ + ์‘๋‹ต ๋ฐ”๋”” + - + { + "status": 200, + "msg": "์„ฑ๊ณต", + "data": [ + { + "id": 1, + "user": { + "id": 2, + "username": "ssar", + "email": "ssar@nate.com", + "role": "USER", + "createdAt": "2023-04-09T22:50:25.430306", + "updatedAt": "2023-04-09T22:54:36.025102" + }, + "orderProductList": [ + { + "id": 1, + "product": { + "id": 1, + "productname": "book1", + "price": 10000, + "qty": 97, + "createdAt": "2023-04-09T22:50:25.450303", + "updatedAt": "2023-04-09T22:54:47.502839" + }, + "count": 3, + "orderPrice": 30000, + "createdAt": "2023-04-09T22:54:47.443667", + "orderSheet": 1 + } + ], + "totalPrice": 30000, + "createdAt": "2023-04-09T22:50:25.434301", + "updatedAt": "2023-04-09T22:54:47.502839" + } + ] + } + +11. ๊ณ ๊ฐ์ž…์žฅ - ์ฃผ๋ฌธ์ทจ์†Œํ•˜๊ธฐ (DELETE) - Casecade ์˜ต์…˜์„ ํ™œ์šฉํ•˜์„ธ์š”. (์–‘๋ฐฉํ–ฅ ๋งคํ•‘) + ์š”์ฒญ ์ฃผ์†Œ + - http://localhost:8080/cancel + ์š”์ฒญ ํ—ค๋” + - Authorization : Bearer ~ + ์‘๋‹ต ๋ฐ”๋”” + - + { + "status": 200, + "msg": "์„ฑ๊ณต", + "data": "์ฃผ๋ฌธ์ด ์ •์ƒ์ ์œผ๋กœ ์ทจ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. " + } + +12. ํŒ๋งค์ž์ž…์žฅ - ์ฃผ๋ฌธ์ทจ์†Œํ•˜๊ธฐ (DELETE) - Casecade ์˜ต์…˜์„ ํ™œ์šฉํ•˜์„ธ์š”. (์–‘๋ฐฉํ–ฅ ๋งคํ•‘) + ์š”์ฒญ ์ฃผ์†Œ + - http://localhost:8080/cancel/2 + ์š”์ฒญ ํ—ค๋” + - Authorization : Bearer ~ + ์‘๋‹ต ๋ฐ”๋”” + - + { + "status": 200, + "msg": "์„ฑ๊ณต", + "data": "2๋ฒˆ ๊ณ ๊ฐ์˜ ์ฃผ๋ฌธ์ด ์ •์ƒ์ ์œผ๋กœ ์ทจ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. " + } diff --git a/src/main/java/shop/mtcoding/metamall/controller/OrderController.java b/src/main/java/shop/mtcoding/metamall/controller/OrderController.java new file mode 100644 index 0000000..bf60e96 --- /dev/null +++ b/src/main/java/shop/mtcoding/metamall/controller/OrderController.java @@ -0,0 +1,159 @@ +package shop.mtcoding.metamall.controller; + +import com.auth0.jwt.interfaces.DecodedJWT; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; +import shop.mtcoding.metamall.core.exception.Exception400; +import shop.mtcoding.metamall.core.exception.Exception401; +import shop.mtcoding.metamall.core.exception.Exception403; +import shop.mtcoding.metamall.core.exception.Exception404; +import shop.mtcoding.metamall.core.jwt.JwtProvider; +import shop.mtcoding.metamall.dto.ResponseDto; +import shop.mtcoding.metamall.dto.order.OrderRequest; +import shop.mtcoding.metamall.model.orderproduct.OrderProduct; +import shop.mtcoding.metamall.model.orderproduct.OrderProductRepository; +import shop.mtcoding.metamall.model.ordersheet.OrderSheet; +import shop.mtcoding.metamall.model.ordersheet.OrderSheetRepository; +import shop.mtcoding.metamall.model.product.Product; +import shop.mtcoding.metamall.model.product.ProductRepository; +import shop.mtcoding.metamall.model.user.Role; +import shop.mtcoding.metamall.model.user.User; +import shop.mtcoding.metamall.model.user.UserRepository; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import javax.validation.Valid; +import java.util.List; +import java.util.Optional; + +@RequiredArgsConstructor +@RestController +public class OrderController { + + private final ProductRepository productRepository; + private final HttpSession session; + private final OrderProductRepository orderProductRepository; + private final OrderSheetRepository orderSheetRepository; + private final UserRepository userRepository; + + @PostMapping("/order") + @Transactional + public ResponseEntity order(@Valid @RequestBody OrderRequest.OrderDto orderDto, HttpServletRequest request) { + + String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", ""); + DecodedJWT decodedJWT = JwtProvider.verify(jwt); + + String name = orderDto.getName(); + Integer count = orderDto.getCount(); + + // ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ํ™•์ธ USER + String role = decodedJWT.getClaim("role").asString(); + Long userId = decodedJWT.getClaim("id").asLong(); + + + if(role.equals(Role.USER.toString())){ //USER ์—ฌ์•ผ ์ฃผ๋ฌธ๊ฐ€๋Šฅ + Product productPS = productRepository.findByName(name).orElseThrow(() -> { + return new Exception404("์ œํ’ˆ์˜ ์ด๋ฆ„์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. "); + }); + + if(productPS.getQty() - count< 0){ + throw new Exception400("์ œํ’ˆ์˜ ์ˆ˜๋Ÿ‰์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. "); + } + productPS.setQty(productPS.getQty() - count); //์ˆ˜๋Ÿ‰ ์—…๋ฐ์ดํŠธ + OrderProduct orderProduct = OrderProduct.builder().product(productPS).count(count).orderPrice(productPS.getPrice() * count).build(); + orderProductRepository.save(orderProduct); + + OrderSheet orderSheetPS = orderSheetRepository.findByUserId(userId).get(); + List orderProductList = orderSheetPS.getOrderProductList(); + orderProductList.add(orderProduct); + orderSheetPS.setOrderProductList(orderProductList); //orderProduct ์ถ”๊ฐ€๋œ ๋ฆฌ์ŠคํŠธ๋กœ ์—…๋ฐ์ดํŠธ + + Integer totalPrice = orderSheetPS.getTotalPrice(); + totalPrice = totalPrice + orderProduct.getOrderPrice(); + orderSheetPS.setTotalPrice(totalPrice); + + orderProduct.setOrderSheet(orderSheetPS.getId()); + + ResponseDto responseDto = new ResponseDto<>().data(orderSheetPS); + return ResponseEntity.ok().body(responseDto); + }else { + throw new Exception403("์ž˜๋ชป๋œ ์ ‘๊ทผ์ž…๋‹ˆ๋‹ค. "); + } + } + + @GetMapping("/findAllOrder") + public ResponseEntity findAllOrder(HttpServletRequest request) { + + String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", ""); + DecodedJWT decodedJWT = JwtProvider.verify(jwt); + + // ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ํ™•์ธ + String role = decodedJWT.getClaim("role").asString(); + Long userId = decodedJWT.getClaim("id").asLong(); + + if(role.equals(Role.USER.toString())){ // ๊ณ ๊ฐ์ผ ๊ฒฝ์šฐ ๋ณธ์ธ์˜ ์ฃผ๋ฌธ ๋ชฉ๋ก ๋ณด๊ธฐ + OrderSheet orderSheet = orderSheetRepository.findByUserId(userId).get(); + List orderProductList = orderSheet.getOrderProductList(); + ResponseDto responseDto = new ResponseDto<>().data(orderProductList); + return ResponseEntity.ok().body(responseDto); + + }else if(role.equals(Role.SELLER.toString())){ // ํŒ๋งค์ž์ผ ๊ฒฝ์šฐ ๋ชจ๋“  ์ฃผ๋ฌธ ๋ชฉ๋ก ๋ณด๊ธฐ + List orderSheetList = orderSheetRepository.findAll(); + ResponseDto responseDto = new ResponseDto<>().data(orderSheetList); + return ResponseEntity.ok().body(responseDto); + + }else { + throw new Exception401("์ธ์ฆ๋˜์ง€ ์•Š์€ ๊ณ ๊ฐ์ž…๋‹ˆ๋‹ค."); + } + } + + @DeleteMapping("/cancel") + public ResponseEntity cancel(HttpServletRequest request){ + + String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", ""); + DecodedJWT decodedJWT = JwtProvider.verify(jwt); + + // 2. ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ํ™•์ธ + String role = decodedJWT.getClaim("role").asString(); + Long userId = decodedJWT.getClaim("id").asLong(); + + if(role.equals(Role.USER.toString())) { // ๊ณ ๊ฐ์ผ ๊ฒฝ์šฐ ๋ณธ์ธ์˜ ์ฃผ๋ฌธ ๋ชฉ๋ก ์‚ญ์ œํ•˜๊ธฐ -> ๋นˆ ์ฃผ๋ฌธ ๋ชฉ๋ก์œผ๋กœ ์ƒˆ๋กœ ์ƒ์„ฑํ•ด์ฃผ๊ธฐ + orderSheetRepository.deleteByUserId(userId); + Optional user = userRepository.findById(userId); + OrderSheet orderSheet = OrderSheet.builder().user(user.get()).totalPrice(0).build(); + orderSheetRepository.save(orderSheet); + ResponseDto responseDto = new ResponseDto<>().data("์ฃผ๋ฌธ์ด ์ •์ƒ์ ์œผ๋กœ ์ทจ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. "); + return ResponseEntity.ok().body(responseDto); + }else { + throw new Exception403("์ž˜๋ชป๋œ ์ ‘๊ทผ์ž…๋‹ˆ๋‹ค. "); + } + } + + @DeleteMapping("/cancel/{userId}") // ๊ฐ’ ์•ˆ๋“ค์–ด์˜ค๋ฉด seller์˜ user cancel๋กœ ํŒ๋‹จํ•ด์„œ 403 - ์ž˜๋ชป๋œ ์ ‘๊ทผ + public ResponseEntity cancelSeller(@PathVariable(required = false) Long userId, HttpServletRequest request){ + + String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", ""); + DecodedJWT decodedJWT = JwtProvider.verify(jwt); + + // ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ํ™•์ธ SELLER(ํŒ๋งค์ž) + String role = decodedJWT.getClaim("role").asString(); + Long id = decodedJWT.getClaim("id").asLong(); + + if(role.equals(Role.SELLER.toString())){ // ํŒ๋งค์ž์ผ ๊ฒฝ์šฐ ๋ณธ์ธ์˜ body์— ์ž…๋ ฅํ•œ ๊ณ ๊ฐ์˜ ์ฃผ๋ฌธ ๋ชฉ๋ก ์‚ญ์ œํ•˜๊ธฐ -> ๋นˆ ์ฃผ๋ฌธ ๋ชฉ๋ก์œผ๋กœ ์ƒˆ๋กœ ์ƒ์„ฑํ•ด์ฃผ๊ธฐ + // Long userId = Long.parseLong(id); + orderSheetRepository.deleteByUserId(userId); + User user = userRepository.findById(userId).orElseThrow(() -> { + return new Exception404(userId + "๋ฒˆ ๊ณ ๊ฐ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. "); + }); + OrderSheet orderSheet = OrderSheet.builder().user(user).totalPrice(0).build(); + orderSheetRepository.save(orderSheet); + + ResponseDto responseDto = new ResponseDto<>().data(userId + "๋ฒˆ ๊ณ ๊ฐ์˜ ์ฃผ๋ฌธ์ด ์ •์ƒ์ ์œผ๋กœ ์ทจ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. "); + return ResponseEntity.ok().body(responseDto); + }else { + throw new Exception403("์ž˜๋ชป๋œ ์ ‘๊ทผ์ž…๋‹ˆ๋‹ค. "); + } + } +} diff --git a/src/main/java/shop/mtcoding/metamall/controller/ProductController.java b/src/main/java/shop/mtcoding/metamall/controller/ProductController.java new file mode 100644 index 0000000..2ad6e8a --- /dev/null +++ b/src/main/java/shop/mtcoding/metamall/controller/ProductController.java @@ -0,0 +1,132 @@ +package shop.mtcoding.metamall.controller; + +import com.auth0.jwt.interfaces.DecodedJWT; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import shop.mtcoding.metamall.core.exception.Exception400; +import shop.mtcoding.metamall.core.exception.Exception403; +import shop.mtcoding.metamall.core.jwt.JwtProvider; +import shop.mtcoding.metamall.dto.ResponseDto; +import shop.mtcoding.metamall.dto.product.ProductRequest; +import shop.mtcoding.metamall.model.product.Product; +import shop.mtcoding.metamall.model.product.ProductRepository; +import shop.mtcoding.metamall.model.user.Role; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import javax.validation.Valid; +import java.util.List; +import java.util.Optional; + +@RequiredArgsConstructor +@RestController +public class ProductController { + + private final ProductRepository productRepository; + private final HttpSession session; + + @PostMapping("/find") + public ResponseEntity find(@Valid @RequestBody ProductRequest.ProductDto product, HttpServletRequest request) { + //์ธ์ฆ๋งŒ ํ•„์š” + String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", ""); + DecodedJWT decodedJWT = JwtProvider.verify(jwt); + Long userId = decodedJWT.getClaim("id").asLong(); + + Optional productOP = productRepository.findByName(product.getProductname()); + if (productOP.isPresent()) { + // 1. ๋ฌผ๊ฑด ์ •๋ณด ๊บผ๋‚ด๊ธฐ + Product findProduct = productOP.get(); + + // 2. ์‘๋‹ต DTO ์ƒ์„ฑ + ResponseDto responseDto = new ResponseDto<>().data(findProduct); + return ResponseEntity.ok().body(responseDto); + } else { + throw new Exception400("์ž˜๋ชป๋œ ์š”์ฒญ์ž…๋‹ˆ๋‹ค"); + } + } + + @GetMapping("/findAll") + public ResponseEntity findAll(HttpServletRequest request) { + + String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", ""); + DecodedJWT decodedJWT = JwtProvider.verify(jwt); + + List productOP = productRepository.findAll(); + ResponseDto responseDto = new ResponseDto<>().data(productOP); + return ResponseEntity.ok().body(responseDto); + } + + @PostMapping("/upload") + public ResponseEntity upload(@Valid @RequestBody Product uploadProduct, HttpServletRequest request){ + + String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", ""); + DecodedJWT decodedJWT = JwtProvider.verify(jwt); + + Long userId = decodedJWT.getClaim("id").asLong(); + + // ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ํ™•์ธ SELLER(ํŒ๋งค์ž) ๋“ฑ๋ก ๊ฐ€๋Šฅ + String role = decodedJWT.getClaim("role").asString(); + + if(role.equals(Role.SELLER.toString())){ + productRepository.save(uploadProduct); + ResponseDto responseDto = new ResponseDto<>().data(uploadProduct); + return ResponseEntity.ok().body(responseDto); + }else{ + throw new Exception403("ํŒ๋งค์ž๋งŒ ๋ฌผ๊ฑด์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"); + } + } + + @PutMapping("/update") + public ResponseEntity update(@Valid @RequestBody Product updateProduct, HttpServletRequest request){ + + String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", ""); + DecodedJWT decodedJWT = JwtProvider.verify(jwt); + + // ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ํ™•์ธ SELLER(ํŒ๋งค์ž) + String role = decodedJWT.getClaim("role").asString(); + Long userId = decodedJWT.getClaim("id").asLong(); + + if(role.equals(Role.SELLER.toString())){ + + Product productPS = productRepository.findByName(updateProduct.getProductname()).orElseThrow(() -> { + return new Exception400("์ œํ’ˆ์˜ ์ด๋ฆ„์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. "); + }); //์˜์†ํ™” ํ•˜๊ธฐ + + productPS.setPrice(updateProduct.getPrice()); + productPS.setQty(updateProduct.getQty()); + + ResponseDto responseDto = new ResponseDto<>().data(productPS); + return ResponseEntity.ok().body(responseDto); + + }else{ + throw new Exception403("์ž˜๋ชป๋œ ์ ‘๊ทผ์ž…๋‹ˆ๋‹ค. "); + } + } + + + @DeleteMapping("/delete/{productname}") // ๊ฐ’ ์•ˆ๋“ค์–ด์˜ค๋ฉด 404 ๋ฐ˜ํ™˜ + public ResponseEntity delete(@PathVariable(required = false) String productname, HttpServletRequest request){ + + String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", ""); + DecodedJWT decodedJWT = JwtProvider.verify(jwt); + Long userId = decodedJWT.getClaim("id").asLong(); + + // ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ํ™•์ธ SELLER(ํŒ๋งค์ž) + String role = decodedJWT.getClaim("role").asString(); + + if(role.equals(Role.SELLER.toString())){ + Product productPS = productRepository.findByName(productname).orElseThrow(() -> { + return new Exception400("์ œํ’ˆ์˜ ์ด๋ฆ„์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. "); + }); //์ œํ’ˆ์ด ์žˆ๋Š”์ง€ ํ™•์ธ + + productRepository.deleteById(productPS.getId()); + + ResponseDto responseDto = new ResponseDto<>().data("Delete Success!"); + return ResponseEntity.ok().body(responseDto); + + }else{ + throw new Exception403("์ž˜๋ชป๋œ ์ ‘๊ทผ์ž…๋‹ˆ๋‹ค. "); + } + } +} diff --git a/src/main/java/shop/mtcoding/metamall/controller/UserController.java b/src/main/java/shop/mtcoding/metamall/controller/UserController.java index ddfee94..49c85fd 100644 --- a/src/main/java/shop/mtcoding/metamall/controller/UserController.java +++ b/src/main/java/shop/mtcoding/metamall/controller/UserController.java @@ -3,19 +3,24 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import shop.mtcoding.metamall.core.anotation.Authorize; import shop.mtcoding.metamall.core.exception.Exception400; import shop.mtcoding.metamall.core.exception.Exception401; import shop.mtcoding.metamall.core.jwt.JwtProvider; +import shop.mtcoding.metamall.core.session.LoginUser; import shop.mtcoding.metamall.dto.ResponseDto; import shop.mtcoding.metamall.dto.user.UserRequest; -import shop.mtcoding.metamall.dto.user.UserResponse; import shop.mtcoding.metamall.model.log.login.LoginLog; import shop.mtcoding.metamall.model.log.login.LoginLogRepository; +import shop.mtcoding.metamall.model.ordersheet.OrderSheet; +import shop.mtcoding.metamall.model.ordersheet.OrderSheetRepository; +import shop.mtcoding.metamall.model.user.Role; import shop.mtcoding.metamall.model.user.User; import shop.mtcoding.metamall.model.user.UserRepository; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; +import javax.validation.Valid; import java.time.LocalDateTime; import java.util.Optional; @@ -25,17 +30,20 @@ public class UserController { private final UserRepository userRepository; private final LoginLogRepository loginLogRepository; + private final OrderSheetRepository orderSheetRepository; + private final HttpSession session; @PostMapping("/login") - public ResponseEntity login(@RequestBody UserRequest.LoginDto loginDto, HttpServletRequest request) { + public ResponseEntity login(@Valid @RequestBody UserRequest.LoginDto loginDto, HttpServletRequest request) { + session.setAttribute("login", null); Optional userOP = userRepository.findByUsername(loginDto.getUsername()); if (userOP.isPresent()) { // 1. ์œ ์ € ์ •๋ณด ๊บผ๋‚ด๊ธฐ - User loginUser = userOP.get(); + User user = userOP.get(); // 2. ํŒจ์Šค์›Œ๋“œ ๊ฒ€์ฆํ•˜๊ธฐ - if(!loginUser.getPassword().equals(loginDto.getPassword())){ + if(!user.getPassword().equals(loginDto.getPassword())){ throw new Exception401("์ธ์ฆ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค"); } @@ -43,21 +51,37 @@ public ResponseEntity login(@RequestBody UserRequest.LoginDto loginDto, HttpS String jwt = JwtProvider.create(userOP.get()); // 4. ์ตœ์ข… ๋กœ๊ทธ์ธ ๋‚ ์งœ ๊ธฐ๋ก (๋”ํ‹ฐ์ฒดํ‚น - update ์ฟผ๋ฆฌ ๋ฐœ์ƒ) - loginUser.setUpdatedAt(LocalDateTime.now()); + user.setUpdatedAt(LocalDateTime.now()); // 5. ๋กœ๊ทธ ํ…Œ์ด๋ธ” ๊ธฐ๋ก LoginLog loginLog = LoginLog.builder() - .userId(loginUser.getId()) + .userId(user.getId()) .userAgent(request.getHeader("User-Agent")) .clientIP(request.getRemoteAddr()) .build(); loginLogRepository.save(loginLog); - // 6. ์‘๋‹ต DTO ์ƒ์„ฑ - ResponseDto responseDto = new ResponseDto<>().data(loginUser); +// 6. loginUser์— ์ €์žฅ - ์—๋Ÿฌ์— ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ + LoginUser loginUser = LoginUser.builder().id(user.getId()).role(user.getRole().toString()).build(); + session.setAttribute("login", loginUser); + System.out.println("๋กœ๊ทธ์ธ ํ›„ ์œ ์ € ์ •๋ณด : " + loginUser.toString()); + + // 7. ์‘๋‹ต DTO ์ƒ์„ฑ + ResponseDto responseDto = new ResponseDto<>().data(user); return ResponseEntity.ok().header(JwtProvider.HEADER, jwt).body(responseDto); } else { throw new Exception400("์œ ์ €๋„ค์ž„ ํ˜น์€ ์•„์ด๋””๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค"); } } + + @PostMapping("/join") + public ResponseEntity join(@Valid @RequestBody User joinUser){ + joinUser.setRole(Role.USER); + userRepository.save(joinUser); + OrderSheet orderSheet = OrderSheet.builder().user(joinUser).totalPrice(0).build(); + orderSheetRepository.save(orderSheet); // ํ•œ ๊ณ ๊ฐ ๋‹น ์ฃผ๋ฌธ ์‹œํŠธ ์ƒ์„ฑ + + ResponseDto responseDto = new ResponseDto<>().data(joinUser); + return ResponseEntity.ok().body(responseDto); + } } diff --git a/src/main/java/shop/mtcoding/metamall/core/advice/AuthorizeAdvice.java b/src/main/java/shop/mtcoding/metamall/core/advice/AuthorizeAdvice.java new file mode 100644 index 0000000..f4614be --- /dev/null +++ b/src/main/java/shop/mtcoding/metamall/core/advice/AuthorizeAdvice.java @@ -0,0 +1,34 @@ +package shop.mtcoding.metamall.core.advice; + + +import com.auth0.jwt.interfaces.DecodedJWT; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import shop.mtcoding.metamall.core.jwt.JwtProvider; + +import javax.servlet.http.HttpServletRequest; + +@Aspect +@Component +public class AuthorizeAdvice { + + //๊นƒ๋ฐœ์— ๋ณ„์นญ์ฃผ๊ธฐ + @Pointcut("@annotation(shop.mtcoding.metamall.core.anotation.Authorize)") + public void authorize(){} + + + @Around("authorize()") + public Object authAdvice(ProceedingJoinPoint jp) throws Throwable{ + + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); + String jwt = request.getHeader(JwtProvider.HEADER).replaceAll("Bearer ", ""); + DecodedJWT decodedJWT = JwtProvider.verify(jwt); + + return jp.proceed(); + } +} diff --git a/src/main/java/shop/mtcoding/metamall/core/advice/ErrorLogAdvice.java b/src/main/java/shop/mtcoding/metamall/core/advice/ErrorLogAdvice.java new file mode 100644 index 0000000..6e2b276 --- /dev/null +++ b/src/main/java/shop/mtcoding/metamall/core/advice/ErrorLogAdvice.java @@ -0,0 +1,31 @@ +package shop.mtcoding.metamall.core.advice; + + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; +import shop.mtcoding.metamall.dto.user.UserRequest; + +@Aspect +@Component +public class ErrorLogAdvice { + + //๊นƒ๋ฐœ์— ๋ณ„์นญ์ฃผ๊ธฐ + @Pointcut("@annotation(shop.mtcoding.metamall.core.anotation.ErrorLog)") + public void errorLog(){} + + + @Before("errorLog()") + public void errorAdvice(JoinPoint jp) throws Throwable{ + Object[] args = jp.getArgs(); + + for (Object arg : args) { + if(arg instanceof UserRequest.LoginDto){ + + System.out.println(((UserRequest.LoginDto) arg).getUsername()+"๋‹˜ ์•ˆ๋…•"); + } + } + } +} diff --git a/src/main/java/shop/mtcoding/metamall/core/advice/MyExceptionAdvice.java b/src/main/java/shop/mtcoding/metamall/core/advice/MyExceptionAdvice.java index 50ebee2..d138e73 100644 --- a/src/main/java/shop/mtcoding/metamall/core/advice/MyExceptionAdvice.java +++ b/src/main/java/shop/mtcoding/metamall/core/advice/MyExceptionAdvice.java @@ -2,11 +2,21 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import shop.mtcoding.metamall.core.exception.*; -import shop.mtcoding.metamall.model.log.error.ErrorLogRepository; +import shop.mtcoding.metamall.core.session.LoginUser; +import shop.mtcoding.metamall.model.log.err.ErrorLog; +import shop.mtcoding.metamall.model.log.err.ErrorLogRepository; + +import javax.servlet.http.HttpSession; +import java.util.List; +import java.util.stream.Collectors; @Slf4j @RequiredArgsConstructor @@ -15,28 +25,65 @@ public class MyExceptionAdvice { private final ErrorLogRepository errorLogRepository; + private final HttpSession session; + @ExceptionHandler(Exception400.class) - public ResponseEntity badRequest(Exception400 e){ + public ResponseEntity badRequest(Exception400 e) { // ์ž˜๋ชป๋œ ์š”์ฒญ์„ ํ–ˆ์„ ๋•Œ + LoginUser loginUser = (LoginUser) session.getAttribute("login"); + if (loginUser != null) { //๋กœ๊ทธ์ธ์ด ๋˜์—ˆ์„ ๋•Œ + ErrorLog errorLog = ErrorLog.builder().userId(loginUser.getId()).msg("code : 400 - " + e.getMessage()).build(); + errorLogRepository.save(errorLog); + } return new ResponseEntity<>(e.body(), e.status()); } @ExceptionHandler(Exception401.class) - public ResponseEntity unAuthorized(Exception401 e){ + public ResponseEntity unAuthorized(Exception401 e) { // ์ธ์ฆ๋˜์ง€ ์•Š์•˜์„ ๋•Œ + LoginUser loginUser = (LoginUser) session.getAttribute("login"); + if (loginUser != null) { //๋กœ๊ทธ์ธ์ด ๋˜์—ˆ์„ ๋•Œ + ErrorLog errorLog = ErrorLog.builder().userId(loginUser.getId()).msg("code : 401 - " + e.getMessage()).build(); + errorLogRepository.save(errorLog); + } return new ResponseEntity<>(e.body(), e.status()); } @ExceptionHandler(Exception403.class) - public ResponseEntity forbidden(Exception403 e){ + public ResponseEntity forbidden(Exception403 e) { // ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชป๋œ ์ ‘๊ทผ์„ ํ–ˆ์„ ๋•Œ + LoginUser loginUser = (LoginUser) session.getAttribute("login"); + System.out.println("์—๋Ÿฌ ๋ฐœ์ƒ ์œ ์ € : " + loginUser); + if (loginUser != null) { //๋กœ๊ทธ์ธ์ด ๋˜์—ˆ์„ ๋•Œ + ErrorLog errorLog = ErrorLog.builder().userId(loginUser.getId()).msg("code : 403 - " + e.getMessage()).build(); + errorLogRepository.save(errorLog); + } return new ResponseEntity<>(e.body(), e.status()); } @ExceptionHandler(Exception404.class) - public ResponseEntity notFound(Exception404 e){ + public ResponseEntity notFound(Exception404 e) { // ๊ฐ์ฒด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์„ ๋•Œ + LoginUser loginUser = (LoginUser) session.getAttribute("login"); + if (loginUser != null) { //๋กœ๊ทธ์ธ์ด ๋˜์—ˆ์„ ๋•Œ + ErrorLog errorLog = ErrorLog.builder().userId(loginUser.getId()).msg("code : 404 - " + e.getMessage()).build(); + errorLogRepository.save(errorLog); + } return new ResponseEntity<>(e.body(), e.status()); } @ExceptionHandler(Exception500.class) - public ResponseEntity serverError(Exception500 e){ + public ResponseEntity serverError(Exception500 e) { + LoginUser loginUser = (LoginUser) session.getAttribute("login"); + if (loginUser != null) { //๋กœ๊ทธ์ธ์ด ๋˜์—ˆ์„ ๋•Œ + ErrorLog errorLog = ErrorLog.builder().userId(loginUser.getId()).msg("code : 500 - " + e.getMessage()).build(); + errorLogRepository.save(errorLog); + } return new ResponseEntity<>(e.body(), e.status()); } -} + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity validError(MethodArgumentNotValidException e) { + BindingResult result = e.getBindingResult(); + List errorMessages = result.getFieldErrors().stream() + .map(error -> error.getField() + " " + error.getDefaultMessage()) + .collect(Collectors.toList()); + return ResponseEntity.badRequest().body(errorMessages); + } +} \ No newline at end of file diff --git a/src/main/java/shop/mtcoding/metamall/core/anotation/Authorize.java b/src/main/java/shop/mtcoding/metamall/core/anotation/Authorize.java new file mode 100644 index 0000000..e756312 --- /dev/null +++ b/src/main/java/shop/mtcoding/metamall/core/anotation/Authorize.java @@ -0,0 +1,4 @@ +package shop.mtcoding.metamall.core.anotation; + +public @interface Authorize { +} diff --git a/src/main/java/shop/mtcoding/metamall/core/anotation/ErrorLog.java b/src/main/java/shop/mtcoding/metamall/core/anotation/ErrorLog.java new file mode 100644 index 0000000..0db7191 --- /dev/null +++ b/src/main/java/shop/mtcoding/metamall/core/anotation/ErrorLog.java @@ -0,0 +1,4 @@ +package shop.mtcoding.metamall.core.anotation; + +public @interface ErrorLog { +} diff --git a/src/main/java/shop/mtcoding/metamall/core/exception/Exception400.java b/src/main/java/shop/mtcoding/metamall/core/exception/Exception400.java index d1b5fec..f99856b 100644 --- a/src/main/java/shop/mtcoding/metamall/core/exception/Exception400.java +++ b/src/main/java/shop/mtcoding/metamall/core/exception/Exception400.java @@ -1,13 +1,19 @@ package shop.mtcoding.metamall.core.exception; import lombok.Getter; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; + + import shop.mtcoding.metamall.dto.ResponseDto; +import shop.mtcoding.metamall.model.log.err.ErrorLog; +import shop.mtcoding.metamall.model.log.err.ErrorLogRepository; // ์œ ํšจ์„ฑ ์‹คํŒจ @Getter public class Exception400 extends RuntimeException { + public Exception400(String message) { super(message); } diff --git a/src/main/java/shop/mtcoding/metamall/core/exception/Exception401.java b/src/main/java/shop/mtcoding/metamall/core/exception/Exception401.java index 5d2f310..0c79bf7 100644 --- a/src/main/java/shop/mtcoding/metamall/core/exception/Exception401.java +++ b/src/main/java/shop/mtcoding/metamall/core/exception/Exception401.java @@ -4,6 +4,8 @@ import lombok.Getter; import org.springframework.http.HttpStatus; import shop.mtcoding.metamall.dto.ResponseDto; +import shop.mtcoding.metamall.model.log.err.ErrorLog; +import shop.mtcoding.metamall.model.log.err.ErrorLogRepository; // ์ธ์ฆ ์•ˆ๋จ diff --git a/src/main/java/shop/mtcoding/metamall/core/exception/Exception403.java b/src/main/java/shop/mtcoding/metamall/core/exception/Exception403.java index c8dc137..562ae9d 100644 --- a/src/main/java/shop/mtcoding/metamall/core/exception/Exception403.java +++ b/src/main/java/shop/mtcoding/metamall/core/exception/Exception403.java @@ -1,13 +1,18 @@ package shop.mtcoding.metamall.core.exception; import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import shop.mtcoding.metamall.dto.ResponseDto; +import shop.mtcoding.metamall.model.log.err.ErrorLog; +import shop.mtcoding.metamall.model.log.err.ErrorLogRepository; // ๊ถŒํ•œ ์—†์Œ @Getter public class Exception403 extends RuntimeException { + public Exception403(String message) { super(message); } diff --git a/src/main/java/shop/mtcoding/metamall/core/exception/Exception404.java b/src/main/java/shop/mtcoding/metamall/core/exception/Exception404.java index c20b64f..e883d72 100644 --- a/src/main/java/shop/mtcoding/metamall/core/exception/Exception404.java +++ b/src/main/java/shop/mtcoding/metamall/core/exception/Exception404.java @@ -3,6 +3,8 @@ import lombok.Getter; import org.springframework.http.HttpStatus; import shop.mtcoding.metamall.dto.ResponseDto; +import shop.mtcoding.metamall.model.log.err.ErrorLog; +import shop.mtcoding.metamall.model.log.err.ErrorLogRepository; // ๋ฆฌ์†Œ์Šค ์—†์Œ @@ -10,6 +12,7 @@ public class Exception404 extends RuntimeException { public Exception404(String message) { super(message); + } public ResponseDto body(){ diff --git a/src/main/java/shop/mtcoding/metamall/core/exception/Exception500.java b/src/main/java/shop/mtcoding/metamall/core/exception/Exception500.java index d3d4468..ec6e4fb 100644 --- a/src/main/java/shop/mtcoding/metamall/core/exception/Exception500.java +++ b/src/main/java/shop/mtcoding/metamall/core/exception/Exception500.java @@ -3,11 +3,14 @@ import lombok.Getter; import org.springframework.http.HttpStatus; import shop.mtcoding.metamall.dto.ResponseDto; +import shop.mtcoding.metamall.model.log.err.ErrorLog; +import shop.mtcoding.metamall.model.log.err.ErrorLogRepository; // ์„œ๋ฒ„ ์—๋Ÿฌ @Getter public class Exception500 extends RuntimeException { + public Exception500(String message) { super(message); } diff --git a/src/main/java/shop/mtcoding/metamall/core/filter/JwtVerifyFilter.java b/src/main/java/shop/mtcoding/metamall/core/filter/JwtVerifyFilter.java index 870bf93..347dd7a 100644 --- a/src/main/java/shop/mtcoding/metamall/core/filter/JwtVerifyFilter.java +++ b/src/main/java/shop/mtcoding/metamall/core/filter/JwtVerifyFilter.java @@ -10,6 +10,7 @@ import shop.mtcoding.metamall.core.jwt.JwtProvider; import shop.mtcoding.metamall.core.session.LoginUser; import shop.mtcoding.metamall.dto.ResponseDto; +import shop.mtcoding.metamall.model.user.Role; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; @@ -31,8 +32,8 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha String jwt = prefixJwt.replace(JwtProvider.TOKEN_PREFIX, ""); try { DecodedJWT decodedJWT = JwtProvider.verify(jwt); - int id = decodedJWT.getClaim("id").asInt(); - String role = decodedJWT.getClaim("role").asString(); + Long id = decodedJWT.getClaim("id").asLong(); + String role = decodedJWT.getClaim("role").toString(); // ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๊ถŒํ•œ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. HttpSession session = req.getSession(); diff --git a/src/main/java/shop/mtcoding/metamall/core/jwt/JwtProvider.java b/src/main/java/shop/mtcoding/metamall/core/jwt/JwtProvider.java index 93a4bae..b314137 100644 --- a/src/main/java/shop/mtcoding/metamall/core/jwt/JwtProvider.java +++ b/src/main/java/shop/mtcoding/metamall/core/jwt/JwtProvider.java @@ -24,7 +24,7 @@ public static String create(User user) { .withSubject(SUBJECT) .withExpiresAt(new Date(System.currentTimeMillis() + EXP)) .withClaim("id", user.getId()) - .withClaim("role", user.getRole()) + .withClaim("role", user.getRole().toString()) .sign(Algorithm.HMAC512(SECRET)); System.out.println("๋””๋ฒ„๊ทธ : ํ† ํฐ ์ƒ์„ฑ๋จ"); return TOKEN_PREFIX + jwt; diff --git a/src/main/java/shop/mtcoding/metamall/core/session/LoginUser.java b/src/main/java/shop/mtcoding/metamall/core/session/LoginUser.java index 59f402c..d8a63ea 100644 --- a/src/main/java/shop/mtcoding/metamall/core/session/LoginUser.java +++ b/src/main/java/shop/mtcoding/metamall/core/session/LoginUser.java @@ -2,14 +2,15 @@ import lombok.Builder; import lombok.Getter; +import shop.mtcoding.metamall.model.user.Role; @Getter public class LoginUser { - private Integer id; + private Long id; private String role; @Builder - public LoginUser(Integer id, String role) { + public LoginUser(Long id, String role) { this.id = id; this.role = role; } diff --git a/src/main/java/shop/mtcoding/metamall/dto/order/OrderRequest.java b/src/main/java/shop/mtcoding/metamall/dto/order/OrderRequest.java new file mode 100644 index 0000000..769cb78 --- /dev/null +++ b/src/main/java/shop/mtcoding/metamall/dto/order/OrderRequest.java @@ -0,0 +1,19 @@ +package shop.mtcoding.metamall.dto.order; + +import lombok.Getter; +import lombok.Setter; +import shop.mtcoding.metamall.model.product.Product; +import shop.mtcoding.metamall.model.user.User; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +public class OrderRequest { + @Getter @Setter + public static class OrderDto { + @NotBlank(message = "์ž…๋ ฅ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค") + private String name; + @NotNull(message = "์ž…๋ ฅ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค") + private Integer count; + } +} diff --git a/src/main/java/shop/mtcoding/metamall/dto/product/ProductRequest.java b/src/main/java/shop/mtcoding/metamall/dto/product/ProductRequest.java new file mode 100644 index 0000000..826ab61 --- /dev/null +++ b/src/main/java/shop/mtcoding/metamall/dto/product/ProductRequest.java @@ -0,0 +1,15 @@ +package shop.mtcoding.metamall.dto.product; + +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +public class ProductRequest { + @Getter @Setter + public static class ProductDto { + + @NotBlank(message = " ์ž…๋ ฅ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค") + private String productname; + } +} diff --git a/src/main/java/shop/mtcoding/metamall/dto/user/UserResponse.java b/src/main/java/shop/mtcoding/metamall/dto/product/UserResponse.java similarity index 71% rename from src/main/java/shop/mtcoding/metamall/dto/user/UserResponse.java rename to src/main/java/shop/mtcoding/metamall/dto/product/UserResponse.java index ae218ec..02b3dc7 100644 --- a/src/main/java/shop/mtcoding/metamall/dto/user/UserResponse.java +++ b/src/main/java/shop/mtcoding/metamall/dto/product/UserResponse.java @@ -1,4 +1,4 @@ -package shop.mtcoding.metamall.dto.user; +package shop.mtcoding.metamall.dto.product; // ์‘๋‹ต DTO๋Š” ์„œ๋น„์Šค ๋ฐฐ์šฐ๊ณ  ๋‚˜์„œ ํ•˜๊ธฐ (ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ํ•ด๋ณด๊ธฐ) public class UserResponse { diff --git a/src/main/java/shop/mtcoding/metamall/dto/user/UserRequest.java b/src/main/java/shop/mtcoding/metamall/dto/user/UserRequest.java index 80947db..39554f9 100644 --- a/src/main/java/shop/mtcoding/metamall/dto/user/UserRequest.java +++ b/src/main/java/shop/mtcoding/metamall/dto/user/UserRequest.java @@ -3,10 +3,14 @@ import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotBlank; + public class UserRequest { @Getter @Setter public static class LoginDto { + @NotBlank(message = "๊ณ ๊ฐ๋ช… ์ž…๋ ฅ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค") private String username; + @NotBlank(message = "๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค") private String password; } } diff --git a/src/main/java/shop/mtcoding/metamall/model/log/error/ErrorLog.java b/src/main/java/shop/mtcoding/metamall/model/log/err/ErrorLog.java similarity index 72% rename from src/main/java/shop/mtcoding/metamall/model/log/error/ErrorLog.java rename to src/main/java/shop/mtcoding/metamall/model/log/err/ErrorLog.java index fbfe7e5..5e2b195 100644 --- a/src/main/java/shop/mtcoding/metamall/model/log/error/ErrorLog.java +++ b/src/main/java/shop/mtcoding/metamall/model/log/err/ErrorLog.java @@ -1,4 +1,4 @@ -package shop.mtcoding.metamall.model.log.error; +package shop.mtcoding.metamall.model.log.err; import lombok.Builder; import lombok.Getter; @@ -19,26 +19,25 @@ public class ErrorLog { private Long id; private String msg; private Long userId; - private LocalDateTime createdAt; - private LocalDateTime updatedAt; +// private LocalDateTime updatedAt; ํ•„์š” ์—†์„ ๋“ฏ @PrePersist protected void onCreate() { this.createdAt = LocalDateTime.now(); } - @PreUpdate - protected void onUpdate() { - this.updatedAt = LocalDateTime.now(); - } +// @PreUpdate +// protected void onUpdate() { +// this.updatedAt = LocalDateTime.now(); +// } ํ•„์š” ์—†์„ ๋“ฏ @Builder - public ErrorLog(Long id, String msg, Long userId, LocalDateTime createdAt, LocalDateTime updatedAt) { + public ErrorLog(Long id, String msg, Long userId, LocalDateTime createdAt) { this.id = id; this.msg = msg; this.userId = userId; this.createdAt = createdAt; - this.updatedAt = updatedAt; +// this.updatedAt = updatedAt; } } diff --git a/src/main/java/shop/mtcoding/metamall/model/log/err/ErrorLogRepository.java b/src/main/java/shop/mtcoding/metamall/model/log/err/ErrorLogRepository.java new file mode 100644 index 0000000..00bf732 --- /dev/null +++ b/src/main/java/shop/mtcoding/metamall/model/log/err/ErrorLogRepository.java @@ -0,0 +1,9 @@ +package shop.mtcoding.metamall.model.log.err; + +import org.springframework.context.annotation.Bean; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Repository; + +public interface ErrorLogRepository extends JpaRepository { +} diff --git a/src/main/java/shop/mtcoding/metamall/model/log/error/ErrorLogRepository.java b/src/main/java/shop/mtcoding/metamall/model/log/error/ErrorLogRepository.java deleted file mode 100644 index 53c8a4f..0000000 --- a/src/main/java/shop/mtcoding/metamall/model/log/error/ErrorLogRepository.java +++ /dev/null @@ -1,6 +0,0 @@ -package shop.mtcoding.metamall.model.log.error; - -import org.springframework.data.jpa.repository.JpaRepository; - -public interface ErrorLogRepository extends JpaRepository { -} diff --git a/src/main/java/shop/mtcoding/metamall/model/log/login/LoginLog.java b/src/main/java/shop/mtcoding/metamall/model/log/login/LoginLog.java index 40b2964..245b2c1 100644 --- a/src/main/java/shop/mtcoding/metamall/model/log/login/LoginLog.java +++ b/src/main/java/shop/mtcoding/metamall/model/log/login/LoginLog.java @@ -21,18 +21,12 @@ public class LoginLog { private String userAgent; private String clientIP; private LocalDateTime createdAt; - private LocalDateTime updatedAt; @PrePersist protected void onCreate() { this.createdAt = LocalDateTime.now(); } - @PreUpdate - protected void onUpdate() { - this.updatedAt = LocalDateTime.now(); - } - @Builder public LoginLog(Long id, Long userId, String userAgent, String clientIP, LocalDateTime createdAt) { diff --git a/src/main/java/shop/mtcoding/metamall/model/orderproduct/OrderProduct.java b/src/main/java/shop/mtcoding/metamall/model/orderproduct/OrderProduct.java index 165905e..0d94069 100644 --- a/src/main/java/shop/mtcoding/metamall/model/orderproduct/OrderProduct.java +++ b/src/main/java/shop/mtcoding/metamall/model/orderproduct/OrderProduct.java @@ -11,8 +11,8 @@ import java.time.LocalDateTime; @NoArgsConstructor -@Setter // DTO ๋งŒ๋“ค๋ฉด ์‚ญ์ œํ•ด์•ผ๋จ @Getter +@Setter @Table(name = "order_product_tb") @Entity public class OrderProduct { // ์ฃผ๋ฌธ ์ƒํ’ˆ @@ -20,33 +20,36 @@ public class OrderProduct { // ์ฃผ๋ฌธ ์ƒํ’ˆ @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne + @JoinColumn(name = "productId") private Product product; + @Column(nullable = false) private Integer count; // ์ƒํ’ˆ ์ฃผ๋ฌธ ๊ฐœ์ˆ˜ private Integer orderPrice; // ์ƒํ’ˆ ์ฃผ๋ฌธ ๊ธˆ์•ก private LocalDateTime createdAt; - private LocalDateTime updatedAt; +// private LocalDateTime updatedAt; - @ManyToOne - private OrderSheet orderSheet; +// @ManyToOne +// OrderSheet๋ฅผ ์ €์žฅํ•˜๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ ์–ด๋ ค์›Œ์„œ ์ผ๋‹จ id๋กœ + private Long orderSheet; @PrePersist protected void onCreate() { this.createdAt = LocalDateTime.now(); } - @PreUpdate - protected void onUpdate() { - this.updatedAt = LocalDateTime.now(); - } +// @PreUpdate ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š” ์žˆ๋‚˜? +// protected void onUpdate() { +// this.updatedAt = LocalDateTime.now(); +// } @Builder - public OrderProduct(Long id, Product product, Integer count, Integer orderPrice, LocalDateTime createdAt, LocalDateTime updatedAt, OrderSheet orderSheet) { + public OrderProduct(Long id, Product product, Integer count, Integer orderPrice, LocalDateTime createdAt, Long orderSheet) { this.id = id; this.product = product; this.count = count; this.orderPrice = orderPrice; this.createdAt = createdAt; - this.updatedAt = updatedAt; +// this.updatedAt = updatedAt; this.orderSheet = orderSheet; } } diff --git a/src/main/java/shop/mtcoding/metamall/model/ordersheet/OrderSheet.java b/src/main/java/shop/mtcoding/metamall/model/ordersheet/OrderSheet.java index 7638710..5e119cb 100644 --- a/src/main/java/shop/mtcoding/metamall/model/ordersheet/OrderSheet.java +++ b/src/main/java/shop/mtcoding/metamall/model/ordersheet/OrderSheet.java @@ -23,8 +23,10 @@ public class OrderSheet { // ์ฃผ๋ฌธ์„œ @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne + @JoinColumn(name = "userId") private User user; // ์ฃผ๋ฌธ์ž - @OneToMany(mappedBy = "orderSheet") + + @OneToMany(mappedBy = "orderSheet", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)// OrderSheet๋ฅผ ์‚ญ์ œํ•˜๋ฉด OrderProduct ๋“ค๋„ ์‚ฌ๋ผ์ง€๊ฒŒ private List orderProductList = new ArrayList<>(); // ์ด ์ฃผ๋ฌธ ์ƒํ’ˆ ๋ฆฌ์ŠคํŠธ private Integer totalPrice; // ์ด ์ฃผ๋ฌธ ๊ธˆ์•ก (์ด ์ฃผ๋ฌธ ์ƒํ’ˆ ๋ฆฌ์ŠคํŠธ์˜ orderPrice ํ•ฉ) private LocalDateTime createdAt; @@ -50,4 +52,14 @@ public OrderSheet(Long id, User user, Integer totalPrice, LocalDateTime createdA this.createdAt = createdAt; this.updatedAt = updatedAt; } + + @Override + public String toString() { + return "OrderSheet{" + + "id=" + id + + ", user=" + user + + ", orderProductList=" + orderProductList + + ", totalPrice=" + totalPrice + + '}'; + } } diff --git a/src/main/java/shop/mtcoding/metamall/model/ordersheet/OrderSheetRepository.java b/src/main/java/shop/mtcoding/metamall/model/ordersheet/OrderSheetRepository.java index 5d59249..e30be5e 100644 --- a/src/main/java/shop/mtcoding/metamall/model/ordersheet/OrderSheetRepository.java +++ b/src/main/java/shop/mtcoding/metamall/model/ordersheet/OrderSheetRepository.java @@ -1,6 +1,19 @@ package shop.mtcoding.metamall.model.ordersheet; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; public interface OrderSheetRepository extends JpaRepository { + @Query("select o from OrderSheet o where o.user.id = :userId") + Optional findByUserId(@Param("userId") Long userId); + + @Modifying + @Transactional + @Query("delete from OrderSheet o where o.user.id = :userId") + void deleteByUserId(@Param("userId") Long userId); } diff --git a/src/main/java/shop/mtcoding/metamall/model/product/Product.java b/src/main/java/shop/mtcoding/metamall/model/product/Product.java index bc8c618..0c0ca72 100644 --- a/src/main/java/shop/mtcoding/metamall/model/product/Product.java +++ b/src/main/java/shop/mtcoding/metamall/model/product/Product.java @@ -6,20 +6,31 @@ import lombok.Setter; import javax.persistence.*; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import java.time.LocalDateTime; @NoArgsConstructor -@Setter // DTO ๋งŒ๋“ค๋ฉด ์‚ญ์ œํ•ด์•ผ๋จ @Getter +@Setter @Table(name = "product_tb") @Entity public class Product { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - private String name; // ์ƒํ’ˆ ์ด๋ฆ„ + @NotBlank(message = "์ž…๋ ฅ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค") + @Column(nullable = false, length = 50) + private String productname; // ์ƒํ’ˆ ์ด๋ฆ„ + + @NotNull(message = "์ž…๋ ฅ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค") + @Column(nullable = false, length = Integer.MAX_VALUE) private Integer price; // ์ƒํ’ˆ ๊ฐ€๊ฒฉ + + @NotNull(message = "์ž…๋ ฅ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค") + @Column(nullable = false, length = Integer.MAX_VALUE) private Integer qty; // ์ƒํ’ˆ ์žฌ๊ณ  + private LocalDateTime createdAt; private LocalDateTime updatedAt; @@ -34,12 +45,22 @@ protected void onUpdate() { } @Builder - public Product(Long id, String name, Integer price, Integer qty, LocalDateTime createdAt, LocalDateTime updatedAt) { + public Product(Long id, String productname, Integer price, Integer qty, LocalDateTime createdAt, LocalDateTime updatedAt) { this.id = id; - this.name = name; + this.productname = productname; this.price = price; this.qty = qty; this.createdAt = createdAt; this.updatedAt = updatedAt; } + + @Override + public String toString() { + return "Product{" + + "id=" + id + + ", productname='" + productname + '\'' + + ", price=" + price + + ", qty=" + qty + + '}'; + } } diff --git a/src/main/java/shop/mtcoding/metamall/model/product/ProductRepository.java b/src/main/java/shop/mtcoding/metamall/model/product/ProductRepository.java index ba5def3..9b659c3 100644 --- a/src/main/java/shop/mtcoding/metamall/model/product/ProductRepository.java +++ b/src/main/java/shop/mtcoding/metamall/model/product/ProductRepository.java @@ -1,6 +1,12 @@ package shop.mtcoding.metamall.model.product; 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 ProductRepository extends JpaRepository { + @Query("select p from Product p where p.productname = :productname") + Optional findByName(@Param("productname") String productname); } diff --git a/src/main/java/shop/mtcoding/metamall/model/user/Role.java b/src/main/java/shop/mtcoding/metamall/model/user/Role.java new file mode 100644 index 0000000..34b765c --- /dev/null +++ b/src/main/java/shop/mtcoding/metamall/model/user/Role.java @@ -0,0 +1,5 @@ +package shop.mtcoding.metamall.model.user; + +public enum Role { + USER,SELLER,ADMIN +} diff --git a/src/main/java/shop/mtcoding/metamall/model/user/User.java b/src/main/java/shop/mtcoding/metamall/model/user/User.java index c929ce5..554a67a 100644 --- a/src/main/java/shop/mtcoding/metamall/model/user/User.java +++ b/src/main/java/shop/mtcoding/metamall/model/user/User.java @@ -1,26 +1,38 @@ package shop.mtcoding.metamall.model.user; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.hibernate.annotations.CreationTimestamp; import javax.persistence.*; +import javax.validation.constraints.NotBlank; +import java.sql.Timestamp; import java.time.LocalDateTime; @NoArgsConstructor -@Setter // DTO ๋งŒ๋“ค๋ฉด ์‚ญ์ œํ•ด์•ผ๋จ @Getter +@Setter @Table(name = "user_tb") @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @NotBlank(message = " ์ž…๋ ฅ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค") + @Column(length = 30) private String username; + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + @NotBlank(message = " ์ž…๋ ฅ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค") + @Column(length = 100) private String password; + @NotBlank(message = " ์ž…๋ ฅ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค") + @Column(length = 50) private String email; - private String role; // USER(๊ณ ๊ฐ), SELLER(ํŒ๋งค์ž), ADMIN(๊ด€๋ฆฌ์ž) + private Role role; // USER(๊ณ ๊ฐ), SELLER(ํŒ๋งค์ž), ADMIN(๊ด€๋ฆฌ์ž) private LocalDateTime createdAt; private LocalDateTime updatedAt; @@ -35,7 +47,7 @@ protected void onUpdate() { } @Builder - public User(Long id, String username, String password, String email, String role, LocalDateTime createdAt) { + public User(Long id, String username, String password, String email, Role role, LocalDateTime createdAt, LocalDateTime updatedAt) { this.id = id; this.username = username; this.password = password; @@ -43,4 +55,15 @@ public User(Long id, String username, String password, String email, String role this.role = role; this.createdAt = createdAt; } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", email='" + email + '\'' + + ", role=" + role + + '}'; + } } diff --git a/src/main/java/shop/mtcoding/metamall/model/user/UserRepository.java b/src/main/java/shop/mtcoding/metamall/model/user/UserRepository.java index 293a101..2f642f9 100644 --- a/src/main/java/shop/mtcoding/metamall/model/user/UserRepository.java +++ b/src/main/java/shop/mtcoding/metamall/model/user/UserRepository.java @@ -6,7 +6,7 @@ import java.util.Optional; -public interface UserRepository extends JpaRepository { +public interface UserRepository extends JpaRepository { @Query("select u from User u where u.username = :username") Optional findByUsername(@Param("username") String username); diff --git a/src/test/java/shop/mtcoding/metamall/controller/OrderControllerTest.java b/src/test/java/shop/mtcoding/metamall/controller/OrderControllerTest.java new file mode 100644 index 0000000..3f4756a --- /dev/null +++ b/src/test/java/shop/mtcoding/metamall/controller/OrderControllerTest.java @@ -0,0 +1,159 @@ +package shop.mtcoding.metamall.controller; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.algorithms.Algorithm; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +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.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.transaction.annotation.Transactional; +import shop.mtcoding.metamall.core.exception.Exception400; +import shop.mtcoding.metamall.core.exception.Exception404; +import shop.mtcoding.metamall.model.orderproduct.OrderProduct; +import shop.mtcoding.metamall.model.orderproduct.OrderProductRepository; +import shop.mtcoding.metamall.model.ordersheet.OrderSheet; +import shop.mtcoding.metamall.model.ordersheet.OrderSheetRepository; +import shop.mtcoding.metamall.model.product.Product; +import shop.mtcoding.metamall.model.product.ProductRepository; +import shop.mtcoding.metamall.model.user.User; +import shop.mtcoding.metamall.model.user.UserRepository; + +import java.util.Date; +import java.util.List; + +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.status; + +@RunWith(SpringRunner.class) +@SpringBootTest +@AutoConfigureMockMvc +class OrderControllerTest { + + private static final String SUBJECT = "jwtstudy"; + private static final int EXP = 1000 * 60 * 60; + public static final String TOKEN_PREFIX = "Bearer "; // ์ŠคํŽ˜์ด์Šค ํ•„์š”ํ•จ + public static final String HEADER = "Authorization"; + private static final String SECRET = "๋ฉ”ํƒ€์ฝ”๋”ฉ"; + + @Autowired + private MockMvc mockMvc; + + @Autowired + private UserRepository userRepository; + + @Autowired + private ProductRepository productRepository; + + @Autowired + private OrderProductRepository orderProductRepository; + + @Autowired + private OrderSheetRepository orderSheetRepository; + + private String jwt = ""; + + + @BeforeEach + @Transactional + void setUp() { + User user = userRepository.findById(2L).get(); //ssar ์œ ์ € ๊บผ๋‚ด์„œ ๋กœ๊ทธ์ธ์‹œํ‚ค๊ธฐ +// User user = userRepository.findById(1L).get(); //seller ์œ ์ € ๊บผ๋‚ด์„œ ๋กœ๊ทธ์ธ์‹œํ‚ค๊ธฐ + + jwt = TOKEN_PREFIX + JWT.create() + .withSubject(SUBJECT) + .withExpiresAt(new Date(System.currentTimeMillis() + EXP)) + .withClaim("id", user.getId()) + .withClaim("role", user.getRole().toString()) + .sign(Algorithm.HMAC512(SECRET)); + + // ssar์˜ book1 ์ฃผ๋ฌธ ๋งŒ๋“ค๊ธฐ, seller๋Š” ์•ˆ๋จ ordersheet ์—†์Œ + Product productPS = productRepository.findByName("book1").get(); + + productPS.setQty(productPS.getQty() - 10); //10๊ฐœ ์ฃผ๋ฌธ, ์ˆ˜๋Ÿ‰ ์—…๋ฐ์ดํŠธ + OrderProduct orderProduct = OrderProduct.builder().product(productPS).count(10).orderPrice(productPS.getPrice() * 10).build(); + orderProductRepository.save(orderProduct); + + OrderSheet orderSheetPS = orderSheetRepository.findByUserId(user.getId()).get(); + + List orderProductList = orderSheetPS.getOrderProductList(); + orderProductList.add(orderProduct); + orderSheetPS.setOrderProductList(orderProductList); //orderProduct ์ถ”๊ฐ€๋œ ๋ฆฌ์ŠคํŠธ๋กœ ์—…๋ฐ์ดํŠธ +// + Integer totalPrice = orderSheetPS.getTotalPrice(); + totalPrice = totalPrice + orderProduct.getOrderPrice(); + orderSheetPS.setTotalPrice(totalPrice); + + orderProduct.setOrderSheet(orderSheetPS.getId()); + + User seller = userRepository.findById(1L).get(); //seller ์œ ์ € ๊บผ๋‚ด์„œ ๋กœ๊ทธ์ธ์‹œํ‚ค๊ธฐ + + jwt = TOKEN_PREFIX + JWT.create() + .withSubject(SUBJECT) + .withExpiresAt(new Date(System.currentTimeMillis() + EXP)) + .withClaim("id", seller.getId()) + .withClaim("role", seller.getRole().toString()) + .sign(Algorithm.HMAC512(SECRET)); + } + + @Test + @Transactional + void order() throws Exception{ + //given + String requestBody = "{\"name\":\"book1\",\"count\":\"10\"}"; //OrderDto ๋งŒ๋“ค์–ด์„œ ์ „๋‹ฌ + + //then + MvcResult result = mockMvc.perform(post("/order") + .header(HEADER, jwt) + .contentType(MediaType.APPLICATION_JSON) + .content(requestBody)) + .andExpect(status().isOk()) + .andReturn(); + + String content = result.getResponse().getContentAsString(); + System.out.println(content); + } + + @Test + @Transactional + void findAllOrder() throws Exception{ + //then + MvcResult result = mockMvc.perform(get("/findAllOrder") + .header(HEADER, jwt)) + .andExpect(status().isOk()) + .andReturn(); + + String content = result.getResponse().getContentAsString(); + System.out.println(content); + } + + @Test + @Transactional + void cancel() throws Exception{ + MvcResult result = mockMvc.perform(delete("/cancel") + .header(HEADER, jwt)) + .andExpect(status().isOk()) + .andReturn(); + + String content = result.getResponse().getContentAsString(); + System.out.println(content); + } + + @Test + @Transactional + void cancelSeller() throws Exception{ + MvcResult result = mockMvc.perform(delete("/cancel/{userId}", 2L) //ssar์˜ ์ฃผ๋ฌธ ์ทจ์†Œ + .header(HEADER, jwt)) //Role์ด Seller์—ฌ์•ผ ํ•จ + .andExpect(status().isOk()) + .andReturn(); + + String content = result.getResponse().getContentAsString(); + System.out.println(content); + } +} \ No newline at end of file diff --git a/src/test/java/shop/mtcoding/metamall/controller/ProductControllerTest.java b/src/test/java/shop/mtcoding/metamall/controller/ProductControllerTest.java new file mode 100644 index 0000000..5affa68 --- /dev/null +++ b/src/test/java/shop/mtcoding/metamall/controller/ProductControllerTest.java @@ -0,0 +1,132 @@ +package shop.mtcoding.metamall.controller; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.algorithms.Algorithm; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +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.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.transaction.annotation.Transactional; +import shop.mtcoding.metamall.model.user.User; +import shop.mtcoding.metamall.model.user.UserRepository; + +import java.util.Date; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(SpringRunner.class) +@SpringBootTest +@AutoConfigureMockMvc +class ProductControllerTest { + + private static final String SUBJECT = "jwtstudy"; + private static final int EXP = 1000 * 60 * 60; + public static final String TOKEN_PREFIX = "Bearer "; // ์ŠคํŽ˜์ด์Šค ํ•„์š”ํ•จ + public static final String HEADER = "Authorization"; + private static final String SECRET = "๋ฉ”ํƒ€์ฝ”๋”ฉ"; + + @Autowired + private MockMvc mockMvc; + + @Autowired + private UserRepository userRepository; + + private String jwt = ""; + + @BeforeEach + void setUp(){ +// User user = userRepository.findById(2L).get(); //ssar ์œ ์ € ๊บผ๋‚ด์„œ ๋กœ๊ทธ์ธ์‹œํ‚ค๊ธฐ + User user = userRepository.findById(1L).get(); //seller ์œ ์ € ๊บผ๋‚ด์„œ ๋กœ๊ทธ์ธ์‹œํ‚ค๊ธฐ + + + jwt = TOKEN_PREFIX + JWT.create() + .withSubject(SUBJECT) + .withExpiresAt(new Date(System.currentTimeMillis() + EXP)) + .withClaim("id", user.getId()) + .withClaim("role", user.getRole().toString()) + .sign(Algorithm.HMAC512(SECRET)); + // + } + + + @Test + void find() throws Exception{ + //given + String requestBody = "{\"name\":\"book1\"}"; //productDto ๋งŒ๋“ค์–ด์„œ ์ „๋‹ฌ + + //then + MvcResult result = mockMvc.perform(post("/find") + .header(HEADER, jwt) + .contentType(MediaType.APPLICATION_JSON) + .content(requestBody)) + .andExpect(status().isOk()) + .andReturn(); + + String content = result.getResponse().getContentAsString(); + System.out.println(content); + } + + @Test + void findAll() throws Exception{ + //then + MvcResult result = mockMvc.perform(get("/findAll") + .header(HEADER, jwt)) + .andExpect(status().isOk()) + .andReturn(); + + String content = result.getResponse().getContentAsString(); + System.out.println(content); + } + + @Test + void upload() throws Exception{ + //given + String requestBody = "{\"name\":\"book3\",\"price\":\"100000\",\"qty\":\"10\"}"; + + //then + MvcResult result = mockMvc.perform(post("/upload") + .header(HEADER, jwt) + .contentType(MediaType.APPLICATION_JSON) + .content(requestBody)) + .andExpect(status().isOk()) + .andReturn(); + + String content = result.getResponse().getContentAsString(); + System.out.println(content); + } + + @Test + void update() throws Exception{ + //given + String requestBody = "{\"productname\":\"book2\",\"price\":\"12345\",\"qty\":\"10\"}"; // ์ˆ˜์ •ํ•  ๋ฌผ๊ฑด ๋‚ด์šฉ book2๋ฅผ ์ˆ˜์ • + + //then + MvcResult result = mockMvc.perform(put("/update") + .header(HEADER, jwt) + .contentType(MediaType.APPLICATION_JSON) + .content(requestBody)) + .andExpect(status().isOk()) + .andReturn(); + + String content = result.getResponse().getContentAsString(); + System.out.println(content); + } + + @Test + @Transactional + void delete_Test() throws Exception{ + //then + mockMvc.perform(delete("/delete/{productname}", "book2") + .header(HEADER, jwt) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + + } +} \ No newline at end of file diff --git a/src/test/java/shop/mtcoding/metamall/controller/UserControllerTest.java b/src/test/java/shop/mtcoding/metamall/controller/UserControllerTest.java new file mode 100644 index 0000000..a1b9b64 --- /dev/null +++ b/src/test/java/shop/mtcoding/metamall/controller/UserControllerTest.java @@ -0,0 +1,63 @@ +package shop.mtcoding.metamall.controller; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +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.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; + +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(SpringRunner.class) +@SpringBootTest +@AutoConfigureMockMvc +class UserControllerTest { + + @Autowired + private MockMvc mockMvc; + + @BeforeEach + void setUp() { + } + + @Test + void login() throws Exception{ + //given + String requestBody = "{\"username\":\"ssar\", \"password\":1234}"; + + //then + MvcResult result = mockMvc.perform(post("/login") + .contentType(MediaType.APPLICATION_JSON) + .content(requestBody)) + .andExpect(status().isOk()) + .andReturn(); + String content = result.getResponse().getContentAsString(); + System.out.println(content); + } + + + + @Test + void join() throws Exception{ + //given + String requestBody = "{\"username\":\"jju\", \"password\":\"1234\", \"email\":\"1234@1234\"}"; + + //then + MvcResult result = mockMvc.perform(post("/join") + .contentType(MediaType.APPLICATION_JSON) + .content(requestBody)) + .andExpect(status().isOk()) + .andReturn(); + + String content = result.getResponse().getContentAsString(); + System.out.println(content); + } +} \ No newline at end of file diff --git a/src/test/java/shop/mtcoding/metamall/model/ordersheet/OrderSheetRepositoryTest.java b/src/test/java/shop/mtcoding/metamall/model/ordersheet/OrderSheetRepositoryTest.java new file mode 100644 index 0000000..86b21e5 --- /dev/null +++ b/src/test/java/shop/mtcoding/metamall/model/ordersheet/OrderSheetRepositoryTest.java @@ -0,0 +1,59 @@ +package shop.mtcoding.metamall.model.ordersheet; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.transaction.annotation.Transactional; +import shop.mtcoding.metamall.model.user.Role; +import shop.mtcoding.metamall.model.user.User; +import shop.mtcoding.metamall.model.user.UserRepository; + +import java.util.Optional; + +@RunWith(SpringRunner.class) +@DataJpaTest +class OrderSheetRepositoryTest { + @Autowired + private OrderSheetRepository orderSheetRepository; + @Autowired + private UserRepository userRepository; + + @BeforeEach + void setUp() { + User user = User.builder().username("jju").email("nn").password("1234").build(); //userId = 3 + user.setRole(Role.USER); + userRepository.save(user); + OrderSheet orderSheet = OrderSheet.builder().user(user).totalPrice(0).build(); + orderSheetRepository.save(orderSheet); + } + + @Test + void findByUserId() { + //given + Long userId = 3L; + + //when + Optional orderSheetOP = orderSheetRepository.findByUserId(userId); + + //then + String username = orderSheetOP.get().getUser().getUsername(); + Assertions.assertThat(username).isEqualTo("jju"); + } + + @Test + void deleteByUserId() { + //given + Long userId = 2L; + + //when + orderSheetRepository.deleteByUserId(userId); + + //then + + Assertions.assertThat(orderSheetRepository.findByUserId(userId)).isNotPresent(); + } +} \ No newline at end of file diff --git a/src/test/java/shop/mtcoding/metamall/model/product/ProductRepositoryTest.java b/src/test/java/shop/mtcoding/metamall/model/product/ProductRepositoryTest.java new file mode 100644 index 0000000..04a2bfd --- /dev/null +++ b/src/test/java/shop/mtcoding/metamall/model/product/ProductRepositoryTest.java @@ -0,0 +1,33 @@ +package shop.mtcoding.metamall.model.product; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.jupiter.api.Assertions.*; + +@RunWith(SpringRunner.class) +@DataJpaTest +class ProductRepositoryTest { + + @Autowired + private ProductRepository productRepository; + + + @Test + void findByName() { + //given + String productname = "phone"; + Product product = Product.builder().productname(productname).price(1000).qty(10).build(); // id : 3 + productRepository.save(product); + //when + Product findProduct = productRepository.findByName(productname).get(); + //then + System.out.println("find ============ " + findProduct); + Assertions.assertThat(findProduct.getId()).isEqualTo(3); + } +} \ No newline at end of file diff --git a/src/test/java/shop/mtcoding/metamall/model/user/UserRepositoryTest.java b/src/test/java/shop/mtcoding/metamall/model/user/UserRepositoryTest.java new file mode 100644 index 0000000..eca9acb --- /dev/null +++ b/src/test/java/shop/mtcoding/metamall/model/user/UserRepositoryTest.java @@ -0,0 +1,35 @@ +package shop.mtcoding.metamall.model.user; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.jupiter.api.Assertions.*; + + +@RunWith(SpringRunner.class) +@DataJpaTest +class UserRepositoryTest { + + @Autowired + private UserRepository userRepository; + + + @Test + void findByUsername() { + //given + String username = "jju"; + User user = User.builder().username(username).email("nn").password("1234").build(); //userId = 3 + userRepository.save(user); + //when + User findUser = userRepository.findByUsername(username).get(); + //then + System.out.println("find================" + findUser); + Assertions.assertThat(findUser.getId()).isEqualTo(3); + + } +} \ No newline at end of file