"""``POST /uploads/presign`` — COS 直传预签名(FR-SYS-03 / T-P1-27)。 图片不经应用服务器:本接口只做场景/类型/大小校验并签发 PUT 预签名 URL, 字节流由客户端直传 COS。真实联调需在 `.env` 配 COS 四件套 (COS_REGION / COS_SECRET_ID / COS_SECRET_KEY + 场景桶配置 UPLOAD_SCENES_JSON);本地单测注入 FakeSigner,不依赖任何真实 COS。 """ from __future__ import annotations from fastapi import APIRouter from apps.api.deps import CurrentUserId, StorageServiceDep from packages.shared.response import ok from packages.storage.schemas import PresignRequest router = APIRouter(prefix="/uploads", tags=["uploads"]) @router.post("/presign", summary="签发图片直传 COS 的 PUT 预签名 URL") async def presign_upload( user_id: CurrentUserId, storage: StorageServiceDep, request: PresignRequest, ) -> dict[str, object]: presigned = storage.build_presign(user_id=user_id, request=request) return ok(presigned.model_dump())