SaaS API피드백 관리자 승인 (v4)
제출 상태 조회
검수 라운드의 현재 제출 상태와 관리자가 바꿀 수 있는 목표 상태 목록을 조회합니다.
제출 상태 조회
검수 라운드(스크립트 = 1, 영상 = 2)의 현재 제출 상태와, 제출 상태 변경으로 바꿀 수 있는 목표 상태 목록을 돌려줍니다.
관리자 화면은 이 목록으로 변경 선택지를 그리고, 막힌 목표는 blockedReason을 안내합니다.
ADMIN 권한 필요 (ROLE_ADMIN). 아니면 차단.
HTTP 요청
GET /ai/admin/feedback-approvals/{reviewId}/state
Authorization: Bearer {access_token}Path Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
reviewId | long | 예 | 검수 라운드 ID |
제출 상태
| 값 | 화면 표현 | 판정 |
|---|---|---|
BEFORE_SUBMISSION | 제출 전 | 라운드 PENDING, 제출된 제출물 없음 |
UNDER_REVIEW | 기업 검수 대기 | 라운드 REVIEWING (또는 PENDING이지만 제출된 제출물 있음) |
GATE_PENDING | 검수의 검수 대기 | adminApprovalStatus = PENDING / CHANGES_REQUESTED |
RESUBMIT_REQUESTED | 재제출 요청 | 라운드 REJECTED (크리에이터 수정 중) |
APPROVED | 승인 | 라운드 APPROVED, approvedWithFeedback = false |
APPROVED_WITH_FEEDBACK | 피드백 포함 승인 | 라운드 APPROVED, approvedWithFeedback = true |
현재 상태는 목표 목록에서 빠집니다. GATE_PENDING(검수의 검수 대기)도 목표로 고를 수 있습니다 — 이미 확정된 기업 결정을 다시 검수의 검수에 걸어 둘 때 씁니다.
응답
성공 응답 (200)
스크립트 라운드(승인 상태, 2차에 제출물이 있어 되돌리기가 막힌 경우):
{
"status": 200,
"code": null,
"message": "조회 성공",
"data": {
"reviewId": 1104,
"reviewRound": 1,
"currentState": "APPROVED",
"currentStateDisplayName": "승인",
"currentRevisionNo": 1,
"hasUploadDate": false,
"uploadDate": null,
"options": [
{ "target": "BEFORE_SUBMISSION", "displayName": "제출 전", "allowed": false, "blockedReason": "2차(영상)에 제출물이나 임시저장한 내용이 있어 스크립트 승인을 되돌릴 수 없습니다.", "acceptsUploadDate": false, "requiresUploadDate": false },
{ "target": "UNDER_REVIEW", "displayName": "기업 검수 대기", "allowed": false, "blockedReason": "2차(영상)에 제출물이나 임시저장한 내용이 있어 스크립트 승인을 되돌릴 수 없습니다.", "acceptsUploadDate": false, "requiresUploadDate": false },
{ "target": "RESUBMIT_REQUESTED", "displayName": "재제출 요청", "allowed": false, "blockedReason": "2차(영상)에 제출물이나 임시저장한 내용이 있어 스크립트 승인을 되돌릴 수 없습니다.", "acceptsUploadDate": false, "requiresUploadDate": false },
{ "target": "APPROVED_WITH_FEEDBACK", "displayName": "피드백 포함 승인", "allowed": false, "blockedReason": "2차(영상)에 제출물이나 임시저장한 내용이 있어 스크립트 승인을 되돌릴 수 없습니다.", "acceptsUploadDate": false, "requiresUploadDate": false }
]
}
}영상 라운드(검수의 검수 대기, 기업이 승인하면서 업로드 일정을 이미 정해 둔 경우 — 승인 계열 선택지는 업로드 일정 선택):
{
"status": 200,
"code": null,
"message": "조회 성공",
"data": {
"reviewId": 1231,
"reviewRound": 2,
"currentState": "GATE_PENDING",
"currentStateDisplayName": "검수의 검수 대기",
"currentRevisionNo": 1,
"hasUploadDate": true,
"uploadDate": {
"uploadDateType": "CANDIDATE",
"uploadDate": null,
"candidateDates": ["2026-10-06", "2026-10-07", "2026-10-08"]
},
"options": [
{ "target": "BEFORE_SUBMISSION", "displayName": "제출 전", "allowed": true, "blockedReason": null, "acceptsUploadDate": false, "requiresUploadDate": false },
{ "target": "UNDER_REVIEW", "displayName": "기업 검수 대기", "allowed": true, "blockedReason": null, "acceptsUploadDate": false, "requiresUploadDate": false },
{ "target": "RESUBMIT_REQUESTED", "displayName": "재제출 요청", "allowed": true, "blockedReason": null, "acceptsUploadDate": false, "requiresUploadDate": false },
{ "target": "APPROVED", "displayName": "승인", "allowed": true, "blockedReason": null, "acceptsUploadDate": true, "requiresUploadDate": false },
{ "target": "APPROVED_WITH_FEEDBACK", "displayName": "피드백 포함 승인", "allowed": true, "blockedReason": null, "acceptsUploadDate": true, "requiresUploadDate": false }
]
}
}| 필드 | 타입 | 설명 |
|---|---|---|
currentState | string | 현재 제출 상태 (위 표) |
currentRevisionNo | int | 현재 수정 차수 |
hasUploadDate | boolean | 영상 라운드에 업로드 일정이 이미 저장돼 있는지. 스크립트 라운드는 항상 false |
uploadDate | object | 저장된 업로드 일정. 없으면 null |
uploadDate.uploadDateType | string | OPTIMAL / ASAP / CANDIDATE |
uploadDate.uploadDate | datetime | 업로드 예정일 (후보일만 정한 경우 null) |
uploadDate.candidateDates | string[] | 후보일(yyyy-MM-dd). 없으면 빈 목록 |
options[].target | string | 목표 상태 |
options[].allowed | boolean | 변경 가능 여부 |
options[].blockedReason | string | 막힌 사유 (가능하면 null) |
options[].acceptsUploadDate | boolean | 이 목표로 바꿀 때 업로드 일정(uploadDate)을 받는지. 영상 라운드의 APPROVED / APPROVED_WITH_FEEDBACK만 true |
options[].requiresUploadDate | boolean | 업로드 일정이 필수인지. acceptsUploadDate이면서 저장된 일정이 없을 때(hasUploadDate = false)만 true |
관리자 화면: acceptsUploadDate가 true인 선택지에서 업로드 일정 입력을 보여 주고, requiresUploadDate가 true면 필수로, false면 선택으로 받습니다. 선택일 때 비워 두면 저장된 일정(uploadDate)이 그대로 쓰이고, 입력하면 덮어씁니다.
막히는 경우
| 사유 | 조건 |
|---|---|
| 크리에이터 제출 없음 | 현재 BEFORE_SUBMISSION — 제출이 필요하면 대리제출을 이용 |
| 2차(영상) 제출물·임시저장 있음 | 스크립트 라운드가 승인 상태이고 영상 라운드에 제출물이나 임시저장한 내용이 있음 — 되돌리면 2차 라운드를 삭제하므로 크리에이터 작업 보호 |
| 최종제출물 제출됨 | 영상 라운드가 승인 상태이고 최종제출물이 제출됨 |
| 보낼 피드백 없음 | 목표가 RESUBMIT_REQUESTED인데 이번 차수에 정식(임시저장 제외) 피드백이 없음 |
| 기업 결정 없음 | 목표가 GATE_PENDING인데 이번 차수에 정식(임시저장 제외) 피드백이 없음 — 검수의 검수에 걸어 둘 기업 결정이 없음 |
에러 응답
거부는 HTTP 200에 body status: 404, code: INVALID_DATA, message에 사유가 담겨 옵니다. 관리자가 아니면 HTTP 403입니다.
| body status | code | 상황 |
|---|---|---|
404 | INVALID_DATA | 검수 라운드 없음 |