제출 상태 변경
관리자가 검수 라운드의 제출 상태를 원하는 상태로 바꿉니다. 되돌리기와 기업 결정 변경을 모두 처리하며 피드백은 지우지 않습니다.
제출 상태 변경
검수 라운드(스크립트 = 1, 영상 = 2)의 제출 상태를 목표 상태로 바꿉니다. 검수 중인 제출을 제출 전으로 되돌리거나, 기업이 고른 결정(재제출 요청·승인·피드백 포함 승인)을 다른 결정으로 바꿀 때 씁니다. 바꿀 수 있는 목표와 막힌 사유는 제출 상태 조회로 먼저 확인합니다.
ADMIN 권한 필요 (ROLE_ADMIN). 아니면 차단.
HTTP 요청
POST /ai/admin/feedback-approvals/{reviewId}/state
Authorization: Bearer {access_token}
Content-Type: application/jsonPath Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
reviewId | long | 예 | 검수 라운드 ID |
Request Body
{
"target": "APPROVED_WITH_FEEDBACK",
"notifyCreator": true,
"reason": "기업 요청: 피드백 없이 재제출 요청을 잘못 누름"
}영상 라운드를 승인·피드백 포함 승인으로 바꿀 때는 업로드 일정을 함께 보냅니다(저장된 일정이 있으면 생략 가능).
{
"target": "APPROVED",
"notifyCreator": true,
"reason": "기업 요청: 재제출 요청 취소 후 승인",
"uploadDate": {
"uploadDateType": "CANDIDATE",
"candidateDates": ["2026-10-06T18:00:00", "2026-10-07T18:00:00", "2026-10-08T18:00:00"]
}
}| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
target | string | 예 | BEFORE_SUBMISSION / UNDER_REVIEW / GATE_PENDING / RESUBMIT_REQUESTED / APPROVED / APPROVED_WITH_FEEDBACK |
notifyCreator | boolean | 아니오 | 크리에이터 메일 발송 여부. 생략하면 보내지 않습니다. 아래 표의 경우에만 쓰입니다 |
reason | string | 아니오 | 사유. 히스토리와 슬랙 알림에 함께 남습니다 |
uploadDate | object | 조건부 | 업로드 일정. 영상 라운드에서 APPROVED / APPROVED_WITH_FEEDBACK로 바꿀 때 받습니다. 저장된 일정이 없으면 필수, 있으면 선택(생략하면 저장된 일정 그대로, 보내면 덮어쓰기). 제출 상태 조회의 hasUploadDate·options[].requiresUploadDate로 확인합니다. 그 외 목표에서는 무시합니다 |
uploadDate.uploadDateType | string | 예 | OPTIMAL(3일 이내 최적일) / ASAP(가능한 빨리) / CANDIDATE(후보일 지정) |
uploadDate.uploadDate | datetime | 아니오 | 업로드 예정일. 생략하면 OPTIMAL은 지금+3일, ASAP은 지금 |
uploadDate.candidateDates | datetime[] | 조건부 | 후보일 목록. CANDIDATE면 필수 |
동작
어느 상태에서든 먼저 기업 검수 대기로 되돌린 뒤, 목표 상태로 정상 흐름을 다시 태웁니다. 그래서 '승인 → 재제출 요청', '재제출 요청 → 승인', '승인 ↔ 피드백 포함 승인' 같은 결정 변경도 같은 방식으로 처리됩니다. 피드백은 어느 경로에서도 삭제하지 않습니다.
1단계 — 기업 검수 대기로 되돌리기
| 현재 상태 | 되돌리는 내용 |
|---|---|
| 검수의 검수 대기 | 게이트 해제(adminApprovalStatus를 게이트 이전 값으로: 첫 제출 NONE, 수정 차수 APPROVED), approvedWithFeedback = false |
| 재제출 요청 | awaitingRevision = false. 라운드 첫 재제출 요청이었다면 크리에이터 개인 일정의 재제출 지연 사유 제거 |
| 승인(스크립트) | 진행 단계 SECOND_REVIEW → FIRST_REVIEW. 스크립트 승인 때 생긴 빈 2차(영상) 라운드를 삭제해 승인 전 모습으로 되돌립니다(재승인하면 다시 생성). 2차에 제출물·임시저장이 있으면 막힙니다 |
| 승인(영상) | uploadApproved = false, 최종제출물 업로드일·후보일·업로드 방식 초기화, 진행 단계 UPLOAD_SETTLEMENT → SECOND_REVIEW. 단 목표가 APPROVED / APPROVED_WITH_FEEDBACK(승인 ↔ 피드백 포함 승인)이면 업로드 일정은 지우지 않습니다 |
라운드는 REVIEWING, 제출된 제출물은 REVIEWING이 됩니다.
2단계 — 목표 상태로 진행
| 목표 | 처리 | 크리에이터 메일 (notifyCreator = true) |
|---|---|---|
UNDER_REVIEW | 이번 차수 피드백을 기업 임시저장으로 돌립니다(크리에이터에게 숨김, 기업이 다시 수정·제출) | 없음 |
BEFORE_SUBMISSION | 이번 차수 피드백을 기업 임시저장으로 돌린 뒤 직전 제출을 되돌립니다. 첫 제출이면 제출물 미제출·라운드 PENDING, 수정본이면 라운드 REJECTED + 수정 차수 -1 + awaitingRevision = true(직전 차수 피드백 달린 제출물만 REJECTED) | 없음 |
RESUBMIT_REQUESTED | 이번 차수 피드백이 달린 제출물을 REJECTED, 피드백 해결 표시 해제, 정상 재제출 릴리즈(재제출 마감·지연 사유·일정) | 스크립트 재제출 요청 / 영상 재제출 요청 |
APPROVED | 정상 승인 릴리즈(2차 라운드·일정·진행 단계, 영상이면 업로드 허용). 영상은 uploadDate를 보냈으면 이어서 업로드 일정까지 저장하고(최종제출물 업로드 방식·업로드일·후보일 덮어쓰기, 업로드 허용일 재산정), 생략했으면 저장된 일정을 그대로 씁니다 | 스크립트 승인. 영상은 포스팅 허용 안내 1통(보낸 일정 또는 저장된 일정 기준) |
APPROVED_WITH_FEEDBACK | approvedWithFeedback = true로 정상 승인 릴리즈. 영상은 위와 같이 업로드 일정까지 저장 | 스크립트 승인(피드백 포함). 영상은 위와 같음 |
GATE_PENDING | 이미 확정된 기업 결정을 다시 검수의 검수 대기로 걸어 둡니다. adminApprovalStatus = PENDING, 결정 종류는 유지(되돌리기 전이 승인·피드백 포함 승인이면 approvedWithFeedback = true, 재제출 요청이면 false), 이번 차수 피드백의 관리자 판단을 PENDING으로 초기화 → 크리에이터 화면에서 피드백이 숨겨지고 대기 목록에 다시 뜹니다. 관리자는 건별 승인/거절로 다시 결정합니다 | 없음. 이후 검수의 검수 결정 시점에 정상 흐름대로 나갑니다 |
notifyCreator가 false(또는 생략)면 위 메일은 하나도 나가지 않습니다 — 영상 승인 시 업로드 일정을 저장해도 포스팅 허용 안내가 나가지 않습니다. 상태 변경 자체는 메일을 보내지 않습니다(캠페인 알리미 슬랙만 매번 발송).
영상 승인과 업로드 일정 저장은 한 트랜잭션입니다. 업로드 일정이 잘못되면(예: CANDIDATE인데 후보일 없음) 승인까지 통째로 되돌아갑니다. 운영팀 후보일 안내 메일은 보내지 않습니다(관리자가 직접 정한 일정). 업로드 일정만 따로 바꿀 때는 관리자 업로드 일정 변경 API를 씁니다.
검수의 검수 대기에서 RESUBMIT_REQUESTED / APPROVED / APPROVED_WITH_FEEDBACK로 바꾸면 관리자가 결정을 바로 확정한 것으로 보고 게이트를 통과 처리합니다(adminApprovalStatus = APPROVED, 이번 차수 피드백 관리자 판단 APPROVED).
- 수정본 제출을
BEFORE_SUBMISSION으로 되돌리면 결과는 재제출 요청 상태입니다. 응답의toState로 실제 결과를 확인하세요. - 이미 크리에이터에게 나간 메일·알림은 회수되지 않습니다.
- 막히는 조건은 제출 상태 조회와 같습니다. 같은 상태로의 변경도 거부합니다.
응답
성공 응답 (200)
{
"status": 200,
"code": null,
"message": "처리 완료",
"data": {
"reviewId": 1084,
"reviewRound": 2,
"fromState": "RESUBMIT_REQUESTED",
"toState": "APPROVED_WITH_FEEDBACK",
"reviewStatus": "APPROVED",
"adminApprovalStatus": "APPROVED",
"approvedWithFeedback": true,
"awaitingRevision": false,
"currentRevisionNo": 1,
"creatorNotified": false
}
}| 필드 | 타입 | 설명 |
|---|---|---|
fromState | string | 변경 전 상태 |
toState | string | 변경 후 실제 상태 |
reviewStatus | string | 처리 후 라운드 상태 |
adminApprovalStatus | string | 처리 후 검수의 검수 상태 |
approvedWithFeedback | boolean | 피드백 포함 승인 여부 |
awaitingRevision | boolean | 수정본 대기 여부 |
currentRevisionNo | int | 현재 수정 차수 |
creatorNotified | boolean | 크리에이터 메일 발송 여부 |
에러 응답
거부는 HTTP 200에 body status: 404, code: INVALID_DATA, message에 사유가 담겨 옵니다. 관리자가 아니면 HTTP 403입니다.
| body status | code | 상황 |
|---|---|---|
404 | INVALID_DATA | 검수 라운드 없음, target 누락 |
404 | INVALID_DATA | 영상 승인인데 uploadDate도 저장된 일정도 없음 — "영상 승인에는 업로드 일정(uploadDate)이 필요합니다." |
404 | INVALID_DATA | 업로드 일정 값 오류 — "CANDIDATE 타입인 경우 후보 날짜가 필요합니다." |
404 | INVALID_DATA | 이미 목표 상태 |
404 | INVALID_DATA | 막힌 목표 (크리에이터 제출 없음 / 2차 제출물·임시저장 있음 / 최종제출물 제출됨 / 보낼 피드백 없음 / 기업 결정 없음) |
기록·알림
- 히스토리에
actor = ADMIN,action = OVERRIDE로 "제출 상태 변경: 이전 → 이후"가 한 줄 남습니다. 같은 관리자가 연달아 바꿔도 이력 조회에는 변경마다 한 줄씩 보입니다(다른 행위처럼 연속 블록으로 접지 않음). - 캠페인 알리미 슬랙 채널로
[관리자 제출 상태 변경]알림(캠페인·크리에이터·라운드·변경 내용·사유·처리자)이 나갑니다. 슬랙 발송 실패는 상태 변경을 되돌리지 않습니다.