Skip to content

Commit

Permalink
배포를 위해 dev 브랜치의 작업 내용을 main 브랜치로 push (#185)
Browse files Browse the repository at this point in the history
* feat: Tag, Post, PostTag 엔티티 간 연관관계 매핑 (#20)

* feat: 신고 카테고리 항목 추가

* Update PULL_REQUEST_TEMPLATE.md

* feat: filetype enum값 추가

* feat: entity에 검증 어노테이션 추가 (#11)

* feat: entity에 검증 어노테이션 추가

* feat: entity에 검증 어노테이션 추가

* style: 업로드 파일명, 서버 관리 파일명의 필드명 변경

---------

Co-authored-by: gywns0417 <[email protected]>

* chore: 패키지 구조 개선

* Revert "chore: 패키지 구조 개선"

This reverts commit f27a0d9.

* chore: 패키지 구조 개선

* feat: Tag, Post, PostTag 엔티티 간 연관관계 매핑

---------

Co-authored-by: Hanjaemo <[email protected]>
Co-authored-by: Hanjaemo <[email protected]>
Co-authored-by: gywns0417 <[email protected]>

* feat: 검증 애노테이션 추가 (#26)

* feat: 엔티티에 검증 애노테이션 추가

* style: 불필요한 import문 제거

* feat: 댓글 리포지토리 구현

* feat: 댓글 DTO 클래스 구현

* feat: 임시 Member, Post 리포지토리 구현

* feat: 댓글 리포지토리 재구현

* feat: 댓글 Service 클래스 구현

* feat: 댓글 Controller 클래스 일부 구현

* 게시글 작성 기능 구현 (#28)

* feat: 신고 카테고리 항목 추가

* Update PULL_REQUEST_TEMPLATE.md

* feat: filetype enum값 추가

* feat: entity에 검증 어노테이션 추가 (#11)

* feat: entity에 검증 어노테이션 추가

* feat: entity에 검증 어노테이션 추가

* style: 업로드 파일명, 서버 관리 파일명의 필드명 변경

---------

Co-authored-by: gywns0417 <[email protected]>

* chore: 패키지 구조 개선

* Revert "chore: 패키지 구조 개선"

This reverts commit f27a0d9.

* chore: 패키지 구조 개선

* commit test

* dto

* feat: 커밋 과정에서 변경사항 추가

* feat: getter 추가

* feat: dto 클래스 추가

* refactor: dto 구조 수정

* refactor: entity 생성자 추가

* feat: 게시글 작성 기능 추가

* test: 게시글 작성 기능 테스트

* feat: FileDto 클래스 추가

* test: fileDto 추가

* refactor: 불필요한 코드 제거

* fix: JSON 매핑 오류 해결 (#33)

* fix: tag <-> TagPost 영속성 전이 추가

* feat: 게시글 전체 조회 기능 추가 (#34)

---------

Co-authored-by: Hanjaemo <[email protected]>
Co-authored-by: Hanjaemo <[email protected]>
Co-authored-by: gywns0417 <[email protected]>

* refactor: 댓글 Service 코드 가독성 향상

* move: 불필요한 댓글 Request Dto 삭제

* refactor: 댓글 API 엔드포인트 수정

* feat: Post 엔티티 어노테이션 추가 구현

* fix: Post 엔티티 Category, viewStatus 필드 임시 @NotNull 해제

쿼리 테스트를 위해 미구현 상태인 Post 엔티티 필드 어노테이션을 일부 수정했습니다.

* feat: Member 엔티티 @Getter 임시 추가

* feat: BalanceOptionRepository 임시 구현

* feat: BalanceOption 엔티티 @Getter 임시 추가

* feat: CommentCreateRequest 클래스에 balanceOptionId 필드 추가

* fix: CommentResponse 클래스에 likeCount() 임시 비활성화

테스트를 위해 현재 미구현 상태인 CommentLike 관련 코드를 임시 비활성화 했습니다.(Null값)

* feat: CommentService 추가 구현 완료

BalanceOption 검증 코드(추후 BalanceOption 구현 완료 시 사용)를 추가 했습니다.

* refactor: 댓글 컨트롤러 createComment() 메서드 수정

댓글 API 엔드포인트를 설계에 맞게 수정함에 따라 관련 사항들을 수정했습니다.

* fix: 댓글 API 사용시 401 에러 해결

localhost:8080 접속 시 로그인이 필요 없도록 임시로 수정했습니다.

* 게시글 CRUD 기능 구현 (#39)

* feat: 신고 카테고리 항목 추가

* Update PULL_REQUEST_TEMPLATE.md

* feat: filetype enum값 추가

* feat: entity에 검증 어노테이션 추가 (#11)

* feat: entity에 검증 어노테이션 추가

* feat: entity에 검증 어노테이션 추가

* style: 업로드 파일명, 서버 관리 파일명의 필드명 변경

---------

Co-authored-by: gywns0417 <[email protected]>

* chore: 패키지 구조 개선

* Revert "chore: 패키지 구조 개선"

This reverts commit f27a0d9.

* chore: 패키지 구조 개선

* commit test

* dto

* feat: 커밋 과정에서 변경사항 추가

* feat: getter 추가

* feat: dto 클래스 추가

* refactor: dto 구조 수정

* refactor: entity 생성자 추가

* feat: 게시글 작성 기능 추가

* test: 게시글 작성 기능 테스트

* feat: FileDto 클래스 추가

* test: fileDto 추가

* refactor: 불필요한 코드 제거

* fix: JSON 매핑 오류 해결 (#33)

* fix: tag <-> TagPost 영속성 전이 추가

* feat: 게시글 전체 조회 기능 추가 (#34)

* feat: 게시글 단건 조회 기능 추가

* feat: 게시글 삭제 기능 추가

* fix: 생성자 private으로 접근 제어

* feat: MemberRepository 클래스 추가

* refactor: 리뷰받은 내용들 수정

* test: 게시글 CRUD 테스트 코드 작성

* refactor: dto에서 views, viewstatus 제거

---------

Co-authored-by: Hanjaemo <[email protected]>
Co-authored-by: Hanjaemo <[email protected]>
Co-authored-by: gywns0417 <[email protected]>

* feat: 회원 투표 기능 구현 (#32)

* chore: Spring Security 라이브러리 임시 주석 처리

* feat: 회원 투표 기능 구현

* test: 투표 생성 기능 단위 테스트

* feat: 선택지 투표 API 컨트롤러에 응답 메시지 추가

* feat: VoteController의 vote 메서드에 201 응답 코드 추가

* test: Mockito를 사용해서 테스트 코드 작성

* feat: 투표 현황 조회 기능 구현

* test: 투표 현황 조회 기능 단위 테스트

* feat: 투표 변경 기능 구현

* refactor: Post의 category 필드명 수정

* refactor: VoteRequest에 @builder 추가

* test: 회원 투표 수정 기능 단위 테스트

* refactor: 빌더 사용 및 메서드 위치 수정

* refactor: 기본값 설정 방법을 @PrePersist 사용 방식으로 변경

* refactor: 테스트 코드에서 EntityManager 주입 로직 제거

* refactor: 조회 메서드에 @transactional(readOnly = true) 추가

* style: import문 압축

* feat: 조회한 선택지가 게시글에 포함되지 않은 게시글인 경우 예외 발생

* fix: 댓글 수정 시 json으로 데이터 전송되지 않던 에러 해결

* feat: 댓글 작성 시 postId를 API 주소에서 가져오게 기능 변경

* feat: 댓글 수정 성공 시 ResponseEntity 전달하도록 구현

* style: 현재 사용하지 않는 BalanceOption 검증 기능 주석 처리

* test: 댓글 CRUD 테스트 코드 작성 및 통과 완료

* style: 불필요한 import문 제거

* feat: 댓글 CRUD 응답 시 댓글 작성 일시, 댓글 최종 수정 일시 반환 구현

* refactor: 메서드 단위로 트랜잭션 구현

* refactor: dev 브랜치에 맞게 클래스 수정

* fix: voteCount() 메서드 문법 오류 수정

* refactor: dev 브랜치에 맞게 클레스 수정

* fix: @NotNull import 미포함 수정 완료

* fix: 중복 MemberRepository 클래스 삭제 완료

* 투표 기능 예외 처리 (#49)

* feat: 투표 생성 시 존재하지 않는 데이터를 요구한 경우 예외 처리

* feat: 중복 투표를 진행하는 경우 예외 처리

* feat: 투표가 이미 종료된 게시글에 투표하려는 경우 예외 처리

* style: 로직 순서 변경

* feat: 존재하지 않는 데이터 요청 시 예외 처리

* feat: 카테고리가 'CASUAL'인 게시글에서 투표를 수정하려는 경우 예외 처리

* feat: 해당 게시글에서 투표한 기록이 없을 때 투표를 수정하려는 경우 예외 처리

* 게시글 추천 기능 구현 (#54)

* feat: 게시글 추천 기능 구현

* test: 게시글의 마감기한, 회원의 투표 정보 필드 추가

* test: 게시글 좋아요 기능 단위 테스트

* test: 게시글 추천 시 해당 게시글이 존재하지 않는 경우 예외 처리에 대한 단위 테스트

* test: 게시글 중복 추천 시 예외 처리에 대한 단위 테스트

* style: 불필요한 메서드 제거

* 댓글 추천 기능 구현 (#55)

* feat: 댓글 추천 기능 구현

* test: 댓글 추천 기능 단위 테스트

* test: 댓글 중복 추천 시 예외 처리 단위 테스트

* style: 각 코드의 구분자를 세미콜론에서 쉼표로 변경

* 댓글 기능 예외 처리 구현

* feat: 댓글 CRUD 예외 처리 구현

* style: TODO-Comment-BalanceOption 연관 필요

* refactor: 댓글 컨트롤러 가독성 개선

* feat: PR 리뷰에 따른 코드 수정

* test: 댓글 예외 처리 단위 테스트 작성 및 통과 완료

* fix: { 문법 오류 수정

* 회원 정보 조회 기능 구현 (#69)

* feat: jwt 라이브러리 추가

* fix: merge 과정에서 충돌 이슈 제거

* feat: 토큰 생성, 검증을 하는 TokenProvider 클래스 생성

* feat: SecurityConfig 클래스 추가

* feat: Jwt Filter 적용

* feat: UserDetailService 추가 및 Member에 메서드 추가

* feat: 로그인, 회원가입 시 필요한 dto 클래스 생성

* feat: 유저 회원가입 기능 구현

* feat: 유저 로그인 기능 구현

* feat: 공통 Exception 클래스들 추가

* refactor: LoginSuccessDto 추가

* feat: LoginSuccessDto 추가

* feat: 회원 정보 조회 기능 추가

* feat: 회원 정보 조회 기능 추가

* fix: securityConfig에서 posts url 허용

* feat: 회원 전체 목록 기능 구현

* feat: ErrorCode 적용

* feat: 단위 테스트 작성

* fix: postCount, postLike 값이 null이 들어가는 오류 수정

* refactor: 불필요한 코드 제거

* feat: 회원 로그인, 조회 예외 처리

* fix: signWith() deprecated 수정

* fix: errorCode 중복 네이밍 제거

* 회원 정보 수정 기능 구현  (#76)

* feat: jwt 라이브러리 추가

* fix: merge 과정에서 충돌 이슈 제거

* feat: 토큰 생성, 검증을 하는 TokenProvider 클래스 생성

* feat: SecurityConfig 클래스 추가

* feat: Jwt Filter 적용

* feat: UserDetailService 추가 및 Member에 메서드 추가

* feat: 로그인, 회원가입 시 필요한 dto 클래스 생성

* feat: 유저 회원가입 기능 구현

* feat: 유저 로그인 기능 구현

* feat: 공통 Exception 클래스들 추가

* refactor: LoginSuccessDto 추가

* feat: LoginSuccessDto 추가

* feat: 회원 정보 조회 기능 추가

* feat: 회원 정보 조회 기능 추가

* fix: securityConfig에서 posts url 허용

* feat: 회원 전체 목록 기능 구현

* feat: ErrorCode 적용

* feat: 단위 테스트 작성

* fix: postCount, postLike 값이 null이 들어가는 오류 수정

* refactor: 불필요한 코드 제거

* feat: 회원 로그인, 조회 예외 처리

* merge branch

* 댓글 추천 기능 구현 (#55)

* feat: 댓글 추천 기능 구현

* test: 댓글 추천 기능 단위 테스트

* test: 댓글 중복 추천 시 예외 처리 단위 테스트

* style: 각 코드의 구분자를 세미콜론에서 쉼표로 변경

* feat: 유저 정보를 업데이트 하는 메서드 추가

* refactor: merge 충돌 제거

* feat: 회원 정보 수정 기능 구현

* feat: 회원 정보 수정 단위 테스트 추가

* refactor: save 메서드 없이도 변경감지로 업데이트 적용

---------

Co-authored-by: Hanjaemo <[email protected]>

* refactor: PostService 에러코드 수정 (#83)

* 멤버 삭제 기능 구현 (#81)

* feat: 회원 탈퇴 기능 추가

* feat: 에러 코드 추가

* feat: 멤버 삭제 단위 테스트 추가

* 북마크 기능 구현 완료 (#80)

* feat: BookmarkRepository 구현 완료

* feat: BookmarkRequestDto 구현 완료

* feat: 북마크에 게시글 추가 기능 구현 완료

* feat: BookmarkResponseDto 구현 완료

* feat: 북마크에 추가된 게시글 전체 목록 조회 기능 구현 완료

* feat: 게시글 북마크 해제 기능 구현 완료

* fix: 북마크 조회 기능을 특정 멤버의 북마크 조회 기능으로 수정 및 API 주소 변경

* refactor: 북마크 API 주소 수정

* feat: 북마크 기능 예외처리 구현 완료

* style: 사용하지 않는 북마크 에러코드 삭제

* style: TODO 추가-게시글을 삭제하면 북마크, 댓글은 어떤 상태로 남아야 하는가?

* style: TODO 제거

* test: 북마크 기능, 예외 처리 단위 테스트 구현 및 통과 완료

* refactor: 북마크 삭제 API HTTPStatus 변경

* style: 불필요한 import 삭제

* feat: 게시글 추천 취소 기능 구현 (#78)

* feat: 댓글 추천 취소 기능 구현 (#79)

* Spring Swagger 세팅  (#89)

* feat: Swagger config 설정

* refactor: 시큐리티 url 전체 허용

* feat: swagger 작업

* 댓글 조회시 selectedOptionId 반환 기능 구현 완료 (#86)

* feat: 댓글 조회시 해당 댓글이 작성된 balanceOptionId 반환하게 구현

 해당 기능 구현을 위해 Comment<->BalanceOption 엔티티 사이에 연관 관계를 맺어줬습니다. ERD 업데이트가 필요합니다.

* feat: 댓글 조회시 투표 옵션 통해 작성된 balanceOptionId 반환하게 구현 수정

* refactor: balanceOptionId -> selectedOptionId 필드명 변경

* feat: 투표한 사람만 댓글 작성할 수 있도록 예외 처리 구현(회원 한정)

* feat: 북마크 기능 swagger에 추가 (#91)

* test: 댓글 기능 및 예외처리 테스트 재작성 및 통과 완료 (#95)

* 이메일 발송 기능 구현 (#98)

* feat: 메일 서버 의존성 추가

* refactor: 에러 코드 수정

* refactor: mail config 설정

* feat: 메일 발송 yml 설정

* refactor: 이메일 발송 config 수정

* feat: 이메일 발송 dto 클래스 추가

* feat: 이메일 발송 컨트롤러 생성

* feat: 이메일 발송 서비스 생성

* feat: 구글 SMTP 설정

* fix: email dto 삭제

* fix: config 파일 제거

* fix: 메일 컨트롤러, 서비스 코드 수정

* fix: 모든 url에 대해서 시큐리티 허용

* feat: EmailRequest dto 추가

* 파일 업로드 기능 구현 완료 (#97)

* feat: 파일 업로드 기능 구현

* style: 스웨거에 추가하지 않는 필드 스웨거 추가

* feat: 파일 다운로드 기능 구현 완료 (#102)

* Redis 설정 (#104)

* feat: Redis 디펜던시 추가

* feat: yml 환경변수 세팅

* refactor: yml 수정

* feat: config 파일 추가

* feat: service 클래스 추가

* fix: BalanceOption import 추가

* fix: Redis CRUD 단위 테스트 추가

* config 파일 서브 모듈로 관리 (#106)

* chore: application.yml 제거

* chore: config 파일 서브모듈로 관리

* 파일 기능 예외 처리 구현 (#112)

* feat: 파일 기능 예외 처리 구현 완료

* chore: 단일 파일 최대 업로드 크기, 전체 요청 최대 크기 설정

* chore: 파일 업로드 위치 설정 완료

* feat: 파일 기능 Configuration 클래스 구현

* feat: 파일 기능 예외 처리 구현

* style: 불필요한 import 삭제

* refactor: downloadFile에 사용 되는 에러 코드 수정

* feat: FileDto에서 엔티티 생성 시 storedName 전달 구현

* move: merge 충돌 방지 위한 application.yml 삭제

* 회원 정보 수정 닉네임 / 패스워드 분리 (#109)

* fix: 삭제된 yml 파일 추가

* Revert "fix: 삭제된 yml 파일 추가"

This reverts commit d24deef.

* fix: 삭제된 yml 파일 추가

* refactor: 비밀번호 변경, 닉네임 변경 로직 둘로 분리

* refactor: dto 파일 수정

* test: 비밀번호, 닉네임 수정 단위 테스트 작성

* 리프레시 토큰 추가 구현 및 전체적인 jwt 로직 수정 (#114)

* fix: 암호화 된 비밀번호가 제약조건 때문에 db에 저장안되는 오류 해결

* feat: authenticationManager를 Bean으로 등록

* refactor: 반환되는 User 객체가 이메일, 비밀번호, 권한 정보를 포함하게 변경

* refactor: JwtFilter 에러 케이스 추가

* feat: RefreshToken 생성 로직 추가 및 리팩토링

* fix: dto 클래스에 accessToken, refreshToken 두개의 필드 분리

* feat: jwt yml 설정 정보 추가

* refactor: changePassword 메서드 제거

* refactor: refreshToken 만료 1주 -> 2주로 변경

* fix: yml 파일 config 폴더 내부로 이동

* AWS S3를 이용한 파일 업로드 기능 구현 (#118)

* chore: AWS S3 dependecy 추가

* chore: S3 관련 설정 추가

* chore: S3 관련 dependency를 Spring Cloud AWS에서 AWS SDK for Java로 변경

* feat: S3 설정 클래스 추가

* chore: 불필요한 설정 제거

* refactor: File 엔티티 내 필드명 수정

uploadName -> originalName

* feat: AWS S3를 이용한 이미지 업로드 기능 구현

* feat: 다중 이미지 업로드 기능 구현

* chore: 파일 최대 용량 설정

* refactor: 다중 이미지 업로드 메서드명 수정

* Delete src/main/resources/application.yml

* refactor: config 파일 최신화

* solve conflict

* 게시글 작성 시 이미지 업로드 기능 구현 (#132)

* chore: config 업데이트

* refactor: 다중 업로드 기능 불필요하다고 결정됨으로써 해당 코드 제거

* chore: 기존에 작성된 FileService 클래스 제거

* refactor: 클래스 이름 수정 및 메서드 추출

* style: 불필요한 코드 제거

* refactor: FileDto 클래스에서 불필요한 코드 제거 및 필드 주입 수정

* refactor: JPEG의 확장자를 jpg에서 jpeg로 변경

* feat: 게시글 작성 시 이미지 엔티티와 매핑

* 발송된 숫자코드 검증 기능 구현 (#107)

* feat: 30분 유효시간 설정

* refactor: dto 이름 수정

* feat: 발송 코드가 일치하는지 검증 기능 구현

* feat: 이메일 검증에 필요한 dto 클래스 추가

* feat: 에러 코드 추가

* refactor: validator 분리 및 에러코드 추가

* feat: swagger 코드 추가

* refactor: 리뷰 내용 리팩토링

* fix: yml 파일 config 폴더 내부로 이동

* refactor: mail패키지를 global에서 module로 이동 및 의미를 더 명확하게 하기 위해 authmail로 이름 변경

* refactor: 메서드 camel case 형식에 맞게 수정

* refactor: 회원 정보에서 ip 제거 (#138)

* 엑세스 토큰 만료 시 리프레시 토큰으로 액세스 토큰 재발급 하는 기능 추가 (#124)

* feat: 유효한 자격증명을 제공하지 않을 때 401 에러 리턴하는 기능 구현

* feat: 유효한 권한이 존재하지 않는 경우 403 에러 리턴하는 기능 구현

* feat: 401, 403에러 exception handling

* refactor: 토큰 필드를 TokenDto를 생성하여 따로 분리

* feat: accessToken 만료시 refreshToken 재발급 하는 기능 구현

* feat: 에러 코드 추가

* refactor: yml 파일 config로 이동

* refactor: JwtTokenProvider 에서 AuthenticationManager 삭제하여 순환 참조 에러 해결

* JwtTokenProvider 테스트 코드 작성 및 예외 테스트 코드 작성 (#128)

* fix: 오류 나는 코드 주석 처리 및 수정

* feat: payload 조회 기능 구현 및 authentication null 체크하는 메서드 추가

* fix: file 테스트 수정

* test: 토큰 테스트 코드 작성

* refacotor: 불필요한 코드 제거

* todo 주석 추가

* refactor:불필요한 코드 삭제

* fix: IllegalArgumentException 다른 amazon.awssdk import문 제거!!!!!

* 게시글 단건, 전체 조회 API 응답에 누락된 필드 추가  (#135)

* feat: 응답 DTO에 게시글 추천수 필드 추가

* feat: 응답 DTO에 게시글 작성일, 작성자 필드 추가

* feat: 응답 DTO에 게시글 추천, 북마크 여부 필드 추가

* feat: likes가 null일 경우 0 반환하는 로직 추가

* refactor: 메서드 파라미터로 memberId 전달

* 회원 정보 조회 로직 수정 (#130)

* refactor: merge

* feat: 토큰 생성할 때 grantType 부여

* Todo: jwt 토큰을 추출하는 공통 로직 추가 예정

* 게시글 작성 시 이미지 업로드 기능 구현 (#132)

* chore: config 업데이트

* refactor: 다중 업로드 기능 불필요하다고 결정됨으로써 해당 코드 제거

* chore: 기존에 작성된 FileService 클래스 제거

* refactor: 클래스 이름 수정 및 메서드 추출

* style: 불필요한 코드 제거

* refactor: FileDto 클래스에서 불필요한 코드 제거 및 필드 주입 수정

* refactor: JPEG의 확장자를 jpg에서 jpeg로 변경

* feat: 게시글 작성 시 이미지 엔티티와 매핑

* 발송된 숫자코드 검증 기능 구현 (#107)

* feat: 30분 유효시간 설정

* refactor: dto 이름 수정

* feat: 발송 코드가 일치하는지 검증 기능 구현

* feat: 이메일 검증에 필요한 dto 클래스 추가

* feat: 에러 코드 추가

* refactor: validator 분리 및 에러코드 추가

* feat: swagger 코드 추가

* refactor: 리뷰 내용 리팩토링

* fix: yml 파일 config 폴더 내부로 이동

* refactor: mail패키지를 global에서 module로 이동 및 의미를 더 명확하게 하기 위해 authmail로 이름 변경

* refactor: 메서드 camel case 형식에 맞게 수정

* refactor: 회원 정보에서 ip 제거 (#138)

* 엑세스 토큰 만료 시 리프레시 토큰으로 액세스 토큰 재발급 하는 기능 추가 (#124)

* feat: 유효한 자격증명을 제공하지 않을 때 401 에러 리턴하는 기능 구현

* feat: 유효한 권한이 존재하지 않는 경우 403 에러 리턴하는 기능 구현

* feat: 401, 403에러 exception handling

* refactor: 토큰 필드를 TokenDto를 생성하여 따로 분리

* feat: accessToken 만료시 refreshToken 재발급 하는 기능 구현

* feat: 에러 코드 추가

* refactor: yml 파일 config로 이동

* refactor: JwtTokenProvider 에서 AuthenticationManager 삭제하여 순환 참조 에러 해결

* JwtTokenProvider 테스트 코드 작성 및 예외 테스트 코드 작성 (#128)

* fix: 오류 나는 코드 주석 처리 및 수정

* feat: payload 조회 기능 구현 및 authentication null 체크하는 메서드 추가

* fix: file 테스트 수정

* test: 토큰 테스트 코드 작성

* refacotor: 불필요한 코드 제거

* todo 주석 추가

* refactor:불필요한 코드 삭제

* fix: IllegalArgumentException 다른 amazon.awssdk import문 제거!!!!!

* refactor: merge

* Todo: jwt 토큰을 추출하는 공통 로직 추가 예정

---------

Co-authored-by: Hanjaemo <[email protected]>

* 회원 정보 수정, 삭제 리팩토링 (#134)

* refactor: merge

* feat: 토큰 생성할 때 grantType 부여

* Todo: jwt 토큰을 추출하는 공통 로직 추가 예정

* refactor: 회원 정보 수정, 회원 삭제 memberId -> 토큰으로 리팩토링

* refactor: 회원 정보 조회할 때 memberId 값 추가

* refactor: 회원 이메일을 jwt 토큰에서 추출하는 중복 코드를 메서드로 변경

* refactor: pr 내용 반영해서 코드 리팩토링

* refactor: merge과정에서 삭제된 메서드 추가

* 답글 작성 기능 구현 완료 (#133)

* feat: Comment 엔티티에 답글 관계 구현을 위한 부모 댓글 참조 필드 구현

* feat: 답글 RequestDto 구현

* feat: 답글 작성 기능 및 예외 처리 구현

* style: optimize imports 적용

* 이메일 인증 단위 테스트 및 예외 처리 단위 테스트 구현 (#141)

* refactor: dto에 어노테이션 추가

* refactor: member, post 테스트 로직 오류 때문에 임시 주석처리

* test: 인증 메일 단위 테스트, 에외 처리 단위 테스트 작성

* 로그아웃 기능 구현 (#144)

* chore:

* feat: 로그 아웃 된 사용자가 글을 쓸때를 막는 에러코드 추가

* feat: 로그아웃 될 때 Redis에 저장된 토큰값을 제거하는 기능 구현

* feat: 글을 작성할 때 Redis에 저장된 토큰 값이 없다면, 에러를 던지는 기능 추가

* feat: 로그인을 하지 않은 사용자가 로그아웃을 시도할 때 에러를 던지는 기능 추가

* 답글 depth를 1로 제한하는 기능 구현 완료 (#145)

* feat: 답글 depth 에러 코드 추가

* feat: 답글에 depth 제한 기능 구현

* test: 답글 기능, 예외 단위 테스트 작성 및 통과 완료, 기존 테스트 통과 확인

* chore: redis 호스트 분리

* refactor: 기존 id를 통해 회원을 조회하는 로직을 jwt를 사용해 조회하도록 수정

* refactor: 메서드 분리 등 코드 개선

* 북마크 API URL 개선 완료 (#148)

* feat: 북마크 삭제 권한 없음 에러 코드 추가

* feat: BookmarkRequestDto 에서 memberId 필드 삭제

* feat: 북마크 기능 사용 시 memberId 대신 현재 인증된 사용자의 정보 조회하도록 구현

* feat: BookmarkRequestDto 의 불필요한 postId 필드 제거

* feat: 북마크 삭제 API postId 기반 작동 구현 완료

* test: 변경된 북마크 개선점 기반으로 기존의 전체 테스트코드 수정 및 통과 완료

* style: optimze imports 적용 완료

* refactor: 불필요한 BookmarkRequestDto 클래스 삭제

* test: 변경점으로 인한 테스트 코드 수정 및 전체 통과 완료

* 댓글 기능 memberId 사용 -> JWT 사용으로 수정 (#150)

* feat: 댓글 기능에서 memberId 삭제 및 JWT로 로그인한 사용자 이메일 기반으로 멤버 조회하도록 변경

* refactor: getCurrentMember 메서드 SecurityUtils 클래스로 분리

* feat: 댓글 삭제 및 수정 요청 시 본인이 작성한 댓글인지 검증 구현

* refactor: CommentCreateRequest 내 불필요한 memberId 필드 제거

* test: 댓글 기능 변경점에 따라 테스트 코드 수정 및 전체 통과 완료

* test: 댓글 수정, 삭제 시 권한 없음 예외 테스트코드 작성 및 통과

* feat: SecurityUtils 클래스 기본 생성자 접근 방지 구현

* fix: mergy 후 충돌 재수정

* refactor: 불필요한 파라미터 삭제

* style: BookmarkService의 save 메서드명 createBookmard로 수정 (컨벤션)

* 멤버 단위 테스트, 예외 처리 테스트 추가 (#157)

* refactor: merge

* fix: dto 파일 삭제

* refactor: 메일 dto에 기본 생성자 추가

* test: MemberService 단위 테스트, 예외 테스트 추가

* fix: 서비스 로직 merge

* fix: import 오류 수정

* 투표 생성 기능 단위 테스트 작성 (#159)

* fix: BookmarkServiceTest 패키지 위치로 인해 발생한 컴파일에러 해결

* test: memberId를 통해 회원을 조회하던 방식에서 jwt로 변경됨에 따라 테스트 코드 수정

* test: 비회원 투표 기능 단위 테스트

* test: 투표 생성 시 게시글 정보가 없는 경우 단위 테스트

* test: 투표 생성 시 선택지 정보가 없는 경우 단위 테스트

* test: 투표 생성 시 회원 정보가 없는 경우 단위 테스트

* test: 투표 생성 시 선택지가 다른 게시글의 선택지인 경우 단위 테스트

* test: 투표 생성 시 게시글 마감 기한이 만료된 경우 단위 테스트

* test: 투표 생성 시 이미 투표한 기록이 있는 게시글인 경우 단위 테스트

* 투표 현황 조회 및 투표 수정 기능에 대한 단위 테스트 작성 (#162)

* test: 투표 현황 조회 시 게시글 정보가 없는 경우 단위 테스트

* test: 투표 수정 시 게시글 정보가 없는 경우 단위 테스트

* test: 투표 수정 시 선택지 정보가 없는 경우 단위 테스트

* test: 투표 수정 시 회원 정보가 없는 경우 단위 테스트

* test: 투표 수정 시 회원 정보가 없는 경우 단위 테스트

* test: 투표 수정 시 게시글의 카테고리가 캐주얼인 경우 단위 테스트

* 게시글 기능 memberId 대신에 jwt를 사용하도록 수정 (#153)

* feat: SecurityUtils 클래스 생성하여 로그인한 회원의 이메일을 가져오는 기능 추가

* refactor: RedisConfigTest 수정

* feat: jwt를 사용하여 게시글 작성 및 삭제 기능 추가

* feat: 게시글 추천 상태가 0일때 추천 취소를 누를 경우 에러 코드 추가

* feat: jwt를 사용하여 게시글 추천, 추천 취소 기능 수정

* refactor: postId로 포스트를 찾는 로직을 메서드화 해서 중복 제거

* 댓글 기능 사용 시 해당 댓글이 URL의 게시글 id와 매칭 여부 검증 로직 추가 완료 (#164)

* refactor: getCurrentMember() 메서드 전역 static 메서드 사용하도록 수정

* feat: 해당 게시글에 존재하지 않는 댓글 예외 구현

* style: optimze imports 적용 완료

* test: 예외 추가에 따른 테스트 코드 추가 작성 및 전체 테스트 코드 통과 완료

* feat: 게시글 작성 시 storedFileName이 Null일 경우에 대한 로직 구현 (#167)

* refactor: 게시글 조회 시 응답 DTO 이름 변경 및 불필요한 파라미터 제거 (#169)

* test: 단위 테스트 및 예외 테스트 추가 (#161)

* 회원가입, 로그인 시 RequestBody, Response 수정 (#176)

* refactor: 유저가 db에 등록될 때 자동으로 USER 값이 들어가도록 설정

* refactor: 로그인 했을 때 토큰 정보만 클라이언트에 전달하도록 변경

* test: 로직 변경에 따른 테스트 코드 수정

* 공지사항 작성 기능 구현 완료 (#172)

* move: Notice 클래스 패키지 생성 및 이동

* feat: NoticeRepository 클래스 작성

* feat: Notice 엔티티 어노테이션 추가

* feat: 공지사항 작성 기능 구현 및 예외처리 구현

* feat: NoticeResponse에 content 반환 추가

* style: 불필요한 공백 제거

* test: 공지사항 작성 및 관련 예외 테스트 코드 작성 및 통과 완료

* feat: 전체 공지 조회, 단건 공지 조회 기능 구현 및 예외 처리 구현

* test: 전체 공지사항 조회, 단건 공지사항 조회 구현에 따른 테스트 코드 추가 작성

* style: optimze imports 적용

* fix: SecurityContextHolder로 인한 다른 테스트와 충돌 일어나는 에러 수정

* feat: 불필요한 생성자 어노테이션 삭제

* feat: 제약 조건을 DTO에서 검증하도록 구현 및 핸들링 클래스 작성

* 공지사항 목록 조회, 특정 공지사항 조회 기능 구현 완료 (#174)

* move: Notice 클래스 패키지 생성 및 이동

* feat: NoticeRepository 클래스 작성

* feat: Notice 엔티티 어노테이션 추가

* feat: 공지사항 작성 기능 구현 및 예외처리 구현

* feat: NoticeResponse에 content 반환 추가

* style: 불필요한 공백 제거

* test: 공지사항 작성 및 관련 예외 테스트 코드 작성 및 통과 완료

* 게시글 조회 API에 조회수 증가 로직 추가 (#181)

* refactor: memberId로 조회하던 기존 로직을 JWT를 사용하여 조회하도록 수정

* fix: Authorization 필수 여부를 false로 수정

* feat: 게시글 조회 API에 조회수 증가 로직 추가

* refactor: findAll 메서드의 readOnly를 true로 지정함으로써 조회용 메서드임을 강조

* 스웨거 헤더 값으로 토큰 추가  (#182)

* feat: swagger 문서에 토큰 헤더값 추가

* fix: multipart file 스웨거 설정 추가

* fix: swagger 문서에 날짜 정보가 example 대로 안들어가던 오류 수정

* fix: afterEach로 테스트 종료 시 SecurityContextHolder context 제거

* test: global 폴더에 위치한 테스트 코드 삭제

* refactor: 파일 어노테이션 RequestParam에서 RequestPart로 변경

* 회원 닉네임 중복 검증 API 추가 및 테스트 코드 작성 (#178)

* feat: 회원 닉네임 중복 검증 기능 구현

* test: 회원 닉네임 중복 검증 기능 단위 테스트 추가

* refactor: 파라미터에 닉네임 정보를 넣어 중복 체크하도록 변경

---------

Co-authored-by: Junsoo Choi <[email protected]>
Co-authored-by: gywns0417 <[email protected]>
Co-authored-by: king_0417 <[email protected]>
Co-authored-by: Junsoo Choi <[email protected]>
  • Loading branch information
5 people authored Mar 12, 2024
1 parent cea2381 commit b461f68
Show file tree
Hide file tree
Showing 53 changed files with 1,803 additions and 828 deletions.
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-mail'
// swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'
implementation group: 'org.springdoc', name: 'springdoc-openapi-ui', version: '1.7.0'
implementation group: 'io.springfox', name: 'springfox-boot-starter', version: '3.0.0'
implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '3.0.0'

// redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
Expand Down
31 changes: 25 additions & 6 deletions src/main/java/balancetalk/global/config/SwaggerConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,34 @@

import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.info.Info;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@OpenAPIDefinition(
info = @Info(title = "Balance Talk API 명세서",
version = "v1")
)
@OpenAPIDefinition(info = @Info(title = "Balance Talk API 명세서", version = "v1"))

@Configuration
public class SwaggerConfig {
public class SwaggerConfig{
@Bean
public OpenAPI openAPI() {

// TODO: JWT 기능 추가
String jwtSchemeName = "AccessToken";

SecurityRequirement securityRequirement = new SecurityRequirement()
.addList(jwtSchemeName);

Components components = new Components()
.addSecuritySchemes(jwtSchemeName, new SecurityScheme()
.name(jwtSchemeName)
.type(SecurityScheme.Type.HTTP)
.scheme("bearer")
.bearerFormat("JWT"));
return new OpenAPI()
.components(new Components())
.addSecurityItem(securityRequirement)
.components(components);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package balancetalk.global.exception;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;


@Slf4j
@RestControllerAdvice
public class ConstraintExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Object> handleNoticeTitleSizeExceededExceptions(MethodArgumentNotValidException e) {
ErrorResponse errorResponse = ErrorResponse.from(ErrorCode.EXCEED_VALIDATION_LENGTH);
log.error("exception message = {}", e.getMessage());

return ResponseEntity.status(errorResponse.getHttpStatus()).body(errorResponse);
}
}
21 changes: 17 additions & 4 deletions src/main/java/balancetalk/global/exception/ErrorCode.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package balancetalk.global.exception;

import static org.springframework.http.HttpStatus.*;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
Expand All @@ -21,18 +23,25 @@ public enum ErrorCode {
FILE_SIZE_EXCEEDED(BAD_REQUEST, "파일 크기가 초과되었습니다."),
EXPIRED_JWT_TOKEN(BAD_REQUEST, "만료된 토큰 입니다."),
INVALID_JWT_TOKEN(BAD_REQUEST, "유효하지 않은 토큰입니다."),
EXCEED_MAX_DEPTH(BAD_REQUEST, "답글에 답글을 달 수 없습니다."),
INVALID_REFRESH_TOKEN(BAD_REQUEST, "유효하지 않은 리프레시 토큰입니다."),
PAGE_NUMBER_ZERO(BAD_REQUEST, "페이지 번호는 0보다 커야합니다."),
PAGE_SIZE_ZERO(BAD_REQUEST, "페이지 사이즈는 0보다 커야합니다."),
EXCEED_VALIDATION_LENGTH(BAD_REQUEST, "입력값이 제약 조건에 맞지 않습니다."),

// 401
MISMATCHED_EMAIL_OR_PASSWORD(UNAUTHORIZED, "이메일 또는 비밀번호가 잘못되었습니다."),
AUTHENTICATION_ERROR(UNAUTHORIZED, "인증 오류가 발생했습니다."),
BAD_CREDENTIAL_ERROR(UNAUTHORIZED, "로그인에 실패했습니다."),
UNAUTHORIZED_LOGOUT(UNAUTHORIZED, "로그아웃을 위해서는 인증이 필요합니다."),

UNAUTHORIZED_CREATE_NOTICE(UNAUTHORIZED, "공지사항 작성 권한이 없습니다."),

// 403
FORBIDDEN_COMMENT_MODIFY(FORBIDDEN, "해당 댓글은 수정 권한이 없습니다."), // TODO : Spring Security 적용 후 적용 필요
FORBIDDEN_COMMENT_DELETE(FORBIDDEN, "해당 댓글은 삭제 권한이 없습니다."), // TODO : SecurityContextHolder 사용 예정
FORBIDDEN_POST_DELETE(FORBIDDEN, "해당 게시글은 삭제 권한이 없습니다."),
FORBIDDEN_COMMENT_MODIFY(FORBIDDEN, "해당 댓글은 수정 권한이 없습니다."),
FORBIDDEN_COMMENT_DELETE(FORBIDDEN, "해당 댓글은 삭제 권한이 없습니다."),
FORBIDDEN_MEMBER_DELETE(FORBIDDEN, "사용자 탈퇴 권한이 없습니다."),
FORBIDDEN_BOOKMARK_DELETE(FORBIDDEN, "북마크 삭제 권한이 없습니다."),
FORBIDDEN_POST_CREATE(FORBIDDEN, "글쓰기 권한이 없습니다."),

// 404
Expand All @@ -46,15 +55,19 @@ public enum ErrorCode {
NOT_SUPPORTED_FILE_TYPE(NOT_FOUND, "지원하지 않는 파일 형식입니다."),
NOT_FOUND_FILE(NOT_FOUND, "존재하지 않는 파일입니다."),
NOT_FOUND_PARENT_COMMENT(NOT_FOUND, "존재하지 않는 원 댓글입니다."),
NOT_FOUND_COMMENT_AT_THAT_POST(NOT_FOUND, "해당 게시글에 존재하지 않는 댓글입니다."),
NOT_FOUND_NOTICE(NOT_FOUND, "존재하지 않는 공지사항입니다."),

// 409
ALREADY_VOTE(CONFLICT, "이미 투표한 게시글입니다."),
ALREADY_LIKE_COMMENT(CONFLICT, "이미 추천을 누른 댓글입니다."),
ALREADY_LIKE_POST(CONFLICT, "이미 추천을 누른 게시글입니다."),
ALREADY_CANCEL_LIKE_POST(CONFLICT, "이미 추천 취소를 누른 게시글입니다"),
ALREADY_REGISTERED_NICKNAME(CONFLICT, "이미 등록된 닉네임입니다."),

// 500
REDIS_CONNECTION_FAIL(INTERNAL_SERVER_ERROR, "Redis 연결에 실패했습니다."),
DUPLICATE_EMAIL(INTERNAL_SERVER_ERROR, "이미 존재하는 이메일입니다. 다른 이메일을 입력해주세요"),
DUPLICATE_EMAIL(INTERNAL_SERVER_ERROR, "이미 존재하는 이메일 입니다. 다른 이메일을 입력해주세요"),
AUTHORIZATION_CODE_MISMATCH(INTERNAL_SERVER_ERROR, "인증 번호가 일치하지 않습니다.");

private final HttpStatus httpStatus;
Expand Down
1 change: 0 additions & 1 deletion src/main/java/balancetalk/global/jwt/JwtTokenProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,6 @@ public TokenDto reissueToken(String refreshToken) {
throw new BalanceTalkException(ErrorCode.INVALID_REFRESH_TOKEN);
}
TokenDto tokenDto = new TokenDto(
"Bearer",
createAccessToken(authentication),
createRefreshToken(authentication)
);
Expand Down
22 changes: 22 additions & 0 deletions src/main/java/balancetalk/global/utils/SecurityUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package balancetalk.global.utils;

import static balancetalk.global.exception.ErrorCode.NOT_FOUND_MEMBER;
import balancetalk.global.exception.BalanceTalkException;
import balancetalk.module.member.domain.Member;
import balancetalk.module.member.domain.MemberRepository;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class SecurityUtils {

public static Member getCurrentMember(MemberRepository memberRepository) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String email = authentication.getName();

return memberRepository.findByEmail(email)
.orElseThrow(() -> new BalanceTalkException(NOT_FOUND_MEMBER));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
@RequiredArgsConstructor
public class MailService {

private static final String senderEmail = "[email protected]";
private static final String SENDER_EMAIL = "[email protected]";

private final JavaMailSender javaMailSender;
private final RedisService redisService;
Expand All @@ -32,17 +32,13 @@ public class MailService {
@Value("${spring.mail.auth-code-expiration-millis}")
private long authCodeExpirationMillis;

private String createNumber(){
return UUID.randomUUID().toString().substring(0, 6);
}

public MimeMessage createMail(EmailRequest request){
String authCode = createNumber();

MimeMessage message = javaMailSender.createMimeMessage();

try {
message.setFrom(senderEmail);
message.setFrom(SENDER_EMAIL);
message.setRecipients(MimeMessage.RecipientType.TO, request.getEmail());
message.setSubject("이메일 인증");
String body = "";
Expand All @@ -57,6 +53,10 @@ public MimeMessage createMail(EmailRequest request){
return message;
}

private String createNumber(){
return UUID.randomUUID().toString().substring(0, 6);
}

public void sendMail(EmailRequest request){
validateEmail(request.getEmail());
MimeMessage message = createMail(request);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
import jakarta.validation.constraints.Email;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class EmailRequest {

@Email
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
import jakarta.validation.constraints.Email;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class EmailVerification {

@Email
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package balancetalk.module.bookmark.application;

import balancetalk.global.exception.BalanceTalkException;
import balancetalk.module.member.domain.Member;
import balancetalk.module.member.domain.MemberRepository;
import balancetalk.module.bookmark.domain.Bookmark;
import balancetalk.module.bookmark.domain.BookmarkRepository;
import balancetalk.module.bookmark.dto.BookmarkResponse;
import balancetalk.module.member.domain.Member;
import balancetalk.module.member.domain.MemberRepository;
import balancetalk.module.post.domain.Post;
import balancetalk.module.post.domain.PostRepository;
import balancetalk.module.bookmark.dto.BookmarkRequest;
import balancetalk.module.bookmark.dto.BookmarkResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand All @@ -17,6 +16,7 @@
import java.util.stream.Collectors;

import static balancetalk.global.exception.ErrorCode.*;
import static balancetalk.global.utils.SecurityUtils.getCurrentMember;

@Service
@RequiredArgsConstructor
Expand All @@ -27,23 +27,24 @@ public class BookmarkService {
private final PostRepository postRepository;

@Transactional
public Bookmark save(final BookmarkRequest bookmarkRequestDto, Long postId) {
Member member = memberRepository.findById(bookmarkRequestDto.getMemberId())
.orElseThrow(() -> new BalanceTalkException(NOT_FOUND_MEMBER));
public Bookmark createBookmark(Long postId) {
Member member = getCurrentMember(memberRepository);
Post post = postRepository.findById(postId)
.orElseThrow(() -> new BalanceTalkException(NOT_FOUND_POST));
if (member.hasBookmarked(post)) {
throw new BalanceTalkException(ALREADY_BOOKMARK);
}
Bookmark bookmark = bookmarkRequestDto.toEntity(member, post);
Bookmark bookmark = Bookmark.builder()
.member(member)
.post(post)
.build();

return bookmarkRepository.save(bookmark);
}

@Transactional(readOnly = true) // TODO: Spring Security 도입 후 현재 인증된 사용자 정보 기반으로 조회하게 변경 필요
public List<BookmarkResponse> findAllByMember(Long memberId) {
Member member = memberRepository.findById(memberId)
.orElseThrow(() -> new BalanceTalkException(NOT_FOUND_MEMBER));
@Transactional(readOnly = true)
public List<BookmarkResponse> findAllByMember() {
Member member = getCurrentMember(memberRepository);
List<Bookmark> bookmarks = bookmarkRepository.findByMember(member);

return bookmarks.stream()
Expand All @@ -52,12 +53,15 @@ public List<BookmarkResponse> findAllByMember(Long memberId) {
}

@Transactional
public void deleteById(Long memberId, Long bookmarkId) { // TODO: Spring Security 도입 후 현재 인증된 사용자 정보 기반으로 삭제하게 변경 필요
memberRepository.findById(memberId)
.orElseThrow(() -> new BalanceTalkException(NOT_FOUND_MEMBER));
bookmarkRepository.findById(bookmarkId)
public void deleteByPostId(Long postId) {
Member member = getCurrentMember(memberRepository);
Bookmark bookmark = bookmarkRepository.findByMemberAndPostId(member, postId)
.orElseThrow(() -> new BalanceTalkException(NOT_FOUND_BOOKMARK));

bookmarkRepository.deleteById(bookmarkId);
if (!bookmark.getMember().equals(member)) {
throw new BalanceTalkException(FORBIDDEN_BOOKMARK_DELETE);
}

bookmarkRepository.delete(bookmark);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;
import java.util.Optional;

public interface BookmarkRepository extends JpaRepository<Bookmark, Long> {
List<Bookmark> findByMember(Member member);
Optional<Bookmark> findByMemberAndPostId(Member member, Long postId);

}
30 changes: 0 additions & 30 deletions src/main/java/balancetalk/module/bookmark/dto/BookmarkRequest.java

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

import java.time.LocalDateTime;

@Data
Expand Down
Loading

0 comments on commit b461f68

Please sign in to comment.