Admin API대리제출
POST /ai/admin/proxy-submission/applications/{applicationId}/signed-url
대리제출용 GCS 업로드 URL 발급
대리제출 업로드 URL 발급 (관리자용)
검수 대리제출에 첨부할 영상·이미지를 GCS에 직접 올리기 위한 Resumable 업로드 Signed URL을 발급합니다. 파일은 서버를 거치지 않고 브라우저에서 GCS로 바로 올라갑니다.
제출물이 CAPTION/HASHTAG/스크립트뿐이라면 이 API는 필요 없습니다. 업로드가 필요한 VIDEO/PHOTO 항목이 있을 때만 호출합니다.
HTTP 요청
POST /ai/admin/proxy-submission/applications/{applicationId}/signed-url
Authorization: Bearer {access_token}
Content-Type: application/jsonPath Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
applicationId | long | 예 | 대상 신청(CampaignApplication) ID |
Request Body
{
"filename": "nanako_final.mp4",
"contentType": "video/mp4"
}| 필드명 | 타입 | 필수 | 설명 |
|---|---|---|---|
filename | string | 예 | 원본 파일명. 비어 있으면 upload 로 대체됩니다 |
contentType | string | 예 | 브라우저 file.type. 허용 형식만 통과합니다 |
허용 Content-Type
image/*, video/*, application/zip, application/x-tar, application/gzip, application/vnd.rar, application/x-7z-compressed
응답
성공 응답 (200 OK)
{
"status": 200,
"code": null,
"message": "발급 완료",
"data": {
"uploadUrl": "https://storage.googleapis.com/glowb-input/campaign/content/admin/20652/1756...mp4?X-Goog-Algorithm=...",
"publicUrl": "https://storage.googleapis.com/glowb-input/campaign/content/admin/20652/1756..._nanako_final.mp4"
}
}| 필드명 | 타입 | 설명 |
|---|---|---|
uploadUrl | string | Resumable 세션을 시작할 서명 URL |
publicUrl | string | 업로드 완료 후 제출 요청의 filePath 에 넣을 GCS URL |
업로드 절차
uploadUrl로 POST 합니다. 헤더는x-goog-resumable: start와 발급 때 사용한Content-Type을 그대로 보냅니다.- 응답
Location헤더가 세션 URI입니다. 이 URI로 파일 바이트를 PUT 합니다. 중간에 끊기면Range헤더로 재개할 수 있습니다. - 업로드가 끝나면
publicUrl을 검수 대리제출 요청의items[].filePath로 넘깁니다.
Resumable 방식은 서명이 Content-Type을 구속하지 않습니다. 발급 때 통과한 형식과 다른 형식으로 업로드해도 서버가 막지 못합니다(2026-08-19 test 실측). 프런트에서 올바른 Content-Type 을 보내야 합니다.
오브젝트 경로에 업로드 주체가 들어갑니다. 매직링크는 campaign/content/link/..., 대리제출은 campaign/content/admin/... 이라 경로만으로 구분됩니다.
에러 응답
에러도 HTTP 200으로 내려가고 실제 상태는 본문 status/code 에 담깁니다. 인증·인가 실패만 실제 401/403입니다.
| 상황 | 본문 status | code | 메시지 |
|---|---|---|---|
| 신청 없음 | 404 | INVALID_DATA | 신청을 찾을 수 없습니다. |
| Content-Type 누락 | 404 | INVALID_DATA | Content-Type이 필요합니다. |
| 지원하지 않는 형식 | 400 | UNSUPPORTED_FILE_FORMAT | 지원하지 않는 파일 형식입니다: (전달한 값) |
| 인증 실패 | HTTP 401 | — | 토큰이 만료되었습니다. |
| ADMIN 권한 아님 | HTTP 403 | — | 권한이 없는 요청 입니다. |