From 4208e607ae7e661a51b4887e9c9e82dd651e7aa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=5BCLOUD4=5D=20=EA=B3=A0=EB=B2=94=EC=84=9D?= Date: Sun, 4 May 2025 18:29:27 +0900 Subject: [PATCH 1/3] =?UTF-8?q?refactor:=20=EC=9C=A0=EC=A0=80=20=EC=8B=A0?= =?UTF-8?q?=EA=B3=A0=20=EC=82=AC=EC=9C=A0=20json=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hyetaekon/common/config/SecurityPath.java | 3 ++- .../hyetaekon/common/exception/ErrorCode.java | 8 ++++++-- .../hyetaekon/user/controller/UserController.java | 4 ++-- .../hyetaekon/user/dto/UserDeleteRequestDto.java | 14 ++++++++++++++ 4 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/hyetaekon/hyetaekon/user/dto/UserDeleteRequestDto.java diff --git a/src/main/java/com/hyetaekon/hyetaekon/common/config/SecurityPath.java b/src/main/java/com/hyetaekon/hyetaekon/common/config/SecurityPath.java index f477ea8..3708117 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/common/config/SecurityPath.java +++ b/src/main/java/com/hyetaekon/hyetaekon/common/config/SecurityPath.java @@ -31,7 +31,8 @@ public class SecurityPath { "/api/posts/*", "/api/search/history", "/api/search/history/*", - "/api/mongo/services/matched" + "/api/mongo/services/matched", + "/api/users/reports" }; // hasRole("ADMIN") diff --git a/src/main/java/com/hyetaekon/hyetaekon/common/exception/ErrorCode.java b/src/main/java/com/hyetaekon/hyetaekon/common/exception/ErrorCode.java index 824cab0..e54102c 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/common/exception/ErrorCode.java +++ b/src/main/java/com/hyetaekon/hyetaekon/common/exception/ErrorCode.java @@ -16,8 +16,12 @@ public enum ErrorCode { INVALID_CREDENTIALS(HttpStatus.UNAUTHORIZED, "AUTH-006", "유효하지 않은 사용자 이름 또는 비밀번호입니다."), INVALID_SECRET_KEY(HttpStatus.UNAUTHORIZED, "AUTH-007", "유효하지 않은 비밀 키입니다."), DELETE_USER_DENIED(HttpStatus.FORBIDDEN, "AUTH-008", "회원 탈퇴가 거부되었습니다."), - ROLE_NOT_FOUND(HttpStatus.FORBIDDEN, "AUTH-009", "권한 정보가 없습니다."), - BLACKLIST_TOKEN(HttpStatus.UNAUTHORIZED, "AUTH-010", "사용할 수 없는 액세스 토큰입니다."), + CANNOT_REPORT_SELF(HttpStatus.BAD_REQUEST, "AUTH-009","자기 자신을 신고할 수 없습니다."), + ROLE_NOT_FOUND(HttpStatus.FORBIDDEN, "AUTH-010", "권한 정보가 없습니다."), + BLACKLIST_TOKEN(HttpStatus.UNAUTHORIZED, "AUTH-011", "사용할 수 없는 액세스 토큰입니다."), + REPORT_NOT_FOUND(HttpStatus.NOT_FOUND, "AUTH-012", "해당 신고 내역을 찾을 수 없습니다."), + REPORT_ALREADY_PROCESSED(HttpStatus.BAD_REQUEST, "AUTH-013", "이미 처리된 신고입니다."), + INVALID_REPORT_REQUEST(HttpStatus.BAD_REQUEST, "AUTH-014","잘못된 신고 요청입니다."), // 계정 관련 DUPLICATED_REAL_ID(HttpStatus.CONFLICT, "ACCOUNT-001", "이미 존재하는 아이디입니다."), diff --git a/src/main/java/com/hyetaekon/hyetaekon/user/controller/UserController.java b/src/main/java/com/hyetaekon/hyetaekon/user/controller/UserController.java index 18b09c0..68ab0d6 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/user/controller/UserController.java +++ b/src/main/java/com/hyetaekon/hyetaekon/user/controller/UserController.java @@ -72,12 +72,12 @@ public ResponseEntity updateMyPassword( @DeleteMapping("/users/me") public ResponseEntity deleteUser( @AuthenticationPrincipal CustomUserDetails customUserDetails, - @RequestBody String deleteReason, + @RequestBody UserDeleteRequestDto deleteRequestDto, @CookieValue(name = "refreshToken", required = false) String refreshToken, @RequestHeader("Authorization") String authHeader ) { String accessToken = authHeader.replace("Bearer ", ""); - userService.deleteUser(customUserDetails.getId(), deleteReason, accessToken, refreshToken); + userService.deleteUser(customUserDetails.getId(), deleteRequestDto.getDeleteReason(), accessToken, refreshToken); return ResponseEntity.noContent().build(); } diff --git a/src/main/java/com/hyetaekon/hyetaekon/user/dto/UserDeleteRequestDto.java b/src/main/java/com/hyetaekon/hyetaekon/user/dto/UserDeleteRequestDto.java new file mode 100644 index 0000000..5873589 --- /dev/null +++ b/src/main/java/com/hyetaekon/hyetaekon/user/dto/UserDeleteRequestDto.java @@ -0,0 +1,14 @@ +package com.hyetaekon.hyetaekon.user.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class UserDeleteRequestDto { + private String deleteReason; +} From a32e3d4925e009f05fee782a99729131d2fe8d96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=5BCLOUD4=5D=20=EA=B3=A0=EB=B2=94=EC=84=9D?= Date: Sun, 4 May 2025 18:33:23 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=20=EC=8B=A0?= =?UTF-8?q?=EA=B3=A0=20=EB=A1=9C=EC=A7=81=20=EB=B0=8F=20=EC=8B=A0=EA=B3=A0?= =?UTF-8?q?=20=EC=B2=98=EB=A6=AC=20=EC=83=81=ED=83=9C=20enum=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9,=20=EA=B4=80=EB=A6=AC=EC=9E=90=20=EC=8B=A0=EA=B3=A0?= =?UTF-8?q?=20=EC=8A=B9=EC=9D=B8,=20=EA=B1=B0=EB=B6=80=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/controller/UserAdminController.java | 45 +++++++++++++- .../user/controller/UserReportController.java | 29 +++++++++ .../user/dto/UserReportRequestDto.java | 21 +++++++ .../user/dto/admin/UserReportProcessDto.java | 21 +++++++ .../hyetaekon/user/entity/ReportStatus.java | 17 ++++++ .../hyetaekon/user/entity/UserReport.java | 13 +++- .../user/mapper/UserAdminMapper.java | 1 + .../user/repository/UserReportRepository.java | 15 ++++- .../user/service/UserAdminService.java | 59 ++++++++++++++++++- .../user/service/UserReportService.java | 54 +++++++++++++++++ 10 files changed, 270 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/hyetaekon/hyetaekon/user/controller/UserReportController.java create mode 100644 src/main/java/com/hyetaekon/hyetaekon/user/dto/UserReportRequestDto.java create mode 100644 src/main/java/com/hyetaekon/hyetaekon/user/dto/admin/UserReportProcessDto.java create mode 100644 src/main/java/com/hyetaekon/hyetaekon/user/entity/ReportStatus.java create mode 100644 src/main/java/com/hyetaekon/hyetaekon/user/service/UserReportService.java diff --git a/src/main/java/com/hyetaekon/hyetaekon/user/controller/UserAdminController.java b/src/main/java/com/hyetaekon/hyetaekon/user/controller/UserAdminController.java index 6af4604..a5ec4ec 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/user/controller/UserAdminController.java +++ b/src/main/java/com/hyetaekon/hyetaekon/user/controller/UserAdminController.java @@ -1,8 +1,11 @@ package com.hyetaekon.hyetaekon.user.controller; +import com.hyetaekon.hyetaekon.common.exception.ErrorCode; +import com.hyetaekon.hyetaekon.common.exception.GlobalException; import com.hyetaekon.hyetaekon.user.dto.admin.UserAdminResponseDto; import com.hyetaekon.hyetaekon.user.dto.admin.UserReportResponseDto; import com.hyetaekon.hyetaekon.user.dto.admin.UserSuspendRequestDto; +import com.hyetaekon.hyetaekon.user.entity.ReportStatus; import com.hyetaekon.hyetaekon.user.service.UserAdminService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -32,7 +35,7 @@ public ResponseEntity> getAllUsers( */ @PostMapping("/users/{userId}/suspend") public ResponseEntity suspendUser( - @PathVariable Long userId, + @PathVariable("userId") Long userId, @RequestBody UserSuspendRequestDto requestDto) { userAdminService.suspendUser(userId, requestDto); return ResponseEntity.ok().build(); @@ -42,7 +45,7 @@ public ResponseEntity suspendUser( * 정지 해제 */ @PutMapping("/users/{userId}/unsuspend") - public ResponseEntity unsuspendUser(@PathVariable Long userId) { + public ResponseEntity unsuspendUser(@PathVariable("userId") Long userId) { userAdminService.unsuspendUser(userId); return ResponseEntity.ok().build(); } @@ -77,4 +80,42 @@ public ResponseEntity> getUserReports( return ResponseEntity.ok(userAdminService.getUserReports(page, size)); } + /** + * 상태별 신고 내역 조회 + */ + @GetMapping("/users/reports/status/{status}") + public ResponseEntity> getReportsByStatus( + @PathVariable("status") ReportStatus status, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "10") int size) { + return ResponseEntity.ok(userAdminService.getReportsByStatus(status, page, size)); + } + + /** + * 신고 승인 처리 + */ + @PostMapping("/users/reports/{reportId}/resolve") + public ResponseEntity resolveReport( + @PathVariable("reportId") Long reportId, + @RequestParam(defaultValue = "false") boolean suspendUser, + @RequestBody(required = false) UserSuspendRequestDto suspendRequestDto) { + + // 사용자 정지 요청이 있지만 정지 정보가 없는 경우 + if (suspendUser && suspendRequestDto == null) { + throw new GlobalException(ErrorCode.INVALID_REPORT_REQUEST); + } + + userAdminService.resolveReport(reportId, suspendUser, suspendRequestDto); + return ResponseEntity.ok().build(); + } + + /** + * 신고 거부 처리 + */ + @PostMapping("/users/reports/{reportId}/reject") + public ResponseEntity rejectReport(@PathVariable("reportId") Long reportId) { + userAdminService.rejectReport(reportId); + return ResponseEntity.ok().build(); + } + } diff --git a/src/main/java/com/hyetaekon/hyetaekon/user/controller/UserReportController.java b/src/main/java/com/hyetaekon/hyetaekon/user/controller/UserReportController.java new file mode 100644 index 0000000..615a7e5 --- /dev/null +++ b/src/main/java/com/hyetaekon/hyetaekon/user/controller/UserReportController.java @@ -0,0 +1,29 @@ +package com.hyetaekon.hyetaekon.user.controller; + +import com.hyetaekon.hyetaekon.common.jwt.CustomUserDetails; +import com.hyetaekon.hyetaekon.user.dto.UserReportRequestDto; +import com.hyetaekon.hyetaekon.user.service.UserReportService; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.*; + +@Slf4j +@RestController +@RequestMapping("/api/users/reports") +@RequiredArgsConstructor +public class UserReportController { + private final UserReportService userReportService; + + @PostMapping + public ResponseEntity reportUser( + @AuthenticationPrincipal CustomUserDetails userDetails, + @Valid @RequestBody UserReportRequestDto reportRequestDto + ) { + Long reporterId = userDetails.getId(); + userReportService.reportUser(reporterId, reportRequestDto); + return ResponseEntity.ok().build(); + } +} diff --git a/src/main/java/com/hyetaekon/hyetaekon/user/dto/UserReportRequestDto.java b/src/main/java/com/hyetaekon/hyetaekon/user/dto/UserReportRequestDto.java new file mode 100644 index 0000000..bddd983 --- /dev/null +++ b/src/main/java/com/hyetaekon/hyetaekon/user/dto/UserReportRequestDto.java @@ -0,0 +1,21 @@ +package com.hyetaekon.hyetaekon.user.dto; + +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class UserReportRequestDto { + @NotNull(message = "신고 대상 사용자 ID는 필수입니다.") + private Long reportedUserId; + + @NotNull(message = "신고 사유는 필수입니다.") + private String reason; + + private String content; +} diff --git a/src/main/java/com/hyetaekon/hyetaekon/user/dto/admin/UserReportProcessDto.java b/src/main/java/com/hyetaekon/hyetaekon/user/dto/admin/UserReportProcessDto.java new file mode 100644 index 0000000..fe214ae --- /dev/null +++ b/src/main/java/com/hyetaekon/hyetaekon/user/dto/admin/UserReportProcessDto.java @@ -0,0 +1,21 @@ +package com.hyetaekon.hyetaekon.user.dto.admin; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class UserReportProcessDto { + private boolean suspendUser; // 신고 처리 시 사용자 정지 여부 + + // 사용자 정지시 필요한 정보 (suspendUser가 true일 때) + private LocalDateTime suspendStartAt; + private LocalDateTime suspendEndAt; + private String suspendReason; +} diff --git a/src/main/java/com/hyetaekon/hyetaekon/user/entity/ReportStatus.java b/src/main/java/com/hyetaekon/hyetaekon/user/entity/ReportStatus.java new file mode 100644 index 0000000..34ba972 --- /dev/null +++ b/src/main/java/com/hyetaekon/hyetaekon/user/entity/ReportStatus.java @@ -0,0 +1,17 @@ +package com.hyetaekon.hyetaekon.user.entity; + +import lombok.Getter; + +@Getter +public enum ReportStatus { + PENDING("처리 대기중"), + RESOLVED("처리 완료"), + REJECTED("거부됨"); + + private final String description; + + ReportStatus(String description) { + this.description = description; + } + +} diff --git a/src/main/java/com/hyetaekon/hyetaekon/user/entity/UserReport.java b/src/main/java/com/hyetaekon/hyetaekon/user/entity/UserReport.java index b63b3ac..9f9c66d 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/user/entity/UserReport.java +++ b/src/main/java/com/hyetaekon/hyetaekon/user/entity/UserReport.java @@ -35,11 +35,22 @@ public class UserReport { private String content; @Column(name = "status", length = 20) - private String status; + @Enumerated(EnumType.STRING) + private ReportStatus status; @Column(name = "created_at") private LocalDateTime createdAt; @Column(name = "processed_at") private LocalDateTime processedAt; + + public void resolve() { + this.status = ReportStatus.RESOLVED; + this.processedAt = LocalDateTime.now(); + } + + public void reject() { + this.status = ReportStatus.REJECTED; + this.processedAt = LocalDateTime.now(); + } } \ No newline at end of file diff --git a/src/main/java/com/hyetaekon/hyetaekon/user/mapper/UserAdminMapper.java b/src/main/java/com/hyetaekon/hyetaekon/user/mapper/UserAdminMapper.java index 7d2b56b..0318822 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/user/mapper/UserAdminMapper.java +++ b/src/main/java/com/hyetaekon/hyetaekon/user/mapper/UserAdminMapper.java @@ -18,5 +18,6 @@ public interface UserAdminMapper { // UserReport Entity -> 신고 내역 DTO 변환 @Mapping(source = "reporter.nickname", target = "reporterNickname") @Mapping(source = "reported.nickname", target = "reportedNickname") + @Mapping(source = "status.description", target = "status") UserReportResponseDto toReportResponseDto(UserReport userReport); } diff --git a/src/main/java/com/hyetaekon/hyetaekon/user/repository/UserReportRepository.java b/src/main/java/com/hyetaekon/hyetaekon/user/repository/UserReportRepository.java index 4a99e23..5f9e542 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/user/repository/UserReportRepository.java +++ b/src/main/java/com/hyetaekon/hyetaekon/user/repository/UserReportRepository.java @@ -1,11 +1,24 @@ package com.hyetaekon.hyetaekon.user.repository; +import com.hyetaekon.hyetaekon.user.entity.ReportStatus; import com.hyetaekon.hyetaekon.user.entity.UserReport; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface UserReportRepository extends JpaRepository { - // 기본 CRUD 메서드 사용 + // 상태별 신고 목록 조회 + Page findByStatus(ReportStatus status, Pageable pageable); + + // 특정 사용자가 신고한 내역 조회 + Page findByReporter_Id(Long reporterId, Pageable pageable); + + // 특정 사용자가 신고당한 내역 조회 + Page findByReported_Id(Long reportedId, Pageable pageable); + + // 신고 처리되지 않은 건수 확인 + long countByStatus(ReportStatus status); } diff --git a/src/main/java/com/hyetaekon/hyetaekon/user/service/UserAdminService.java b/src/main/java/com/hyetaekon/hyetaekon/user/service/UserAdminService.java index c175027..8ec0a6b 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/user/service/UserAdminService.java +++ b/src/main/java/com/hyetaekon/hyetaekon/user/service/UserAdminService.java @@ -3,8 +3,10 @@ import com.hyetaekon.hyetaekon.common.exception.ErrorCode; import com.hyetaekon.hyetaekon.common.exception.GlobalException; import com.hyetaekon.hyetaekon.user.dto.admin.UserAdminResponseDto; +import com.hyetaekon.hyetaekon.user.dto.admin.UserReportProcessDto; import com.hyetaekon.hyetaekon.user.dto.admin.UserReportResponseDto; import com.hyetaekon.hyetaekon.user.dto.admin.UserSuspendRequestDto; +import com.hyetaekon.hyetaekon.user.entity.ReportStatus; import com.hyetaekon.hyetaekon.user.entity.User; import com.hyetaekon.hyetaekon.user.entity.UserReport; import com.hyetaekon.hyetaekon.user.mapper.UserAdminMapper; @@ -107,7 +109,7 @@ public Page getWithdrawnUsers(int page, int size) { } /** - * 신고 내역 조회 + * 신고 내역 조회 (전체) */ @Transactional(readOnly = true) public Page getUserReports(int page, int size) { @@ -116,5 +118,60 @@ public Page getUserReports(int page, int size) { return reportPage.map(userAdminMapper::toReportResponseDto); } + /** + * 상태별 신고 내역 조회 + */ + @Transactional(readOnly = true) + public Page getReportsByStatus(ReportStatus status, int page, int size) { + Pageable pageable = PageRequest.of(page, size, Sort.by("createdAt").descending()); + Page reportPage = userReportRepository.findByStatus(status, pageable); + return reportPage.map(userAdminMapper::toReportResponseDto); + } + + /** + * 신고 승인 처리 + */ + @Transactional + public void resolveReport(Long reportId, boolean suspendUser, UserSuspendRequestDto suspendRequestDto) { + UserReport report = userReportRepository.findById(reportId) + .orElseThrow(() -> new GlobalException(ErrorCode.REPORT_NOT_FOUND)); + + // 이미 처리된 신고인지 확인 + if (report.getStatus() != ReportStatus.PENDING) { + throw new GlobalException(ErrorCode.REPORT_ALREADY_PROCESSED); + } + + // 신고 승인 처리 + report.resolve(); + + // 신고당한 사용자 정지 처리 여부 확인 + if (suspendUser && suspendRequestDto != null) { + User reportedUser = report.getReported(); + suspendUser(reportedUser.getId(), suspendRequestDto); + log.info("신고에 따른 사용자 {} 정지 처리 완료", reportedUser.getId()); + } + + userReportRepository.save(report); + log.info("신고 {} 승인 처리 완료", reportId); + } + + /** + * 신고 거부 처리 + */ + @Transactional + public void rejectReport(Long reportId) { + UserReport report = userReportRepository.findById(reportId) + .orElseThrow(() -> new GlobalException(ErrorCode.REPORT_NOT_FOUND)); + + // 이미 처리된 신고인지 확인 + if (report.getStatus() != ReportStatus.PENDING) { + throw new GlobalException(ErrorCode.REPORT_ALREADY_PROCESSED); + } + + report.reject(); + userReportRepository.save(report); + log.info("신고 {} 거부 처리 완료", reportId); + } + } diff --git a/src/main/java/com/hyetaekon/hyetaekon/user/service/UserReportService.java b/src/main/java/com/hyetaekon/hyetaekon/user/service/UserReportService.java new file mode 100644 index 0000000..56e44f4 --- /dev/null +++ b/src/main/java/com/hyetaekon/hyetaekon/user/service/UserReportService.java @@ -0,0 +1,54 @@ +package com.hyetaekon.hyetaekon.user.service; + +import com.hyetaekon.hyetaekon.common.exception.ErrorCode; +import com.hyetaekon.hyetaekon.common.exception.GlobalException; +import com.hyetaekon.hyetaekon.user.dto.UserReportRequestDto; +import com.hyetaekon.hyetaekon.user.entity.ReportStatus; +import com.hyetaekon.hyetaekon.user.entity.User; +import com.hyetaekon.hyetaekon.user.entity.UserReport; +import com.hyetaekon.hyetaekon.user.repository.UserReportRepository; +import com.hyetaekon.hyetaekon.user.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; + +@Slf4j +@Service +@RequiredArgsConstructor +public class UserReportService { + private final UserRepository userRepository; + private final UserReportRepository userReportRepository; + + // 사용자 신고 + @Transactional + public void reportUser(Long reporterId, UserReportRequestDto reportRequestDto) { + // 신고자 확인 + User reporter = userRepository.findByIdAndDeletedAtIsNull(reporterId) + .orElseThrow(() -> new GlobalException(ErrorCode.USER_NOT_FOUND_BY_ID)); + + // 신고 대상자 확인 + User reported = userRepository.findByIdAndDeletedAtIsNull(reportRequestDto.getReportedUserId()) + .orElseThrow(() -> new GlobalException(ErrorCode.USER_NOT_FOUND_BY_ID)); + + // 자기 자신 신고 방지 + if (reporter.getId().equals(reported.getId())) { + throw new GlobalException(ErrorCode.CANNOT_REPORT_SELF); + } + + // 신고 내역 생성 및 저장 + UserReport userReport = UserReport.builder() + .reporter(reporter) + .reported(reported) + .reason(reportRequestDto.getReason()) + .content(reportRequestDto.getContent()) + .status(ReportStatus.PENDING) // 대기 상태로 초기화 + .createdAt(LocalDateTime.now()) + .build(); + + userReportRepository.save(userReport); + log.info("사용자 신고 접수 완료 - 신고자: {}, 피신고자: {}", reporter.getId(), reported.getId()); + } +} \ No newline at end of file From 23644b15d3a25ac9346332c267de6a20f81271a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=5BCLOUD4=5D=20=EA=B3=A0=EB=B2=94=EC=84=9D?= Date: Sun, 4 May 2025 18:34:50 +0900 Subject: [PATCH 3/3] =?UTF-8?q?style:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=B6=80=EB=B6=84=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hyetaekon/user/repository/UserReportRepository.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/java/com/hyetaekon/hyetaekon/user/repository/UserReportRepository.java b/src/main/java/com/hyetaekon/hyetaekon/user/repository/UserReportRepository.java index 5f9e542..4302435 100644 --- a/src/main/java/com/hyetaekon/hyetaekon/user/repository/UserReportRepository.java +++ b/src/main/java/com/hyetaekon/hyetaekon/user/repository/UserReportRepository.java @@ -12,13 +12,4 @@ public interface UserReportRepository extends JpaRepository { // 상태별 신고 목록 조회 Page findByStatus(ReportStatus status, Pageable pageable); - - // 특정 사용자가 신고한 내역 조회 - Page findByReporter_Id(Long reporterId, Pageable pageable); - - // 특정 사용자가 신고당한 내역 조회 - Page findByReported_Id(Long reportedId, Pageable pageable); - - // 신고 처리되지 않은 건수 확인 - long countByStatus(ReportStatus status); }