Skip to content

feat(admin): 이의제기 내역 목록·상세 API + 접수 당시 실패 설명 저장(V21) - #369

Merged
selee1012 merged 2 commits into
devfrom
feat/admin-appeals
Oct 29, 2026
Merged

selee1012 merged 2 commits into
devfrom
feat/admin-appeals

Conversation

@selee1012

Copy link
Copy Markdown
Contributor

무엇

관리자 콘솔에서 이의제기 내역을 볼 수 있게 한다. Closes #361 · 콘솔 짝: RuleUp-ASM/AdminPage#10

커밋 1 — 이의 접수 당시 실패 설명을 이의 행에 남긴다 (V21)

이슈는 「이의 전 실패 상세」를 verification_failure_details 에서 읽자고 했지만, 이의된 판정에는 그 행이 생기지 않는다.

  • 이의는 확정 전(실패 예정)에 받고 즉시 인용된다 → 판정 행의 failureReason 이 지워진다(correctByAppeal).
  • verification_failure_details 는 확정된 FAILED 에만 생긴다. 이의 기한 = 확정 시각이라 확정된 실패는 이미 이의 창이 닫혀 있다.

그래서 「무엇에 이의를 냈는지」가 어디에도 남지 않았다. 신청 화면과 같은 설명(사유 코드·요약·기준값·실제값)을 접수 때 verification_appeals 새 컬럼에 적는다.

  • 오늘 인증 카드와 같은 계산을 쓰도록 VerificationReadService.failureOf 를 FailureExplainer 로 뺐다.
  • 관리자 목록용 (acceptedAt, id) 인덱스도 함께. ALGORITHM=INPLACE, LOCK=NONE.
  • V21 이전 접수는 실패 설명이 null 이다(되살릴 원천이 없다).

커밋 2 — 관리자 API

  • GET /api/v1/admin/appeals — 최신순, from·to(접수일 KST)·userId·challengeId·hasImage 필터, (시각, id) 커서, totalCount
  • GET /api/v1/admin/appeals/{id} — 사유 전문, 증빙 사진(단기 presigned + 만료 시각), 접수 당시 실패 설명, 같은 회원 최근 30일 이의 수
  • 감사 로그: 목록 APPEAL_QUEUE_VIEW, 상세 APPEAL_VIEW(target APPEAL)
  • 새 오류 코드 APPEAL_NOT_FOUND(404)
  • 관리자 DB 계정 권한은 늘지 않는다 — verification_appeals·users·challenges SELECT, admin_audit_logs INSERT 만 쓴다(AdminSqlCapture 확인).

테스트

  • AdminAppealIT 5건: 403, 정렬·필터·커서(같은 시각 두 건 포함), 상세·감사 로그, 옛 접수, 잘못된 입력 400/404
    • 커서가 처음엔 밀리초로 잘려 같은 밀리초의 다음 건을 건너뛰었다 — 시각 전체 정밀도로 고쳤다.
  • VerificationAppealIT 에 접수 당시 실패 설명이 남는지 1건 추가
  • 로컬: admin.*·docs.*·VerificationAppealIT·VerificationDecisionTimingIT 통과

🤖 Generated with Claude Code

selee1012 and others added 2 commits October 29, 2026 10:44
이의는 확정 전에 받고 즉시 인용돼 판정 행의 failureReason 이 지워진다.
verification_failure_details 는 확정된 실패에만 생겨 인용된 이의에는 행이 없다.
운영자가 「무엇에 이의를 냈는지」 볼 원천이 없어, 신청 화면과 같은 설명(사유 코드·요약·기준값·실제값)을
V21 컬럼에 적어 둔다. 오늘 인증 카드와 같은 계산을 쓰도록 FailureExplainer 로 뺐다.
관리자 목록용 acceptedAt 인덱스도 함께 둔다. Refs #361

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GET /api/v1/admin/appeals — 최신순, 접수일(KST)·회원·방·사진 여부 필터, (시각, id) 커서.
GET /api/v1/admin/appeals/{id} — 사유 전문, 증빙 사진(단기 주소), 접수 당시 실패 설명, 최근 30일 이의 수.
목록은 APPEAL_QUEUE_VIEW, 상세는 개인정보 열람이라 APPEAL_VIEW 로 감사 로그에 남긴다.
관리자 DB 계정이 이미 가진 SELECT(verification_appeals·users·challenges)만 쓴다. Closes #361

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Test Coverage

Overall Project 83.6% -0.06% 🍏
Files changed 94.56% 🍏

File Coverage
AdminAppealDtos.java 100% 🍏
AdminAction.java 100% 🍏
AdminAuditLog.java 100% 🍏
ErrorCode.java 100% 🍏
Appeal.java 100% 🍏
AdminAppealService.java 98.09% -1.91% 🍏
AppealService.java 92.31% -1.48% 🍏
AdminController.java 90.36% 🍏
VerificationReadService.java 85.17% 🍏
FailureExplainer.java 70.64% -29.36% ❌
AdminCursors.java 56.71% -6.71% 🍏

@selee1012
selee1012 merged commit 188d477 into dev Oct 29, 2026
3 checks passed
@selee1012
selee1012 deleted the feat/admin-appeals branch October 29, 2026 02:15
selee1012 added a commit that referenced this pull request Oct 29, 2026
release: 관리자 이의제기 내역 API + 이의 접수 당시 실패 설명 저장(#369)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[P2] 관리자 API: 이의제기 내역 목록·상세 조회

1 participant