선행 작업: #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 호출)
선행 조건
요구사항
신고 대상 스키마 확장 (POST/COMMENT 통합)
post_reports 테이블에 target_type, target_id 컬럼을 추가하고 기존 post_id 데이터를 target_type=POST로 이관하는 마이그레이션을 작성한다.
PostReport 도메인과 PostReportJpaEntity를 postId 단일 필드 구조에서 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
완료 조건
참고 자료
제출 전 확인사항
선행 작업: #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 응답으로 교체합니다.
관련 도메인
선행 조건
PostReport가postId단일 필드만 지원하는 상태이므로, COMMENT 신고를 다루려면 영속성 계층 확장이 선행되어야 한다.요구사항
신고 대상 스키마 확장 (POST/COMMENT 통합)
post_reports테이블에target_type,target_id컬럼을 추가하고 기존post_id데이터를target_type=POST로 이관하는 마이그레이션을 작성한다.PostReport도메인과PostReportJpaEntity를postId단일 필드 구조에서targetType/targetId구조로 확장한다.ReportReason.isAllowedFor규칙을 그대로 재사용한다.관리자 권한 검증
UserRole.ADMIN)가 아닌 사용자의 요청은 403 Forbidden으로 거절한다.신고 목록 조회 (GET /admin/reports)
targetType,status파라미터로 필터링하며 둘 다 선택적(optional)이다.PageResponse규격을 그대로 사용한다.신고 처리 (PATCH /admin/reports/{reportId})
UpdateReportStatusRequest의 기존 Bean Validation 재사용).reportId는 404 Not Found로 반환한다.영속성 및 트랜잭션
SearchReportsUseCase,UpdateReportStatusUseCase와 Command/Query Service를 정의한다.@Transactional경계에서 처리한다.TODO
post_reports에target_type/target_id컬럼 추가 및 기존 데이터 이관 마이그레이션 작성PostReport도메인/PostReportJpaEntity를 targetType/targetId 구조로 리팩터링SearchReportsUseCase/ModerationQueryService+ 필터링·페이징 조회 포트 구현UpdateReportStatusUseCase/ModerationCommandService+ 상태 변경 포트 구현AdminReportController#getReports,#updateReportStatus를 UseCase에 연결완료 조건
참고 자료
AdminReportController,PostReport,ReportReason.isAllowedForReportSummaryResponse,UpdateReportStatusRequest제출 전 확인사항