feat: добавить endpoint picture/srcset

- добавлен contract DTO для picture sources и fallback image
- реализована выдача versioned Gateway URLs по static presets
- обновлена документация business API и dev smoke flow
This commit is contained in:
2026-05-05 13:35:25 +03:00
parent 3ec1e51bea
commit 56d551b43b
6 changed files with 279 additions and 2 deletions

View File

@@ -12,6 +12,7 @@ import {
} from "@nestjs/swagger"
import { AssetsService } from "./assets.service"
import { AssetPictureResponseDto } from "./asset-picture-response.dto"
import { AssetResponseDto, AssetVariantsResponseDto, AssetsListResponseDto } from "./asset-response.dto"
import { CreateAssetVersionRequestDto, CreateAssetVersionResponseDto } from "./create-asset-version.dto"
import { CreateAssetVariantsRequestDto, CreateAssetVariantsResponseDto } from "./create-asset-variants.dto"
@@ -77,6 +78,30 @@ export class AssetsController {
return this.assets.createAssetVersion(publicId, request)
}
@Get(":publicId/picture")
@ApiOperation({
summary: "получить picture/srcset URLs",
description:
"Возвращает готовый контракт для `<picture>` и `<img>` по static preset: sources, srcset, fallback src, sizes и versioned Gateway URLs. Endpoint не ставит generation jobs: Gateway сгенерирует bytes lazy или отдаст cache.",
})
@ApiParam({ description: "Публичный идентификатор asset.", example: "asset_demo", name: "publicId" })
@ApiQuery({ description: "Static preset для picture contract.", example: "card", name: "preset", required: true })
@ApiQuery({ description: "Версия source image. Если не передана, используется currentVersion asset.", example: 1, name: "version", required: false })
@ApiQuery({ description: "Quality. Если не передано, берётся default quality preset.", example: 80, name: "quality", required: false })
@ApiQuery({ description: "Значение для HTML `sizes`.", example: "(min-width: 768px) 50vw, 100vw", name: "sizes", required: false })
@ApiOkResponse({ description: "Picture/srcset contract возвращён.", type: AssetPictureResponseDto })
@ApiBadRequestResponse({ description: "Некорректный preset, version, quality или sizes." })
@ApiNotFoundResponse({ description: "Asset или version не найдены." })
getAssetPicture(
@Param("publicId") publicId: string,
@Query("preset") preset?: string,
@Query("version") version?: string,
@Query("quality") quality?: string,
@Query("sizes") sizes?: string,
): Promise<AssetPictureResponseDto> {
return this.assets.getAssetPicture(publicId, { preset, quality, sizes, version })
}
@Get(":publicId/variants")
@ApiOperation({
summary: "получить variants asset",