diff --git a/backend/src/main/java/com/ai/lawyer/domain/poll/repository/PollVoteRepositoryImpl.java b/backend/src/main/java/com/ai/lawyer/domain/poll/repository/PollVoteRepositoryImpl.java index dfefe91..faa1172 100644 --- a/backend/src/main/java/com/ai/lawyer/domain/poll/repository/PollVoteRepositoryImpl.java +++ b/backend/src/main/java/com/ai/lawyer/domain/poll/repository/PollVoteRepositoryImpl.java @@ -97,7 +97,8 @@ public List countStaticsByPollOptionIds(List pollOptionIds .fetch(); return tuples.stream() .map(t -> { - String gender = t.get(1, String.class); + Member.Gender genderEnum = t.get(1, Member.Gender.class); + String gender = genderEnum != null ? genderEnum.name() : "기타"; Integer age = t.get(2, Integer.class); String ageGroup = getAgeGroup(age); Long voteCount = t.get(3, Long.class); diff --git a/backend/src/main/java/com/ai/lawyer/domain/poll/service/PollService.java b/backend/src/main/java/com/ai/lawyer/domain/poll/service/PollService.java index 63e7853..0d1ddca 100644 --- a/backend/src/main/java/com/ai/lawyer/domain/poll/service/PollService.java +++ b/backend/src/main/java/com/ai/lawyer/domain/poll/service/PollService.java @@ -37,7 +37,7 @@ public interface PollService { PollDto updatePoll(Long pollId, PollUpdateDto pollUpdateDto, Long memberId); void patchUpdatePoll(Long pollId, PollUpdateDto pollUpdateDto); void closePoll(Long pollId); - void deletePoll(Long pollId, Long memberId); + void deletePoll(Long pollId, Long memberId); // ===== 검증 관련 ===== void validatePollCreate(PollCreateDto dto); diff --git a/backend/src/main/java/com/ai/lawyer/domain/post/controller/PostController.java b/backend/src/main/java/com/ai/lawyer/domain/post/controller/PostController.java index 38e00a6..fd860c2 100644 --- a/backend/src/main/java/com/ai/lawyer/domain/post/controller/PostController.java +++ b/backend/src/main/java/com/ai/lawyer/domain/post/controller/PostController.java @@ -114,6 +114,15 @@ public ResponseEntity> deletePost(@PathVariable Long postId) { return ResponseEntity.ok(new ApiResponse<>(200, "게시글이 삭제되었습니다.", null)); } + @Operation(summary = "게시글 삭제(관리자)") + @DeleteMapping("/admin/{postId}") + public ResponseEntity> deletePostAdmin(@PathVariable Long postId) { + //AuthUtil.validateAdmin(); 관리자 + AuthUtil.getAuthenticatedMemberId(); // 모든 유저 + postService.deletePostAdmin(postId); + return ResponseEntity.ok(new ApiResponse<>(200, "게시글이 삭제되었습니다.", null)); + } + @ExceptionHandler(ResponseStatusException.class) public ResponseEntity> handleResponseStatusException(ResponseStatusException ex) { int code = ex.getStatusCode().value(); diff --git a/backend/src/main/java/com/ai/lawyer/domain/post/service/PostService.java b/backend/src/main/java/com/ai/lawyer/domain/post/service/PostService.java index 65860de..b87dde0 100644 --- a/backend/src/main/java/com/ai/lawyer/domain/post/service/PostService.java +++ b/backend/src/main/java/com/ai/lawyer/domain/post/service/PostService.java @@ -26,6 +26,7 @@ public interface PostService { PostDto updatePost(Long postId, PostUpdateDto postUpdateDto); void patchUpdatePost(Long postId, PostUpdateDto postUpdateDto); void deletePost(Long postId); + void deletePostAdmin(Long postId); PostDetailDto createPostWithPoll(PostWithPollCreateDto dto, Long memberId); // ===== 본인 게시글 관련 ===== diff --git a/backend/src/main/java/com/ai/lawyer/domain/post/service/PostServiceImpl.java b/backend/src/main/java/com/ai/lawyer/domain/post/service/PostServiceImpl.java index 2024b2e..2b007cb 100644 --- a/backend/src/main/java/com/ai/lawyer/domain/post/service/PostServiceImpl.java +++ b/backend/src/main/java/com/ai/lawyer/domain/post/service/PostServiceImpl.java @@ -100,9 +100,9 @@ public PostDetailDto getPostById(Long postId) { public List getPostsByMemberId(Long memberId) { Member member = AuthUtil.getMemberOrThrow(memberId); List posts = postRepository.findByMember(member); - if (posts.isEmpty()) { - throw new ResponseStatusException(HttpStatus.NOT_FOUND, "해당 회원의 게시글이 없습니다."); - } +// if (posts.isEmpty()) { +// throw new ResponseStatusException(HttpStatus.NOT_FOUND, "해당 회원의 게시글이 없습니다."); +// } return posts.stream() .sorted(Comparator.comparing(Post::getUpdatedAt, Comparator.nullsLast(Comparator.naturalOrder())).reversed()) // 최신순 정렬 .map(post -> convertToDto(post, memberId)) @@ -145,6 +145,13 @@ public void deletePost(Long postId) { postRepository.delete(post); } + @Override + public void deletePostAdmin(Long postId) { + Post post = postRepository.findById(postId) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "삭제할 게시글을 찾을 수 없습니다.")); + postRepository.delete(post); + } + @Override public List getAllPosts(Long memberId) { return postRepository.findAll().stream() diff --git a/backend/src/main/java/com/ai/lawyer/global/oauth/CustomOAuth2UserService.java b/backend/src/main/java/com/ai/lawyer/global/oauth/CustomOAuth2UserService.java index 251dc48..c3b3e41 100644 --- a/backend/src/main/java/com/ai/lawyer/global/oauth/CustomOAuth2UserService.java +++ b/backend/src/main/java/com/ai/lawyer/global/oauth/CustomOAuth2UserService.java @@ -48,10 +48,12 @@ public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2Authentic member = createOAuth2Member(userInfo); } else { // 기존 OAuth2 회원 로그인 - log.info("기존 OAuth2 사용자 로그인: email={}, provider={}", userInfo.getEmail(), registrationId); + log.info("기존 OAuth2 사용자 로그인: email={}, provider={}, memberId={}", userInfo.getEmail(), registrationId, member.getMemberId()); } - oauth2MemberRepository.save(member); + // 엔티티를 저장하고 영속화된 엔티티를 반환받아야 memberId가 할당됨 + member = oauth2MemberRepository.save(member); + log.info("OAuth2 회원 저장 완료: memberId={}, loginId={}", member.getMemberId(), member.getLoginId()); // OAuth2 provider의 access token을 Redis에 저장 (연동 해제용) saveOAuth2ProviderAccessToken(userInfo.getEmail(), accessToken);