Admin Pending Participants API
캠페인별 미처리 대상자(미서명/미제출/미등록) 조회 및 연락 이력·메모 관리 API
Admin Pending Participants API
캠페인별로 계약을 안 쓴 사람 / 제출(1차·2차·재제출)을 안 한 사람 / 최종 제출물을 안 낸 사람을 케이스별로 조회하고, 관리자가 연락 이력과 메모를 남길 수 있는 API입니다.
Base URL: /ai/admin/campaigns/{campaignNo}/pending-participants
여러 캠페인을 한 번에 훑으려면 Admin All Pending Participants API 를 사용하세요.
이 API는 관리자 권한이 필요합니다. actorId는 @AuthenticationPrincipal에서 서버가 자동 주입합니다.
엔드포인트 목록
대상자 조회
| 메서드 | 경로 | 설명 |
|---|---|---|
GET | / | 미처리 대상자 목록(페이지) |
GET | /summary | 케이스별 건수 집계 |
인스타 DM
| 메서드 | 경로 | 설명 |
|---|---|---|
POST | /{applicationId}/dm | 인스타 DM 발송(AutoDM, 1인 1DM) + 연락 이력 자동 기록 |
연락 이력 (CONTACT)
| 메서드 | 경로 | 설명 |
|---|---|---|
POST | /{applicationId}/contact-logs | 연락 이력 추가 |
GET | /{applicationId}/contact-logs | 연락 이력 목록 |
메모 (MEMO)
| 메서드 | 경로 | 설명 |
|---|---|---|
POST | /{applicationId}/memos | 메모 작성 |
GET | /{applicationId}/memos | 메모 목록 |
PATCH | /{applicationId}/memos/{memoId} | 메모 수정 (작성자만) |
DELETE | /{applicationId}/memos/{memoId} | 메모 삭제 (작성자만) |
공통 Enum
PendingCase
| 값 | 설명 |
|---|---|
CONTRACT_UNSIGNED | 계약 미체결 |
FIRST_REVIEW_NOT_SUBMITTED | 1차 제작물 미제출 |
SECOND_REVIEW_NOT_SUBMITTED | 2차 제작물 미제출 |
FIRST_RESUBMISSION_PENDING | 1차 재제출 필요 |
SECOND_RESUBMISSION_PENDING | 2차 재제출 필요 |
FINAL_NOT_SUBMITTED | 최종 제출물 미등록 (콘텐츠 링크/클린본/최종본) |
FINAL_RESUBMISSION_PENDING | 최종 제출물 재제출 필요 (게시 항목 미비) |
FINAL_RESUBMISSION_PENDING 판정 주의
이 케이스만 판정 정본이 다릅니다. 최신 자동 검수 결과를 봅니다.
re_requested_at 은 쓸 수 없습니다 — 재제출 경로가 둘인데 PATCH resubmit 은 재요청 필드를
지우고 POST saveOrSubmit 은 안 지웁니다. 게다가 지워졌다고 미비가 해소된 것도 아닙니다.
"최신"을 고를 때 아래 두 종류는 건너뜁니다. 둘 다 새 정보가 없는 행인데, 최신으로 치면 직전의 진짜 판정을 가려 대상자가 목록에서 조용히 사라집니다.
| 건너뛰는 행 | 이유 |
|---|---|
PENDING | 재제출 직후의 예약. 유예 5분 동안 직전 위반이 가려짐 |
FAILED + reRequestedAt 없음 | 파이썬·RapidAPI 호출 실패(우리 쪽 장애). 크리에이터가 조치할 것이 없어 재요청도 안 나감 |
게시물 조회 실패(FAILED + reRequestedAt 있음)는 크리에이터가 고쳐야 하는 상태라 그대로 판정에 씁니다.
자동 검수를 꺼도(autoCheckEnabled=false) 이 케이스에서 빠지지 않습니다. 스위치는 자동
발송을 멈추는 것이지 미비 사실을 지우는 것이 아닙니다. 목록에서 빼려면 관리자가 통과 처리해야
합니다.
OverdueStatus (row 단위 계산)
| 값 | 조건 |
|---|---|
OVERDUE | deadline.toLocalDate() < today (경과) |
TODAY | deadline.toLocalDate() == today (오늘 마감) |
UPCOMING | deadline.toLocalDate() > today (예정) |
NO_DEADLINE | deadline == null |
ContactMethod (CONTACT 전용)
PHONE · SMS · EMAIL · KAKAO · INSTAGRAM_DM · OTHER
INSTAGRAM_DM 은 인스타 DM 발송이 자동으로 남깁니다.
ContactFilter (쿼리 파라미터)
| 값 | 설명 |
|---|---|
ALL | 필터링 없음 (기본) |
CONTACTED | ContactLog(entryType=CONTACT) 1건 이상 존재하는 대상만 |
NOT_CONTACTED | 연락 이력이 없는 대상만 |
판정 로직 요약
| Case | 마감일 출처 | 조건 |
|---|---|---|
CONTRACT_UNSIGNED | CampaignSchedule(CONTRACT_CREATION).endDate | selectionStatus=SELECTED AND 최신 ApplicationContract.status != SIGNED |
FIRST_REVIEW_NOT_SUBMITTED | ApplicationSchedule 1차 제출 phase | review 없거나 미제출 아이템 존재 |
SECOND_REVIEW_NOT_SUBMITTED | ApplicationSchedule(CONTENT_SUBMISSION_DEADLINE) | 2회검수 + 1차 APPROVED + 2차 미제출 |
FIRST_RESUBMISSION_PENDING | ContentReview(round=1).feedbackDeadline | 1차 status=REJECTED |
SECOND_RESUBMISSION_PENDING | ContentReview(round=2).feedbackDeadline | 2차 status=REJECTED |
FINAL_NOT_SUBMITTED | ApplicationSchedule(UPLOAD_ALLOWED_DATE) | 2차 uploadApproved=true AND FinalSubmission 미제출 |
FINAL_RESUBMISSION_PENDING | ApplicationSchedule(FINAL_RESUBMISSION_DEADLINE) | FinalSubmission 제출 완료 AND 최신 자동 검수에 미비 AND 관리자 미통과 |
1차 제출 phase 분기: Collab.isDoubleReview=true → SCRIPT_SUBMISSION_DEADLINE, false → CONTENT_SUBMISSION_DEADLINE. 1차/2차 관련 모든 마감일은 ApplicationSchedule(개별 일정)에서만 조회합니다.
마감 경과 여부는 판정 조건이 아닙니다. 각 케이스 해당자를 모두 반환하고, row별 overdueStatus 로 운영자가 필터링합니다.