MintTokenRequest/Response 스키마 추가, mint_token 라우트 구현 (HMAC 인증 + 확장자 검증 + JTI 발급), 테스트 3건 추가. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
54 lines
1.3 KiB
Python
54 lines
1.3 KiB
Python
"""Pydantic schemas for packs API."""
|
|
from datetime import datetime
|
|
from typing import Literal
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
PackTier = Literal["starter", "pro", "master"]
|
|
|
|
|
|
class SignLinkRequest(BaseModel):
|
|
"""Vercel → backend: 사용자 다운로드 링크 발급 요청."""
|
|
file_path: str = Field(..., description="NAS 절대 경로 — pack_files.file_path 그대로")
|
|
expires_in_seconds: int = Field(default=14400, description="공유 링크 만료 (기본 4시간)")
|
|
|
|
|
|
class SignLinkResponse(BaseModel):
|
|
url: str
|
|
expires_at: datetime
|
|
|
|
|
|
class UploadResponse(BaseModel):
|
|
file_id: str # uuid
|
|
file_path: str
|
|
filename: str
|
|
size_bytes: int
|
|
min_tier: PackTier
|
|
label: str
|
|
uploaded_at: datetime
|
|
|
|
|
|
class PackFileItem(BaseModel):
|
|
id: str
|
|
min_tier: PackTier
|
|
label: str
|
|
file_path: str
|
|
filename: str
|
|
size_bytes: int
|
|
sort_order: int
|
|
uploaded_at: datetime
|
|
|
|
|
|
class MintTokenRequest(BaseModel):
|
|
"""Vercel → backend: admin upload 토큰 발급 요청."""
|
|
tier: PackTier
|
|
label: str = Field(..., max_length=200)
|
|
filename: str = Field(..., max_length=255)
|
|
size_bytes: int = Field(..., gt=0, le=5 * 1024 * 1024 * 1024)
|
|
|
|
|
|
class MintTokenResponse(BaseModel):
|
|
token: str
|
|
expires_at: datetime
|
|
jti: str
|