From d0c5807abadecacabd20fd6891f136bb5b76caa1 Mon Sep 17 00:00:00 2001 From: Junsoo Choi <78118588+jschoi-96@users.noreply.github.com> Date: Sun, 31 Mar 2024 00:11:42 +0900 Subject: [PATCH] deploy (#280) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * main -> dev merge (#252) * Dev to main (#251) * 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 * chore: 패키지 구조 개선 * Revert "chore: 패키지 구조 개선" This reverts commit f27a0d95080e705a953d94cfb7ef365a6a1f49cb. * chore: 패키지 구조 개선 * feat: Tag, Post, PostTag 엔티티 간 연관관계 매핑 --------- Co-authored-by: Hanjaemo Co-authored-by: Hanjaemo <110653660+Hanjaemo@users.noreply.github.com> Co-authored-by: gywns0417 * 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 * chore: 패키지 구조 개선 * Revert "chore: 패키지 구조 개선" This reverts commit f27a0d95080e705a953d94cfb7ef365a6a1f49cb. * 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 Co-authored-by: Hanjaemo <110653660+Hanjaemo@users.noreply.github.com> Co-authored-by: gywns0417 * 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 * chore: 패키지 구조 개선 * Revert "chore: 패키지 구조 개선" This reverts commit f27a0d95080e705a953d94cfb7ef365a6a1f49cb. * 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 Co-authored-by: Hanjaemo <110653660+Hanjaemo@users.noreply.github.com> Co-authored-by: gywns0417 * 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 <110653660+Hanjaemo@users.noreply.github.com> * 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 d24deef0a0bdab526b7e34ccd39a76fcfda8ec4c. * 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 <110653660+Hanjaemo@users.noreply.github.com> * 회원 정보 수정, 삭제 리팩토링 (#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: 파라미터에 닉네임 정보를 넣어 중복 체크하도록 변경 * test: 공지사항 생성 실패 테스트 스프링 통합 테스트로 변경 * 게시글, 댓글 조회 API 페이징, 정렬 처리 (#191) * chore: 설정 업데이트 * feat: 게시글 목록 조회 페이징 처리 * test: PostServiceTest 임시 주석 처리 * feat: 댓글 목록 조회 API 페이징 처리 * chore: 기본 페이지 사이즈 설정 추가 * refactor: 댓글 목록 조회 메서드의 반환 타입을 List에서 Page로 수정 * refactor: 게시글 목록 조회 메서드의 반환 타입을 List에서 Page로 수정 * refactor: PostRequest에서 memberId 제거 * 시큐리티 인증 URL 추가 및 에러 처리 추가 (#199) * refactor: 이메일 인증 에러코드 HttpStatus 변경 * refactor: JwtTokenProvider 코드 리팩토링 및 에러 코드 추가 * refactor: 테스트 코드 예외 처리할 때 메세지 String -> ErrorCode 형태로 수정 * refactor: 닉네임, 비밀번호 변경할 때 현재 값과 동일할 때 에러 메세지 추가 * refactor: 회원 가입 시 중복 이메일, 중복 닉네임 예외 처리 * refactor: 로그인 상태가 아닐 때 에러 메세지를 던지도록 수정 * refactor: 유효한 토큰이 아닐 때 클라이언트에 에러 메세지를 보내주도록 설정 * feat: 유효하지 않은 토큰인 경우 에러 코드 추가 * feat: 인증이 필요하지 않은 API URL 설정 * fix: swagger 문서에서 이중 배열로 데이터가 나타나던 문제 해결 * refactor: likeCount -> likesCount로 필드 이름 통일 * feat: 미인증 상태일 때 클라이언트에 json 형태로 httpStatus와 message를 보여주는 기능 추가 * refactor: 리뷰 내용 반영하여 에러 코드 이름 수정 * 회원가입 시 프로필 사진 선택 기능 구현 완료 (#207) * feat: 회원가입 시 프로필 사진 선택 가능하게 구현 * test: 기능 변경에 따른 기존 테스트 코드 변경 * feat: 게시글 응답 dto에 투표 여부 추가 (#198) * 인기 댓글 조회 기능 구현 (#206) * chore: HTTP 메서드가 GET인 댓글 관련 모든 URL 허용 * feat: 인기 댓글 목록 조회 기능 구현 * feat: 비회원과 회원 각각의 경우에 따른 조회 로직 구분, 응답 DTO에 myLike 필드 추가 * refactor: api 테스트용으로 사용하던 매직 넘버를 상수로 수정 * 인기 게시글 조회 기능 구현 (#203) * feat: 인기 게시글 조회 기능 구현 * style: 불필요한 개행 제거 * fix: PostService update * fix: PostController update * test: 시큐리티 인증 기능 추가로 인한 기존 공지 테스트 코드 수정 * feat: 게시글 응답 시 balanceOptionId 반환 구현 (#195) * Create ci.yml * Update ci.yml * init ci.yml * fix: CommentServiceTest * Embedded Redis 적용 (#218) * chore: embedded redis 설정 추가 * chore: 내장 redis를 profile이 local일때만 동작하도록 설정 * fix: 임시로 실패하는 로그아웃 단위 테스트 주석 처리 * refactor: 로그 아웃 테스트 코드 수정 * 비밀번호 찾기 기능 구현 (#205) * feat: 임시 비밀번호 발급 기능 구현 * feat: 임시 비밀번호 발급 후 데이터베이스에 저장된 비밀번호 변경 * feat: 이메일 발송이 실패한 경우 에러 코드 추가 * test: 임시 비밀번호 발송 후 회원 비밀번호 단위 테스트 추가 * refactor: 리뷰 받은 내용들 반영하여 수정 * Update ci.yml * Update ErrorCode.java * NoticeControllerTest 임시 주석 처리 * 공지사항 수정, 삭제 기능, 파일 첨부 구현 완료 (#186) * feat: 공지사항 수정, 삭제 에러 코드 추가 및 403번 에러로 변경 * feat: 공지사항 수정, 삭제 기능 구현 * test: 공지사항 수정, 삭제 기능에 대한 테스트 코드 작성 및 통과 완료 * feat: 공지사항 파일 첨부 구현 * fix: 공지사항 파일 첨부 시 Response에서 파일 목록이 null로 뜨던 에러 수정 * test: 공지사항 기능 추가 구현에 대한 테스트 코드 수정 및 추가 작성 완료 * test: 테스트 주석 처리 * 토큰 값에 memberId 추가 및 기타 예외 처리 (#219) * feat: 회원 가입 시 중복된 닉네임, 중복된 이메일 에러 처리 추가 * feat: 토큰 claims 정보에 memberId 추가 * feat: 파일 업로드 URL 시큐리티 접근 허용 * refactor: Notice Controller 테스트 주석 처리 * refactor: 누락된 코드 추가 --------- Co-authored-by: Hanjaemo <110653660+Hanjaemo@users.noreply.github.com> * Create cd.yml * Update cd.yml * Update cd.yml * Update cd.yml * Update cd.yml * Update cd.yml * Update cd.yml * feat: 선택지별 득표 수, 게시글 전체 투표 수 반환 구현 * Update cd.yml * feat: 게시글 전체 투표 수 필드명 변경 * 게시글 응답 필드(이미지 url) 변경 (#211) * refactor: 파일 업로드 경로 변경 및 상수화 * refactor: 게시글 조회 시 이미지 이름 대신 URL을 응답하도록 수정 * Bean Validation 사용 시 API 에러 메세지 처리 구현 (#222) * feat: 회원가입 할 때 입력 유효성 검증 추가 * feat: 메일 인증 서비스 유효성 검사 추가 * feat: 게시글 작성 유효성 검사 추가 * feat: 밸런스 옵션, 게시글 작성시 BalanceOption이 비어있는 경우 유효성 검사 * feat: 투표 생성 유효성 검사 * refactor: bookmark -> bookmarks로 url 수정 * refactor: "/posts" url 삭제 * refactor: @Valid 어노테이션 추가 및 파일 업로드 URL 시큐리티 허용 * refactor: Notice Controller 테스트 주석 처리 --------- Co-authored-by: Hanjaemo <110653660+Hanjaemo@users.noreply.github.com> * 게시글 검색, 태그 검색 기능 구현 (#233) * feat: 게시글 제목 검색 기능 구현 * feat: 게시글 태그 검색 기능 구현 * refactor: pageable 파라미터 제거 * test: 게시글 제목 검색, 태그 검색 단위 테스트 작성 * 마이페이지 본인이 작성한 게시글, 댓글 조회 기능 구현 (#209) * feat: 마이페이지 - 본인이 작성한 게시글 조회 기능 구현 완료 * feat: 마이페이지 - 본인이 작성한 댓글 조회 기능 구현 완료 * 마이페이지 본인이 투표한 게시글, 즐겨찾기한 게시글 조회 기능 구현 (#214) * feat: 마이페이지 - 본인이 작성한 게시글 조회 기능 구현 완료 * feat: 마이페이지 - 본인이 작성한 댓글 조회 기능 구현 완료 * feat: 마이페이지 - 본인이 투표한 게시글 조회 기능 구현 완료 * fix: 페이지네이션 적용 안되던 문제 해결 * feat: 마이페이지 - 본인이 북마크한 게시글 조회 기능 구현 완료 * style: 메서드 네이밍 수정 * feat: 마이페이지 컨트롤러 누락된 어노테이션 추가 * fix: 머지 후 conflicts 해결 * feat: totalVoteCount -> totalVotesCount 필드명 수정 * 게시글 응답 시 투표한 선택지인 selectedOptionId 반환 구현 완료 (#228) * feat: 게시글 응답 시 투표한 선택지인 selectedOptionId 반환 구현 * feat: 비회원 게시글 조회 가능 및 selectedOptionId null 반환 구현 * 게시글 및 댓글 응답시 사용자 프로필 이미지 반환 구현 완료 (#230) * feat: 게시글 응답 시 게시글 작성자의 프로필 이미지 반환 구현 * feat: 댓글 응답 시 모든 댓글 작성자의 프로필 이미지 반환 구현 * 댓글 응답시 부모 댓글(원 댓글) id 응답 추가 구현 완료 (#232) * feat: 게시글 응답 시 게시글 작성자의 프로필 이미지 반환 구현 * feat: 댓글 응답 시 모든 댓글 작성자의 프로필 이미지 반환 구현 * feat: 댓글 응답 시 부모 댓글 id 반환 구현 * fix: merge 후 conflicts 수정 * fix: PostRequest, PostResponse에서 리스트 형태로 된 Schema 삭제 * 회원 이미지 수정 기능 추가 (#226) * feat: 선택지별 득표 수, 게시글 전체 투표 수 반환 구현 * dev -> main (#223) * 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 * chore: 패키지 구조 개선 * Revert "chore: 패키지 구조 개선" This reverts commit f27a0d95080e705a953d94cfb7ef365a6a1f49cb. * chore: 패키지 구조 개선 * feat: Tag, Post, PostTag 엔티티 간 연관관계 매핑 --------- Co-authored-by: Hanjaemo Co-authored-by: Hanjaemo <110653660+Hanjaemo@users.noreply.github.com> Co-authored-by: gywns0417 * 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 * chore: 패키지 구조 개선 * Revert "chore: 패키지 구조 개선" This reverts commit f27a0d95080e705a953d94cfb7ef365a6a1f49cb. * 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 Co-authored-by: Hanjaemo <110653660+Hanjaemo@users.noreply.github.com> Co-authored-by: gywns0417 * 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 * chore: 패키지 구조 개선 * Revert "chore: 패키지 구조 개선" This reverts commit f27a0d95080e705a953d94cfb7ef365a6a1f49cb. * 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 Co-authored-by: Hanjaemo <110653660+Hanjaemo@users.noreply.github.com> Co-authored-by: gywns0417 * 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 <110653660+Hanjaemo@users.noreply.github.com> * 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 d24deef0a0bdab526b7e34ccd39a76fcfda8ec4c. * 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 <110653660+Hanjaemo@users.noreply.github.com> * 회원 정보 수정, 삭제 리팩토링 (#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: 파라미터에 닉네임 정보를 넣어 중복 체크하도록 변경 * test: 공지사항 생성 실패 테스트 스프링 통합 테스트로 변경 * 게시글, 댓글 조회 API 페이징, 정렬 처리 (#191) * chore: 설정 업데이트 * feat: 게시글 목록 조회 페이징 처리 * test: PostServiceTest 임시 주석 처리 * feat: 댓글 목록 조회 API 페이징 처리 * chore: 기본 페이지 사이즈 설정 추가 * refactor: 댓글 목록 조회 메서드의 반환 타입을 List에서 Page로 수정 * refactor: 게시글 목록 조회 메서드의 반환 타입을 List에서 Page로 수정 * refactor: PostRequest에서 memberId 제거 * 시큐리티 인증 URL 추가 및 에러 처리 추가 (#199) * refactor: 이메일 인증 에러코드 HttpStatus 변경 * refactor: JwtTokenProvider 코드 리팩토링 및 에러 코드 추가 * refactor: 테스트 코드 예외 처리할 때 메세지 String -> ErrorCode 형태로 수정 * refactor: 닉네임, 비밀번호 변경할 때 현재 값과 동일할 때 에러 메세지 추가 * refactor: 회원 가입 시 중복 이메일, 중복 닉네임 예외 처리 * refactor: 로그인 상태가 아닐 때 에러 메세지를 던지도록 수정 * refactor: 유효한 토큰이 아닐 때 클라이언트에 에러 메세지를 보내주도록 설정 * feat: 유효하지 않은 토큰인 경우 에러 코드 추가 * feat: 인증이 필요하지 않은 API URL 설정 * fix: swagger 문서에서 이중 배열로 데이터가 나타나던 문제 해결 * refactor: likeCount -> likesCount로 필드 이름 통일 * feat: 미인증 상태일 때 클라이언트에 json 형태로 httpStatus와 message를 보여주는 기능 추가 * refactor: 리뷰 내용 반영하여 에러 코드 이름 수정 * 회원가입 시 프로필 사진 선택 기능 구현 완료 (#207) * feat: 회원가입 시 프로필 사진 선택 가능하게 구현 * test: 기능 변경에 따른 기존 테스트 코드 변경 * feat: 게시글 응답 dto에 투표 여부 추가 (#198) * 인기 댓글 조회 기능 구현 (#206) * chore: HTTP 메서드가 GET인 댓글 관련 모든 URL 허용 * feat: 인기 댓글 목록 조회 기능 구현 * feat: 비회원과 회원 각각의 경우에 따른 조회 로직 구분, 응답 DTO에 myLike 필드 추가 * refactor: api 테스트용으로 사용하던 매직 넘버를 상수로 수정 * 인기 게시글 조회 기능 구현 (#203) * feat: 인기 게시글 조회 기능 구현 * style: 불필요한 개행 제거 * fix: PostService update * fix: PostController update * test: 시큐리티 인증 기능 추가로 인한 기존 공지 테스트 코드 수정 * feat: 게시글 응답 시 balanceOptionId 반환 구현 (#195) * Create ci.yml * Update ci.yml * init ci.yml * fix: CommentServiceTest * Embedded Redis 적용 (#218) * chore: embedded redis 설정 추가 * chore: 내장 redis를 profile이 local일때만 동작하도록 설정 * fix: 임시로 실패하는 로그아웃 단위 테스트 주석 처리 * refactor: 로그 아웃 테스트 코드 수정 * 비밀번호 찾기 기능 구현 (#205) * feat: 임시 비밀번호 발급 기능 구현 * feat: 임시 비밀번호 발급 후 데이터베이스에 저장된 비밀번호 변경 * feat: 이메일 발송이 실패한 경우 에러 코드 추가 * test: 임시 비밀번호 발송 후 회원 비밀번호 단위 테스트 추가 * refactor: 리뷰 받은 내용들 반영하여 수정 * Update ci.yml * Update ErrorCode.java * NoticeControllerTest 임시 주석 처리 * 공지사항 수정, 삭제 기능, 파일 첨부 구현 완료 (#186) * feat: 공지사항 수정, 삭제 에러 코드 추가 및 403번 에러로 변경 * feat: 공지사항 수정, 삭제 기능 구현 * test: 공지사항 수정, 삭제 기능에 대한 테스트 코드 작성 및 통과 완료 * feat: 공지사항 파일 첨부 구현 * fix: 공지사항 파일 첨부 시 Response에서 파일 목록이 null로 뜨던 에러 수정 * test: 공지사항 기능 추가 구현에 대한 테스트 코드 수정 및 추가 작성 완료 * test: 테스트 주석 처리 * 토큰 값에 memberId 추가 및 기타 예외 처리 (#219) * feat: 회원 가입 시 중복된 닉네임, 중복된 이메일 에러 처리 추가 * feat: 토큰 claims 정보에 memberId 추가 * feat: 파일 업로드 URL 시큐리티 접근 허용 * refactor: Notice Controller 테스트 주석 처리 * refactor: 누락된 코드 추가 --------- Co-authored-by: Hanjaemo <110653660+Hanjaemo@users.noreply.github.com> * Create cd.yml * Update cd.yml * Update cd.yml * Update cd.yml * Update cd.yml * Update cd.yml * Update cd.yml * Update cd.yml --------- Co-authored-by: Junsoo Choi <78118588+jschoi-96@users.noreply.github.com> Co-authored-by: gywns0417 Co-authored-by: king_0417 <73704053+gywns0417@users.noreply.github.com> Co-authored-by: Junsoo Choi * Update .gitmodules * Update cd.yml * feat: 게시글 전체 투표 수 필드명 변경 * Update cd.yml * Update cd.yml * feat: 임시 비밀번호 발송 API 시큐리티 허용 * feat: 회원 프로필 이미지 수정 기능 추가 * feat: 회원 프로필 이미지 수정 단위 테스트 추가 * 게시글 응답 필드(이미지 url) 변경 (#211) * refactor: 파일 업로드 경로 변경 및 상수화 * refactor: 게시글 조회 시 이미지 이름 대신 URL을 응답하도록 수정 * Bean Validation 사용 시 API 에러 메세지 처리 구현 (#222) * feat: 회원가입 할 때 입력 유효성 검증 추가 * feat: 메일 인증 서비스 유효성 검사 추가 * feat: 게시글 작성 유효성 검사 추가 * feat: 밸런스 옵션, 게시글 작성시 BalanceOption이 비어있는 경우 유효성 검사 * feat: 투표 생성 유효성 검사 * refactor: bookmark -> bookmarks로 url 수정 * refactor: "/posts" url 삭제 * refactor: @Valid 어노테이션 추가 및 파일 업로드 URL 시큐리티 허용 * refactor: Notice Controller 테스트 주석 처리 --------- Co-authored-by: Hanjaemo <110653660+Hanjaemo@users.noreply.github.com> * Update cd.yml * 게시글 검색, 태그 검색 기능 구현 (#233) * feat: 게시글 제목 검색 기능 구현 * feat: 게시글 태그 검색 기능 구현 * refactor: pageable 파라미터 제거 * test: 게시글 제목 검색, 태그 검색 단위 테스트 작성 * 마이페이지 본인이 작성한 게시글, 댓글 조회 기능 구현 (#209) * feat: 마이페이지 - 본인이 작성한 게시글 조회 기능 구현 완료 * feat: 마이페이지 - 본인이 작성한 댓글 조회 기능 구현 완료 * Create appspec.yml * 마이페이지 본인이 투표한 게시글, 즐겨찾기한 게시글 조회 기능 구현 (#214) * feat: 마이페이지 - 본인이 작성한 게시글 조회 기능 구현 완료 * feat: 마이페이지 - 본인이 작성한 댓글 조회 기능 구현 완료 * feat: 마이페이지 - 본인이 투표한 게시글 조회 기능 구현 완료 * fix: 페이지네이션 적용 안되던 문제 해결 * feat: 마이페이지 - 본인이 북마크한 게시글 조회 기능 구현 완료 * style: 메서드 네이밍 수정 * feat: 마이페이지 컨트롤러 누락된 어노테이션 추가 * fix: 머지 후 conflicts 해결 * feat: totalVoteCount -> totalVotesCount 필드명 수정 * 게시글 응답 시 투표한 선택지인 selectedOptionId 반환 구현 완료 (#228) * feat: 게시글 응답 시 투표한 선택지인 selectedOptionId 반환 구현 * feat: 비회원 게시글 조회 가능 및 selectedOptionId null 반환 구현 * 게시글 및 댓글 응답시 사용자 프로필 이미지 반환 구현 완료 (#230) * feat: 게시글 응답 시 게시글 작성자의 프로필 이미지 반환 구현 * feat: 댓글 응답 시 모든 댓글 작성자의 프로필 이미지 반환 구현 * 댓글 응답시 부모 댓글(원 댓글) id 응답 추가 구현 완료 (#232) * feat: 게시글 응답 시 게시글 작성자의 프로필 이미지 반환 구현 * feat: 댓글 응답 시 모든 댓글 작성자의 프로필 이미지 반환 구현 * feat: 댓글 응답 시 부모 댓글 id 반환 구현 * fix: merge 후 conflicts 수정 * Create gh_deploy.sh * Update build.gradle * Update cd.yml * Update cd.yml * Update cd.yml * Update cd.yml * fix: PostRequest, PostResponse에서 리스트 형태로 된 Schema 삭제 * feat: 임시 비밀번호 발송 API 시큐리티 허용 * feat: 회원 프로필 이미지 수정 기능 추가 * feat: 회원 프로필 이미지 수정 단위 테스트 추가 * fix: storedFileName을 사용하여 이미지를 수정하는 방식으로 코드 리팩토링 --------- Co-authored-by: gywns0417 Co-authored-by: Hanjaemo <110653660+Hanjaemo@users.noreply.github.com> Co-authored-by: king_0417 <73704053+gywns0417@users.noreply.github.com> * feat: 게시글 응답에 선택지 ID 추가 (#242) * feat: 회원/비회원 로직 구분 개선 (#243) * 리프레시 토큰을 쿠키에 담는 기능 구현 (#236) * refactor: balanceOption 스웨거에서 정상적으로 보여지지 않는 오류 수정 * fix: balanceOption 스웨거에서 정상적으로 보여지지 않는 오류 수정 * refactor: 토큰 만료, 유효하지 않은 토큰 에러인 경우 서버에 에러 메세지 전달하도록 수정 * refactor: 기본 생성자 제거 * feat: allowCredentials true 설정 * feat: 쿠키에 리프레시 토큰을 담는 기능 추가 * feat: 프론트에 쿠키를 보내기 위해 CORS 설정 수정 * feat: 리프레시 토큰을 헤더로 보내서 만료된 액세스 토큰을 재발급 받는 기능 추가 * test: MemberServiceTest 수정 * refactor: 불필요한 주석, Import문 제거 및 @Schema 제거 * refactor: 로그인 시 액세스 토큰만 클라이언트에 전달하도록 수정 * feat: refreshToken 헤더 설정 정보 추가 --------- Co-authored-by: Junsoo Choi <78118588+jschoi-96@users.noreply.github.com> Co-authored-by: gywns0417 Co-authored-by: king_0417 <73704053+gywns0417@users.noreply.github.com> Co-authored-by: Junsoo Choi * cors 설정 * Update SecurityConfig.java --------- Co-authored-by: Hanjaemo <110653660+Hanjaemo@users.noreply.github.com> Co-authored-by: gywns0417 Co-authored-by: king_0417 <73704053+gywns0417@users.noreply.github.com> * 공지사항, 마이페이지 시작 페이지 번호 수정 완료 (#239) * feat: 마이페이지 페이지 번호 0부터 시작하도록 수정 * feat: 공지사항 페이지 번호 0부터 시작하도록 수정 * 답글 조회 API 구현 완료 (#254) * feat: 답글 응답 ReplyResponse 클래스 작성 * feat: 답글 조회하는 JPA 쿼리 메서드 추가 * feat: 답글 조회 API 구현 * feat: CommentResponse 내 불필요한 답글 관련 필드, 메서드 삭제 * style: 스웨거 스키마 (댓글 -> 답글) 수정 * feat: 댓글 목록 조회 시 답글 제외 (#249) * feat: 게시글 목록 조회 시 추천수를 기준으로 내림차순 정렬하는 기능 구현 (#248) * fix: PostResponse 응답 시 vote.getMember() 가 null일 경우 처리 구현 (#263) * 스웨거 문서 수정 및 시큐리티 URL 허용 (#269) * refactor: application/json 에서 text/plain 으로 수정 * refactor: 임시 비밀번호 발급 로직을 POST로 변경 후 시큐리티 URL 허용 * feat: 클라이언트에 올바르게 토큰 에러 정보를 보여주도록 수정 (#258) * 회원 조회 시 응답에 있는 프로필 사진의 storedName을 url로 수정 (#268) * fix: VoteRequest에 기본 생성자 추가 및 허용 도메인 주소 변경 * chore: 포트 변경 * feat: MemberResponse에서 프로필 사진 이름 대신 URL을 포함하도록 수정 * 게시글 조회 응답에 댓글 개수 추가 (#271) * feat: 게시글 조회 응답에 댓글 개수 추가 * refactor: 댓글 개수 가져오는 책임을 Post 객체에 위임 * 마이페이지 API 응답 수정 완료 (#253) * move: 기존 마이페이지 Response 클래스 삭제 * feat: CommentResponse 내 불필요해진 postTitle 필드 삭제 * feat: MyPageResponse 클래스 작성 * feat: MyPageResponse 클래스 작성에 따른 기존 코드 수정 * fix: VoteRequest에 누락된 @NoArgsConstructor 어노테이션 추가 * style: 공백 추가 * feat: MyPageResponse 에 postId 반환 추가 구현 * feat: 쿠키를 이용하여 리프레시 토큰을 추출하고 액세스 토큰을 재발급 하는 방법으로 구현 (#264) Co-authored-by: king_0417 <73704053+gywns0417@users.noreply.github.com> * fix: merge 후 에러 수정 * 게시글, 댓글 신고 기능 구현 (#255) * refactor: dto 클래스에서 기본 생성자 제거 * feat: 게시글 신고 기능 구현 * feat: 댓글 신고 기능 구현 * feat: 신고 관련 파일 추가 * feat: 게시글 신고 횟수가 5가 되면 BLIND로 변경 * feat: 댓글 신고 횟수가 5가 되면 BLIND 상태로 변경 * feat: 회원이 신고당한 횟수를 보여주는 API 추가 * refactor: 리뷰 수정 * refactor: 수정 사항 추가 * fix: 사용하지 않는 메서드, 변수 제거 * fix: 신고만 적용되도록 수정 * refactor: viewStatus 주석 처리 * test * refactor: 리뷰 내용 반영해서 수정 * fix: import 수정 * 영속성 전이 (#279) * submodule --------- Co-authored-by: Hanjaemo <110653660+Hanjaemo@users.noreply.github.com> Co-authored-by: gywns0417 Co-authored-by: king_0417 <73704053+gywns0417@users.noreply.github.com> --- .../module/authmail/dto/EmailRequest.java | 1 - .../authmail/dto/EmailVerification.java | 1 - .../comment/application/CommentService.java | 24 ++++++++++++++++++- .../module/comment/domain/Comment.java | 4 ++-- .../module/comment/dto/CommentResponse.java | 9 +++++++ .../presentation/CommentController.java | 9 +++++++ .../module/file/dto/FileResponse.java | 1 - .../member/application/MemberService.java | 8 +++++++ .../module/member/dto/JoinRequest.java | 1 - .../module/member/dto/LoginRequest.java | 1 - .../module/member/dto/MemberResponse.java | 1 - .../module/post/application/PostService.java | 24 ++++++++++++++++++- .../module/post/domain/BalanceOption.java | 2 +- .../balancetalk/module/post/domain/Post.java | 12 ++++++---- .../module/post/dto/BalanceOptionRequest.java | 4 ++-- .../post/dto/BalanceOptionResponse.java | 4 ++-- .../module/post/dto/PostRequest.java | 2 -- .../module/post/dto/PostResponse.java | 13 ++++++++-- .../module/post/dto/PostTagDto.java | 1 - .../post/presentation/PostController.java | 9 +++++++ .../module/report/domain/Report.java | 6 +++-- .../report/domain/ReportRepository.java | 6 +++++ .../module/report/dto/ReportRequest.java | 20 ++++++++++++++++ .../report/presentation/ReportController.java | 12 ++++++++++ src/main/resources/config | 2 +- 25 files changed, 150 insertions(+), 27 deletions(-) create mode 100644 src/main/java/balancetalk/module/report/domain/ReportRepository.java create mode 100644 src/main/java/balancetalk/module/report/dto/ReportRequest.java create mode 100644 src/main/java/balancetalk/module/report/presentation/ReportController.java diff --git a/src/main/java/balancetalk/module/authmail/dto/EmailRequest.java b/src/main/java/balancetalk/module/authmail/dto/EmailRequest.java index 31b45753f..b5ab7ed5b 100644 --- a/src/main/java/balancetalk/module/authmail/dto/EmailRequest.java +++ b/src/main/java/balancetalk/module/authmail/dto/EmailRequest.java @@ -10,7 +10,6 @@ @Data @AllArgsConstructor -@NoArgsConstructor public class EmailRequest { @NotNull diff --git a/src/main/java/balancetalk/module/authmail/dto/EmailVerification.java b/src/main/java/balancetalk/module/authmail/dto/EmailVerification.java index 81e673a66..a7aa52822 100644 --- a/src/main/java/balancetalk/module/authmail/dto/EmailVerification.java +++ b/src/main/java/balancetalk/module/authmail/dto/EmailVerification.java @@ -10,7 +10,6 @@ @Data @AllArgsConstructor -@NoArgsConstructor public class EmailVerification { @NotNull diff --git a/src/main/java/balancetalk/module/comment/application/CommentService.java b/src/main/java/balancetalk/module/comment/application/CommentService.java index b286a9411..df3d59980 100644 --- a/src/main/java/balancetalk/module/comment/application/CommentService.java +++ b/src/main/java/balancetalk/module/comment/application/CommentService.java @@ -15,6 +15,9 @@ import balancetalk.module.post.domain.BalanceOption; import balancetalk.module.post.domain.Post; import balancetalk.module.post.domain.PostRepository; +import balancetalk.module.report.domain.Report; +import balancetalk.module.report.domain.ReportRepository; +import balancetalk.module.report.dto.ReportRequest; import balancetalk.module.member.dto.MyPageResponse; import balancetalk.module.vote.domain.Vote; import balancetalk.module.vote.domain.VoteRepository; @@ -46,6 +49,7 @@ public class CommentService { private final PostRepository postRepository; private final CommentLikeRepository commentLikeRepository; private final VoteRepository voteRepository; + private final ReportRepository reportRepository; @Value("${comments.max-depth}") private int maxDepth; @@ -255,7 +259,25 @@ public List findBestComments(Long postId, String token) { .toList()); } } - return responses; } + + public void reportComment(Long postId, Long commentId, ReportRequest reportRequest) { + Comment comment = validateCommentId(commentId); + Member member = getCurrentMember(memberRepository); +// if (comment.getMember().equals(member)) { +// throw new BalanceTalkException(FORBIDDEN_OWN_REPORT); +// } + + if (!comment.getPost().getId().equals(postId)) { + throw new BalanceTalkException(NOT_FOUND_COMMENT_AT_THAT_POST); + } + Report report = Report.builder() + .content(reportRequest.getDescription()) + .reporter(member) + .comment(comment) + .category(reportRequest.getCategory()) + .build(); + reportRepository.save(report); + } } diff --git a/src/main/java/balancetalk/module/comment/domain/Comment.java b/src/main/java/balancetalk/module/comment/domain/Comment.java index 4b3f1eb2a..eb6798696 100644 --- a/src/main/java/balancetalk/module/comment/domain/Comment.java +++ b/src/main/java/balancetalk/module/comment/domain/Comment.java @@ -46,10 +46,10 @@ public class Comment extends BaseTimeEntity { @JoinColumn(name = "parent_id") private Comment parent; - @OneToMany(mappedBy = "comment") + @OneToMany(mappedBy = "comment", cascade = CascadeType.ALL) private List likes = new ArrayList<>(); - @OneToMany(mappedBy = "comment") + @OneToMany(mappedBy = "comment", cascade = CascadeType.ALL) private List reports = new ArrayList<>(); public void updateContent(String content) { diff --git a/src/main/java/balancetalk/module/comment/dto/CommentResponse.java b/src/main/java/balancetalk/module/comment/dto/CommentResponse.java index 401aec48a..77e9f5d36 100644 --- a/src/main/java/balancetalk/module/comment/dto/CommentResponse.java +++ b/src/main/java/balancetalk/module/comment/dto/CommentResponse.java @@ -1,5 +1,6 @@ package balancetalk.module.comment.dto; +import balancetalk.module.ViewStatus; import balancetalk.module.comment.domain.Comment; import balancetalk.module.file.domain.File; import balancetalk.module.member.domain.Member; @@ -30,9 +31,15 @@ public class CommentResponse { @Schema(description = "해당 댓글에 맞는 선택지 id", example = "23") private Long selectedOptionId; +// @Schema(description = "댓글 블라인드 여부", example = "NORMAL") +// private ViewStatus viewStatus; + @Schema(description = "댓글 추천 수", example = "24") private int likesCount; +// @Schema(description = "댓글 신고 수", example = "3") +// private long reportedCount; + @Schema(description = "추천 여부", example = "true") private boolean myLike; @@ -52,7 +59,9 @@ public static CommentResponse fromEntity(Comment comment, Long balanceOptionId, .memberName(comment.getMember().getNickname()) .postId(comment.getPost().getId()) .selectedOptionId(balanceOptionId) + //.viewStatus(comment.getViewStatus()) .likesCount(comment.getLikes().size()) + //.reportedCount(comment.reportedCount()) .myLike(myLike) .createdAt(comment.getCreatedAt()) .lastModifiedAt(comment.getLastModifiedAt()) diff --git a/src/main/java/balancetalk/module/comment/presentation/CommentController.java b/src/main/java/balancetalk/module/comment/presentation/CommentController.java index 0ea64bf05..0db727e11 100644 --- a/src/main/java/balancetalk/module/comment/presentation/CommentController.java +++ b/src/main/java/balancetalk/module/comment/presentation/CommentController.java @@ -4,6 +4,7 @@ import balancetalk.module.comment.dto.CommentRequest; import balancetalk.module.comment.dto.CommentResponse; import balancetalk.module.comment.dto.ReplyCreateRequest; +import balancetalk.module.report.dto.ReportRequest; import balancetalk.module.comment.dto.ReplyResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -93,4 +94,12 @@ public String likeComment(@PathVariable Long postId, @PathVariable Long commentI public void cancelLikeComment(@PathVariable Long commentId) { commentService.cancelLikeComment(commentId); } + + @ResponseStatus(HttpStatus.OK) + @PostMapping("/{commentId}/report") + @Operation(summary = "댓글 신고", description = "comment-id에 해당하는 댓글을 신고 처리한다.") + public String reportComment(@PathVariable Long postId, @PathVariable Long commentId, @RequestBody ReportRequest reportRequest) { + commentService.reportComment(postId, commentId, reportRequest); + return "신고가 성공적으로 접수되었습니다."; + } } diff --git a/src/main/java/balancetalk/module/file/dto/FileResponse.java b/src/main/java/balancetalk/module/file/dto/FileResponse.java index 5a7faed55..f97763199 100644 --- a/src/main/java/balancetalk/module/file/dto/FileResponse.java +++ b/src/main/java/balancetalk/module/file/dto/FileResponse.java @@ -7,7 +7,6 @@ @Data @Builder -@NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor public class FileResponse { @Schema(description = "파일 id", example = "1") diff --git a/src/main/java/balancetalk/module/member/application/MemberService.java b/src/main/java/balancetalk/module/member/application/MemberService.java index 81bf89974..4c6ed7e25 100644 --- a/src/main/java/balancetalk/module/member/application/MemberService.java +++ b/src/main/java/balancetalk/module/member/application/MemberService.java @@ -4,11 +4,13 @@ import balancetalk.global.exception.ErrorCode; import balancetalk.global.jwt.JwtTokenProvider; import balancetalk.global.redis.application.RedisService; +import balancetalk.module.comment.domain.Comment; import balancetalk.module.file.domain.File; import balancetalk.module.file.domain.FileRepository; import balancetalk.module.member.domain.Member; import balancetalk.module.member.domain.MemberRepository; import balancetalk.module.member.dto.*; +import balancetalk.module.post.domain.Post; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -124,6 +126,12 @@ public void delete(final LoginRequest loginRequest, HttpServletRequest request) if (!passwordEncoder.matches(loginRequest.getPassword(), member.getPassword())) { throw new BalanceTalkException(ErrorCode.MISMATCHED_EMAIL_OR_PASSWORD); } + List posts = member.getPosts(); + if (posts != null) { + for (Post post : posts) { + post.removeMember(); + } + } memberRepository.deleteByEmail(member.getEmail()); } diff --git a/src/main/java/balancetalk/module/member/dto/JoinRequest.java b/src/main/java/balancetalk/module/member/dto/JoinRequest.java index d9d02abdf..ace7a9c3e 100644 --- a/src/main/java/balancetalk/module/member/dto/JoinRequest.java +++ b/src/main/java/balancetalk/module/member/dto/JoinRequest.java @@ -12,7 +12,6 @@ @Data @Builder -@NoArgsConstructor @AllArgsConstructor public class JoinRequest { diff --git a/src/main/java/balancetalk/module/member/dto/LoginRequest.java b/src/main/java/balancetalk/module/member/dto/LoginRequest.java index fdcd07fb4..c1d5f8521 100644 --- a/src/main/java/balancetalk/module/member/dto/LoginRequest.java +++ b/src/main/java/balancetalk/module/member/dto/LoginRequest.java @@ -9,7 +9,6 @@ @Data @Builder -@NoArgsConstructor @AllArgsConstructor public class LoginRequest { diff --git a/src/main/java/balancetalk/module/member/dto/MemberResponse.java b/src/main/java/balancetalk/module/member/dto/MemberResponse.java index 9cf243e25..4ee1080ef 100644 --- a/src/main/java/balancetalk/module/member/dto/MemberResponse.java +++ b/src/main/java/balancetalk/module/member/dto/MemberResponse.java @@ -11,7 +11,6 @@ import java.util.Optional; @Data @Builder -@NoArgsConstructor @AllArgsConstructor public class MemberResponse { diff --git a/src/main/java/balancetalk/module/post/application/PostService.java b/src/main/java/balancetalk/module/post/application/PostService.java index 8fadd74f2..b1756e446 100644 --- a/src/main/java/balancetalk/module/post/application/PostService.java +++ b/src/main/java/balancetalk/module/post/application/PostService.java @@ -13,6 +13,12 @@ import balancetalk.module.member.domain.Role; import balancetalk.module.member.dto.MyPageResponse; import balancetalk.module.post.domain.*; +import balancetalk.module.post.dto.BalanceOptionRequest; +import balancetalk.module.post.dto.PostRequest; +import balancetalk.module.post.dto.PostResponse; +import balancetalk.module.report.domain.Report; +import balancetalk.module.report.domain.ReportRepository; +import balancetalk.module.report.dto.ReportRequest; import balancetalk.module.post.dto.*; import balancetalk.module.vote.domain.VoteRepository; import java.util.stream.Collectors; @@ -31,7 +37,6 @@ @Transactional public class PostService { private static final int BEST_POSTS_SIZE = 5; - private final PostRepository postRepository; private final MemberRepository memberRepository; private final PostLikeRepository postLikeRepository; @@ -39,6 +44,7 @@ public class PostService { private final VoteRepository voteRepository; private final BookmarkRepository bookmarkRepository; private final RedisService redisService; + private final ReportRepository reportRepository; public PostResponse save(final PostRequest request) { Member writer = getCurrentMember(memberRepository); @@ -226,4 +232,20 @@ public List findPostsByTag(String token, String tagName) { member.hasVoted(post))) .collect(Collectors.toList()); } + + public void reportPost(Long postId, ReportRequest reportRequest) { + Post post = postRepository.findById(postId) + .orElseThrow(() -> new BalanceTalkException(NOT_FOUND_POST)); + Member member = getCurrentMember(memberRepository); +// if (post.getMember().equals(member)) { +// throw new BalanceTalkException(FORBIDDEN_OWN_REPORT); +// } + Report report = Report.builder() + .content(reportRequest.getDescription()) + .reporter(member) + .post(post) + .category(reportRequest.getCategory()) + .build(); + reportRepository.save(report); + } } diff --git a/src/main/java/balancetalk/module/post/domain/BalanceOption.java b/src/main/java/balancetalk/module/post/domain/BalanceOption.java index f2ba07823..0676da667 100644 --- a/src/main/java/balancetalk/module/post/domain/BalanceOption.java +++ b/src/main/java/balancetalk/module/post/domain/BalanceOption.java @@ -40,7 +40,7 @@ public class BalanceOption { @JoinColumn(name = "post_id") private Post post; - @OneToMany(mappedBy = "balanceOption") + @OneToMany(mappedBy = "balanceOption", cascade = CascadeType.ALL) private List votes = new ArrayList<>(); public int voteCount() { diff --git a/src/main/java/balancetalk/module/post/domain/Post.java b/src/main/java/balancetalk/module/post/domain/Post.java index 41b446733..fddd1065f 100644 --- a/src/main/java/balancetalk/module/post/domain/Post.java +++ b/src/main/java/balancetalk/module/post/domain/Post.java @@ -59,22 +59,22 @@ public class Post extends BaseTimeEntity { @OneToMany(mappedBy = "post", cascade = CascadeType.ALL) private List options = new ArrayList<>(); - @OneToMany(mappedBy = "post") + @OneToMany(mappedBy = "post", cascade = CascadeType.ALL) private List likes = new ArrayList<>(); @Formula("(select count(*) from post_like where post_like.post_id = post_id)") private long likesCount; - @OneToMany(mappedBy = "post") + @OneToMany(mappedBy = "post", cascade = CascadeType.ALL) private List comments = new ArrayList<>(); @OneToMany(mappedBy = "post", cascade = CascadeType.ALL) private List postTags = new ArrayList<>(); - @OneToMany(mappedBy = "post") + @OneToMany(mappedBy = "post", cascade = CascadeType.ALL) private List bookmarks = new ArrayList<>(); - @OneToMany(mappedBy = "post") + @OneToMany(mappedBy = "post", cascade = CascadeType.ALL) private List reports = new ArrayList<>(); public boolean isCasual() { @@ -101,6 +101,10 @@ public void init() { this.viewStatus = ViewStatus.NORMAL; } + public void removeMember() { + this.member = null; + } + public boolean notContainsBalanceOption(BalanceOption option) { return !options.contains(option); } diff --git a/src/main/java/balancetalk/module/post/dto/BalanceOptionRequest.java b/src/main/java/balancetalk/module/post/dto/BalanceOptionRequest.java index ecac4163f..2287a3738 100644 --- a/src/main/java/balancetalk/module/post/dto/BalanceOptionRequest.java +++ b/src/main/java/balancetalk/module/post/dto/BalanceOptionRequest.java @@ -2,7 +2,6 @@ import balancetalk.module.file.domain.File; import balancetalk.module.post.domain.BalanceOption; -import balancetalk.module.post.domain.BalanceOption.BalanceOptionBuilder; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; @@ -14,9 +13,10 @@ import java.util.List; import java.util.Optional; +import static balancetalk.module.post.domain.BalanceOption.*; + @Data @Builder -@NoArgsConstructor @AllArgsConstructor public class BalanceOptionRequest { diff --git a/src/main/java/balancetalk/module/post/dto/BalanceOptionResponse.java b/src/main/java/balancetalk/module/post/dto/BalanceOptionResponse.java index 5fc5d70d9..cadd9eb1c 100644 --- a/src/main/java/balancetalk/module/post/dto/BalanceOptionResponse.java +++ b/src/main/java/balancetalk/module/post/dto/BalanceOptionResponse.java @@ -2,7 +2,6 @@ import balancetalk.module.file.domain.File; import balancetalk.module.post.domain.BalanceOption; -import balancetalk.module.post.domain.BalanceOption.BalanceOptionBuilder; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; @@ -10,9 +9,10 @@ import lombok.NoArgsConstructor; import org.springframework.lang.Nullable; +import static balancetalk.module.post.domain.BalanceOption.*; + @Data @Builder -@NoArgsConstructor @AllArgsConstructor public class BalanceOptionResponse { diff --git a/src/main/java/balancetalk/module/post/dto/PostRequest.java b/src/main/java/balancetalk/module/post/dto/PostRequest.java index 6e69e2ab7..97ae45de2 100644 --- a/src/main/java/balancetalk/module/post/dto/PostRequest.java +++ b/src/main/java/balancetalk/module/post/dto/PostRequest.java @@ -12,7 +12,6 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; -import lombok.NoArgsConstructor; import java.time.LocalDateTime; import java.util.List; import java.util.Map; @@ -21,7 +20,6 @@ @Data @Builder -@NoArgsConstructor @AllArgsConstructor public class PostRequest { diff --git a/src/main/java/balancetalk/module/post/dto/PostResponse.java b/src/main/java/balancetalk/module/post/dto/PostResponse.java index 391916c12..5e76503f9 100644 --- a/src/main/java/balancetalk/module/post/dto/PostResponse.java +++ b/src/main/java/balancetalk/module/post/dto/PostResponse.java @@ -1,5 +1,6 @@ package balancetalk.module.post.dto; +import balancetalk.module.ViewStatus; import balancetalk.module.file.domain.File; import balancetalk.module.member.domain.Member; import balancetalk.module.post.domain.BalanceOption; @@ -26,15 +27,21 @@ public class PostResponse { private String title; @JsonFormat(pattern = "yyyy/MM/dd HH:mm:ss") - @Schema(description = "투료 종료 기한", example = "2024-12-25T15:30:00") + @Schema(description = "투료 종료 기한", example = "2024/12/25 15:30:00") private LocalDateTime deadline; @Schema(description = "게시글 조회수", example = "126") private long views; +// @Schema(description = "게시글 블라인드 여부", example = "NORMAL") +// private ViewStatus viewStatus; + @Schema(description = "게시글 추천수", example = "15") private long likesCount; +// @Schema(description = "신고 횟수" , example = "3") +// private long reportedCount; + @Schema(description = "추천 여부", example = "true") private boolean myLike; @@ -61,7 +68,7 @@ public class PostResponse { private long commentsCount; @JsonFormat(pattern = "yyyy/MM/dd HH:mm:ss") - @Schema(description = "게시글 작성일", example = "2023-12-25T15:30:00") + @Schema(description = "게시글 작성일", example = "2024/03/30 11:12:37") private LocalDateTime createdAt; @Schema(description = "게시글 작성자", example = "작성자 닉네임") @@ -77,8 +84,10 @@ public static PostResponse fromEntity(Post post, Member member, boolean myLike, .title(post.getTitle()) .deadline(post.getDeadline()) .views(post.getViews()) +// .viewStatus(post.getViewStatus()) .likesCount(post.likesCount()) .myLike(myLike) +// .reportedCount(post.reportedCount()) .myBookmark(myBookmark) .myVote(myVote) .selectedOptionId(getSelectedOptionId(post, member)) diff --git a/src/main/java/balancetalk/module/post/dto/PostTagDto.java b/src/main/java/balancetalk/module/post/dto/PostTagDto.java index 8623c97ff..2e19439ff 100644 --- a/src/main/java/balancetalk/module/post/dto/PostTagDto.java +++ b/src/main/java/balancetalk/module/post/dto/PostTagDto.java @@ -7,7 +7,6 @@ @Data @Builder -@NoArgsConstructor @AllArgsConstructor public class PostTagDto { diff --git a/src/main/java/balancetalk/module/post/presentation/PostController.java b/src/main/java/balancetalk/module/post/presentation/PostController.java index 8556e37d4..5ba72bf47 100644 --- a/src/main/java/balancetalk/module/post/presentation/PostController.java +++ b/src/main/java/balancetalk/module/post/presentation/PostController.java @@ -3,6 +3,7 @@ import balancetalk.module.post.application.PostService; import balancetalk.module.post.dto.PostRequest; import balancetalk.module.post.dto.PostResponse; +import balancetalk.module.report.dto.ReportRequest; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import java.util.List; @@ -92,4 +93,12 @@ public String cancelLikePost(@PathVariable Long postId) { postService.cancelLikePost(postId); return "요청이 정상적으로 처리되었습니다."; } + + @ResponseStatus(HttpStatus.OK) + @PostMapping("/{postId}/report") + @Operation(summary = "게시글 신고", description = "post-id에 해당하는 게시글을 신고 처리한다.") + public String reportPost(@PathVariable Long postId, @RequestBody ReportRequest request) { + postService.reportPost(postId, request); + return "신고가 성공적으로 접수되었습니다."; + } } diff --git a/src/main/java/balancetalk/module/report/domain/Report.java b/src/main/java/balancetalk/module/report/domain/Report.java index 4ce186bb1..3627e9e12 100644 --- a/src/main/java/balancetalk/module/report/domain/Report.java +++ b/src/main/java/balancetalk/module/report/domain/Report.java @@ -15,11 +15,13 @@ import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; +import lombok.*; @Entity +@Builder +@Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public class Report extends BaseTimeEntity { @Id diff --git a/src/main/java/balancetalk/module/report/domain/ReportRepository.java b/src/main/java/balancetalk/module/report/domain/ReportRepository.java new file mode 100644 index 000000000..cd63599ee --- /dev/null +++ b/src/main/java/balancetalk/module/report/domain/ReportRepository.java @@ -0,0 +1,6 @@ +package balancetalk.module.report.domain; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ReportRepository extends JpaRepository { +} \ No newline at end of file diff --git a/src/main/java/balancetalk/module/report/dto/ReportRequest.java b/src/main/java/balancetalk/module/report/dto/ReportRequest.java new file mode 100644 index 000000000..bf0ab0d52 --- /dev/null +++ b/src/main/java/balancetalk/module/report/dto/ReportRequest.java @@ -0,0 +1,20 @@ +package balancetalk.module.report.dto; + +import balancetalk.module.report.domain.ReportCategory; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Builder +@Data +@AllArgsConstructor +public class ReportRequest { + + @Schema(description = "신고 이유", example = "정치 게시글 / 분란성 댓글") + private ReportCategory category; + + @Schema(description = "신고 설명", example = "게시글 / 댓글 신고한 이유") + private String description; + +} diff --git a/src/main/java/balancetalk/module/report/presentation/ReportController.java b/src/main/java/balancetalk/module/report/presentation/ReportController.java new file mode 100644 index 000000000..961c3d5cc --- /dev/null +++ b/src/main/java/balancetalk/module/report/presentation/ReportController.java @@ -0,0 +1,12 @@ +package balancetalk.module.report.presentation; + +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/admin") +public class ReportController { + +} diff --git a/src/main/resources/config b/src/main/resources/config index ed4cab658..dfd0c39dd 160000 --- a/src/main/resources/config +++ b/src/main/resources/config @@ -1 +1 @@ -Subproject commit ed4cab6581e749d25bb6fbc8cc031260ee61a469 +Subproject commit dfd0c39dd335becea21435284ab8ff0bc18905c3