SaaS APIAgency API
Agency Branding API
에이전시 로고 URL 저장 및 파일 업로드
브랜딩/로고
에이전시 로고는 두 단계로 처리할 수 있습니다.
PATCH /agency/me/branding은 이미 확보한 로고 URL을 저장하는 API입니다. POST /agency/branding/logo는 multipart 파일을 서버가 받아 S3에 업로드하고 logoUrl을 반환하는 API입니다. presigned URL 전용 구조가 아닙니다.
로고 URL 저장
| 항목 | 값 |
|---|---|
| 메서드 | PATCH |
| 경로 | /agency/me/branding 또는 /ai/agency/me/branding |
| 인증 | 필요 |
| 권한 | ROLE_AGENCY |
PATCH /agency/me/branding HTTP/1.1
Host: api.glowb.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"logoUrl": "https://cdn.example.com/agency/logo.png"
}Request Body
Prop
Type
응답
{
"logoUrl": "https://cdn.example.com/agency/logo.png"
}로고 파일 업로드
이 API는 에이전시 본인 전용입니다. SecurityConfig가 URL 레벨에서 ROLE_ADMIN도 통과시키지만, 서비스가 호출자 본인의 에이전시를 역산하므로(businessType == AGENCY && agency != null) 본인 에이전시가 없는 어드민은 AUTH_002로 거절됩니다. 어드민은 POST /admin/agency/branding/logo를 사용하세요.
| 항목 | 값 |
|---|---|
| 메서드 | POST |
| 경로 | /agency/branding/logo 또는 /ai/agency/branding/logo |
| 인증 | 필요 |
| 권한 | ROLE_AGENCY |
| Content-Type | multipart/form-data |
POST /agency/branding/logo HTTP/1.1
Host: api.glowb.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: multipart/form-data; boundary=----boundary
------boundary
Content-Disposition: form-data; name="file"; filename="logo.webp"
Content-Type: image/webp
{binary}
------boundary--curl -X POST "https://api.glowb.com/agency/branding/logo" \
-H "Authorization: Bearer {access_token}" \
-F "file=@logo.webp"const formData = new FormData();
formData.append('file', file);
const upload = await fetch('/agency/branding/logo', {
method: 'POST',
headers: {
Authorization: `Bearer ${accessToken}`,
},
body: formData,
});
const { logoUrl } = await upload.json();응답
{
"logoUrl": "https://..."
}