Skip to content

[Feat] 관리자 신고함 조회·처리 API 구현 #55

Description

@kallin1

선행 작업: #32 관리자 및 마이페이지 API 계약 및 Swagger 명세 작성 (계약/DTO/501 골격, ReportTargetType·ReportReason.isAllowedFor 도메인 규칙)

어떤 기능인가요?

API 계약 이슈 #31/#32를 기반으로 관리자 신고함의 실제 비즈니스 로직과 영속성을 구현합니다.

관리자가 신고 목록을 대상 타입·처리 상태로 필터링해 조회(GET /admin/reports)하고, 개별 신고를 RESOLVED/REJECTED로 처리(PATCH /admin/reports/{reportId})할 수 있도록 UseCase와 Persistence Adapter를 구현합니다. 현재 NotImplementedException으로 반환되는 501 응답을 실제 200 OK 응답으로 교체합니다.

관련 도메인

  • moderation
  • admin (진입점만, 실제 처리는 moderation UseCase 호출)

선행 조건

  • 관리자 권한 검증(@PreAuthorize 등)이 최소한의 형태로라도 구성되어 있어야 한다. (없으면 이번 이슈에서 함께 구성)
  • PostReportpostId 단일 필드만 지원하는 상태이므로, COMMENT 신고를 다루려면 영속성 계층 확장이 선행되어야 한다.

요구사항

신고 대상 스키마 확장 (POST/COMMENT 통합)

  • post_reports 테이블에 target_type, target_id 컬럼을 추가하고 기존 post_id 데이터를 target_type=POST로 이관하는 마이그레이션을 작성한다.
  • PostReport 도메인과 PostReportJpaEntitypostId 단일 필드 구조에서 targetType/targetId 구조로 확장한다.
  • 대상 타입별 허용 사유는 기존 ReportReason.isAllowedFor 규칙을 그대로 재사용한다.

관리자 권한 검증

  • 관리자(UserRole.ADMIN)가 아닌 사용자의 요청은 403 Forbidden으로 거절한다.
  • 인증 정보가 없으면 401 Unauthorized를 반환한다.

신고 목록 조회 (GET /admin/reports)

  • targetType, status 파라미터로 필터링하며 둘 다 선택적(optional)이다.
  • 잘못된 enum 값은 400 Bad Request로 반환한다(기존 GlobalExceptionHandler 보완 로직 재사용).
  • 페이지네이션은 기존 PageResponse 규격을 그대로 사용한다.

신고 처리 (PATCH /admin/reports/{reportId})

  • 처리 상태는 RESOLVED/REJECTED만 허용하고 PENDING으로 되돌릴 수 없다(UpdateReportStatusRequest의 기존 Bean Validation 재사용).
  • 존재하지 않는 reportId는 404 Not Found로 반환한다.
  • 이미 처리된 신고를 다시 처리하는 경우의 정책(재처리 허용 여부)을 정하고 도메인 규칙으로 반영한다.

영속성 및 트랜잭션

  • SearchReportsUseCase, UpdateReportStatusUseCase와 Command/Query Service를 정의한다.
  • application 계층이 Spring Data Repository에 직접 의존하지 않도록 outbound port와 persistence adapter를 구현한다.
  • 상태 변경은 @Transactional 경계에서 처리한다.

TODO

  • post_reportstarget_type/target_id 컬럼 추가 및 기존 데이터 이관 마이그레이션 작성
  • PostReport 도메인/PostReportJpaEntity를 targetType/targetId 구조로 리팩터링
  • 관리자 권한 검증(@PreAuthorize 또는 SecurityConfig 보완) 구성
  • SearchReportsUseCase/ModerationQueryService + 필터링·페이징 조회 포트 구현
  • UpdateReportStatusUseCase/ModerationCommandService + 상태 변경 포트 구현
  • AdminReportController#getReports, #updateReportStatus를 UseCase에 연결
  • 501 기대값으로 작성된 기존 Controller 테스트를 실제 응답 검증으로 교체
  • 도메인·UseCase·Persistence·Controller 테스트 추가
  • 전체 테스트 및 API 문서 계약 검증

완료 조건

  • GET /admin/reports가 targetType/status 필터와 페이지네이션을 정확히 반영해 200 OK로 반환한다.
  • PATCH /admin/reports/{reportId}가 RESOLVED/REJECTED로만 상태를 변경하고 PENDING 복귀를 거절한다.
  • 관리자가 아닌 사용자의 요청이 403으로 거절된다.
  • 주요 성공·실패 경로에 대한 테스트가 통과한다.

참고 자료

제출 전 확인사항

  • 동일하거나 유사한 구현 이슈가 없는지 확인했습니다.
  • 유료 콘텐츠 원문 노출 정책에 영향이 없는지 확인했습니다.
  • API 계약 작업과 실제 구현 범위를 분리했습니다.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions