From 251e121be0b330f10f89ba9d36aa65b3757fca4a Mon Sep 17 00:00:00 2001 From: jinseohyun1228 <121755257+jinseohyun1228@users.noreply.github.com> Date: Sat, 13 Jul 2024 09:12:11 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B6=80=EC=82=B0=EB=8C=80=5FBE=5F=EC=A7=84?= =?UTF-8?q?=EC=84=9C=ED=98=84=5F3=EC=A3=BC=EC=B0=A8=5F2=EB=8B=A8=EA=B3=84?= =?UTF-8?q?=20(#295)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Initial commit * Initial commit * feat: set up the project * Docs : 파일 형식자 변경 * Test : 컨트롤러 잘 돌아가는지..ㅎ * Feat: 컨트롤러 작성 * Feat: 컨버터 작성 * Feat: Product 엔티티 * Feat: dto 작성 * Feat: 컨트롤러 작성 * fix : getter 없던 오류 추가 * feat: 요청 객체 추가 * fix : 1. 메서드 접근 제어자 수정, 2. id 발급 전략 선택 3. * fix : 1. 메서드 접근 제어자 수정, 2. id 발급 전략 선택 3. 쿼리파라미터 타입형 long으로 수정 4. 불필요한 예외처리 삭제 * Feat: thymeleaf 공부 * style : ProductRequest의 줄바꿈 * Feat: Product에 toString 추가 * Feat: 타임리프를 적용한 html 문서 추가 * Feat:수정을 위한 별도의 페이지 추가 * Feat: 관리자페이지 관련 컨트롤러 추가 * Feat: 폼에서 put 메서드를 쓰기 위한 빈등록 * chore : 타임리프 사용을 위한 의존성 추가 * Style : 페이지 한글로 통일 * Style : 페이지 한글로 통일 * refactor : 전체 메서드의 매핑 url에 처음을 rest로 수정 * refactor : @RestMapping 사용하고, 변수명 바꿈(오타수정등) * refactor :쿼리 파라미터를 @ModelAttribute 사용해서 한버ㅓㄴ에 받도록 * style: 필요없는 거 지움 * chore : application.properties 에 jdbc 설정 추가 * style : toString 삭제 * feat : JDBC를 사용한 레파지토리 Dao 추가 * feat : JDBC Dao 를 사용해서 DB 기능 추가 * style : MapToProductTransformer -> ProductTransformer클래스 명 변경 * docs : README.md 작성 * feat: set up the project * 부산대_BE_진서현_2주차_과제 _Step0 (#60) * Initial commit * feat: set up the project * Docs : 파일 형식자 변경 * Test : 컨트롤러 잘 돌아가는지..ㅎ * Feat: 컨트롤러 작성 * Feat: 컨버터 작성 * Feat: Product 엔티티 * Feat: dto 작성 * Feat: 컨트롤러 작성 * fix : getter 없던 오류 추가 * feat: 요청 객체 추가 * fix : 1. 메서드 접근 제어자 수정, 2. id 발급 전략 선택 3. * fix : 1. 메서드 접근 제어자 수정, 2. id 발급 전략 선택 3. 쿼리파라미터 타입형 long으로 수정 4. 불필요한 예외처리 삭제 * Feat: thymeleaf 공부 * style : ProductRequest의 줄바꿈 * Feat: Product에 toString 추가 * Feat: 타임리프를 적용한 html 문서 추가 * Feat:수정을 위한 별도의 페이지 추가 * Feat: 관리자페이지 관련 컨트롤러 추가 * Feat: 폼에서 put 메서드를 쓰기 위한 빈등록 * chore : 타임리프 사용을 위한 의존성 추가 * Style : 페이지 한글로 통일 * Style : 페이지 한글로 통일 * refactor : 전체 메서드의 매핑 url에 처음을 rest로 수정 * refactor : @RestMapping 사용하고, 변수명 바꿈(오타수정등) * refactor :쿼리 파라미터를 @ModelAttribute 사용해서 한버ㅓㄴ에 받도록 * style: 필요없는 거 지움 * chore : application.properties 에 jdbc 설정 추가 * style : toString 삭제 * feat : JDBC를 사용한 레파지토리 Dao 추가 * feat : JDBC Dao 를 사용해서 DB 기능 추가 * style : MapToProductTransformer -> ProductTransformer클래스 명 변경 * docs : README.md 작성 --------- Co-authored-by: 박재성(Jason) * docs(README.md): 기능 구현 사항 작성 * chore(controller) : 컨트롤러 명 변경 * docs(README.md): 유효성 검사 위치 추가 고민 작성 * refactor(ProductDao) : id 전략 위치 Dao로 변경 * refactor(ProductDao) : id 전략 위치 Dao로 변경 * refactor(ProductDao) : idㄹ를 Dao 내부에서 생성하도록 * build(build.gradle): validation 의존성 추가 * refactor: 상품 추가 로직에 유효성 검사를 추가하고,컨트롤러,서비스 단으로 분리하였음 * refactor: 삼품 삳제 로직에, Dao에서 유효성을 검사할 수 있게, 서비스와 컨트롤러를 구분하도록 수정 * refactor:상품 정보 변경 로직 수정 * fix( * refactor:상품 정보 찾기 로직 수정, 컨트롤러와 서비스 분리 * fix (ProductService) : Servide내에서 Dao 클래스 주입안돼서 코드 수정 * docs(READE.md): 예외 발생 처리 로직 추가 * docs(READE.md): 예외 클래스 작성 * docs(product.html) : 헤더 추가^^ * docs(error.html) : 스타일 변경 * feat: 에러 핸들러 추가 * bug(ProductValidator): 가격 유효성 검사 로직 추가 * bug(ProductValidator): 가격 유효성 검사 로직 추가 * docs : 타임리프 탬플릿 변경 * fetch: Valid 구현 * fetch: vaild 사용 * build: 의존성 추가 * docs: 구현 고민 정리 * style: * bug: 유효성 검사 안되는 오류 해결 * stlye: 패키지 구조 변경 * stlye: 패키지 구조 변경 * refactor: 타임리프 -> ajax로!! 로 변환 * refactor: 유효성 검사를 컨트롤러에서 진행 * refactor: DB id 생성 전략으로 변경 * Merge step2_ajax into step1 with preference to step2_ajax changes * chore: 패키지 변경 * feat : User 객체 구현과 레파지토리 구현 * feat : Jwt 발급 검증 util 객체 구현 * feat : Jwt 발급 검증 util 객체 구현 * feat : 회원가입 로직 구현 * feat :로그인 로직 구현 * refactor:메서드 명 수정 * fix: url 잘못 등록되어있단 부분 고침 -> 무한 리디렉션.. * fix: 쉬운 키로, 생성안되는 오류 해결 * fix: 바디데이터 응답 객체에 담기 * chore(UserException) : 패키지 위치 변경 * fix(UserJoinRequest): 알고보니까 member 페이지에서 키로 잘 전달 중임 * fix(ProductDao): id 발급 전략에 따른 변경 * fix(MemberService) : != 연산자 고침 * fix : 에러 처리 부분 * fix:jwt 검증 부분 오류 해결 * fetch: 커스텀예외 구현 * refactor:오류 핸들링 동일하게 변경 * build: 의존성 추가 * chore: ㄱ공백 추가..? * docs: 문서 작성 * 3단계 과제 요구사항에 맞춰서, 인증 토큰 키 변경 * docs : 기능 구현 계획 * build : 의존성 추가 * refactor: 위시리스트 등록시, 유저 id 가 필요해서 JWT에 id도 추가함(DB 접근 ㄴㄴ) * fetch : 위시리스트 상품 Dto, Entity, Dao 구현 * refactor: jwt 발급시 id도 추가 * refactor: jwt 발급시 id도 추가 * chore : * chore : 수정사항 딱히 없음 * refactor: 보안을 위해 password를 뺌 * refactor: 로그인, 회원가입, 유효성 검사 추가 * 부산대 BE 진서현 2주차 step1 (#198) * Initial commit * feat: set up the project * Docs : 파일 형식자 변경 * Test : 컨트롤러 잘 돌아가는지..ㅎ * Feat: 컨트롤러 작성 * Feat: 컨버터 작성 * Feat: Product 엔티티 * Feat: dto 작성 * Feat: 컨트롤러 작성 * fix : getter 없던 오류 추가 * feat: 요청 객체 추가 * fix : 1. 메서드 접근 제어자 수정, 2. id 발급 전략 선택 3. * fix : 1. 메서드 접근 제어자 수정, 2. id 발급 전략 선택 3. 쿼리파라미터 타입형 long으로 수정 4. 불필요한 예외처리 삭제 * Feat: thymeleaf 공부 * style : ProductRequest의 줄바꿈 * Feat: Product에 toString 추가 * Feat: 타임리프를 적용한 html 문서 추가 * Feat:수정을 위한 별도의 페이지 추가 * Feat: 관리자페이지 관련 컨트롤러 추가 * Feat: 폼에서 put 메서드를 쓰기 위한 빈등록 * chore : 타임리프 사용을 위한 의존성 추가 * Style : 페이지 한글로 통일 * Style : 페이지 한글로 통일 * refactor : 전체 메서드의 매핑 url에 처음을 rest로 수정 * refactor : @RestMapping 사용하고, 변수명 바꿈(오타수정등) * refactor :쿼리 파라미터를 @ModelAttribute 사용해서 한버ㅓㄴ에 받도록 * style: 필요없는 거 지움 * chore : application.properties 에 jdbc 설정 추가 * style : toString 삭제 * feat : JDBC를 사용한 레파지토리 Dao 추가 * feat : JDBC Dao 를 사용해서 DB 기능 추가 * style : MapToProductTransformer -> ProductTransformer클래스 명 변경 * docs : README.md 작성 * docs(README.md): 기능 구현 사항 작성 * chore(controller) : 컨트롤러 명 변경 * docs(README.md): 유효성 검사 위치 추가 고민 작성 * refactor(ProductDao) : id 전략 위치 Dao로 변경 * refactor(ProductDao) : id 전략 위치 Dao로 변경 * refactor(ProductDao) : idㄹ를 Dao 내부에서 생성하도록 * build(build.gradle): validation 의존성 추가 * refactor: 상품 추가 로직에 유효성 검사를 추가하고,컨트롤러,서비스 단으로 분리하였음 * refactor: 삼품 삳제 로직에, Dao에서 유효성을 검사할 수 있게, 서비스와 컨트롤러를 구분하도록 수정 * refactor:상품 정보 변경 로직 수정 * fix( * refactor:상품 정보 찾기 로직 수정, 컨트롤러와 서비스 분리 * fix (ProductService) : Servide내에서 Dao 클래스 주입안돼서 코드 수정 * docs(READE.md): 예외 발생 처리 로직 추가 * docs(READE.md): 예외 클래스 작성 * docs(product.html) : 헤더 추가^^ * docs(error.html) : 스타일 변경 * feat: 에러 핸들러 추가 * bug(ProductValidator): 가격 유효성 검사 로직 추가 * bug(ProductValidator): 가격 유효성 검사 로직 추가 * docs : 타임리프 탬플릿 변경 * fetch: Valid 구현 * fetch: vaild 사용 * build: 의존성 추가 * docs: 구현 고민 정리 * style: * bug: 유효성 검사 안되는 오류 해결 * stlye: 패키지 구조 변경 * stlye: 패키지 구조 변경 * refactor: 타임리프 -> ajax로!! 로 변환 * refactor: 유효성 검사를 컨트롤러에서 진행 * refactor: DB id 생성 전략으로 변경 * Merge step2_ajax into step1 with preference to step2_ajax changes --------- Co-authored-by: 박재성(Jason) * 부산대 BE_진서현_2주차 과제(2단계) (#332) * Initial commit * feat: set up the project * Docs : 파일 형식자 변경 * Test : 컨트롤러 잘 돌아가는지..ㅎ * Feat: 컨트롤러 작성 * Feat: 컨버터 작성 * Feat: Product 엔티티 * Feat: dto 작성 * Feat: 컨트롤러 작성 * fix : getter 없던 오류 추가 * feat: 요청 객체 추가 * fix : 1. 메서드 접근 제어자 수정, 2. id 발급 전략 선택 3. * fix : 1. 메서드 접근 제어자 수정, 2. id 발급 전략 선택 3. 쿼리파라미터 타입형 long으로 수정 4. 불필요한 예외처리 삭제 * Feat: thymeleaf 공부 * style : ProductRequest의 줄바꿈 * Feat: Product에 toString 추가 * Feat: 타임리프를 적용한 html 문서 추가 * Feat:수정을 위한 별도의 페이지 추가 * Feat: 관리자페이지 관련 컨트롤러 추가 * Feat: 폼에서 put 메서드를 쓰기 위한 빈등록 * chore : 타임리프 사용을 위한 의존성 추가 * Style : 페이지 한글로 통일 * Style : 페이지 한글로 통일 * refactor : 전체 메서드의 매핑 url에 처음을 rest로 수정 * refactor : @RestMapping 사용하고, 변수명 바꿈(오타수정등) * refactor :쿼리 파라미터를 @ModelAttribute 사용해서 한버ㅓㄴ에 받도록 * style: 필요없는 거 지움 * chore : application.properties 에 jdbc 설정 추가 * style : toString 삭제 * feat : JDBC를 사용한 레파지토리 Dao 추가 * feat : JDBC Dao 를 사용해서 DB 기능 추가 * style : MapToProductTransformer -> ProductTransformer클래스 명 변경 * docs : README.md 작성 * docs(README.md): 기능 구현 사항 작성 * chore(controller) : 컨트롤러 명 변경 * docs(README.md): 유효성 검사 위치 추가 고민 작성 * refactor(ProductDao) : id 전략 위치 Dao로 변경 * refactor(ProductDao) : id 전략 위치 Dao로 변경 * refactor(ProductDao) : idㄹ를 Dao 내부에서 생성하도록 * build(build.gradle): validation 의존성 추가 * refactor: 상품 추가 로직에 유효성 검사를 추가하고,컨트롤러,서비스 단으로 분리하였음 * refactor: 삼품 삳제 로직에, Dao에서 유효성을 검사할 수 있게, 서비스와 컨트롤러를 구분하도록 수정 * refactor:상품 정보 변경 로직 수정 * fix( * refactor:상품 정보 찾기 로직 수정, 컨트롤러와 서비스 분리 * fix (ProductService) : Servide내에서 Dao 클래스 주입안돼서 코드 수정 * docs(READE.md): 예외 발생 처리 로직 추가 * docs(READE.md): 예외 클래스 작성 * docs(product.html) : 헤더 추가^^ * docs(error.html) : 스타일 변경 * feat: 에러 핸들러 추가 * bug(ProductValidator): 가격 유효성 검사 로직 추가 * bug(ProductValidator): 가격 유효성 검사 로직 추가 * docs : 타임리프 탬플릿 변경 * fetch: Valid 구현 * fetch: vaild 사용 * build: 의존성 추가 * docs: 구현 고민 정리 * style: * bug: 유효성 검사 안되는 오류 해결 * stlye: 패키지 구조 변경 * stlye: 패키지 구조 변경 * refactor: 타임리프 -> ajax로!! 로 변환 * refactor: 유효성 검사를 컨트롤러에서 진행 * refactor: DB id 생성 전략으로 변경 * Merge step2_ajax into step1 with preference to step2_ajax changes * chore: 패키지 변경 * feat : User 객체 구현과 레파지토리 구현 * feat : Jwt 발급 검증 util 객체 구현 * feat : Jwt 발급 검증 util 객체 구현 * feat : 회원가입 로직 구현 * feat :로그인 로직 구현 * refactor:메서드 명 수정 * fix: url 잘못 등록되어있단 부분 고침 -> 무한 리디렉션.. * fix: 쉬운 키로, 생성안되는 오류 해결 * fix: 바디데이터 응답 객체에 담기 * chore(UserException) : 패키지 위치 변경 * fix(UserJoinRequest): 알고보니까 member 페이지에서 키로 잘 전달 중임 * fix(ProductDao): id 발급 전략에 따른 변경 * fix(MemberService) : != 연산자 고침 * fix : 에러 처리 부분 * fix:jwt 검증 부분 오류 해결 * fetch: 커스텀예외 구현 * refactor:오류 핸들링 동일하게 변경 * build: 의존성 추가 * chore: ㄱ공백 추가..? * docs: 문서 작성 --------- Co-authored-by: 박재성(Jason) * refactor: 에러 메시지를 enum으로 구현과 적용 * test : 유저 회원가입 로직 테스트 구현 * chore: member -> user로 통일 * chore: member -> user로 통일 * Refactor: URI를 Restful 한 설계에 맞춰변경 * Refactor: jwt 인증에 필요없는 이메일 값을 제외함, enum을 사용해서 에러 메시지를 설정함, HttpHeaders.AUTHORIZATION * refator:products 반환 방식을 Map 형태에서 객체 그대로 반환하는 방법으로 변경 * refactor: user의 role enum 적용 * fetch(AuthUtil): 세션의 user가져오는 메서드 추가 * refactor: AuthUtil -> JwtUtil로 클래스 명 변경 * refactor: AuthUtil -> Jwtutil 변경 * style: 패키지 구조 변경 * refactor: session에서 user 가져오기 어노테이션으로 구현 * chore: 위치 변경 등 * refactor: 테이블 생성 위치 스크립트로 변경 * 테스트 파일 올라가도록 설정 변경 * docs : 기능 요구사항 정리 * build:JPA 의존성 추가 * fetch: wishProduct 에 JPA 도입 * fetch: User JPA 도입 * refator: product를 JPA로 관리 * fetch: 제품 관련 에러 추가 * chore: 자바 코드컨벤션 지키기 * chore: 자바 코드컨벤션 지키기 * refator: wishProduct Serive로 변경 * fix: User객체 ENUM 적용으로 인한 테스트 코드 오류 수정 * refactor : WishProductRepository 의 deleteByProductIdAndUserId메서드 반환값 수정 * fetch: WishProductRepositoryTest 추가 * fetch: ProductRepositoryTest 추가 * fetch: UserRepositoryTest 추가 * chore:빈칸 , 공백 삭제 등 * git : 충돌 해결 * git : 충돌 해결 * refator: Product 업데이트 시 setter가 아닌 update메서드를 사용할 수 있도록 변경 * refator: Product 업데이트 시 setter가 아닌 update메서드를 사용할 수 있도록 변경, + AdminProductController에서 Admin삭제 * fix : 불필요한 @Transactional삭제 * fetch : 위시물건: 물건-유저 연관관계 등록 * refactor: 레파지토리 반환값을 Optional으로 변경 * refactor(WishProductController): 반환 메시지를 영어로 * fetch : Aop Aspect로 메서드 권한 검사하기 * refactor : Product에 판매자 연관관계 추가 * refactor: 응답을 위한 ProductResponce추가 * refactor: WishProductController에서 getProducts()의 반환값 ProductResponce로 수정 * style: 전체 코드 컨벤션 수정 * fix : 회원가입시 role이 소문자로 들어오는 부분 수정 * fix... : aspect 왜 안될까 * fix: Aspect 도입 고민 중으로 해당 로직 삭제 --------- Co-authored-by: 박재성(Jason) --- .../java/gift/main/Exception/ErrorCode.java | 8 ++- .../Exception/GlobalExceptionHandler.java | 3 +- src/main/java/gift/main/MainController.java | 1 - .../java/gift/main/annotation/AdminCheck.java | 11 ++++ .../gift/main/annotation/IsValidName.java | 6 +- src/main/java/gift/main/aop/AdminAspect.java | 27 +++++++++ src/main/java/gift/main/config/WebConfig.java | 2 + .../controller/AdminProductController.java | 54 ----------------- .../main/controller/ProductController.java | 59 +++++++++++++++++++ .../controller/WishProductController.java | 20 +++---- src/main/java/gift/main/dto/ProductDto.java | 36 ----------- .../java/gift/main/dto/ProductRequest.java | 7 +-- .../java/gift/main/dto/ProductResponce.java | 10 ++++ src/main/java/gift/main/dto/UserDto.java | 2 +- .../java/gift/main/dto/UserJoinRequest.java | 2 +- src/main/java/gift/main/entity/Product.java | 34 ++++++----- src/main/java/gift/main/entity/User.java | 1 - .../java/gift/main/entity/WishProduct.java | 34 +++++------ .../main/interceptor/AuthInterceptor.java | 2 +- .../main/repository/ProductRepository.java | 3 + .../gift/main/repository/UserRepository.java | 8 ++- .../repository/WishProductRepository.java | 5 +- .../resolver/SessionUserArgumentResolver.java | 2 - .../gift/main/service/ProductService.java | 41 +++++++------ .../java/gift/main/service/UserService.java | 16 +++-- .../gift/main/service/WishProductService.java | 30 ++++++++-- src/main/java/gift/main/util/JwtUtil.java | 6 +- src/main/resources/application.properties | 6 +- src/main/resources/templates/product.html | 3 + src/main/resources/templates/user.html | 2 +- .../repository/ProductRepositoryTest.java | 9 +-- .../main/repository/UserRepositoryTest.java | 2 - .../repository/WishProductRepositoryTest.java | 2 - 33 files changed, 250 insertions(+), 204 deletions(-) create mode 100644 src/main/java/gift/main/annotation/AdminCheck.java create mode 100644 src/main/java/gift/main/aop/AdminAspect.java delete mode 100644 src/main/java/gift/main/controller/AdminProductController.java create mode 100644 src/main/java/gift/main/controller/ProductController.java delete mode 100644 src/main/java/gift/main/dto/ProductDto.java create mode 100644 src/main/java/gift/main/dto/ProductResponce.java diff --git a/src/main/java/gift/main/Exception/ErrorCode.java b/src/main/java/gift/main/Exception/ErrorCode.java index 578d92224..1a477bd5e 100644 --- a/src/main/java/gift/main/Exception/ErrorCode.java +++ b/src/main/java/gift/main/Exception/ErrorCode.java @@ -8,16 +8,22 @@ public enum ErrorCode { EMPTY_NAME(HttpStatus.BAD_REQUEST, "이름을 채워주세요"), EMPTY_PASSWORD(HttpStatus.BAD_REQUEST, "비밀번호를 채워주세요"), + //인증관련 NO_TOKEN(HttpStatus.UNAUTHORIZED, "토큰이 비어있습니다."), INVALID_TOKEN(HttpStatus.UNAUTHORIZED, "인증에 실패했습니다."), + NO_PERMISSION(HttpStatus.UNAUTHORIZED, "해당 페이지에 권합이 없습니다."), + NO_PERMISSION_PRODUCT(HttpStatus.UNAUTHORIZED, "해당 상품에 권합이 없습니다."), + + //로그인 ALREADY_EMAIL(HttpStatus.BAD_REQUEST, "이미 존재하는 이메일입니다."), ERROR_LOGIN(HttpStatus.BAD_REQUEST, "이메일과 비밀번호를 정확히 입력해주세요"), + USER_NOT_FOUND(HttpStatus.BAD_REQUEST, "이메일과 비밀번호를 정확히 입력해주세요"), + PRODUCT_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 제품을 찾을 수 없습니다."), ; //이메일과 비밀번호 코드가 401이 아닌 400인 이유: 코드를 보고 해당 유저가 있다고 판단할 것 같아서 - private final HttpStatus httpStatus; private final String errorMessage; diff --git a/src/main/java/gift/main/Exception/GlobalExceptionHandler.java b/src/main/java/gift/main/Exception/GlobalExceptionHandler.java index 15819379b..713413e46 100644 --- a/src/main/java/gift/main/Exception/GlobalExceptionHandler.java +++ b/src/main/java/gift/main/Exception/GlobalExceptionHandler.java @@ -1,4 +1,5 @@ package gift.main.Exception; + import io.jsonwebtoken.security.SignatureException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -20,7 +21,7 @@ public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public String handleGeneralException(Model model, Exception e) { - model.addAttribute("error",e.getMessage()); + model.addAttribute("error", e.getMessage()); String refererUrl = " http://localhost:8080/spring-gift/"; model.addAttribute("refererUrl", refererUrl); return "error/error"; diff --git a/src/main/java/gift/main/MainController.java b/src/main/java/gift/main/MainController.java index 3915bcc64..69b4e3148 100644 --- a/src/main/java/gift/main/MainController.java +++ b/src/main/java/gift/main/MainController.java @@ -1,6 +1,5 @@ package gift.main; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/src/main/java/gift/main/annotation/AdminCheck.java b/src/main/java/gift/main/annotation/AdminCheck.java new file mode 100644 index 000000000..b10e612fc --- /dev/null +++ b/src/main/java/gift/main/annotation/AdminCheck.java @@ -0,0 +1,11 @@ +package gift.main.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.METHOD, ElementType.TYPE}) //적용될 부분 +@Retention(RetentionPolicy.RUNTIME) +public @interface AdminCheck { +} diff --git a/src/main/java/gift/main/annotation/IsValidName.java b/src/main/java/gift/main/annotation/IsValidName.java index 86bfcfef6..8d10a7b11 100644 --- a/src/main/java/gift/main/annotation/IsValidName.java +++ b/src/main/java/gift/main/annotation/IsValidName.java @@ -5,11 +5,7 @@ import jakarta.validation.Constraint; import jakarta.validation.Payload; -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; -import java.lang.annotation.ElementType; -import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.*; @Documented diff --git a/src/main/java/gift/main/aop/AdminAspect.java b/src/main/java/gift/main/aop/AdminAspect.java new file mode 100644 index 000000000..23d61df54 --- /dev/null +++ b/src/main/java/gift/main/aop/AdminAspect.java @@ -0,0 +1,27 @@ +package gift.main.aop; + +import gift.main.Exception.CustomException; +import gift.main.Exception.ErrorCode; +import gift.main.annotation.SessionUser; +import gift.main.dto.UserVo; +import gift.main.entity.Role; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; + +/* +도입 유지 고민... + */ + +@Component +@Aspect +public class AdminAspect { + +// @Before("execution(* gift.main.controller.ProductController.*(..))") + public void checkAdmin(@SessionUser UserVo userVo) { + System.out.println("실행된다."); + if (!Role.ADMIN.equals(userVo.getRole())) { + throw new CustomException(ErrorCode.NO_PERMISSION); + } + } +} diff --git a/src/main/java/gift/main/config/WebConfig.java b/src/main/java/gift/main/config/WebConfig.java index 27817de81..11466a829 100644 --- a/src/main/java/gift/main/config/WebConfig.java +++ b/src/main/java/gift/main/config/WebConfig.java @@ -3,6 +3,7 @@ import gift.main.interceptor.AuthInterceptor; import gift.main.resolver.SessionUserArgumentResolver; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; @@ -12,6 +13,7 @@ @Configuration @EnableWebMvc +//@EnableAspectJAutoProxy(proxyTargetClass=true) public class WebConfig implements WebMvcConfigurer { private final AuthInterceptor authLoginInterceptor; diff --git a/src/main/java/gift/main/controller/AdminProductController.java b/src/main/java/gift/main/controller/AdminProductController.java deleted file mode 100644 index 9b051c8be..000000000 --- a/src/main/java/gift/main/controller/AdminProductController.java +++ /dev/null @@ -1,54 +0,0 @@ -package gift.main.controller; - -import gift.main.dto.ProductRequest; -import gift.main.entity.Product; -import gift.main.service.ProductService; -import jakarta.validation.Valid; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@RestController -@RequestMapping("/admin") -public class AdminProductController { - private final ProductService productService; - - public AdminProductController(ProductService productService) { - this.productService = productService; - } - - @GetMapping("/products") - public ResponseEntity getProducts() { - List products = productService.getProducts(); - return ResponseEntity.ok(products); - } - - @GetMapping("/product/{id}") - public ResponseEntity findProduct(@PathVariable(name = "id") Long id) { - Product product = productService.getProduct(id); - return ResponseEntity.ok(product); - } - - @PostMapping("/product") - public ResponseEntity addProduct(@Valid @RequestBody ProductRequest productRequest) { - productService.addProduct(productRequest); - return ResponseEntity.ok("Product added successfully"); - } - - @PutMapping("/product") - public ResponseEntity updateProduct(@RequestParam(value = "id") long id,@Valid @RequestBody ProductRequest productRequest) { - productService.updateProduct(id, productRequest); - return ResponseEntity.ok("Product updated successfully"); - } - - @DeleteMapping("/product/{id}") - public ResponseEntity deleteProduct(@PathVariable(name = "id") Long id) { - productService.deleteProduct(id); - return ResponseEntity.ok("Product deleted successfully"); - } - - -} diff --git a/src/main/java/gift/main/controller/ProductController.java b/src/main/java/gift/main/controller/ProductController.java new file mode 100644 index 000000000..0fb98625c --- /dev/null +++ b/src/main/java/gift/main/controller/ProductController.java @@ -0,0 +1,59 @@ +package gift.main.controller; + +import gift.main.annotation.AdminCheck; +import gift.main.annotation.SessionUser; +import gift.main.dto.ProductRequest; +import gift.main.dto.ProductResponce; +import gift.main.dto.UserVo; +import gift.main.service.ProductService; +import jakarta.validation.Valid; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/admin") +public class ProductController { + private final ProductService productService; + + public ProductController(ProductService productService) { + this.productService = productService; + } + + @GetMapping("/products") + public ResponseEntity getProducts(@SessionUser UserVo sessionUserVo) { + List products = productService.getProducts(); + return ResponseEntity.ok(products); + } + + @GetMapping("/product/{id}") + public ResponseEntity findProduct(@PathVariable(name = "id") Long id, @SessionUser UserVo sessionUserVo) { + ProductResponce product = productService.getProduct(id); + return ResponseEntity.ok(product); + } + + @PostMapping("/product") + public ResponseEntity addProduct(@Valid @RequestBody ProductRequest productRequest, @SessionUser UserVo sessionUserVo) { + productService.addProduct(productRequest, sessionUserVo); + return ResponseEntity.ok("Product added successfully"); + } + + @PutMapping("/product") + public ResponseEntity updateProduct( + @RequestParam(value = "id") long id, + @Valid @RequestBody ProductRequest productRequest, + @SessionUser UserVo sessionUserVo) { + + productService.updateProduct(id, productRequest); + return ResponseEntity.ok("Product added successfully"); + } + + @DeleteMapping("/product/{id}") + public ResponseEntity deleteProduct(@PathVariable(name = "id") Long id) { + productService.deleteProduct(id); + return ResponseEntity.ok("Product deleted successfully"); + } + + +} diff --git a/src/main/java/gift/main/controller/WishProductController.java b/src/main/java/gift/main/controller/WishProductController.java index 25870bedf..79f4d0902 100644 --- a/src/main/java/gift/main/controller/WishProductController.java +++ b/src/main/java/gift/main/controller/WishProductController.java @@ -1,6 +1,7 @@ package gift.main.controller; import gift.main.annotation.SessionUser; +import gift.main.dto.ProductResponce; import gift.main.dto.UserVo; import gift.main.entity.Product; import gift.main.entity.WishProduct; @@ -10,9 +11,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; -import java.util.HashMap; import java.util.List; -import java.util.Map; @RestController @RequestMapping("/product") @@ -28,32 +27,27 @@ public WishProductController(WishProductService wishProductService, ProductServi @GetMapping public ResponseEntity getProducts() { - List products = productService.getProducts(); - Map> response = new HashMap<>(); - response.put("products", products); - return ResponseEntity.ok(response); + List products = productService.getProducts(); + return ResponseEntity.ok(products); } @DeleteMapping("/wishlist/{productId}") @Transactional public ResponseEntity deleteWishProduct(@PathVariable(name = "productId") Long productId, @SessionUser UserVo sessionUserVo) { wishProductService.deleteProducts(productId, sessionUserVo); - return ResponseEntity.ok("성공적으로 삭제 완료~!"); + return ResponseEntity.ok("successfully deleted the item to your wishlist"); } @GetMapping("/wishlist") public ResponseEntity getWishProduct(@SessionUser UserVo sessionUser) { List wishProducts = wishProductService.getWishProducts(sessionUser.getId()); - Map> response = new HashMap<>(); - response.put("wishlistProducts", wishProducts); - return ResponseEntity.ok(response); - } + return ResponseEntity.ok(wishProducts); } @Transactional @PostMapping("/wishlist/{productId}") - public ResponseEntity addWishlistProduct(@PathVariable(name = "productId") Long productId, @SessionUser UserVo sessionUser){ + public ResponseEntity addWishlistProduct(@PathVariable(name = "productId") Long productId, @SessionUser UserVo sessionUser) { wishProductService.addWishlistProduct(productId, sessionUser); - return ResponseEntity.ok("성공적으로 등록~"); + return ResponseEntity.ok("successfully added the item to your wishlist"); } } diff --git a/src/main/java/gift/main/dto/ProductDto.java b/src/main/java/gift/main/dto/ProductDto.java deleted file mode 100644 index 11224f692..000000000 --- a/src/main/java/gift/main/dto/ProductDto.java +++ /dev/null @@ -1,36 +0,0 @@ -package gift.main.dto; - - -public class ProductDto { - - private String name; - - private int price; - - private String imageUrl; - - public ProductDto(String name, int price, String imageUrl) { - this.name = name; - this.price = price; - this.imageUrl = imageUrl; - } - - public ProductDto(ProductRequest productRequest) { - this.name = productRequest.name(); - this.price = productRequest.price(); - this.imageUrl = productRequest.imageUrl(); - } - - - public String getName() { - return name; - } - - public int getPrice() { - return price; - } - - public String getImageUrl() { - return imageUrl; - } -} diff --git a/src/main/java/gift/main/dto/ProductRequest.java b/src/main/java/gift/main/dto/ProductRequest.java index 0a86d4222..2d85c6b44 100644 --- a/src/main/java/gift/main/dto/ProductRequest.java +++ b/src/main/java/gift/main/dto/ProductRequest.java @@ -5,8 +5,7 @@ import jakarta.validation.constraints.PositiveOrZero; public record ProductRequest( - @IsValidName String name, - @PositiveOrZero(message = "상품 가격은 음수일 수 없습니다.") int price, - @NotBlank(message = "이미지주소를 등록해주세요.") String imageUrl) { - + @IsValidName String name, + @PositiveOrZero(message = "상품 가격은 음수일 수 없습니다.") int price, + @NotBlank(message = "이미지주소를 등록해주세요.") String imageUrl) { } diff --git a/src/main/java/gift/main/dto/ProductResponce.java b/src/main/java/gift/main/dto/ProductResponce.java new file mode 100644 index 000000000..e4102e94e --- /dev/null +++ b/src/main/java/gift/main/dto/ProductResponce.java @@ -0,0 +1,10 @@ +package gift.main.dto; + +import gift.main.entity.Product; + +public record ProductResponce(Long id, String name, int price, String imageUrl, String seller) { + + public ProductResponce(Product product) { + this(product.getId(), product.getName(), product.getPrice(), product.getImageUrl(), product.getSellerName()); + } +} diff --git a/src/main/java/gift/main/dto/UserDto.java b/src/main/java/gift/main/dto/UserDto.java index f0fc27aa3..962969679 100644 --- a/src/main/java/gift/main/dto/UserDto.java +++ b/src/main/java/gift/main/dto/UserDto.java @@ -1,7 +1,7 @@ package gift.main.dto; -public class UserDto { +public class UserDto { private final String name; private final String email; private final String password; diff --git a/src/main/java/gift/main/dto/UserJoinRequest.java b/src/main/java/gift/main/dto/UserJoinRequest.java index b78d07ac0..5482f9bb2 100644 --- a/src/main/java/gift/main/dto/UserJoinRequest.java +++ b/src/main/java/gift/main/dto/UserJoinRequest.java @@ -11,7 +11,7 @@ public record UserJoinRequest( String email, @NotBlank(message = "패스워드 입력해주세요.") String password, - String role ) { + String role) { } diff --git a/src/main/java/gift/main/entity/Product.java b/src/main/java/gift/main/entity/Product.java index 4376cbb0d..1d5436d2d 100644 --- a/src/main/java/gift/main/entity/Product.java +++ b/src/main/java/gift/main/entity/Product.java @@ -12,44 +12,44 @@ public class Product { @Column(nullable = false) private String name; + @Column(nullable = false, columnDefinition = "decimal(10,2) check (price >= 0)") private int price; + @Column(nullable = false) private String imageUrl; + @ManyToOne + @JoinColumn(name = "seller_id") + private User seller; + public Product() { } - public Product(ProductRequest productRequest) { + public Product(ProductRequest productRequest, User seller) { this.name = productRequest.name(); this.price = productRequest.price(); this.imageUrl = productRequest.imageUrl(); + this.seller = seller; } - public Product(long id, String name, int price, String imageUrl) { - this.id = id; + public Product(String name, int price, String imageUrl, User seller) { this.name = name; this.price = price; this.imageUrl = imageUrl; + this.seller = seller; } - public Product(String name, int price, String imageUrl) { - this.name = name; - this.price = price; - this.imageUrl = imageUrl; - + public void updateValue(ProductRequest productRequest) { + this.name = productRequest.name(); + this.price = productRequest.price(); + this.imageUrl = productRequest.imageUrl(); } - public void setName(String name) { + public void updateValue(String name, int price, String imageUrl) { this.name = name; - } - - public void setPrice(int price) { this.price = price; - } - - public void setImageUrl(String imageUrl) { this.imageUrl = imageUrl; } @@ -69,4 +69,8 @@ public String getImageUrl() { return imageUrl; } + public String getSellerName() { + return seller.getName(); + } + } diff --git a/src/main/java/gift/main/entity/User.java b/src/main/java/gift/main/entity/User.java index 15fe9905a..40fd5a46a 100644 --- a/src/main/java/gift/main/entity/User.java +++ b/src/main/java/gift/main/entity/User.java @@ -42,7 +42,6 @@ public User(String name, String email, String password, Role role) { } - public User(long id, String name, String email, String password, String role) { this.id = id; this.name = name; diff --git a/src/main/java/gift/main/entity/WishProduct.java b/src/main/java/gift/main/entity/WishProduct.java index 8ee2bb0eb..95181e242 100644 --- a/src/main/java/gift/main/entity/WishProduct.java +++ b/src/main/java/gift/main/entity/WishProduct.java @@ -9,33 +9,33 @@ public class WishProduct { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column(nullable = false) - private Long productId; - @Column(nullable = false) - private Long userId; - - public WishProduct(Long productId, Long userId) { - this.productId = productId; - this.userId = userId; - } + @ManyToOne + @JoinColumn(name = "prduct_id") + public Product product; + + @ManyToOne + @JoinColumn(name = "user_id") + public User user; public WishProduct() { } - public Long getProductId() { - return productId; + public WishProduct(Product product, User user) { + this.product = product; + this.user = user; } - public Long getUserId() { - return userId; + public Long getId() { + return id; } - public void setId(Long id) { - this.id = id; + public Product getProduct() { + return product; } - public Long getId() { - return id; + public User getUser() { + return user; + } } diff --git a/src/main/java/gift/main/interceptor/AuthInterceptor.java b/src/main/java/gift/main/interceptor/AuthInterceptor.java index b4bf8e097..bc4a04014 100644 --- a/src/main/java/gift/main/interceptor/AuthInterceptor.java +++ b/src/main/java/gift/main/interceptor/AuthInterceptor.java @@ -1,8 +1,8 @@ package gift.main.interceptor; -import gift.main.dto.UserVo; import gift.main.Exception.CustomException; import gift.main.Exception.ErrorCode; +import gift.main.dto.UserVo; import gift.main.util.JwtUtil; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; diff --git a/src/main/java/gift/main/repository/ProductRepository.java b/src/main/java/gift/main/repository/ProductRepository.java index ca96bef5d..609cac2f5 100644 --- a/src/main/java/gift/main/repository/ProductRepository.java +++ b/src/main/java/gift/main/repository/ProductRepository.java @@ -4,7 +4,10 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface ProductRepository extends JpaRepository { + Optional findById(Long id); } diff --git a/src/main/java/gift/main/repository/UserRepository.java b/src/main/java/gift/main/repository/UserRepository.java index 0e195ca2d..81b8ef5d5 100644 --- a/src/main/java/gift/main/repository/UserRepository.java +++ b/src/main/java/gift/main/repository/UserRepository.java @@ -4,9 +4,15 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface UserRepository extends JpaRepository { boolean existsByEmail(String email); - User findByEmailAndPassword(String email, String password); + Optional findByEmailAndPassword(String email, String password); + + Optional findByEmail(String email); + + Optional findById(Long id); } diff --git a/src/main/java/gift/main/repository/WishProductRepository.java b/src/main/java/gift/main/repository/WishProductRepository.java index 29ea500e6..80abd5fc3 100644 --- a/src/main/java/gift/main/repository/WishProductRepository.java +++ b/src/main/java/gift/main/repository/WishProductRepository.java @@ -5,9 +5,12 @@ import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; @Repository public interface WishProductRepository extends JpaRepository { void deleteByProductIdAndUserId(Long productId, Long userId); - List findAllByUserId(Long userId); + + Optional> findAllByUserId(Long userId); + } diff --git a/src/main/java/gift/main/resolver/SessionUserArgumentResolver.java b/src/main/java/gift/main/resolver/SessionUserArgumentResolver.java index fcd49ead6..0b8a73cb6 100644 --- a/src/main/java/gift/main/resolver/SessionUserArgumentResolver.java +++ b/src/main/java/gift/main/resolver/SessionUserArgumentResolver.java @@ -4,7 +4,6 @@ import gift.main.dto.UserVo; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpSession; -import jakarta.websocket.Session; import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; @@ -19,7 +18,6 @@ public boolean supportsParameter(MethodParameter parameter) { } - @Override //넣어줄 반환값을 넣어준다. public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest(HttpServletRequest.class); diff --git a/src/main/java/gift/main/service/ProductService.java b/src/main/java/gift/main/service/ProductService.java index 5e7032135..4b9f6d6a8 100644 --- a/src/main/java/gift/main/service/ProductService.java +++ b/src/main/java/gift/main/service/ProductService.java @@ -3,30 +3,42 @@ import gift.main.Exception.CustomException; import gift.main.Exception.ErrorCode; import gift.main.dto.ProductRequest; +import gift.main.dto.ProductResponce; +import gift.main.dto.UserVo; import gift.main.entity.Product; +import gift.main.entity.User; import gift.main.repository.ProductRepository; +import gift.main.repository.UserRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; - import java.util.List; +import java.util.stream.Collectors; @Service public class ProductService { private final ProductRepository productRepository; + private final UserRepository userRepository; - public ProductService(ProductRepository productRepository) { + public ProductService(ProductRepository productRepository, UserRepository userRepository) { this.productRepository = productRepository; + this.userRepository = userRepository; } - public List getProducts() { - List productList = productRepository.findAll(); - return productList; + public List getProducts() { + List productResponces = productRepository.findAll() + .stream() + .map(product -> new ProductResponce(product)) //스트림 요소를 다른 형태로 바꾸는 메서드 + .collect(Collectors.toList()); //변환된 요소 각각을 리스트로~! + + return productResponces; } @Transactional - public void addProduct(ProductRequest productRequest) { - Product product = new Product(productRequest); + public void addProduct(ProductRequest productRequest, UserVo user) { + User seller = userRepository.findById(user.getId()) + .orElseThrow(() -> new CustomException(ErrorCode.USER_NOT_FOUND)); + Product product = new Product(productRequest, seller); productRepository.save(product); } @@ -36,27 +48,22 @@ public void deleteProduct(long id) { } @Transactional - public void updateProduct(long id,ProductRequest productRequest) { + public void updateProduct(long id, ProductRequest productRequest) { Product product = productRepository.findById(id) .orElseThrow(() -> new CustomException(ErrorCode.PRODUCT_NOT_FOUND)); - product.setName(product.getName()); - product.setPrice(product.getPrice()); - product.setImageUrl(product.getImageUrl()); - + product.updateValue(productRequest); productRepository.save(product); } - public Product getProduct(long id) { + public ProductResponce getProduct(long id) { Product product = productRepository.findById(id) .orElseThrow(() -> new CustomException(ErrorCode.PRODUCT_NOT_FOUND)); - return product; + return new ProductResponce(product); + //변경은 어디서? } - - - } diff --git a/src/main/java/gift/main/service/UserService.java b/src/main/java/gift/main/service/UserService.java index 0a9b3d395..376394497 100644 --- a/src/main/java/gift/main/service/UserService.java +++ b/src/main/java/gift/main/service/UserService.java @@ -1,11 +1,10 @@ package gift.main.service; +import gift.main.Exception.CustomException; +import gift.main.Exception.ErrorCode; import gift.main.dto.UserJoinRequest; import gift.main.dto.UserLoginRequest; import gift.main.entity.User; -import gift.main.Exception.ErrorCode; -import gift.main.Exception.CustomException; - import gift.main.repository.UserRepository; import gift.main.util.JwtUtil; import org.springframework.stereotype.Service; @@ -28,9 +27,10 @@ public UserService(JwtUtil jwtUtil, UserRepository userRepository) { public String joinUser(UserJoinRequest userJoinRequest) { //유효성 검사해야하는데용~! if (userRepository.existsByEmail(userJoinRequest.email())) { - throw new CustomException(ErrorCode.ALREADY_EMAIL.getErrorMessage(), ErrorCode.ALREADY_EMAIL.getHttpStatus()); + throw new CustomException(ErrorCode.ALREADY_EMAIL); } - User userdto = new User(userJoinRequest) ; + User userdto = new User(userJoinRequest); + User user = userRepository.save(userdto); return jwtUtil.createToken(user); @@ -38,10 +38,8 @@ public String joinUser(UserJoinRequest userJoinRequest) { public String loginUser(UserLoginRequest userLoginRequest) { - User user = userRepository.findByEmailAndPassword(userLoginRequest.email(),userLoginRequest.password()); - if (user == null) { - throw new CustomException(ErrorCode.ERROR_LOGIN.getErrorMessage(), ErrorCode.ERROR_LOGIN.getHttpStatus()); - } + User user = userRepository.findByEmailAndPassword(userLoginRequest.email(), userLoginRequest.password()) + .orElseThrow(() -> new CustomException(ErrorCode.ERROR_LOGIN)); return jwtUtil.createToken(user); } diff --git a/src/main/java/gift/main/service/WishProductService.java b/src/main/java/gift/main/service/WishProductService.java index 76bcfe662..9687b4b0a 100644 --- a/src/main/java/gift/main/service/WishProductService.java +++ b/src/main/java/gift/main/service/WishProductService.java @@ -1,7 +1,13 @@ package gift.main.service; +import gift.main.Exception.CustomException; +import gift.main.Exception.ErrorCode; import gift.main.dto.UserVo; +import gift.main.entity.Product; +import gift.main.entity.User; import gift.main.entity.WishProduct; +import gift.main.repository.ProductRepository; +import gift.main.repository.UserRepository; import gift.main.repository.WishProductRepository; import org.springframework.stereotype.Service; @@ -11,20 +17,32 @@ public class WishProductService { private final WishProductRepository wishProductRepository; + private final ProductRepository productRepository; + private final UserRepository userRepository; - public WishProductService(WishProductRepository wishProductRepository) { + public WishProductService(WishProductRepository wishProductRepository, ProductRepository productRepository, UserRepository userRepository) { this.wishProductRepository = wishProductRepository; - } - - public void addWishlistProduct(Long productId, UserVo sessionUser) { - wishProductRepository.deleteByProductIdAndUserId(productId, sessionUser.getId()); + this.productRepository = productRepository; + this.userRepository = userRepository; } public List getWishProducts(Long userId) { - List wishProducts = wishProductRepository.findAllByUserId(userId); + List wishProducts = wishProductRepository.findAllByUserId(userId) + .orElseGet(() -> List.of()); + return wishProducts; + } + public void addWishlistProduct(Long productId, UserVo sessionUser) { + Product product = productRepository.findById(productId) + .orElseThrow(() -> new CustomException(ErrorCode.PRODUCT_NOT_FOUND)); + User user = userRepository.findByEmail(sessionUser.getEmail()) + .orElseThrow(() -> new CustomException(ErrorCode.USER_NOT_FOUND)); + wishProductRepository.save(new WishProduct(product, user)); + } + + public void deleteProducts(Long productId, UserVo sessionUserVo) { wishProductRepository.deleteByProductIdAndUserId(productId, sessionUserVo.getId()); } diff --git a/src/main/java/gift/main/util/JwtUtil.java b/src/main/java/gift/main/util/JwtUtil.java index 7304d7b1d..4036786f3 100644 --- a/src/main/java/gift/main/util/JwtUtil.java +++ b/src/main/java/gift/main/util/JwtUtil.java @@ -21,7 +21,7 @@ public JwtUtil(@Value("${spring.jwt.secret}") String secret) { } public String createToken(Long id, String name, String email, String password, String role) { - String token = Jwts.builder() + String token = Jwts.builder() .claim("id", id) .claim("name", name) .claim("email", email) @@ -35,7 +35,7 @@ public String createToken(Long id, String name, String email, String password, S } public String createToken(User user) { - String token = Jwts.builder() + String token = Jwts.builder() .claim("id", user.getId()) .claim("name", user.getName()) .claim("email", user.getEmail()) @@ -51,7 +51,7 @@ public String createToken(User user) { public String createToken(Long id, UserDto userDto) { - String token = Jwts.builder() + String token = Jwts.builder() .claim("id", id) .claim("name", userDto.getName()) .claim("email", userDto.getEmail()) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 032e98cad..9caecf845 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -22,11 +22,13 @@ spring.datasource.username=sa spring.datasource.password= spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect -spring.jpa.properties.hibernate.format_sql=true +#spring.jpa.properties.hibernate.format_sql=true spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.open-in-view=false -spring.mvc.hiddenmethod.filter.enable=true + +#spring.mvc.hiddenmethod.filter.enable=true + diff --git a/src/main/resources/templates/product.html b/src/main/resources/templates/product.html index b63629455..28f5d9760 100644 --- a/src/main/resources/templates/product.html +++ b/src/main/resources/templates/product.html @@ -64,6 +64,7 @@

물건 리스트 확인

Name Price Image + Seller @@ -155,6 +156,7 @@ '' + product.name + '' + '' + product.price + '' + '' + product.imageUrl + '' + + '' + product.seller+ '' + ''; } else { html += '상품을 찾을 수 없습니다.'; @@ -188,6 +190,7 @@ '' + product.name + '' + '' + product.price + '' + '' + product.imageUrl + '' + + '' + product.seller + '' + '' + '
' + '' + diff --git a/src/main/resources/templates/user.html b/src/main/resources/templates/user.html index 8e6892df0..ff9d346fc 100644 --- a/src/main/resources/templates/user.html +++ b/src/main/resources/templates/user.html @@ -53,7 +53,7 @@

로그인

name: $('#joinName').val(), email: $('#joinEmail').val(), password: $('#joinPassword').val(), - role: $('#role').is(':checked') ? 'admin' : 'user' + role: $('#role').is(':checked') ? 'ADMIN' : 'USER' }; $.ajax({ type: 'POST', diff --git a/src/test/java/gift/main/repository/ProductRepositoryTest.java b/src/test/java/gift/main/repository/ProductRepositoryTest.java index 46decb664..578fd6b4b 100644 --- a/src/test/java/gift/main/repository/ProductRepositoryTest.java +++ b/src/test/java/gift/main/repository/ProductRepositoryTest.java @@ -1,8 +1,7 @@ package gift.main.repository; -import gift.main.Exception.CustomException; + import gift.main.entity.Product; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; @@ -21,7 +20,6 @@ class ProductRepositoryTest { private ProductRepository productRepository; @Test - @Transactional public void 조회() { //givem String name = "물건"; @@ -36,7 +34,6 @@ class ProductRepositoryTest { } @Test - @Transactional public void 모두조회() { //given productRepository.save(new Product("테스트1", 123, "123")); @@ -53,7 +50,6 @@ class ProductRepositoryTest { @Test - @Transactional public void 수정() { //given Product product = new Product("테스트용", 123, "123"); @@ -61,7 +57,7 @@ class ProductRepositoryTest { //when String newName = "newName"; - product1.setName(newName); + product1.updateValue(newName,123,"123"); productRepository.save(product1); //then @@ -70,7 +66,6 @@ class ProductRepositoryTest { } @Test - @Transactional public void 삭제() { //given Product product = new Product("테스트용", 123, "123"); diff --git a/src/test/java/gift/main/repository/UserRepositoryTest.java b/src/test/java/gift/main/repository/UserRepositoryTest.java index e0590c692..0f547caa7 100644 --- a/src/test/java/gift/main/repository/UserRepositoryTest.java +++ b/src/test/java/gift/main/repository/UserRepositoryTest.java @@ -21,7 +21,6 @@ class UserRepositoryTest { @Test - @Transactional public void 모두조회() { //given userRepository.save(new User("name", "123@123", "123", "USER")); @@ -37,7 +36,6 @@ class UserRepositoryTest { @Test - @Transactional public void 이메일중복허용안함() { //given userRepository.save(new User("name", "123@123", "123", "USER")); diff --git a/src/test/java/gift/main/repository/WishProductRepositoryTest.java b/src/test/java/gift/main/repository/WishProductRepositoryTest.java index 1b41f8722..956eca6a8 100644 --- a/src/test/java/gift/main/repository/WishProductRepositoryTest.java +++ b/src/test/java/gift/main/repository/WishProductRepositoryTest.java @@ -21,7 +21,6 @@ class WishProductRepositoryTest { @Test - @Transactional public void 유저아이디값으로여러개조회하기() { //given(준비) Long userId = 1L; @@ -40,7 +39,6 @@ class WishProductRepositoryTest { @Test - @Transactional public void 값삭제하기() { //given(준비) Long userId = 1L;