Admin API대리제출
POST /ai/admin/proxy-submission/applications/{applicationId}/final
관리자가 크리에이터 대신 최종제출물을 제출
최종제출물 대리제출 (관리자용)
크리에이터가 직접 제출하지 못하는 상황에서 관리자가 최종제출물을 대신 제출합니다. 크리에이터가 웹앱에서 직접 제출한 것과 동일하게 처리됩니다.
기존 POST /ai/admin/campaigns/final-submission/{applicationId}/submit 과 다릅니다
기존 관리자 API는 크리에이터 정본 로직(FinalSubmissionService)을 재사용하지 않고 별도로 구현되어 있어, 제출 표시(isSubmitted, submittedAt)와 캠페인 상태 변경만 수행합니다. 아래 후속 처리가 모두 빠집니다.
- 2차 활용 기간 확정
- 정산 일정·마감 산정
- 게시 항목(계정 태그·공동작업자) 자동검수 예약
UPLOAD_SETTLEMENT단계 검증
이 API는 정본을 그대로 재사용하므로 위 처리가 함께 수행됩니다.
처리 순서
applicationId로 신청 조회 후 신청 소유자의 memberId 해석- 클린본·최종본이 영상이면 트랜스코딩 트리거
- 크리에이터 정본 호출 —
isResubmit에 따라 최초 제출 또는 재제출 - 광고주 최종제출 알림 발행
FinalSubmissionService 는 memberId 가 신청 소유자와 일치할 때만 통과시킵니다. 관리자 토큰의 memberId 를 그대로 넘기면 막히므로, 매직링크와 동일하게 신청 자체의 소유자에서 memberId 를 꺼내 넘깁니다.
HTTP 요청
POST /ai/admin/proxy-submission/applications/{applicationId}/final
Authorization: Bearer {access_token}
Content-Type: application/jsonPath Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
applicationId | long | 예 | 대상 신청(CampaignApplication) ID |
Request Body
{
"contentLink": "https://www.instagram.com/reel/xxxxx",
"partnershipCode": "ABC123",
"cleanFilePath": "https://storage.googleapis.com/glowb-input/campaign/content/admin/20652/...clean.mp4",
"finalFilePath": "https://storage.googleapis.com/glowb-input/campaign/content/admin/20652/...final.mp4",
"isResubmit": false
}| 필드명 | 타입 | 필수 | 설명 |
|---|---|---|---|
contentLink | string | 아니오 | 업로드한 콘텐츠 링크 |
partnershipCode | string | 아니오 | 파트너십 코드 |
cleanFilePath | string | 아니오 | 클린본 파일 URL. 업로드 URL 발급의 publicUrl |
finalFilePath | string | 아니오 | 최종본 파일 URL |
isResubmit | boolean | 아니오 | true 면 재제출로 처리(기본 false) |
null 인 필드는 기존 값을 유지합니다. 캠페인이 요구하는 항목은 TB_COLLAB_FINAL_SUBMISSION_TYPES 로 결정됩니다.
최초 제출과 재제출의 차이
isResubmit: false | isResubmit: true | |
|---|---|---|
| 전제 | UPLOAD_SETTLEMENT 단계 | 이미 제출된 상태 |
| 2차 활용 기간 | 최초 제출 시점으로 확정 | 갱신하지 않음(최초 기준 유지) |
| 정산 일정 | 재계산 | 하지 않음 |
| 자동검수 예약 | 예약 | 재예약 |
응답 message | 제출 완료 (data: null) | 재제출 완료 (제출물 전체) |
응답
성공 응답 (200 OK) — 최초 제출
{
"status": 200,
"code": null,
"message": "제출 완료",
"data": null
}성공 응답 (200 OK) — 재제출
{
"status": 200,
"code": null,
"message": "재제출 완료",
"data": {
"contentLink": "https://www.instagram.com/reel/xxxxx",
"isSubmitted": true,
"submittedAt": "2026-09-01T17:40:00"
}
}에러 응답
에러도 HTTP 200으로 내려가고 실제 상태는 본문 status/code 에 담깁니다. 인증·인가 실패만 실제 401/403입니다.
| 상황 | 본문 status | 메시지 |
|---|---|---|
| 신청 없음 | 404 | 신청을 찾을 수 없습니다. |
| 신청 소유자 확인 불가 | 404 | 신청 소유자를 확인할 수 없습니다. |
| 업로드/정산 단계가 아님 | 404 | 업로드/정산 단계에서만 최종 제작물을 제출할 수 있습니다. |
| 재제출인데 제출물 없음 | 404 | 제출된 최종 제작물이 없습니다. 먼저 제출해주세요. |
| 재제출인데 미제출 상태 | 404 | 아직 제출되지 않은 상태입니다. 최초 제출은 POST API를 사용해주세요. |
| 인증 실패 | HTTP 401 | 토큰이 만료되었습니다. |
| ADMIN 권한 아님 | HTTP 403 | 권한이 없는 요청 입니다. |
감사 기록
제출 주체 컬럼이 없어 DB만 보면 크리에이터 본인 제출과 구분되지 않습니다. 애플리케이션 로그로만 남습니다.
[AdminProxySubmission] 최종제출 대리제출 완료. adminId=..., applicationId=..., isResubmit=..., influenceNo=...